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