blob: f35c8dfef225edba06d123695ea34e468c49d60d [file] [log] [blame]
José Fonsecaf6b0dfe2012-04-23 00:42:44 +01001/**************************************************************************
2 *
3 * Copyright 2011 Jose Fonseca
4 * All Rights Reserved.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE.
23 *
24 **************************************************************************/
25
José Fonsecaf6b0dfe2012-04-23 00:42:44 +010026
José Fonseca5773beb2012-11-14 11:46:58 +000027#include <stdio.h>
José Fonsecaf6b0dfe2012-04-23 00:42:44 +010028
José Fonsecad63a3612012-05-08 23:41:35 +010029#include <iostream>
José Fonseca54105f02015-03-12 12:07:42 +000030#include <type_traits>
José Fonsecad63a3612012-05-08 23:41:35 +010031
José Fonseca1df5ed82014-06-13 10:45:46 +010032#include "com_ptr.hpp"
José Fonseca5773beb2012-11-14 11:46:58 +000033#include "d3d11imports.hpp"
José Fonseca1592ad22012-12-04 13:04:14 +000034#include "d3d10state.hpp"
José Fonseca6f4fd6a2015-03-05 15:43:01 +000035#include "dxgistate_so.hpp"
Zack Rusin1cb7b772018-02-09 11:36:11 -050036#include "dxgistate.hpp"
José Fonsecaf6b0dfe2012-04-23 00:42:44 +010037
38
39namespace d3dstate {
40
41
Jose Fonseca456a0ba2015-03-19 20:05:25 +000042// Ensure ExtractDescType template is sane
43static_assert( std::is_same< ExtractDescType< decltype( &ID3D11BlendState::GetDesc ) >::type, D3D11_BLEND_DESC >::value, "type mismatch" );
44
45
José Fonseca1592ad22012-12-04 13:04:14 +000046static void
Jose Fonsecae8ba0792015-05-01 12:38:03 +010047dumpRasterizerState(StateWriter &writer, ID3D11DeviceContext *pDeviceContext)
Zack Rusin86bd4992015-03-03 21:50:43 -050048{
49 com_ptr<ID3D11RasterizerState> pRasterizerState;
50
51 pDeviceContext->RSGetState(&pRasterizerState);
Jose Fonsecae8ba0792015-05-01 12:38:03 +010052 writer.beginMember("RasterizerState");
53 dumpStateObjectDesc(writer, pRasterizerState);
54 writer.endMember(); // RasterizerState
Zack Rusin86bd4992015-03-03 21:50:43 -050055}
56
57
58static void
Jose Fonsecae8ba0792015-05-01 12:38:03 +010059dumpBlendState(StateWriter &writer, ID3D11DeviceContext *pDeviceContext)
José Fonseca6f4fd6a2015-03-05 15:43:01 +000060{
61 com_ptr<ID3D11BlendState> pBlendState;
62 FLOAT BlendFactor[4];
63 UINT SampleMask;
64
65 pDeviceContext->OMGetBlendState(&pBlendState, BlendFactor, &SampleMask);
José Fonseca54105f02015-03-12 12:07:42 +000066
Jose Fonsecae8ba0792015-05-01 12:38:03 +010067 writer.beginMember("BlendState");
68 dumpStateObjectDesc(writer, pBlendState);
69 writer.endMember(); // BlendState
Zack Rusin1cb7b772018-02-09 11:36:11 -050070
Jose Fonsecae8ba0792015-05-01 12:38:03 +010071 writer.beginMember("BlendFactor");
72 writer.beginArray();
73 writer.writeFloat(BlendFactor[0]);
74 writer.writeFloat(BlendFactor[1]);
75 writer.writeFloat(BlendFactor[2]);
76 writer.writeFloat(BlendFactor[3]);
77 writer.endArray();
78 writer.endMember(); // BlendFactor
José Fonseca6f4fd6a2015-03-05 15:43:01 +000079
Jose Fonsecae8ba0792015-05-01 12:38:03 +010080 writer.writeIntMember("SampleMask", SampleMask);
José Fonseca6f4fd6a2015-03-05 15:43:01 +000081}
82
83
84static void
Jose Fonsecae8ba0792015-05-01 12:38:03 +010085dumpDepthStencilState(StateWriter &writer, ID3D11DeviceContext *pDeviceContext)
Zack Rusinacca7d22015-03-18 22:47:17 -040086{
87 com_ptr<ID3D11DepthStencilState> pDepthStencilState;
88 UINT stencilRef;
89
90 pDeviceContext->OMGetDepthStencilState(&pDepthStencilState, &stencilRef);
Jose Fonsecae8ba0792015-05-01 12:38:03 +010091 writer.beginMember("DepthStencilState");
92 dumpStateObjectDesc(writer, pDepthStencilState);
93 writer.endMember(); // DepthStencilState
94 writer.writeIntMember("StencilRef", stencilRef);
Zack Rusinacca7d22015-03-18 22:47:17 -040095}
96
97
98static void
Zack Rusin4398f8b2015-06-29 15:40:42 -040099dumpViewports(StateWriter &writer, ID3D11DeviceContext *pDeviceContext)
100{
101 D3D11_VIEWPORT vps[D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE];
102 UINT numViewports = 0, i;
103
104 pDeviceContext->RSGetViewports(&numViewports, NULL);
105 pDeviceContext->RSGetViewports(&numViewports, vps);
106
107 writer.beginMember("Viewports");
108 writer.beginArray();
109 for (i = 0; i < numViewports; ++i) {
110 dumpStateObject(writer, vps[i]);
111 }
112 writer.endArray();
113 writer.endMember();
114}
115
116
117static void
118dumpScissors(StateWriter &writer, ID3D11DeviceContext *pDeviceContext)
119{
120 D3D11_RECT rects[D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE];
121 UINT numRects = 0, i;
122
123 pDeviceContext->RSGetScissorRects(&numRects, NULL);
124 pDeviceContext->RSGetScissorRects(&numRects, rects);
125
126 writer.beginMember("Scissors");
127 writer.beginArray();
128 for (i = 0; i < numRects; ++i) {
129 dumpStateObject(writer, rects[i]);
130 }
131 writer.endArray();
132 writer.endMember();
133}
134
135
136static void
Zack Rusin9428d0a2019-06-27 11:45:45 -0400137dumpTopology(StateWriter &writer, ID3D11DeviceContext *pDeviceContext)
138{
139 D3D11_PRIMITIVE_TOPOLOGY topology;
140
141 pDeviceContext->IAGetPrimitiveTopology(&topology);
142 writer.beginMember("Topology");
143 dumpStateObject(writer, topology);
144 writer.endMember();
145}
146
147
148static void
Jose Fonsecae8ba0792015-05-01 12:38:03 +0100149dumpParameters(StateWriter &writer, ID3D11DeviceContext *pDeviceContext)
José Fonseca6f4fd6a2015-03-05 15:43:01 +0000150{
151 // TODO: dump description of current bound state
Jose Fonsecae8ba0792015-05-01 12:38:03 +0100152 writer.beginMember("parameters");
153 writer.beginObject();
José Fonseca6f4fd6a2015-03-05 15:43:01 +0000154
Jose Fonsecab059dd82017-07-20 13:13:44 +0100155 D3D11_DEVICE_CONTEXT_TYPE Type = pDeviceContext->GetType();
156 writer.beginMember("Type");
157 dumpStateObject(writer, Type);
158 writer.endMember(); // Type
159
Jose Fonsecae8ba0792015-05-01 12:38:03 +0100160 dumpRasterizerState(writer, pDeviceContext);
161 dumpBlendState(writer, pDeviceContext);
162 dumpDepthStencilState(writer, pDeviceContext);
Zack Rusin4398f8b2015-06-29 15:40:42 -0400163 dumpViewports(writer, pDeviceContext);
164 dumpScissors(writer, pDeviceContext);
Zack Rusin9428d0a2019-06-27 11:45:45 -0400165 dumpTopology(writer, pDeviceContext);
José Fonseca6f4fd6a2015-03-05 15:43:01 +0000166
Jose Fonsecae8ba0792015-05-01 12:38:03 +0100167 writer.endObject();
168 writer.endMember(); // parameters
José Fonseca6f4fd6a2015-03-05 15:43:01 +0000169}
170
171
172static void
Jose Fonsecae8ba0792015-05-01 12:38:03 +0100173dumpShaders(StateWriter &writer, ID3D11DeviceContext *pDeviceContext)
José Fonseca1592ad22012-12-04 13:04:14 +0000174{
Jose Fonsecae8ba0792015-05-01 12:38:03 +0100175 writer.beginMember("shaders");
176 writer.beginObject();
José Fonseca1592ad22012-12-04 13:04:14 +0000177
José Fonseca1df5ed82014-06-13 10:45:46 +0100178 com_ptr<ID3D11VertexShader> pVertexShader;
José Fonseca1592ad22012-12-04 13:04:14 +0000179 pDeviceContext->VSGetShader(&pVertexShader, NULL, NULL);
180 if (pVertexShader) {
Jose Fonsecae8ba0792015-05-01 12:38:03 +0100181 dumpShader<ID3D11DeviceChild>(writer, "VS", pVertexShader);
José Fonseca1592ad22012-12-04 13:04:14 +0000182 }
183
Jose Fonseca0c7d9ee2015-02-05 07:39:54 +0000184 com_ptr<ID3D11HullShader> pHullShader;
185 pDeviceContext->HSGetShader(&pHullShader, NULL, NULL);
186 if (pHullShader) {
Jose Fonsecae8ba0792015-05-01 12:38:03 +0100187 dumpShader<ID3D11DeviceChild>(writer, "HS", pHullShader);
Jose Fonseca0c7d9ee2015-02-05 07:39:54 +0000188 }
189
190 com_ptr<ID3D11DomainShader> pDomainShader;
191 pDeviceContext->DSGetShader(&pDomainShader, NULL, NULL);
192 if (pDomainShader) {
Jose Fonsecae8ba0792015-05-01 12:38:03 +0100193 dumpShader<ID3D11DeviceChild>(writer, "DS", pDomainShader);
Jose Fonseca0c7d9ee2015-02-05 07:39:54 +0000194 }
195
José Fonseca1df5ed82014-06-13 10:45:46 +0100196 com_ptr<ID3D11GeometryShader> pGeometryShader;
José Fonseca1592ad22012-12-04 13:04:14 +0000197 pDeviceContext->GSGetShader(&pGeometryShader, NULL, NULL);
198 if (pGeometryShader) {
Jose Fonsecae8ba0792015-05-01 12:38:03 +0100199 dumpShader<ID3D11DeviceChild>(writer, "GS", pGeometryShader);
José Fonseca1592ad22012-12-04 13:04:14 +0000200 }
201
José Fonseca1df5ed82014-06-13 10:45:46 +0100202 com_ptr<ID3D11PixelShader> pPixelShader;
José Fonseca1592ad22012-12-04 13:04:14 +0000203 pDeviceContext->PSGetShader(&pPixelShader, NULL, NULL);
204 if (pPixelShader) {
Jose Fonsecae8ba0792015-05-01 12:38:03 +0100205 dumpShader<ID3D11DeviceChild>(writer, "PS", pPixelShader);
José Fonseca1592ad22012-12-04 13:04:14 +0000206 }
207
Yu Wangde5211b2017-12-03 19:26:35 -0800208 com_ptr<ID3D11ComputeShader> pComputeShader;
209 pDeviceContext->CSGetShader(&pComputeShader, NULL, NULL);
210 if (pComputeShader) {
211 dumpShader<ID3D11DeviceChild>(writer, "CS", pComputeShader);
212 }
Jose Fonsecab059dd82017-07-20 13:13:44 +0100213
Jose Fonsecae8ba0792015-05-01 12:38:03 +0100214 writer.endObject();
215 writer.endMember(); // shaders
José Fonseca1592ad22012-12-04 13:04:14 +0000216}
217
218
Zack Rusin1cb7b772018-02-09 11:36:11 -0500219static void
220dumpConstantBuffers(StateWriter &writer, ID3D11DeviceContext *pDeviceContext)
221{
222 writer.beginMember("uniforms");
223 writer.beginObject();
224 if (pDeviceContext->GetType() != D3D11_DEVICE_CONTEXT_DEFERRED) {
225 ID3D11Buffer *pConstantBuffers[D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT];
226
227 pDeviceContext->VSGetConstantBuffers(0, ARRAYSIZE(pConstantBuffers), pConstantBuffers);
228 dumpBuffers(writer, "VS", ARRAYSIZE(pConstantBuffers), pConstantBuffers);
229
230 pDeviceContext->HSGetConstantBuffers(0, ARRAYSIZE(pConstantBuffers), pConstantBuffers);
231 dumpBuffers(writer, "HS", ARRAYSIZE(pConstantBuffers), pConstantBuffers);
232
233 pDeviceContext->DSGetConstantBuffers(0, ARRAYSIZE(pConstantBuffers), pConstantBuffers);
234 dumpBuffers(writer, "DS", ARRAYSIZE(pConstantBuffers), pConstantBuffers);
235
236 pDeviceContext->GSGetConstantBuffers(0, ARRAYSIZE(pConstantBuffers), pConstantBuffers);
237 dumpBuffers(writer, "GS", ARRAYSIZE(pConstantBuffers), pConstantBuffers);
238
239 pDeviceContext->PSGetConstantBuffers(0, ARRAYSIZE(pConstantBuffers), pConstantBuffers);
240 dumpBuffers(writer, "PS", ARRAYSIZE(pConstantBuffers), pConstantBuffers);
241
242 }
243 writer.endObject();
244 writer.endMember();
245}
246
247
248static void
249dumpBuffers(StateWriter &writer, ID3D11DeviceContext *pDeviceContext)
250{
251 writer.beginMember("buffers");
252 writer.beginObject();
253
254 UINT numBuffers = D3D11_SO_BUFFER_SLOT_COUNT;
255 ID3D11Buffer *soBuffers[D3D11_SO_BUFFER_SLOT_COUNT];
256 pDeviceContext->SOGetTargets(numBuffers, soBuffers);
257 dumpBuffers(writer, "SO", ARRAYSIZE(soBuffers), soBuffers);
258
259 ID3D11Buffer *vertexBuffers[D3D11_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT];
260 UINT strides[D3D11_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT];
261 UINT offsets[D3D11_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT];
262 pDeviceContext->IAGetVertexBuffers(0, ARRAYSIZE(vertexBuffers),
263 vertexBuffers, strides, offsets);
264 bool hasVBs = false;
265 for (UINT i = 0; i < ARRAYSIZE(vertexBuffers); ++i) {
266 hasVBs = hasVBs || (vertexBuffers[i] != 0);
267 }
268 if (hasVBs) {
269 writer.beginMember("Vertex Buffers");
270 writer.beginArray();
271 for (UINT i = 0; i < ARRAYSIZE(vertexBuffers); ++i) {
272 char label[64];
273 std::string name;
274
275 if (vertexBuffers[i]) {
276 name = getObjectName(vertexBuffers[i]);
277 _snprintf(label, sizeof label, "%s, stride: %d, offset: %d",
278 name.c_str(), strides[i], offsets[i]);
279 vertexBuffers[i]->Release();
280 } else {
281 _snprintf(label, sizeof label, "null");
282 }
283 writer.writeString(label);
284 }
285 writer.endArray();
286 writer.endMember();
287 }
288
289 ID3D11Buffer *indexBuffer = NULL;
290 DXGI_FORMAT iaFormat;
291 UINT iaOffset;
292 pDeviceContext->IAGetIndexBuffer(&indexBuffer, &iaFormat, &iaOffset);
293 if (indexBuffer) {
294 char label[64];
295 std::string formatName = d3dstate::getDXGIFormatName(iaFormat);
296 std::string name = getObjectName(indexBuffer);
297 _snprintf(label, sizeof label, "%s, format: %s, offset: %d",
298 name.c_str(), formatName.c_str(), iaOffset);
299 writer.writeStringMember("Index Buffer", label);
300 indexBuffer->Release();
301 }
302 writer.endObject();
303 writer.endMember();
304}
305
José Fonsecad63a3612012-05-08 23:41:35 +0100306void
Jose Fonsecae8ba0792015-05-01 12:38:03 +0100307dumpDevice(StateWriter &writer, ID3D11DeviceContext *pDeviceContext)
José Fonseca5773beb2012-11-14 11:46:58 +0000308{
Jose Fonsecae8ba0792015-05-01 12:38:03 +0100309 dumpParameters(writer, pDeviceContext);
José Fonseca5773beb2012-11-14 11:46:58 +0000310
Jose Fonsecae8ba0792015-05-01 12:38:03 +0100311 dumpShaders(writer, pDeviceContext);
José Fonseca1592ad22012-12-04 13:04:14 +0000312
Zack Rusin1cb7b772018-02-09 11:36:11 -0500313 dumpConstantBuffers(writer, pDeviceContext);
Jose Fonsecaca335e02015-02-05 07:44:18 +0000314
Zack Rusin1cb7b772018-02-09 11:36:11 -0500315 dumpBuffers(writer, pDeviceContext);
Jose Fonsecaca335e02015-02-05 07:44:18 +0000316
Jose Fonsecae8ba0792015-05-01 12:38:03 +0100317 dumpTextures(writer, pDeviceContext);
José Fonseca1592ad22012-12-04 13:04:14 +0000318
Jose Fonsecae8ba0792015-05-01 12:38:03 +0100319 dumpFramebuffer(writer, pDeviceContext);
José Fonseca5773beb2012-11-14 11:46:58 +0000320}
José Fonsecad63a3612012-05-08 23:41:35 +0100321
322
José Fonsecaf6b0dfe2012-04-23 00:42:44 +0100323} /* namespace d3dstate */