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 }