1 module directx.d3d11shadertracing; 2 3 import directx.d3d11shader; 4 5 extern(C) { 6 7 enum D3D11_SHADER_TYPE 8 { 9 D3D11_VERTEX_SHADER = 1, 10 D3D11_HULL_SHADER = 2, 11 D3D11_DOMAIN_SHADER = 3, 12 D3D11_GEOMETRY_SHADER = 4, 13 D3D11_PIXEL_SHADER = 5, 14 D3D11_COMPUTE_SHADER = 6 15 } 16 17 enum D3D11_TRACE_COMPONENT_X = 0x1; 18 enum D3D11_TRACE_COMPONENT_Y = 0x2; 19 enum D3D11_TRACE_COMPONENT_Z = 0x4; 20 enum D3D11_TRACE_COMPONENT_W = 0x8; 21 alias D3D11_TRACE_COMPONENT_MASK = UINT8; 22 23 struct D3D11_VERTEX_SHADER_TRACE_DESC 24 { 25 UINT64 Invocation; 26 } 27 28 struct D3D11_HULL_SHADER_TRACE_DESC 29 { 30 UINT64 Invocation; 31 } 32 33 struct D3D11_DOMAIN_SHADER_TRACE_DESC 34 { 35 UINT64 Invocation; 36 } 37 38 struct D3D11_GEOMETRY_SHADER_TRACE_DESC 39 { 40 UINT64 Invocation; 41 } 42 43 struct D3D11_PIXEL_SHADER_TRACE_DESC 44 { 45 UINT64 Invocation; 46 INT X; 47 INT Y; 48 UINT64 SampleMask; 49 } 50 51 struct D3D11_COMPUTE_SHADER_TRACE_DESC 52 { 53 UINT64 Invocation; 54 UINT[3] ThreadIDInGroup; 55 UINT[3] ThreadGroupID; 56 } 57 58 enum D3D11_SHADER_TRACE_FLAG_RECORD_REGISTER_WRITES = 0x1; 59 enum D3D11_SHADER_TRACE_FLAG_RECORD_REGISTER_READS = 0x2; 60 61 struct D3D11_SHADER_TRACE_DESC 62 { 63 D3D11_SHADER_TYPE Type; 64 UINT Flags; 65 union 66 { 67 D3D11_VERTEX_SHADER_TRACE_DESC VertexShaderTraceDesc; 68 D3D11_HULL_SHADER_TRACE_DESC HullShaderTraceDesc; 69 D3D11_DOMAIN_SHADER_TRACE_DESC DomainShaderTraceDesc; 70 D3D11_GEOMETRY_SHADER_TRACE_DESC GeometryShaderTraceDesc; 71 D3D11_PIXEL_SHADER_TRACE_DESC PixelShaderTraceDesc; 72 D3D11_COMPUTE_SHADER_TRACE_DESC ComputeShaderTraceDesc; 73 } 74 } 75 76 alias DWORD D3D11_TRACE_GS_INPUT_PRIMITIVE; 77 enum : D3D11_TRACE_GS_INPUT_PRIMITIVE 78 { 79 D3D11_TRACE_GS_INPUT_PRIMITIVE_UNDEFINED = 0, 80 D3D11_TRACE_GS_INPUT_PRIMITIVE_POINT = 1, 81 D3D11_TRACE_GS_INPUT_PRIMITIVE_LINE = 2, 82 D3D11_TRACE_GS_INPUT_PRIMITIVE_TRIANGLE = 3, 83 D3D11_TRACE_GS_INPUT_PRIMITIVE_LINE_ADJ = 6, 84 D3D11_TRACE_GS_INPUT_PRIMITIVE_TRIANGLE_ADJ = 7 85 } 86 87 struct D3D11_TRACE_STATS 88 { 89 D3D11_SHADER_TRACE_DESC TraceDesc; 90 UINT8 NumInvocationsInStamp; 91 UINT8 TargetStampIndex; 92 UINT NumTraceSteps; 93 D3D11_TRACE_COMPONENT_MASK[32] InputMask; 94 D3D11_TRACE_COMPONENT_MASK[32] OutputMask; 95 UINT16 NumTemps; 96 UINT16 MaxIndexableTempIndex; 97 UINT16[4096] IndexableTempSize; 98 UINT16 ImmediateConstantBufferSize; 99 UINT[4][2] PixelPosition; 100 UINT64[4] PixelCoverageMask; 101 UINT64[4] PixelDiscardedMask; 102 UINT64[4] PixelCoverageMaskAfterShader; 103 UINT64[4] PixelCoverageMaskAfterA2CSampleMask; 104 UINT64[4] PixelCoverageMaskAfterA2CSampleMaskDepth; 105 UINT64[4] PixelCoverageMaskAfterA2CSampleMaskDepthStencil; 106 BOOL PSOutputsDepth; 107 BOOL PSOutputsMask; 108 D3D11_TRACE_GS_INPUT_PRIMITIVE GSInputPrimitive; 109 BOOL GSInputsPrimitiveID; 110 D3D11_TRACE_COMPONENT_MASK[32] HSOutputPatchConstantMask; 111 D3D11_TRACE_COMPONENT_MASK[32] DSInputPatchConstantMask; 112 } 113 114 struct D3D11_TRACE_VALUE 115 { 116 UINT[4] Bits; 117 D3D11_TRACE_COMPONENT_MASK ValidMask; 118 } 119 120 alias DWORD D3D11_TRACE_REGISTER_TYPE; 121 enum : D3D11_TRACE_REGISTER_TYPE 122 { 123 D3D11_TRACE_OUTPUT_NULL_REGISTER = 0, 124 D3D11_TRACE_INPUT_REGISTER = ( D3D11_TRACE_OUTPUT_NULL_REGISTER + 1 ) , 125 D3D11_TRACE_INPUT_PRIMITIVE_ID_REGISTER = ( D3D11_TRACE_INPUT_REGISTER + 1 ) , 126 D3D11_TRACE_IMMEDIATE_CONSTANT_BUFFER = ( D3D11_TRACE_INPUT_PRIMITIVE_ID_REGISTER + 1 ) , 127 D3D11_TRACE_TEMP_REGISTER = ( D3D11_TRACE_IMMEDIATE_CONSTANT_BUFFER + 1 ) , 128 D3D11_TRACE_INDEXABLE_TEMP_REGISTER = ( D3D11_TRACE_TEMP_REGISTER + 1 ) , 129 D3D11_TRACE_OUTPUT_REGISTER = ( D3D11_TRACE_INDEXABLE_TEMP_REGISTER + 1 ) , 130 D3D11_TRACE_OUTPUT_DEPTH_REGISTER = ( D3D11_TRACE_OUTPUT_REGISTER + 1 ) , 131 D3D11_TRACE_CONSTANT_BUFFER = ( D3D11_TRACE_OUTPUT_DEPTH_REGISTER + 1 ) , 132 D3D11_TRACE_IMMEDIATE32 = ( D3D11_TRACE_CONSTANT_BUFFER + 1 ) , 133 D3D11_TRACE_SAMPLER = ( D3D11_TRACE_IMMEDIATE32 + 1 ) , 134 D3D11_TRACE_RESOURCE = ( D3D11_TRACE_SAMPLER + 1 ) , 135 D3D11_TRACE_RASTERIZER = ( D3D11_TRACE_RESOURCE + 1 ) , 136 D3D11_TRACE_OUTPUT_COVERAGE_MASK = ( D3D11_TRACE_RASTERIZER + 1 ) , 137 D3D11_TRACE_STREAM = ( D3D11_TRACE_OUTPUT_COVERAGE_MASK + 1 ) , 138 D3D11_TRACE_THIS_POINTER = ( D3D11_TRACE_STREAM + 1 ) , 139 D3D11_TRACE_OUTPUT_CONTROL_POINT_ID_REGISTER = ( D3D11_TRACE_THIS_POINTER + 1 ) , 140 D3D11_TRACE_INPUT_FORK_INSTANCE_ID_REGISTER = ( D3D11_TRACE_OUTPUT_CONTROL_POINT_ID_REGISTER + 1 ) , 141 D3D11_TRACE_INPUT_JOIN_INSTANCE_ID_REGISTER = ( D3D11_TRACE_INPUT_FORK_INSTANCE_ID_REGISTER + 1 ) , 142 D3D11_TRACE_INPUT_CONTROL_POINT_REGISTER = ( D3D11_TRACE_INPUT_JOIN_INSTANCE_ID_REGISTER + 1 ) , 143 D3D11_TRACE_OUTPUT_CONTROL_POINT_REGISTER = ( D3D11_TRACE_INPUT_CONTROL_POINT_REGISTER + 1 ) , 144 D3D11_TRACE_INPUT_PATCH_CONSTANT_REGISTER = ( D3D11_TRACE_OUTPUT_CONTROL_POINT_REGISTER + 1 ) , 145 D3D11_TRACE_INPUT_DOMAIN_POINT_REGISTER = ( D3D11_TRACE_INPUT_PATCH_CONSTANT_REGISTER + 1 ) , 146 D3D11_TRACE_UNORDERED_ACCESS_VIEW = ( D3D11_TRACE_INPUT_DOMAIN_POINT_REGISTER + 1 ) , 147 D3D11_TRACE_THREAD_GROUP_SHARED_MEMORY = ( D3D11_TRACE_UNORDERED_ACCESS_VIEW + 1 ) , 148 D3D11_TRACE_INPUT_THREAD_ID_REGISTER = ( D3D11_TRACE_THREAD_GROUP_SHARED_MEMORY + 1 ) , 149 D3D11_TRACE_INPUT_THREAD_GROUP_ID_REGISTER = ( D3D11_TRACE_INPUT_THREAD_ID_REGISTER + 1 ) , 150 D3D11_TRACE_INPUT_THREAD_ID_IN_GROUP_REGISTER = ( D3D11_TRACE_INPUT_THREAD_GROUP_ID_REGISTER + 1 ) , 151 D3D11_TRACE_INPUT_COVERAGE_MASK_REGISTER = ( D3D11_TRACE_INPUT_THREAD_ID_IN_GROUP_REGISTER + 1 ) , 152 D3D11_TRACE_INPUT_THREAD_ID_IN_GROUP_FLATTENED_REGISTER = ( D3D11_TRACE_INPUT_COVERAGE_MASK_REGISTER + 1 ) , 153 D3D11_TRACE_INPUT_GS_INSTANCE_ID_REGISTER = ( D3D11_TRACE_INPUT_THREAD_ID_IN_GROUP_FLATTENED_REGISTER + 1 ) , 154 D3D11_TRACE_OUTPUT_DEPTH_GREATER_EQUAL_REGISTER = ( D3D11_TRACE_INPUT_GS_INSTANCE_ID_REGISTER + 1 ) , 155 D3D11_TRACE_OUTPUT_DEPTH_LESS_EQUAL_REGISTER = ( D3D11_TRACE_OUTPUT_DEPTH_GREATER_EQUAL_REGISTER + 1 ) , 156 D3D11_TRACE_IMMEDIATE64 = ( D3D11_TRACE_OUTPUT_DEPTH_LESS_EQUAL_REGISTER + 1 ) , 157 D3D11_TRACE_INPUT_CYCLE_COUNTER_REGISTER = ( D3D11_TRACE_IMMEDIATE64 + 1 ) , 158 D3D11_TRACE_INTERFACE_POINTER = ( D3D11_TRACE_INPUT_CYCLE_COUNTER_REGISTER + 1 ) 159 } 160 161 enum D3D11_TRACE_REGISTER_FLAGS_RELATIVE_INDEXING = 0x1; 162 struct D3D11_TRACE_REGISTER 163 { 164 D3D11_TRACE_REGISTER_TYPE RegType; 165 union 166 { 167 UINT16 Index1D; 168 UINT16[2] Index2D; 169 } 170 UINT8 OperandIndex; 171 UINT8 Flags; 172 } 173 174 enum D3D11_TRACE_MISC_GS_EMIT = 0x1; 175 enum D3D11_TRACE_MISC_GS_CUT = 0x2; 176 enum D3D11_TRACE_MISC_PS_DISCARD = 0x4; 177 enum D3D11_TRACE_MISC_GS_EMIT_STREAM = 0x8; 178 enum D3D11_TRACE_MISC_GS_CUT_STREAM = 0x10; 179 enum D3D11_TRACE_MISC_HALT = 0x20; 180 enum D3D11_TRACE_MISC_MESSAGE = 0x40; 181 alias D3D11_TRACE_MISC_OPERATIONS_MASK = UINT16; 182 183 struct D3D11_TRACE_STEP 184 { 185 UINT ID; 186 BOOL InstructionActive; 187 UINT8 NumRegistersWritten; 188 UINT8 NumRegistersRead; 189 D3D11_TRACE_MISC_OPERATIONS_MASK MiscOperations; 190 UINT OpcodeType; 191 UINT64 CurrentGlobalCycle; 192 } 193 194 mixin( uuid!(ID3D11ShaderTrace, "36b013e6-2811-4845-baa7-d623fe0df104") ); 195 interface ID3D11ShaderTrace : IUnknown 196 { 197 extern(Windows): 198 public: 199 HRESULT TraceReady( 200 /*out*/ UINT64* pTestCount); 201 202 void ResetTrace(); 203 204 HRESULT GetTraceStats( 205 /*out*/ D3D11_TRACE_STATS* pTraceStats); 206 207 HRESULT PSSelectStamp( 208 UINT stampIndex); 209 210 HRESULT GetInitialRegisterContents( 211 D3D11_TRACE_REGISTER *pRegister, 212 /*out*/ D3D11_TRACE_VALUE* pValue) ; 213 214 HRESULT GetStep( 215 UINT stepIndex, 216 /*out*/ D3D11_TRACE_STEP* pTraceStep); 217 218 HRESULT GetWrittenRegister( 219 UINT stepIndex, 220 UINT writtenRegisterIndex, 221 /*out*/ D3D11_TRACE_REGISTER* pRegister, 222 /*out*/ D3D11_TRACE_VALUE* pValue); 223 224 HRESULT GetReadRegister( 225 UINT stepIndex, 226 UINT readRegisterIndex, 227 /*out*/ D3D11_TRACE_REGISTER* pRegister, 228 /*out*/ D3D11_TRACE_VALUE* pValue); 229 } 230 231 mixin( uuid!(ID3D11ShaderTraceFactory, "1fbad429-66ab-41cc-9617-667ac10e4459") ); 232 interface ID3D11ShaderTraceFactory : IUnknown 233 { 234 extern(Windows): 235 HRESULT CreateShaderTrace( 236 IUnknown pShader, 237 D3D11_SHADER_TRACE_DESC* pTraceDesc, 238 /*out*/ ID3D11ShaderTrace* ppShaderTrace); 239 240 } 241 242 243 extern(Windows): 244 HRESULT D3DDisassemble11Trace( LPCVOID pSrcData, 245 SIZE_T SrcDataSize, 246 ID3D11ShaderTrace pTrace, 247 UINT StartStep, 248 UINT NumSteps, 249 UINT Flags, 250 /*out*/ID3D10Blob* ppDisassembly); 251 }