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 }