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 }