blob: f9708f4ca415d678dd88f43ccaa6ee8f44cb326a [file] [log] [blame]
José Fonsecac8695f72013-03-06 12:12:04 +00001/**************************************************************************
2 *
3 * Copyright 2013 VMware, Inc.
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
José Fonsecabbb9eb32013-04-16 19:38:00 +010027#include <assert.h>
28
José Fonseca4bdfcb92013-07-09 13:27:00 +010029#include <iostream>
30
José Fonsecabbb9eb32013-04-16 19:38:00 +010031#include "image.hpp"
Jose Fonsecae8ba0792015-05-01 12:38:03 +010032#include "state_writer.hpp"
José Fonseca00dc2f12014-06-12 19:18:11 +010033#include "com_ptr.hpp"
José Fonsecabbb9eb32013-04-16 19:38:00 +010034
José Fonsecac8695f72013-03-06 12:12:04 +000035#include "dxgistate.hpp"
José Fonseca29d4bda2014-02-28 17:50:24 +000036#include "d3d10state.hpp"
José Fonseca00dc2f12014-06-12 19:18:11 +010037#include "d3d11state.hpp"
Jose Fonseca4a4a5cb2015-07-21 13:31:16 +010038#include "d3d11imports.hpp"
José Fonsecac8695f72013-03-06 12:12:04 +000039
José Fonsecac8695f72013-03-06 12:12:04 +000040#include "DirectXTex.h"
41
42
43namespace d3dstate {
44
45
José Fonsecabbb9eb32013-04-16 19:38:00 +010046static DXGI_FORMAT
José Fonseca52fc2b02013-10-10 18:43:33 -070047ChooseConversionFormat(DXGI_FORMAT Format, unsigned &numChannels, image::ChannelType &channelType)
José Fonsecabbb9eb32013-04-16 19:38:00 +010048{
José Fonseca52fc2b02013-10-10 18:43:33 -070049 numChannels = 4;
José Fonseca75af8672013-09-16 12:20:40 +010050 channelType = image::TYPE_UNORM8;
51
José Fonsecabbb9eb32013-04-16 19:38:00 +010052 switch (Format) {
53
54 // Float
55 case DXGI_FORMAT_R32G32B32A32_FLOAT:
56 case DXGI_FORMAT_R32G32B32_FLOAT:
57 case DXGI_FORMAT_R16G16B16A16_FLOAT:
58 case DXGI_FORMAT_R32G32_FLOAT:
59 case DXGI_FORMAT_R11G11B10_FLOAT:
60 case DXGI_FORMAT_R16G16_FLOAT:
61 case DXGI_FORMAT_R32_FLOAT:
62 case DXGI_FORMAT_R16_FLOAT:
63 case DXGI_FORMAT_R9G9B9E5_SHAREDEXP:
64 case DXGI_FORMAT_BC6H_UF16:
65 case DXGI_FORMAT_BC6H_SF16:
José Fonseca75af8672013-09-16 12:20:40 +010066 channelType = image::TYPE_FLOAT;
67 return DXGI_FORMAT_R32G32B32A32_FLOAT;
José Fonsecabbb9eb32013-04-16 19:38:00 +010068
69 // Unsigned normalized
70 case DXGI_FORMAT_R16G16B16A16_UNORM:
71 case DXGI_FORMAT_R10G10B10A2_UNORM:
72 case DXGI_FORMAT_R8G8B8A8_UNORM:
73 case DXGI_FORMAT_R16G16_UNORM:
74 case DXGI_FORMAT_R8G8_UNORM:
75 case DXGI_FORMAT_R16_UNORM:
76 case DXGI_FORMAT_R8_UNORM:
77 case DXGI_FORMAT_A8_UNORM:
78 case DXGI_FORMAT_R1_UNORM:
79 case DXGI_FORMAT_R8G8_B8G8_UNORM:
80 case DXGI_FORMAT_G8R8_G8B8_UNORM:
81 case DXGI_FORMAT_BC1_UNORM:
82 case DXGI_FORMAT_BC2_UNORM:
83 case DXGI_FORMAT_BC3_UNORM:
84 case DXGI_FORMAT_BC4_UNORM:
85 case DXGI_FORMAT_BC5_UNORM:
86 case DXGI_FORMAT_B5G6R5_UNORM:
87 case DXGI_FORMAT_B5G5R5A1_UNORM:
88 case DXGI_FORMAT_B8G8R8A8_UNORM:
89 case DXGI_FORMAT_B8G8R8X8_UNORM:
90 case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM:
91 case DXGI_FORMAT_BC7_UNORM:
92 return DXGI_FORMAT_R8G8B8A8_UNORM;
93
94 // SRGB
95 case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
96 case DXGI_FORMAT_BC1_UNORM_SRGB:
97 case DXGI_FORMAT_BC2_UNORM_SRGB:
98 case DXGI_FORMAT_BC3_UNORM_SRGB:
99 case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB:
100 case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB:
101 case DXGI_FORMAT_BC7_UNORM_SRGB:
102 return DXGI_FORMAT_R8G8B8A8_UNORM;
103
104 // Signed normalized
105 case DXGI_FORMAT_R16G16B16A16_SNORM:
106 case DXGI_FORMAT_R8G8B8A8_SNORM:
107 case DXGI_FORMAT_R16G16_SNORM:
108 case DXGI_FORMAT_R8G8_SNORM:
109 case DXGI_FORMAT_R16_SNORM:
110 case DXGI_FORMAT_R8_SNORM:
111 case DXGI_FORMAT_BC4_SNORM:
112 case DXGI_FORMAT_BC5_SNORM:
113 return DXGI_FORMAT_R8G8B8A8_SNORM;
114
115 // Unsigned
116 case DXGI_FORMAT_R32G32B32A32_UINT:
117 case DXGI_FORMAT_R32G32B32_UINT:
118 case DXGI_FORMAT_R16G16B16A16_UINT:
119 case DXGI_FORMAT_R32G32_UINT:
120 case DXGI_FORMAT_R10G10B10A2_UINT:
121 case DXGI_FORMAT_R8G8B8A8_UINT:
122 case DXGI_FORMAT_R16G16_UINT:
123 case DXGI_FORMAT_R32_UINT:
124 case DXGI_FORMAT_R8G8_UINT:
125 case DXGI_FORMAT_R16_UINT:
126 case DXGI_FORMAT_R8_UINT:
127 return DXGI_FORMAT_R8G8B8A8_UINT;
128
129 // Signed
130 case DXGI_FORMAT_R32G32B32A32_SINT:
131 case DXGI_FORMAT_R32G32B32_SINT:
132 case DXGI_FORMAT_R16G16B16A16_SINT:
133 case DXGI_FORMAT_R32G32_SINT:
134 case DXGI_FORMAT_R8G8B8A8_SINT:
135 case DXGI_FORMAT_R16G16_SINT:
136 case DXGI_FORMAT_R32_SINT:
137 case DXGI_FORMAT_R8G8_SINT:
138 case DXGI_FORMAT_R16_SINT:
139 case DXGI_FORMAT_R8_SINT:
140 return DXGI_FORMAT_R8G8B8A8_SINT;
141
142 // Depth
143 case DXGI_FORMAT_D32_FLOAT:
144 case DXGI_FORMAT_D24_UNORM_S8_UINT:
145 case DXGI_FORMAT_D32_FLOAT_S8X24_UINT:
146 case DXGI_FORMAT_D16_UNORM:
José Fonseca52fc2b02013-10-10 18:43:33 -0700147 numChannels = 1;
148 channelType = image::TYPE_FLOAT;
149 return DXGI_FORMAT_D32_FLOAT;
José Fonsecabbb9eb32013-04-16 19:38:00 +0100150
151 // Typeless
152 case DXGI_FORMAT_UNKNOWN:
153 case DXGI_FORMAT_R32G32B32A32_TYPELESS:
154 case DXGI_FORMAT_R32G32B32_TYPELESS:
155 case DXGI_FORMAT_R16G16B16A16_TYPELESS:
156 case DXGI_FORMAT_R32G32_TYPELESS:
157 case DXGI_FORMAT_R32G8X24_TYPELESS:
158 case DXGI_FORMAT_R10G10B10A2_TYPELESS:
159 case DXGI_FORMAT_R8G8B8A8_TYPELESS:
160 case DXGI_FORMAT_R16G16_TYPELESS:
161 case DXGI_FORMAT_R32_TYPELESS:
162 case DXGI_FORMAT_R8G8_TYPELESS:
163 case DXGI_FORMAT_R16_TYPELESS:
164 case DXGI_FORMAT_R8_TYPELESS:
165 case DXGI_FORMAT_BC1_TYPELESS:
166 case DXGI_FORMAT_BC2_TYPELESS:
167 case DXGI_FORMAT_BC3_TYPELESS:
168 case DXGI_FORMAT_BC4_TYPELESS:
169 case DXGI_FORMAT_BC5_TYPELESS:
170 case DXGI_FORMAT_B8G8R8A8_TYPELESS:
171 case DXGI_FORMAT_B8G8R8X8_TYPELESS:
172 case DXGI_FORMAT_BC6H_TYPELESS:
173 case DXGI_FORMAT_BC7_TYPELESS:
174 case DXGI_FORMAT_R24G8_TYPELESS:
175 case DXGI_FORMAT_R24_UNORM_X8_TYPELESS:
176 case DXGI_FORMAT_X24_TYPELESS_G8_UINT:
177 case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS:
178 case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT:
179 return DXGI_FORMAT_UNKNOWN;
180
181 default:
182 return DXGI_FORMAT_R8G8B8A8_UNORM;
183 }
184}
185
186
José Fonsecac8695f72013-03-06 12:12:04 +0000187/**
188 * Convert between DXGI formats.
189 *
190 */
191HRESULT
192ConvertFormat(DXGI_FORMAT SrcFormat,
193 void *SrcData,
194 UINT SrcPitch,
195 DXGI_FORMAT DstFormat,
196 void *DstData,
197 UINT DstPitch,
198 UINT Width, UINT Height)
199{
200 HRESULT hr;
201
202 DirectX::Image SrcImage;
203 DirectX::Image DstImage;
204
205 SrcImage.width = Width;
206 SrcImage.height = Height;
207 SrcImage.format = SrcFormat;
208 SrcImage.rowPitch = SrcPitch;
209 SrcImage.slicePitch = Height * SrcPitch;
210 SrcImage.pixels = (uint8_t*)SrcData;
211
212 DstImage.width = Width;
213 DstImage.height = Height;
214 DstImage.format = DstFormat;
215 DstImage.rowPitch = DstPitch;
216 DstImage.slicePitch = Height * DstPitch;
217 DstImage.pixels = (uint8_t*)DstData;
218
219 DirectX::Rect rect(0, 0, Width, Height);
220
José Fonseca386d29d2013-05-20 13:35:23 +0100221 hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
222 assert(SUCCEEDED(hr));
223 if (FAILED(hr)) {
224 return hr;
225 }
226
José Fonsecac8695f72013-03-06 12:12:04 +0000227 if (SrcFormat != DstFormat) {
228 DirectX::ScratchImage ScratchImage;
229 ScratchImage.Initialize2D(DstFormat, Width, Height, 1, 1);
230
José Fonseca4bdfcb92013-07-09 13:27:00 +0100231 if (DirectX::IsCompressed(SrcFormat)) {
232 hr = DirectX::Decompress(SrcImage, DstFormat, ScratchImage);
233 } else {
Jose Fonsecaa1fbeb52018-08-23 12:25:30 +0100234 /*
235 * Avoid WIC, as it's not reliable (e.g, R32_FLOAT ->
236 * R32G32B32A32_FLOAT will fail with E_INVALIDARG.)
237 */
238 DWORD filter = DirectX::TEX_FILTER_FORCE_NON_WIC;
239
240 hr = DirectX::Convert(SrcImage, DstFormat, filter, 0.0f, ScratchImage);
José Fonseca4bdfcb92013-07-09 13:27:00 +0100241 }
242
José Fonsecac8695f72013-03-06 12:12:04 +0000243 if (SUCCEEDED(hr)) {
244 hr = CopyRectangle(*ScratchImage.GetImage(0, 0, 0), rect, DstImage, DirectX::TEX_FILTER_DEFAULT, 0, 0);
245 }
246 } else {
247 hr = CopyRectangle(SrcImage, rect, DstImage, DirectX::TEX_FILTER_DEFAULT, 0, 0);
248 }
249
250 return hr;
251}
252
253
José Fonsecabbb9eb32013-04-16 19:38:00 +0100254image::Image *
255ConvertImage(DXGI_FORMAT SrcFormat,
256 void *SrcData,
257 UINT SrcPitch,
Zack Rusin4a7a0612018-07-03 20:34:36 -0400258 UINT Width, UINT Height,
Jose Fonseca9383c672018-07-04 16:32:50 +0100259 bool isDepthStencil)
José Fonsecabbb9eb32013-04-16 19:38:00 +0100260{
José Fonseca52fc2b02013-10-10 18:43:33 -0700261 unsigned numChannels;
José Fonseca75af8672013-09-16 12:20:40 +0100262 image::ChannelType channelType;
José Fonsecabbb9eb32013-04-16 19:38:00 +0100263
Zack Rusin4a7a0612018-07-03 20:34:36 -0400264 // DirectXTex doesn't support the typeless depth-stencil/uav variants
Jose Fonseca47f48a42015-07-06 16:45:51 +0100265 switch (SrcFormat) {
266 case DXGI_FORMAT_R24G8_TYPELESS:
267 case DXGI_FORMAT_R24_UNORM_X8_TYPELESS:
268 SrcFormat = DXGI_FORMAT_D24_UNORM_S8_UINT;
269 break;
270
271 case DXGI_FORMAT_X24_TYPELESS_G8_UINT:
272 // FIXME: This will dump the depth-channel. It would be more
273 // adequate to dump the stencil channel, but we can't achieve
274 // that with DirectXTex.
275 SrcFormat = DXGI_FORMAT_D24_UNORM_S8_UINT;
276 break;
277
278 case DXGI_FORMAT_R32G8X24_TYPELESS:
279 case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS:
280 case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT:
281 SrcFormat = DXGI_FORMAT_D32_FLOAT_S8X24_UINT;
282 break;
283
Zack Rusin4a7a0612018-07-03 20:34:36 -0400284 case DXGI_FORMAT_R32_TYPELESS:
Jose Fonseca9383c672018-07-04 16:32:50 +0100285 SrcFormat = isDepthStencil ? DXGI_FORMAT_D32_FLOAT : DXGI_FORMAT_R32_UINT;
Zack Rusin4a7a0612018-07-03 20:34:36 -0400286 break;
287
Jose Fonseca47f48a42015-07-06 16:45:51 +0100288 default:
289 break;
290 }
291
José Fonseca52fc2b02013-10-10 18:43:33 -0700292 DXGI_FORMAT DstFormat = ChooseConversionFormat(SrcFormat, numChannels, channelType);
José Fonsecabbb9eb32013-04-16 19:38:00 +0100293 if (DstFormat == DXGI_FORMAT_UNKNOWN) {
294 return NULL;
295 }
296
José Fonseca52fc2b02013-10-10 18:43:33 -0700297 image::Image *image = new image::Image(Width, Height, numChannels, false, channelType);
José Fonsecabbb9eb32013-04-16 19:38:00 +0100298 if (!image) {
299 return NULL;
300 }
301 assert(image->stride() > 0);
302
303 HRESULT hr;
304 hr = ConvertFormat(SrcFormat,
305 SrcData, SrcPitch,
306 DstFormat,
307 image->start(), image->stride(),
308 Width, Height);
309 if (FAILED(hr)) {
Jose Fonsecaa1fbeb52018-08-23 12:25:30 +0100310 std::cerr << "warning: failed to convert from format " << getDXGIFormatName(SrcFormat)
311 << " to format " << getDXGIFormatName(DstFormat) << "\n";
José Fonsecabbb9eb32013-04-16 19:38:00 +0100312 delete image;
313 image = NULL;
314 }
315
316 return image;
317}
318
José Fonseca29d4bda2014-02-28 17:50:24 +0000319
320image::Image *
321getRenderTargetImage(IDXGISwapChain *pSwapChain)
322{
323 HRESULT hr;
324
325 assert(pSwapChain);
326 if (!pSwapChain) {
327 return NULL;
328 }
329
330 DXGI_SWAP_CHAIN_DESC Desc;
331 hr = pSwapChain->GetDesc(&Desc);
332 assert(SUCCEEDED(hr));
333
José Fonseca36413ec2014-08-14 13:58:19 +0100334 DXGI_FORMAT Format = Desc.BufferDesc.Format;
335
José Fonseca29d4bda2014-02-28 17:50:24 +0000336 /*
337 * There is a IDXGISurface::Map method, but swapchains are not normally mappable,
338 * and there is no way to copy into a staging resource, which effectively means there
339 * is no way to read a IDXGISwapChain using DXGI interfaces alone.
340 *
341 * We must figure out
342 * the appropriate D3D10/D3D11 interfaces, and use them instead.
343 */
344
Jose Fonseca4a4a5cb2015-07-21 13:31:16 +0100345 com_ptr<ID3D11Device1> pD3D11Device1;
346 hr = pSwapChain->GetDevice(IID_ID3D11Device1, (void **)&pD3D11Device1);
347 if (SUCCEEDED(hr)) {
348 /*
349 * With D3D11.1 runtime (that comes with Windows 8 and Windows 7
350 * Platform Update), we can no longer guess the device interface based
351 * on the success of GetDevice, since it will always succeed regardless
352 * the requested device interface, but the returned device maight be
353 * inactive/lockedout, and attempt to use it will cause the call to be
354 * ignored, though a debug runtime will issue a
355 * DEVICE_LOCKEDOUT_INTERFACE warning.
356 *
357 * See also:
358 * - https://msdn.microsoft.com/en-us/library/windows/desktop/hh404583.aspx
359 * - https://social.msdn.microsoft.com/Forums/en-US/c482bcec-b094-4df0-9253-9c496b115beb/d3d11-runtime-assertion-when-using-graphics-debugger-and-other-applications-may-be-intercepting?forum=wingameswithdirectx
360 */
361 com_ptr<ID3D11Resource> pD3D11Resource;
362 hr = pSwapChain->GetBuffer(0, IID_ID3D11Resource, (void **)&pD3D11Resource);
363 assert(SUCCEEDED(hr));
364 if (FAILED(hr)) {
365 return NULL;
366 }
367
368 com_ptr<ID3D11DeviceContext1> pD3D11DeviceContext;
369 pD3D11Device1->GetImmediateContext1(&pD3D11DeviceContext);
370
371 UINT Flags = 0;
372 UINT DeviceFlags = pD3D11Device1->GetCreationFlags();
373 if (DeviceFlags & D3D11_CREATE_DEVICE_SINGLETHREADED) {
374 Flags |= D3D11_1_CREATE_DEVICE_CONTEXT_STATE_SINGLETHREADED;
375 }
376 D3D_FEATURE_LEVEL FeatureLevel = pD3D11Device1->GetFeatureLevel();
377
378 com_ptr<ID3DDeviceContextState> pState;
379 hr = pD3D11Device1->CreateDeviceContextState(Flags, &FeatureLevel, 1, D3D11_SDK_VERSION, IID_ID3D11Device1, NULL, &pState);
380 if (SUCCEEDED(hr)) {
381 com_ptr<ID3DDeviceContextState> pPreviousState;
382 pD3D11DeviceContext->SwapDeviceContextState(pState, &pPreviousState);
383
384 image::Image *image;
385 image = getSubResourceImage(pD3D11DeviceContext, pD3D11Resource, Format, 0, 0);
386
387 pD3D11DeviceContext->SwapDeviceContextState(pPreviousState, NULL);
388
389 return image;
390 }
391 }
392
José Fonseca00dc2f12014-06-12 19:18:11 +0100393 com_ptr<ID3D11Device> pD3D11Device;
394 hr = pSwapChain->GetDevice(IID_ID3D11Device, (void **)&pD3D11Device);
395 if (SUCCEEDED(hr)) {
Jose Fonseca9bc17b72015-07-21 13:23:57 +0100396 com_ptr<ID3D11Resource> pD3D11Resource;
José Fonseca00dc2f12014-06-12 19:18:11 +0100397 hr = pSwapChain->GetBuffer(0, IID_ID3D11Resource, (void **)&pD3D11Resource);
398 assert(SUCCEEDED(hr));
399 if (FAILED(hr)) {
400 return NULL;
401 }
402
403 com_ptr<ID3D11DeviceContext> pD3D11DeviceContext;
404 pD3D11Device->GetImmediateContext(&pD3D11DeviceContext);
405
José Fonseca00dc2f12014-06-12 19:18:11 +0100406 return getSubResourceImage(pD3D11DeviceContext, pD3D11Resource, Format, 0, 0);
407 }
José Fonseca29d4bda2014-02-28 17:50:24 +0000408
Jose Fonsecabbd17872015-07-20 22:42:43 +0100409 com_ptr<ID3D10Device> pD3D10Device;
410 hr = pSwapChain->GetDevice(IID_ID3D10Device, (void **)&pD3D10Device);
411 if (SUCCEEDED(hr)) {
Jose Fonseca9bc17b72015-07-21 13:23:57 +0100412 com_ptr<ID3D10Resource> pD3D10Resource;
Jose Fonsecabbd17872015-07-20 22:42:43 +0100413 hr = pSwapChain->GetBuffer(0, IID_ID3D10Resource, (void **)&pD3D10Resource);
414 assert(SUCCEEDED(hr));
415 if (FAILED(hr)) {
416 return NULL;
417 }
418
419 return getSubResourceImage(pD3D10Device, pD3D10Resource, Format, 0, 0);
420 }
421
José Fonseca29d4bda2014-02-28 17:50:24 +0000422 return NULL;
423}
424
425
426void
Jose Fonsecae8ba0792015-05-01 12:38:03 +0100427dumpDevice(StateWriter &writer, IDXGISwapChain *pSwapChain)
José Fonseca29d4bda2014-02-28 17:50:24 +0000428{
José Fonseca52024be2014-06-12 19:48:35 +0100429 HRESULT hr;
José Fonseca29d4bda2014-02-28 17:50:24 +0000430
José Fonseca52024be2014-06-12 19:48:35 +0100431 if (pSwapChain) {
432 com_ptr<ID3D10Device> pD3D10Device;
433 hr = pSwapChain->GetDevice(IID_ID3D10Device, (void **)&pD3D10Device);
434 if (SUCCEEDED(hr)) {
Jose Fonsecae8ba0792015-05-01 12:38:03 +0100435 dumpDevice(writer, pD3D10Device);
José Fonseca52024be2014-06-12 19:48:35 +0100436 return;
437 }
438
José Fonseca52024be2014-06-12 19:48:35 +0100439 com_ptr<ID3D11Device> pD3D11Device;
440 hr = pSwapChain->GetDevice(IID_ID3D11Device, (void **)&pD3D11Device);
441 if (SUCCEEDED(hr)) {
442 com_ptr<ID3D11DeviceContext> pD3D11DeviceContext;
443 pD3D11Device->GetImmediateContext(&pD3D11DeviceContext);
Jose Fonsecae8ba0792015-05-01 12:38:03 +0100444 dumpDevice(writer, pD3D11DeviceContext);
José Fonseca52024be2014-06-12 19:48:35 +0100445 return;
446 }
José Fonseca52024be2014-06-12 19:48:35 +0100447 }
448
449 // Fallback -- this should really never happen.
450 assert(0);
Jose Fonsecae8ba0792015-05-01 12:38:03 +0100451 writer.beginMember("framebuffer");
452 writer.beginObject();
José Fonseca29d4bda2014-02-28 17:50:24 +0000453 if (pSwapChain) {
454 image::Image *image;
455 image = getRenderTargetImage(pSwapChain);
456 if (image) {
Jose Fonsecae8ba0792015-05-01 12:38:03 +0100457 writer.beginMember("SWAP_CHAIN");
458 writer.writeImage(image);
459 writer.endMember();
José Fonseca52024be2014-06-12 19:48:35 +0100460 delete image;
José Fonseca29d4bda2014-02-28 17:50:24 +0000461 }
462 }
Jose Fonsecae8ba0792015-05-01 12:38:03 +0100463 writer.endObject();
464 writer.endMember(); // framebuffer
José Fonseca29d4bda2014-02-28 17:50:24 +0000465}
466
467
Zack Rusin86bd4992015-03-03 21:50:43 -0500468std::string
469getDXGIFormatName(DXGI_FORMAT format)
470{
471 switch (format) {
472 case DXGI_FORMAT_UNKNOWN:
473 return "DXGI_FORMAT_UNKNOWN";
474 case DXGI_FORMAT_R32G32B32A32_TYPELESS:
475 return "DXGI_FORMAT_R32G32B32A32_TYPELESS";
476 case DXGI_FORMAT_R32G32B32A32_FLOAT:
477 return "DXGI_FORMAT_R32G32B32A32_FLOAT";
478 case DXGI_FORMAT_R32G32B32A32_UINT:
479 return "DXGI_FORMAT_R32G32B32A32_UINT";
480 case DXGI_FORMAT_R32G32B32A32_SINT:
481 return "DXGI_FORMAT_R32G32B32A32_SINT";
482 case DXGI_FORMAT_R32G32B32_TYPELESS:
483 return "DXGI_FORMAT_R32G32B32_TYPELESS";
484 case DXGI_FORMAT_R32G32B32_FLOAT:
485 return "DXGI_FORMAT_R32G32B32_FLOAT";
486 case DXGI_FORMAT_R32G32B32_UINT:
487 return "DXGI_FORMAT_R32G32B32_UINT";
488 case DXGI_FORMAT_R32G32B32_SINT:
489 return "DXGI_FORMAT_R32G32B32_SINT";
490 case DXGI_FORMAT_R16G16B16A16_TYPELESS:
491 return "DXGI_FORMAT_R16G16B16A16_TYPELESS";
492 case DXGI_FORMAT_R16G16B16A16_FLOAT:
493 return "DXGI_FORMAT_R16G16B16A16_FLOAT";
494 case DXGI_FORMAT_R16G16B16A16_UNORM:
495 return "DXGI_FORMAT_R16G16B16A16_UNORM";
496 case DXGI_FORMAT_R16G16B16A16_UINT:
497 return "DXGI_FORMAT_R16G16B16A16_UINT";
498 case DXGI_FORMAT_R16G16B16A16_SNORM:
499 return "DXGI_FORMAT_R16G16B16A16_SNORM";
500 case DXGI_FORMAT_R16G16B16A16_SINT:
501 return "DXGI_FORMAT_R16G16B16A16_SINT";
502 case DXGI_FORMAT_R32G32_TYPELESS:
503 return "DXGI_FORMAT_R32G32_TYPELESS";
504 case DXGI_FORMAT_R32G32_FLOAT:
505 return "DXGI_FORMAT_R32G32_FLOAT";
506 case DXGI_FORMAT_R32G32_UINT:
507 return "DXGI_FORMAT_R32G32_UINT";
508 case DXGI_FORMAT_R32G32_SINT:
509 return "DXGI_FORMAT_R32G32_SINT";
510 case DXGI_FORMAT_R32G8X24_TYPELESS:
511 return "DXGI_FORMAT_R32G8X24_TYPELESS";
512 case DXGI_FORMAT_D32_FLOAT_S8X24_UINT:
513 return "DXGI_FORMAT_D32_FLOAT_S8X24_UINT";
514 case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS:
515 return "DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS";
516 case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT:
517 return "DXGI_FORMAT_X32_TYPELESS_G8X24_UINT";
518 case DXGI_FORMAT_R10G10B10A2_TYPELESS:
519 return "DXGI_FORMAT_R10G10B10A2_TYPELESS";
520 case DXGI_FORMAT_R10G10B10A2_UNORM:
521 return "DXGI_FORMAT_R10G10B10A2_UNORM";
522 case DXGI_FORMAT_R10G10B10A2_UINT:
523 return "DXGI_FORMAT_R10G10B10A2_UINT";
524 case DXGI_FORMAT_R11G11B10_FLOAT:
525 return "DXGI_FORMAT_R11G11B10_FLOAT";
526 case DXGI_FORMAT_R8G8B8A8_TYPELESS:
527 return "DXGI_FORMAT_R8G8B8A8_TYPELESS";
528 case DXGI_FORMAT_R8G8B8A8_UNORM:
529 return "DXGI_FORMAT_R8G8B8A8_UNORM";
530 case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
531 return "DXGI_FORMAT_R8G8B8A8_UNORM_SRGB";
532 case DXGI_FORMAT_R8G8B8A8_UINT:
533 return "DXGI_FORMAT_R8G8B8A8_UINT";
534 case DXGI_FORMAT_R8G8B8A8_SNORM:
535 return "DXGI_FORMAT_R8G8B8A8_SNORM";
536 case DXGI_FORMAT_R8G8B8A8_SINT:
537 return "DXGI_FORMAT_R8G8B8A8_SINT";
538 case DXGI_FORMAT_R16G16_TYPELESS:
539 return "DXGI_FORMAT_R16G16_TYPELESS";
540 case DXGI_FORMAT_R16G16_FLOAT:
541 return "DXGI_FORMAT_R16G16_FLOAT";
542 case DXGI_FORMAT_R16G16_UNORM:
543 return "DXGI_FORMAT_R16G16_UNORM";
544 case DXGI_FORMAT_R16G16_UINT:
545 return "DXGI_FORMAT_R16G16_UINT";
546 case DXGI_FORMAT_R16G16_SNORM:
547 return "DXGI_FORMAT_R16G16_SNORM";
548 case DXGI_FORMAT_R16G16_SINT:
549 return "DXGI_FORMAT_R16G16_SINT";
550 case DXGI_FORMAT_R32_TYPELESS:
551 return "DXGI_FORMAT_R32_TYPELESS";
552 case DXGI_FORMAT_D32_FLOAT:
553 return "DXGI_FORMAT_D32_FLOAT";
554 case DXGI_FORMAT_R32_FLOAT:
555 return "DXGI_FORMAT_R32_FLOAT";
556 case DXGI_FORMAT_R32_UINT:
557 return "DXGI_FORMAT_R32_UINT";
558 case DXGI_FORMAT_R32_SINT:
559 return "DXGI_FORMAT_R32_SINT";
560 case DXGI_FORMAT_R24G8_TYPELESS:
561 return "DXGI_FORMAT_R24G8_TYPELESS";
562 case DXGI_FORMAT_D24_UNORM_S8_UINT:
563 return "DXGI_FORMAT_D24_UNORM_S8_UINT";
564 case DXGI_FORMAT_R24_UNORM_X8_TYPELESS:
565 return "DXGI_FORMAT_R24_UNORM_X8_TYPELESS";
566 case DXGI_FORMAT_X24_TYPELESS_G8_UINT:
567 return "DXGI_FORMAT_X24_TYPELESS_G8_UINT";
568 case DXGI_FORMAT_R8G8_TYPELESS:
569 return "DXGI_FORMAT_R8G8_TYPELESS";
570 case DXGI_FORMAT_R8G8_UNORM:
571 return "DXGI_FORMAT_R8G8_UNORM";
572 case DXGI_FORMAT_R8G8_UINT:
573 return "DXGI_FORMAT_R8G8_UINT";
574 case DXGI_FORMAT_R8G8_SNORM:
575 return "DXGI_FORMAT_R8G8_SNORM";
576 case DXGI_FORMAT_R8G8_SINT:
577 return "DXGI_FORMAT_R8G8_SINT";
578 case DXGI_FORMAT_R16_TYPELESS:
579 return "DXGI_FORMAT_R16_TYPELESS";
580 case DXGI_FORMAT_R16_FLOAT:
581 return "DXGI_FORMAT_R16_FLOAT";
582 case DXGI_FORMAT_D16_UNORM:
583 return "DXGI_FORMAT_D16_UNORM";
584 case DXGI_FORMAT_R16_UNORM:
585 return "DXGI_FORMAT_R16_UNORM";
586 case DXGI_FORMAT_R16_UINT:
587 return "DXGI_FORMAT_R16_UINT";
588 case DXGI_FORMAT_R16_SNORM:
589 return "DXGI_FORMAT_R16_SNORM";
590 case DXGI_FORMAT_R16_SINT:
591 return "DXGI_FORMAT_R16_SINT";
592 case DXGI_FORMAT_R8_TYPELESS:
593 return "DXGI_FORMAT_R8_TYPELESS";
594 case DXGI_FORMAT_R8_UNORM:
595 return "DXGI_FORMAT_R8_UNORM";
596 case DXGI_FORMAT_R8_UINT:
597 return "DXGI_FORMAT_R8_UINT";
598 case DXGI_FORMAT_R8_SNORM:
599 return "DXGI_FORMAT_R8_SNORM";
600 case DXGI_FORMAT_R8_SINT:
601 return "DXGI_FORMAT_R8_SINT";
602 case DXGI_FORMAT_A8_UNORM:
603 return "DXGI_FORMAT_A8_UNORM";
604 case DXGI_FORMAT_R1_UNORM:
605 return "DXGI_FORMAT_R1_UNORM";
606 case DXGI_FORMAT_R9G9B9E5_SHAREDEXP:
607 return "DXGI_FORMAT_R9G9B9E5_SHAREDEXP";
608 case DXGI_FORMAT_R8G8_B8G8_UNORM:
609 return "DXGI_FORMAT_R8G8_B8G8_UNORM";
610 case DXGI_FORMAT_G8R8_G8B8_UNORM:
611 return "DXGI_FORMAT_G8R8_G8B8_UNORM";
612 case DXGI_FORMAT_BC1_TYPELESS:
613 return "DXGI_FORMAT_BC1_TYPELESS";
614 case DXGI_FORMAT_BC1_UNORM:
615 return "DXGI_FORMAT_BC1_UNORM";
616 case DXGI_FORMAT_BC1_UNORM_SRGB:
617 return "DXGI_FORMAT_BC1_UNORM_SRGB";
618 case DXGI_FORMAT_BC2_TYPELESS:
619 return "DXGI_FORMAT_BC2_TYPELESS";
620 case DXGI_FORMAT_BC2_UNORM:
621 return "DXGI_FORMAT_BC2_UNORM";
622 case DXGI_FORMAT_BC2_UNORM_SRGB:
623 return "DXGI_FORMAT_BC2_UNORM_SRGB";
624 case DXGI_FORMAT_BC3_TYPELESS:
625 return "DXGI_FORMAT_BC3_TYPELESS";
626 case DXGI_FORMAT_BC3_UNORM:
627 return "DXGI_FORMAT_BC3_UNORM";
628 case DXGI_FORMAT_BC3_UNORM_SRGB:
629 return "DXGI_FORMAT_BC3_UNORM_SRGB";
630 case DXGI_FORMAT_BC4_TYPELESS:
631 return "DXGI_FORMAT_BC4_TYPELESS";
632 case DXGI_FORMAT_BC4_UNORM:
633 return "DXGI_FORMAT_BC4_UNORM";
634 case DXGI_FORMAT_BC4_SNORM:
635 return "DXGI_FORMAT_BC4_SNORM";
636 case DXGI_FORMAT_BC5_TYPELESS:
637 return "DXGI_FORMAT_BC5_TYPELESS";
638 case DXGI_FORMAT_BC5_UNORM:
639 return "DXGI_FORMAT_BC5_UNORM";
640 case DXGI_FORMAT_BC5_SNORM:
641 return "DXGI_FORMAT_BC5_SNORM";
642 case DXGI_FORMAT_B5G6R5_UNORM:
643 return "DXGI_FORMAT_B5G6R5_UNORM";
644 case DXGI_FORMAT_B5G5R5A1_UNORM:
645 return "DXGI_FORMAT_B5G5R5A1_UNORM";
646 case DXGI_FORMAT_B8G8R8A8_UNORM:
647 return "DXGI_FORMAT_B8G8R8A8_UNORM";
648 case DXGI_FORMAT_B8G8R8X8_UNORM:
649 return "DXGI_FORMAT_B8G8R8X8_UNORM";
650 case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM:
651 return "DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM";
652 case DXGI_FORMAT_B8G8R8A8_TYPELESS:
653 return "DXGI_FORMAT_B8G8R8A8_TYPELESS";
654 case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB:
655 return "DXGI_FORMAT_B8G8R8A8_UNORM_SRGB";
656 case DXGI_FORMAT_B8G8R8X8_TYPELESS:
657 return "DXGI_FORMAT_B8G8R8X8_TYPELESS";
658 case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB:
659 return "DXGI_FORMAT_B8G8R8X8_UNORM_SRGB";
660 case DXGI_FORMAT_BC6H_TYPELESS:
661 return "DXGI_FORMAT_BC6H_TYPELESS";
662 case DXGI_FORMAT_BC6H_UF16:
663 return "DXGI_FORMAT_BC6H_UF16";
664 case DXGI_FORMAT_BC6H_SF16:
665 return "DXGI_FORMAT_BC6H_SF16";
666 case DXGI_FORMAT_BC7_TYPELESS:
667 return "DXGI_FORMAT_BC7_TYPELESS";
668 case DXGI_FORMAT_BC7_UNORM:
669 return "DXGI_FORMAT_BC7_UNORM";
670 case DXGI_FORMAT_BC7_UNORM_SRGB:
671 return "DXGI_FORMAT_BC7_UNORM_SRGB";
672 case DXGI_FORMAT_AYUV:
673 return "DXGI_FORMAT_AYUV";
674 case DXGI_FORMAT_Y410:
675 return "DXGI_FORMAT_Y410";
676 case DXGI_FORMAT_Y416:
677 return "DXGI_FORMAT_Y416";
678 case DXGI_FORMAT_NV12:
679 return "DXGI_FORMAT_NV12";
680 case DXGI_FORMAT_P010:
681 return "DXGI_FORMAT_P010";
682 case DXGI_FORMAT_P016:
683 return "DXGI_FORMAT_P016";
684 case DXGI_FORMAT_420_OPAQUE:
685 return "DXGI_FORMAT_420_OPAQUE";
686 case DXGI_FORMAT_YUY2:
687 return "DXGI_FORMAT_YUY2";
688 case DXGI_FORMAT_Y210:
689 return "DXGI_FORMAT_Y210";
690 case DXGI_FORMAT_Y216:
691 return "DXGI_FORMAT_Y216";
692 case DXGI_FORMAT_NV11:
693 return "DXGI_FORMAT_NV11";
694 case DXGI_FORMAT_AI44:
695 return "DXGI_FORMAT_AI44";
696 case DXGI_FORMAT_IA44:
697 return "DXGI_FORMAT_IA44";
698 case DXGI_FORMAT_P8:
699 return "DXGI_FORMAT_P8";
700 case DXGI_FORMAT_A8P8:
701 return "DXGI_FORMAT_A8P8";
702 case DXGI_FORMAT_B4G4R4A4_UNORM:
703 return "DXGI_FORMAT_B4G4R4A4_UNORM";
704 case DXGI_FORMAT_FORCE_UINT:
705 return "DXGI_FORMAT_FORCE_UINT";
706 default:
707 return "DXGI_ERROR_FORMAT";
708 }
709}
710
José Fonsecac8695f72013-03-06 12:12:04 +0000711} /* namespace d3dstate */