1 module aurora.directx.d3d11.d3d11shadertracing; 2 3 public import aurora.directx.d3d.d3dcommon; 4 5 public: 6 7 /// 8 /// Constants 9 /// 10 11 enum int COMPONENT_X = 0x1; 12 enum int COMPONENT_Y = 0x2; 13 enum int COMPONENT_Z = 0x4; 14 enum int COMPONENT_W = 0x8; 15 16 enum int D3D11_SHADER_TRACE_FLAG_RECORD_REGISTER_WRITES = 0x1; 17 enum int D3D11_SHADER_TRACE_FLAG_RECORD_REGISTER_READS = 0x2; 18 19 alias ubyte COMPONENT_MASK; 20 21 enum int D3D11_TRACE_MISC_GS_EMIT = 0x1; 22 enum int D3D11_TRACE_MISC_GS_CUT = 0x2; 23 enum int D3D11_TRACE_MISC_PS_DISCARD = 0x4; 24 enum int D3D11_TRACE_MISC_GS_EMIT_STREAM = 0x8; 25 enum int D3D11_TRACE_MISC_GS_CUT_STREAM = 0x10; 26 enum int D3D11_TRACE_MISC_HALT = 0x20; 27 enum int D3D11_TRACE_MISC_MESSAGE = 0x40; 28 29 alias ushort D3D11_TRACE_MISC_OPERATIONS_MASK; 30 31 /// 32 /// Functions 33 /// 34 35 extern(Windows) { 36 HRESULT D3DDisassemble11Trace(const void *pSrcData, size_t SrcDataSize, ID3D11ShaderTrace pTrace, uint StartStep, uint NumSteps, uint Flags, ID3D10Blob* ppDisassembly); 37 } 38 39 /// 40 /// Enumerations 41 /// 42 43 enum D3D11_SHADER_TYPE 44 { 45 D3D11_VERTEX_SHADER = 1, 46 D3D11_HULL_SHADER = 2, 47 D3D11_DOMAIN_SHADER = 3, 48 D3D11_GEOMETRY_SHADER = 4, 49 D3D11_PIXEL_SHADER = 5, 50 D3D11_COMPUTE_SHADER = 6 51 } 52 53 enum D3D11_TRACE_GS_INPUT_PRIMITIVE 54 { 55 UNDEFINED = 0, 56 POINT = 1, 57 LINE = 2, 58 TRIANGLE = 3, 59 LINE_ADJ = 6, 60 TRIANGLE_ADJ = 7 61 } 62 63 enum D3D11_TRACE_REGISTER_TYPE 64 { 65 OUTPUT_NULL_REGISTER = 0, 66 INPUT_REGISTER = ( OUTPUT_NULL_REGISTER + 1 ) , 67 INPUT_PRIMITIVE_ID_REGISTER = ( INPUT_REGISTER + 1 ) , 68 IMMEDIATE_CONSTANT_BUFFER = ( INPUT_PRIMITIVE_ID_REGISTER + 1 ) , 69 TEMP_REGISTER = ( IMMEDIATE_CONSTANT_BUFFER + 1 ) , 70 INDEXABLE_TEMP_REGISTER = ( TEMP_REGISTER + 1 ) , 71 OUTPUT_REGISTER = ( INDEXABLE_TEMP_REGISTER + 1 ) , 72 OUTPUT_DEPTH_REGISTER = ( OUTPUT_REGISTER + 1 ) , 73 CONSTANT_BUFFER = ( OUTPUT_DEPTH_REGISTER + 1 ) , 74 IMMEDIATE32 = ( CONSTANT_BUFFER + 1 ) , 75 SAMPLER = ( IMMEDIATE32 + 1 ) , 76 RESOURCE = ( SAMPLER + 1 ) , 77 RASTERIZER = ( RESOURCE + 1 ) , 78 OUTPUT_COVERAGE_MASK = ( RASTERIZER + 1 ) , 79 STREAM = ( OUTPUT_COVERAGE_MASK + 1 ) , 80 THIS_POINTER = ( STREAM + 1 ) , 81 OUTPUT_CONTROL_POINT_ID_REGISTER = ( THIS_POINTER + 1 ) , 82 INPUT_FORK_INSTANCE_ID_REGISTER = ( OUTPUT_CONTROL_POINT_ID_REGISTER + 1 ) , 83 INPUT_JOIN_INSTANCE_ID_REGISTER = ( INPUT_FORK_INSTANCE_ID_REGISTER + 1 ) , 84 INPUT_CONTROL_POINT_REGISTER = ( INPUT_JOIN_INSTANCE_ID_REGISTER + 1 ) , 85 OUTPUT_CONTROL_POINT_REGISTER = ( INPUT_CONTROL_POINT_REGISTER + 1 ) , 86 INPUT_PATCH_CONSTANT_REGISTER = ( OUTPUT_CONTROL_POINT_REGISTER + 1 ) , 87 INPUT_DOMAIN_POINT_REGISTER = ( INPUT_PATCH_CONSTANT_REGISTER + 1 ) , 88 UNORDERED_ACCESS_VIEW = ( INPUT_DOMAIN_POINT_REGISTER + 1 ) , 89 THREAD_GROUP_SHARED_MEMORY = ( UNORDERED_ACCESS_VIEW + 1 ) , 90 INPUT_THREAD_ID_REGISTER = ( THREAD_GROUP_SHARED_MEMORY + 1 ) , 91 INPUT_THREAD_GROUP_ID_REGISTER = ( INPUT_THREAD_ID_REGISTER + 1 ) , 92 INPUT_THREAD_ID_IN_GROUP_REGISTER = ( INPUT_THREAD_GROUP_ID_REGISTER + 1 ) , 93 INPUT_COVERAGE_MASK_REGISTER = ( INPUT_THREAD_ID_IN_GROUP_REGISTER + 1 ) , 94 INPUT_THREAD_ID_IN_GROUP_FLATTENED_REGISTER = ( INPUT_COVERAGE_MASK_REGISTER + 1 ) , 95 INPUT_GS_INSTANCE_ID_REGISTER = ( INPUT_THREAD_ID_IN_GROUP_FLATTENED_REGISTER + 1 ) , 96 OUTPUT_DEPTH_GREATER_EQUAL_REGISTER = ( INPUT_GS_INSTANCE_ID_REGISTER + 1 ) , 97 OUTPUT_DEPTH_LESS_EQUAL_REGISTER = ( OUTPUT_DEPTH_GREATER_EQUAL_REGISTER + 1 ) , 98 IMMEDIATE64 = ( OUTPUT_DEPTH_LESS_EQUAL_REGISTER + 1 ) , 99 INPUT_CYCLE_COUNTER_REGISTER = ( IMMEDIATE64 + 1 ) , 100 INTERFACE_POINTER = ( INPUT_CYCLE_COUNTER_REGISTER + 1 ) 101 } 102 103 /// 104 /// Structures 105 /// 106 107 struct D3D11_TRACE_REGISTER 108 { 109 D3D11_TRACE_REGISTER_TYPE RegType; 110 union 111 { 112 ushort Index1D; 113 ushort[2] Index2D; 114 }; 115 ubyte OperandIndex; 116 ubyte Flags; 117 } 118 119 struct D3D11_VERTEX_SHADER_TRACE_DESC 120 { 121 ulong Invocation; 122 } 123 124 struct D3D11_HULL_SHADER_TRACE_DESC 125 { 126 ulong Invocation; 127 } 128 129 struct D3D11_DOMAIN_SHADER_TRACE_DESC 130 { 131 ulong Invocation; 132 } 133 134 struct D3D11_GEOMETRY_SHADER_TRACE_DESC 135 { 136 ulong Invocation; 137 } 138 139 struct D3D11_PIXEL_SHADER_TRACE_DESC 140 { 141 ulong Invocation; 142 int X; 143 int Y; 144 ulong SampleMask; 145 } 146 147 struct D3D11_COMPUTE_SHADER_TRACE_DESC 148 { 149 ulong Invocation; 150 uint[3] ThreadIDInGroup; 151 uint[3] ThreadGroupID; 152 } 153 154 struct D3D11_SHADER_TRACE_DESC 155 { 156 D3D11_SHADER_TYPE Type; 157 uint Flags; 158 union 159 { 160 D3D11_VERTEX_SHADER_TRACE_DESC VertexShaderTraceDesc; 161 D3D11_HULL_SHADER_TRACE_DESC HullShaderTraceDesc; 162 D3D11_DOMAIN_SHADER_TRACE_DESC DomainShaderTraceDesc; 163 D3D11_GEOMETRY_SHADER_TRACE_DESC GeometryShaderTraceDesc; 164 D3D11_PIXEL_SHADER_TRACE_DESC PixelShaderTraceDesc; 165 D3D11_COMPUTE_SHADER_TRACE_DESC ComputeShaderTraceDesc; 166 }; 167 } 168 169 struct D3D11_TRACE_STATS 170 { 171 D3D11_SHADER_TRACE_DESC TraceDesc; 172 ubyte NumInvocationsInStamp; 173 ubyte TargetStampIndex; 174 uint NumTraceSteps; 175 COMPONENT_MASK[32] InputMask; 176 COMPONENT_MASK[32] OutputMask; 177 ushort NumTemps; 178 ushort MaxIndexableTempIndex; 179 ushort[4096] IndexableTempSize; 180 ushort ImmediateConstantBufferSize; 181 uint[4][2] PixelPosition; 182 ulong[4] PixelCoverageMask; 183 ulong[4] PixelDiscardedMask; 184 ulong[4] PixelCoverageMaskAfterShader; 185 ulong[4] PixelCoverageMaskAfterA2CSampleMask; 186 ulong[4] PixelCoverageMaskAfterA2CSampleMaskDepth; 187 ulong[4] PixelCoverageMaskAfterA2CSampleMaskDepthStencil; 188 bool PSOutputsDepth; 189 bool PSOutputsMask; 190 D3D11_TRACE_GS_INPUT_PRIMITIVE GSInputPrimitive; 191 bool GSInputsPrimitiveID; 192 COMPONENT_MASK[32] HSOutputPatchConstantMask; 193 COMPONENT_MASK[32] DSInputPatchConstantMask; 194 } 195 196 struct D3D11_TRACE_VALUE 197 { 198 uint[4] Bits; 199 COMPONENT_MASK ValidMask; 200 } 201 202 struct D3D11_TRACE_STEP 203 { 204 uint ID; 205 bool InstructionActive; 206 ubyte NumRegistersWritten; 207 ubyte NumRegistersRead; 208 D3D11_TRACE_MISC_OPERATIONS_MASK MiscOperations; 209 uint OpcodeType; 210 ulong CurrentGlobalCycle; 211 } 212 213 /// 214 /// Interfaces 215 /// 216 217 mixin(uuid!(ID3D11ShaderTrace, "36b013e6-2811-4845-baa7-d623fe0df104")); 218 public interface ID3D11ShaderTrace : IUnknown 219 { 220 extern(Windows): 221 HRESULT GetInitialRegisterContents(D3D11_TRACE_REGISTER *pRegister, D3D11_TRACE_VALUE *pValue); 222 HRESULT GetReadRegister(uint stepIndex, uint readRegisterIndex, D3D11_TRACE_REGISTER *pRegister, D3D11_TRACE_VALUE *pValue); 223 HRESULT GetStep(uint stepIndex, D3D11_TRACE_STEP *pTraceStep); 224 HRESULT GetTraceStats(D3D11_TRACE_STATS *pTraceStats); 225 HRESULT GetWrittenRegister(uint stepIndex, uint writtenRegisterIndex, D3D11_TRACE_REGISTER *pRegister, D3D11_TRACE_VALUE *pValue); 226 HRESULT PSSelectStamp(uint stampIndex); 227 void ResetTrace(); 228 HRESULT TraceReady(ulong *pTestCount); 229 } 230 231 mixin(uuid!(ID3D11ShaderTraceFactory, "1fbad429-66ab-41cc-9617-667ac10e4459")); 232 public interface ID3D11ShaderTraceFactory : IUnknown 233 { 234 extern(Windows): 235 HRESULT CreateShaderTrace(IUnknown pShader, D3D11_SHADER_TRACE_DESC *pTraceDesc, ID3D11ShaderTrace *ppShaderTrace); 236 }