blob: 4c9f3c9b12d1473470c10bc6050d0e76755463fe [file] [log] [blame]
José Fonsecad63a3612012-05-08 23:41:35 +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
26
Jose Fonseca64c4fdf2017-07-30 12:55:32 +010027#include <assert.h>
José Fonseca3379d422012-09-20 12:29:16 +010028#include <stdio.h>
29
José Fonsecad63a3612012-05-08 23:41:35 +010030#include <iostream>
Patrick Rudolph94202882016-09-04 17:15:16 +020031#include <sstream>
Jose Fonseca64c4fdf2017-07-30 12:55:32 +010032#include <memory>
José Fonsecad63a3612012-05-08 23:41:35 +010033
Jose Fonsecae8ba0792015-05-01 12:38:03 +010034#include "state_writer.hpp"
José Fonseca1df5ed82014-06-13 10:45:46 +010035#include "com_ptr.hpp"
José Fonsecad63a3612012-05-08 23:41:35 +010036#include "d3d9imports.hpp"
José Fonseca3b186822012-11-27 15:25:21 +000037#include "d3dshader.hpp"
José Fonseca9d8029d2012-12-05 12:00:37 +000038#include "d3dstate.hpp"
José Fonsecad63a3612012-05-08 23:41:35 +010039
40
41namespace d3dstate {
42
43
José Fonseca3379d422012-09-20 12:29:16 +010044template< class T >
45inline void
Jose Fonsecae8ba0792015-05-01 12:38:03 +010046dumpShader(StateWriter &writer, const char *name, T *pShader) {
José Fonseca3379d422012-09-20 12:29:16 +010047 if (!pShader) {
48 return;
49 }
50
51 HRESULT hr;
52
53 UINT SizeOfData = 0;
54
55 hr = pShader->GetFunction(NULL, &SizeOfData);
56 if (SUCCEEDED(hr)) {
Jose Fonseca64c4fdf2017-07-30 12:55:32 +010057 assert(SizeOfData % sizeof(DWORD) == 0);
58 std::unique_ptr<DWORD []> pData(new DWORD[SizeOfData / sizeof(DWORD)]);
59 hr = pShader->GetFunction(pData.get(), &SizeOfData);
60 if (SUCCEEDED(hr)) {
61 com_ptr<IDisassemblyBuffer> pDisassembly;
62 hr = DisassembleShader(pData.get(), &pDisassembly);
José Fonseca3379d422012-09-20 12:29:16 +010063 if (SUCCEEDED(hr)) {
Jose Fonseca64c4fdf2017-07-30 12:55:32 +010064 writer.beginMember(name);
65 writer.writeString((const char *)pDisassembly->GetBufferPointer() /*, pDisassembly->GetBufferSize() */);
66 writer.endMember();
José Fonseca3379d422012-09-20 12:29:16 +010067 }
José Fonseca3379d422012-09-20 12:29:16 +010068 }
69 }
70}
71
72static void
Jose Fonsecae8ba0792015-05-01 12:38:03 +010073dumpShaders(StateWriter &writer, IDirect3DDevice9 *pDevice)
José Fonseca3379d422012-09-20 12:29:16 +010074{
Jose Fonsecae8ba0792015-05-01 12:38:03 +010075 writer.beginMember("shaders");
José Fonseca3379d422012-09-20 12:29:16 +010076
77 HRESULT hr;
Jose Fonsecae8ba0792015-05-01 12:38:03 +010078 writer.beginObject();
José Fonseca3379d422012-09-20 12:29:16 +010079
José Fonseca1df5ed82014-06-13 10:45:46 +010080 com_ptr<IDirect3DVertexShader9> pVertexShader;
José Fonseca3379d422012-09-20 12:29:16 +010081 hr = pDevice->GetVertexShader(&pVertexShader);
82 if (SUCCEEDED(hr)) {
Jose Fonsecae8ba0792015-05-01 12:38:03 +010083 dumpShader<IDirect3DVertexShader9>(writer, "vertex", pVertexShader);
José Fonseca3379d422012-09-20 12:29:16 +010084 }
85
José Fonseca1df5ed82014-06-13 10:45:46 +010086 com_ptr<IDirect3DPixelShader9> pPixelShader;
José Fonseca3379d422012-09-20 12:29:16 +010087 hr = pDevice->GetPixelShader(&pPixelShader);
88 if (SUCCEEDED(hr)) {
Jose Fonsecae8ba0792015-05-01 12:38:03 +010089 dumpShader<IDirect3DPixelShader9>(writer, "pixel", pPixelShader);
José Fonseca3379d422012-09-20 12:29:16 +010090 }
91
Jose Fonsecae8ba0792015-05-01 12:38:03 +010092 writer.endObject();
93 writer.endMember(); // shaders
José Fonseca3379d422012-09-20 12:29:16 +010094}
95
Patrick Rudolph5d999b42016-08-03 17:44:26 +020096static void
Patrick Rudolph94202882016-09-04 17:15:16 +020097dumpTextureStates(StateWriter &writer, IDirect3DDevice9 *pDevice)
98{
99#define _DUMP_TS_INT(x) { \
100 DWORD rsDword = 0; \
101 pDevice->GetTextureStageState(i, x, &rsDword); \
102 writer.writeIntMember(#x, rsDword); \
103}
104
105#define _DUMP_TS_FLOAT(x) { \
106 float rsFloat = 0.0f; \
107 pDevice->GetTextureStageState(i, x, (DWORD *)&rsFloat); \
108 writer.writeFloatMember(#x, rsFloat); \
109}
110
111 for (int i = 0; i < 8; i++)
112 {
113 std::ostringstream oss;
114 oss << "TextureStageState" << i;
115 writer.beginMember(oss.str());
116 writer.beginObject();
117
118 _DUMP_TS_INT(D3DTSS_COLOROP);
119 _DUMP_TS_INT(D3DTSS_COLORARG1);
120 _DUMP_TS_INT(D3DTSS_COLORARG2);
121 _DUMP_TS_INT(D3DTSS_ALPHAOP);
122 _DUMP_TS_INT(D3DTSS_ALPHAARG1);
123 _DUMP_TS_INT(D3DTSS_ALPHAARG2);
124 _DUMP_TS_FLOAT(D3DTSS_BUMPENVMAT00);
125 _DUMP_TS_FLOAT(D3DTSS_BUMPENVMAT01);
126 _DUMP_TS_FLOAT(D3DTSS_BUMPENVMAT10);
127 _DUMP_TS_FLOAT(D3DTSS_BUMPENVMAT11);
128 _DUMP_TS_INT(D3DTSS_TEXCOORDINDEX);
129 _DUMP_TS_FLOAT(D3DTSS_BUMPENVLSCALE);
130 _DUMP_TS_FLOAT(D3DTSS_BUMPENVLOFFSET);
131 _DUMP_TS_INT(D3DTSS_TEXTURETRANSFORMFLAGS);
132 _DUMP_TS_INT(D3DTSS_COLORARG0);
133 _DUMP_TS_INT(D3DTSS_ALPHAARG0);
134 _DUMP_TS_INT(D3DTSS_RESULTARG);
135 _DUMP_TS_INT(D3DTSS_CONSTANT);
136
137 writer.endObject();
138 writer.endMember();
139 }
140
141#undef _DUMP_TS_INT
142#undef _DUMP_TS_FLOAT
143}
144
145static void
Tiziano Bacocco45ec91c2015-02-02 17:40:28 +0100146dumpViewport(StateWriter &writer, IDirect3DDevice9 *pDevice)
147{
148 writer.beginMember("Viewport");
149 writer.beginObject();
150
151 D3DVIEWPORT9 vp;
152 pDevice->GetViewport(&vp);
153 writer.writeIntMember("X", vp.X);
154 writer.writeIntMember("Y", vp.Y);
155 writer.writeIntMember("Width", vp.Width);
156 writer.writeIntMember("Height", vp.Height);
Jose Fonseca5791f6f2016-09-21 11:57:36 +0100157 writer.writeFloatMember("MinZ", vp.MinZ);
158 writer.writeFloatMember("MaxZ", vp.MaxZ);
Tiziano Bacocco45ec91c2015-02-02 17:40:28 +0100159
160 writer.endObject();
161 writer.endMember();
162}
163
164static void
Patrick Rudolph5d999b42016-08-03 17:44:26 +0200165dumpRenderstate(StateWriter &writer, IDirect3DDevice9 *pDevice)
166{
167#define _DUMP_RS_INT(x) { \
168 DWORD rsDword = 0; \
169 pDevice->GetRenderState(x, &rsDword); \
170 writer.writeIntMember(#x, rsDword); \
171}
172
173#define _DUMP_RS_FLOAT(x) { \
174 float rsFloat = 0.0f; \
175 pDevice->GetRenderState(x, (DWORD *)&rsFloat); \
176 writer.writeFloatMember(#x, rsFloat); \
177}
178
179 writer.beginMember("parameters");
180 writer.beginObject();
181
182 _DUMP_RS_INT(D3DRS_ZENABLE);
183 _DUMP_RS_INT(D3DRS_FILLMODE);
184 _DUMP_RS_INT(D3DRS_SHADEMODE);
185 _DUMP_RS_INT(D3DRS_ZWRITEENABLE);
186 _DUMP_RS_INT(D3DRS_ALPHATESTENABLE);
187 _DUMP_RS_INT(D3DRS_LASTPIXEL);
188 _DUMP_RS_INT(D3DRS_SRCBLEND);
189 _DUMP_RS_INT(D3DRS_DESTBLEND);
190 _DUMP_RS_INT(D3DRS_CULLMODE);
191 _DUMP_RS_INT(D3DRS_ZFUNC);
192 _DUMP_RS_INT(D3DRS_ALPHAREF);
193 _DUMP_RS_INT(D3DRS_ALPHAFUNC);
194 _DUMP_RS_INT(D3DRS_DITHERENABLE);
195 _DUMP_RS_INT(D3DRS_ALPHABLENDENABLE);
196 _DUMP_RS_INT(D3DRS_FOGENABLE);
197 _DUMP_RS_INT(D3DRS_SPECULARENABLE);
198 _DUMP_RS_INT(D3DRS_FOGCOLOR);
199 _DUMP_RS_INT(D3DRS_FOGTABLEMODE);
200 _DUMP_RS_FLOAT(D3DRS_FOGSTART);
201 _DUMP_RS_FLOAT(D3DRS_FOGEND);
202 _DUMP_RS_FLOAT(D3DRS_FOGDENSITY);
203 _DUMP_RS_INT(D3DRS_RANGEFOGENABLE);
204 _DUMP_RS_INT(D3DRS_STENCILENABLE);
205 _DUMP_RS_INT(D3DRS_STENCILFAIL);
206 _DUMP_RS_INT(D3DRS_STENCILZFAIL);
207 _DUMP_RS_INT(D3DRS_STENCILPASS);
208 _DUMP_RS_INT(D3DRS_STENCILFUNC);
209 _DUMP_RS_INT(D3DRS_STENCILREF);
210 _DUMP_RS_INT(D3DRS_STENCILMASK);
211 _DUMP_RS_INT(D3DRS_STENCILWRITEMASK);
212 _DUMP_RS_INT(D3DRS_TEXTUREFACTOR);
213 _DUMP_RS_INT(D3DRS_WRAP0);
214 _DUMP_RS_INT(D3DRS_WRAP1);
215 _DUMP_RS_INT(D3DRS_WRAP2);
216 _DUMP_RS_INT(D3DRS_WRAP3);
217 _DUMP_RS_INT(D3DRS_WRAP4);
218 _DUMP_RS_INT(D3DRS_WRAP5);
219 _DUMP_RS_INT(D3DRS_WRAP6);
220 _DUMP_RS_INT(D3DRS_WRAP7);
221 _DUMP_RS_INT(D3DRS_CLIPPING);
222 _DUMP_RS_INT(D3DRS_LIGHTING);
223 _DUMP_RS_FLOAT(D3DRS_AMBIENT);
224 _DUMP_RS_INT(D3DRS_FOGVERTEXMODE);
225 _DUMP_RS_INT(D3DRS_COLORVERTEX);
226 _DUMP_RS_INT(D3DRS_LOCALVIEWER);
227 _DUMP_RS_INT(D3DRS_NORMALIZENORMALS);
228 _DUMP_RS_INT(D3DRS_DIFFUSEMATERIALSOURCE);
229 _DUMP_RS_INT(D3DRS_SPECULARMATERIALSOURCE);
230 _DUMP_RS_INT(D3DRS_AMBIENTMATERIALSOURCE);
231 _DUMP_RS_INT(D3DRS_EMISSIVEMATERIALSOURCE);
232 _DUMP_RS_INT(D3DRS_VERTEXBLEND);
233 _DUMP_RS_INT(D3DRS_CLIPPLANEENABLE);
234 _DUMP_RS_FLOAT(D3DRS_POINTSIZE);
235 _DUMP_RS_FLOAT(D3DRS_POINTSIZE_MIN);
236 _DUMP_RS_INT(D3DRS_POINTSPRITEENABLE);
237 _DUMP_RS_INT(D3DRS_POINTSCALEENABLE);
238 _DUMP_RS_FLOAT(D3DRS_POINTSCALE_A);
239 _DUMP_RS_FLOAT(D3DRS_POINTSCALE_B);
240 _DUMP_RS_FLOAT(D3DRS_POINTSCALE_C);
241 _DUMP_RS_INT(D3DRS_MULTISAMPLEANTIALIAS);
242 _DUMP_RS_INT(D3DRS_MULTISAMPLEMASK);
243 _DUMP_RS_INT(D3DRS_PATCHEDGESTYLE);
244 _DUMP_RS_INT(D3DRS_DEBUGMONITORTOKEN);
245 _DUMP_RS_FLOAT(D3DRS_POINTSIZE_MAX);
246 _DUMP_RS_INT(D3DRS_INDEXEDVERTEXBLENDENABLE);
247 _DUMP_RS_INT(D3DRS_COLORWRITEENABLE);
248 _DUMP_RS_INT(D3DRS_TWEENFACTOR);
249 _DUMP_RS_INT(D3DRS_BLENDOP);
250 _DUMP_RS_INT(D3DRS_POSITIONDEGREE);
251 _DUMP_RS_INT(D3DRS_NORMALDEGREE);
252 _DUMP_RS_INT(D3DRS_SCISSORTESTENABLE);
253 _DUMP_RS_INT(D3DRS_SLOPESCALEDEPTHBIAS);
254 _DUMP_RS_INT(D3DRS_ANTIALIASEDLINEENABLE);
255 _DUMP_RS_INT(D3DRS_MINTESSELLATIONLEVEL);
256 _DUMP_RS_INT(D3DRS_MAXTESSELLATIONLEVEL);
257 _DUMP_RS_FLOAT(D3DRS_ADAPTIVETESS_X);
258 _DUMP_RS_FLOAT(D3DRS_ADAPTIVETESS_Y);
259 _DUMP_RS_FLOAT(D3DRS_ADAPTIVETESS_Z);
260 _DUMP_RS_FLOAT(D3DRS_ADAPTIVETESS_W);
261 _DUMP_RS_INT(D3DRS_ENABLEADAPTIVETESSELLATION);
262 _DUMP_RS_INT(D3DRS_TWOSIDEDSTENCILMODE);
263 _DUMP_RS_INT(D3DRS_CCW_STENCILFAIL);
264 _DUMP_RS_INT(D3DRS_CCW_STENCILZFAIL);
265 _DUMP_RS_INT(D3DRS_CCW_STENCILPASS);
266 _DUMP_RS_INT(D3DRS_CCW_STENCILFUNC);
267 _DUMP_RS_INT(D3DRS_COLORWRITEENABLE1);
268 _DUMP_RS_INT(D3DRS_COLORWRITEENABLE2);
269 _DUMP_RS_INT(D3DRS_COLORWRITEENABLE3);
270 _DUMP_RS_INT(D3DRS_BLENDFACTOR);
271 _DUMP_RS_INT(D3DRS_SRGBWRITEENABLE);
272 _DUMP_RS_FLOAT(D3DRS_DEPTHBIAS);
273 _DUMP_RS_INT(D3DRS_WRAP8);
274 _DUMP_RS_INT(D3DRS_WRAP9);
275 _DUMP_RS_INT(D3DRS_WRAP10);
276 _DUMP_RS_INT(D3DRS_WRAP11);
277 _DUMP_RS_INT(D3DRS_WRAP12);
278 _DUMP_RS_INT(D3DRS_WRAP13);
279 _DUMP_RS_INT(D3DRS_WRAP14);
280 _DUMP_RS_INT(D3DRS_WRAP15);
281 _DUMP_RS_INT(D3DRS_SEPARATEALPHABLENDENABLE);
282 _DUMP_RS_INT(D3DRS_SRCBLENDALPHA);
283 _DUMP_RS_INT(D3DRS_DESTBLENDALPHA);
284 _DUMP_RS_INT(D3DRS_BLENDOPALPHA);
285
286#undef _DUMP_RS_INT
287#undef _DUMP_RS_FLOAT
288
Tiziano Bacocco45ec91c2015-02-02 17:40:28 +0100289 dumpViewport(writer, pDevice);
290
Patrick Rudolph94202882016-09-04 17:15:16 +0200291 dumpTextureStates(writer, pDevice);
292
Patrick Rudolph5d999b42016-08-03 17:44:26 +0200293 writer.endObject();
294 writer.endMember();
295}
296
José Fonsecad63a3612012-05-08 23:41:35 +0100297void
Jose Fonsecae8ba0792015-05-01 12:38:03 +0100298dumpDevice(StateWriter &writer, IDirect3DDevice9 *pDevice)
José Fonsecad63a3612012-05-08 23:41:35 +0100299{
Patrick Rudolph5d999b42016-08-03 17:44:26 +0200300 dumpRenderstate(writer, pDevice);
José Fonseca9d8029d2012-12-05 12:00:37 +0000301
Jose Fonsecae8ba0792015-05-01 12:38:03 +0100302 dumpShaders(writer, pDevice);
José Fonseca3379d422012-09-20 12:29:16 +0100303
Jose Fonsecae8ba0792015-05-01 12:38:03 +0100304 dumpTextures(writer, pDevice);
José Fonseca9d8029d2012-12-05 12:00:37 +0000305
Jose Fonsecae8ba0792015-05-01 12:38:03 +0100306 dumpFramebuffer(writer, pDevice);
José Fonsecad63a3612012-05-08 23:41:35 +0100307}
308
Jose Fonsecae39d56e2015-07-16 12:31:10 +0100309void
310dumpDevice(StateWriter &writer, IDirect3DSwapChain9 *pSwapChain)
311{
312 com_ptr<IDirect3DDevice9> pDevice;
313 HRESULT hr = pSwapChain->GetDevice(&pDevice);
314 if (SUCCEEDED(hr)) {
315 dumpDevice(writer, pDevice);
316 }
317}
318
José Fonsecad63a3612012-05-08 23:41:35 +0100319
320} /* namespace d3dstate */