blob: 88619462ecf123d3341d621f57110485da994a1b [file] [log] [blame]
/**************************************************************************
*
* Copyright 2013 VMware, Inc.
* All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
**************************************************************************/
#include <assert.h>
#include <iostream>
#include "image.hpp"
#include "state_writer.hpp"
#include "com_ptr.hpp"
#include "dxgistate.hpp"
#include "d3d10state.hpp"
#include "d3d11state.hpp"
#include "d3d11imports.hpp"
#include "DirectXTex.h"
namespace d3dstate {
static DXGI_FORMAT
ChooseConversionFormat(DXGI_FORMAT Format, unsigned &numChannels, image::ChannelType &channelType)
{
numChannels = 4;
channelType = image::TYPE_UNORM8;
switch (Format) {
// Float
case DXGI_FORMAT_R32G32B32A32_FLOAT:
case DXGI_FORMAT_R32G32B32_FLOAT:
case DXGI_FORMAT_R16G16B16A16_FLOAT:
case DXGI_FORMAT_R32G32_FLOAT:
case DXGI_FORMAT_R11G11B10_FLOAT:
case DXGI_FORMAT_R16G16_FLOAT:
case DXGI_FORMAT_R32_FLOAT:
case DXGI_FORMAT_R16_FLOAT:
case DXGI_FORMAT_R9G9B9E5_SHAREDEXP:
case DXGI_FORMAT_BC6H_UF16:
case DXGI_FORMAT_BC6H_SF16:
channelType = image::TYPE_FLOAT;
return DXGI_FORMAT_R32G32B32A32_FLOAT;
// Unsigned normalized
case DXGI_FORMAT_R16G16B16A16_UNORM:
case DXGI_FORMAT_R10G10B10A2_UNORM:
case DXGI_FORMAT_R8G8B8A8_UNORM:
case DXGI_FORMAT_R16G16_UNORM:
case DXGI_FORMAT_R8G8_UNORM:
case DXGI_FORMAT_R16_UNORM:
case DXGI_FORMAT_R8_UNORM:
case DXGI_FORMAT_A8_UNORM:
case DXGI_FORMAT_R1_UNORM:
case DXGI_FORMAT_R8G8_B8G8_UNORM:
case DXGI_FORMAT_G8R8_G8B8_UNORM:
case DXGI_FORMAT_BC1_UNORM:
case DXGI_FORMAT_BC2_UNORM:
case DXGI_FORMAT_BC3_UNORM:
case DXGI_FORMAT_BC4_UNORM:
case DXGI_FORMAT_BC5_UNORM:
case DXGI_FORMAT_B5G6R5_UNORM:
case DXGI_FORMAT_B5G5R5A1_UNORM:
case DXGI_FORMAT_B8G8R8A8_UNORM:
case DXGI_FORMAT_B8G8R8X8_UNORM:
case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM:
case DXGI_FORMAT_BC7_UNORM:
case DXGI_FORMAT_B4G4R4A4_UNORM:
return DXGI_FORMAT_R8G8B8A8_UNORM;
// SRGB
case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
case DXGI_FORMAT_BC1_UNORM_SRGB:
case DXGI_FORMAT_BC2_UNORM_SRGB:
case DXGI_FORMAT_BC3_UNORM_SRGB:
case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB:
case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB:
case DXGI_FORMAT_BC7_UNORM_SRGB:
return DXGI_FORMAT_R8G8B8A8_UNORM_SRGB;
// Signed normalized
case DXGI_FORMAT_R16G16B16A16_SNORM:
case DXGI_FORMAT_R8G8B8A8_SNORM:
case DXGI_FORMAT_R16G16_SNORM:
case DXGI_FORMAT_R8G8_SNORM:
case DXGI_FORMAT_R16_SNORM:
case DXGI_FORMAT_R8_SNORM:
case DXGI_FORMAT_BC4_SNORM:
case DXGI_FORMAT_BC5_SNORM:
return DXGI_FORMAT_R8G8B8A8_SNORM;
// 8-bit unsigned
case DXGI_FORMAT_R8G8B8A8_UINT:
case DXGI_FORMAT_R8G8_UINT:
case DXGI_FORMAT_R8_UINT:
return DXGI_FORMAT_R8G8B8A8_UINT;
// 4-channel integers
case DXGI_FORMAT_R32G32B32A32_UINT:
case DXGI_FORMAT_R32G32B32A32_SINT:
case DXGI_FORMAT_R16G16B16A16_UINT:
case DXGI_FORMAT_R16G16B16A16_SINT:
case DXGI_FORMAT_R8G8B8A8_SINT:
case DXGI_FORMAT_R10G10B10A2_UINT:
numChannels = 4;
channelType = image::TYPE_FLOAT;
return DXGI_FORMAT_R32G32B32A32_FLOAT;
// 3-channel integers
case DXGI_FORMAT_R32G32B32_UINT:
case DXGI_FORMAT_R32G32B32_SINT:
numChannels = 3;
channelType = image::TYPE_FLOAT;
return DXGI_FORMAT_R32G32B32_FLOAT;
// 2-channel integers
case DXGI_FORMAT_R32G32_UINT:
case DXGI_FORMAT_R32G32_SINT:
case DXGI_FORMAT_R16G16_UINT:
case DXGI_FORMAT_R16G16_SINT:
case DXGI_FORMAT_R8G8_SINT:
numChannels = 2;
channelType = image::TYPE_FLOAT;
return DXGI_FORMAT_R32G32_FLOAT;
// 1-channel integers
case DXGI_FORMAT_R32_UINT:
case DXGI_FORMAT_R32_SINT:
case DXGI_FORMAT_R16_UINT:
case DXGI_FORMAT_R16_SINT:
case DXGI_FORMAT_R8_SINT:
numChannels = 1;
channelType = image::TYPE_FLOAT;
return DXGI_FORMAT_R32_FLOAT;
// Depth
case DXGI_FORMAT_D32_FLOAT:
case DXGI_FORMAT_D24_UNORM_S8_UINT:
case DXGI_FORMAT_D32_FLOAT_S8X24_UINT:
case DXGI_FORMAT_D16_UNORM:
numChannels = 1;
channelType = image::TYPE_FLOAT;
return DXGI_FORMAT_D32_FLOAT;
// Typeless
case DXGI_FORMAT_UNKNOWN:
case DXGI_FORMAT_R32G32B32A32_TYPELESS:
case DXGI_FORMAT_R32G32B32_TYPELESS:
case DXGI_FORMAT_R16G16B16A16_TYPELESS:
case DXGI_FORMAT_R32G32_TYPELESS:
case DXGI_FORMAT_R32G8X24_TYPELESS:
case DXGI_FORMAT_R10G10B10A2_TYPELESS:
case DXGI_FORMAT_R8G8B8A8_TYPELESS:
case DXGI_FORMAT_R16G16_TYPELESS:
case DXGI_FORMAT_R32_TYPELESS:
case DXGI_FORMAT_R8G8_TYPELESS:
case DXGI_FORMAT_R16_TYPELESS:
case DXGI_FORMAT_R8_TYPELESS:
case DXGI_FORMAT_BC1_TYPELESS:
case DXGI_FORMAT_BC2_TYPELESS:
case DXGI_FORMAT_BC3_TYPELESS:
case DXGI_FORMAT_BC4_TYPELESS:
case DXGI_FORMAT_BC5_TYPELESS:
case DXGI_FORMAT_B8G8R8A8_TYPELESS:
case DXGI_FORMAT_B8G8R8X8_TYPELESS:
case DXGI_FORMAT_BC6H_TYPELESS:
case DXGI_FORMAT_BC7_TYPELESS:
case DXGI_FORMAT_R24G8_TYPELESS:
case DXGI_FORMAT_R24_UNORM_X8_TYPELESS:
case DXGI_FORMAT_X24_TYPELESS_G8_UINT:
case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS:
case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT:
return DXGI_FORMAT_UNKNOWN;
default:
return DXGI_FORMAT_R8G8B8A8_UNORM;
}
}
/**
* Convert between DXGI formats.
*
*/
HRESULT
ConvertFormat(DXGI_FORMAT SrcFormat,
void *SrcData,
UINT SrcPitch,
DXGI_FORMAT DstFormat,
void *DstData,
UINT DstPitch,
UINT Width, UINT Height)
{
HRESULT hr;
DirectX::Image SrcImage;
DirectX::Image DstImage;
SrcImage.width = Width;
SrcImage.height = Height;
SrcImage.format = SrcFormat;
SrcImage.rowPitch = SrcPitch;
SrcImage.slicePitch = Height * SrcPitch;
SrcImage.pixels = (uint8_t*)SrcData;
DstImage.width = Width;
DstImage.height = Height;
DstImage.format = DstFormat;
DstImage.rowPitch = DstPitch;
DstImage.slicePitch = Height * DstPitch;
DstImage.pixels = (uint8_t*)DstData;
DirectX::Rect rect(0, 0, Width, Height);
hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
assert(SUCCEEDED(hr));
if (FAILED(hr)) {
return hr;
}
/*
* Avoid WIC, as it's not reliable (e.g, R32_FLOAT ->
* R32G32B32A32_FLOAT will fail with E_INVALIDARG.)
*/
DWORD filter = DirectX::TEX_FILTER_FORCE_NON_WIC;
if (SrcFormat != DstFormat) {
DirectX::ScratchImage ScratchImage;
ScratchImage.Initialize2D(DstFormat, Width, Height, 1, 1);
if (DirectX::IsCompressed(SrcFormat)) {
hr = DirectX::Decompress(SrcImage, DstFormat, ScratchImage);
} else {
hr = DirectX::Convert(SrcImage, DstFormat, filter, 0.0f, ScratchImage);
}
if (SUCCEEDED(hr)) {
hr = DirectX::CopyRectangle(*ScratchImage.GetImage(0, 0, 0), rect, DstImage, filter, 0, 0);
}
} else {
hr = DirectX::CopyRectangle(SrcImage, rect, DstImage, filter, 0, 0);
}
return hr;
}
image::Image *
ConvertImage(DXGI_FORMAT SrcFormat,
void *SrcData,
UINT SrcPitch,
UINT Width, UINT Height,
bool isDepthStencil)
{
unsigned numChannels;
image::ChannelType channelType;
// DirectXTex doesn't support the typeless depth-stencil/uav variants
switch (SrcFormat) {
case DXGI_FORMAT_R24G8_TYPELESS:
case DXGI_FORMAT_R24_UNORM_X8_TYPELESS:
SrcFormat = DXGI_FORMAT_D24_UNORM_S8_UINT;
break;
case DXGI_FORMAT_X24_TYPELESS_G8_UINT:
// FIXME: This will dump the depth-channel. It would be more
// adequate to dump the stencil channel, but we can't achieve
// that with DirectXTex.
SrcFormat = DXGI_FORMAT_D24_UNORM_S8_UINT;
break;
case DXGI_FORMAT_R32G8X24_TYPELESS:
case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS:
case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT:
SrcFormat = DXGI_FORMAT_D32_FLOAT_S8X24_UINT;
break;
case DXGI_FORMAT_R32_TYPELESS:
SrcFormat = isDepthStencil ? DXGI_FORMAT_D32_FLOAT : DXGI_FORMAT_R32_UINT;
break;
default:
break;
}
DXGI_FORMAT DstFormat = ChooseConversionFormat(SrcFormat, numChannels, channelType);
if (DstFormat == DXGI_FORMAT_UNKNOWN) {
std::cerr << "warning: don't know how to convert format " << getDXGIFormatName(SrcFormat) << "\n";
return NULL;
}
image::Image *image = new image::Image(Width, Height, numChannels, false, channelType);
if (!image) {
return NULL;
}
assert(image->stride() > 0);
HRESULT hr;
hr = ConvertFormat(SrcFormat,
SrcData, SrcPitch,
DstFormat,
image->start(), image->stride(),
Width, Height);
if (FAILED(hr)) {
std::cerr << "warning: failed to convert from format " << getDXGIFormatName(SrcFormat)
<< " to format " << getDXGIFormatName(DstFormat) << "\n";
delete image;
image = NULL;
}
return image;
}
image::Image *
getRenderTargetImage(IDXGISwapChain *pSwapChain)
{
HRESULT hr;
assert(pSwapChain);
if (!pSwapChain) {
return NULL;
}
DXGI_SWAP_CHAIN_DESC Desc;
hr = pSwapChain->GetDesc(&Desc);
assert(SUCCEEDED(hr));
DXGI_FORMAT Format = Desc.BufferDesc.Format;
/*
* There is a IDXGISurface::Map method, but swapchains are not normally mappable,
* and there is no way to copy into a staging resource, which effectively means there
* is no way to read a IDXGISwapChain using DXGI interfaces alone.
*
* We must figure out
* the appropriate D3D10/D3D11 interfaces, and use them instead.
*/
com_ptr<ID3D11Device1> pD3D11Device1;
hr = pSwapChain->GetDevice(IID_ID3D11Device1, (void **)&pD3D11Device1);
if (SUCCEEDED(hr)) {
/*
* With D3D11.1 runtime (that comes with Windows 8 and Windows 7
* Platform Update), we can no longer guess the device interface based
* on the success of GetDevice, since it will always succeed regardless
* the requested device interface, but the returned device maight be
* inactive/lockedout, and attempt to use it will cause the call to be
* ignored, though a debug runtime will issue a
* DEVICE_LOCKEDOUT_INTERFACE warning.
*
* See also:
* - https://msdn.microsoft.com/en-us/library/windows/desktop/hh404583.aspx
* - 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
*/
com_ptr<ID3D11Resource> pD3D11Resource;
hr = pSwapChain->GetBuffer(0, IID_ID3D11Resource, (void **)&pD3D11Resource);
assert(SUCCEEDED(hr));
if (FAILED(hr)) {
return NULL;
}
com_ptr<ID3D11DeviceContext1> pD3D11DeviceContext;
pD3D11Device1->GetImmediateContext1(&pD3D11DeviceContext);
UINT Flags = 0;
UINT DeviceFlags = pD3D11Device1->GetCreationFlags();
if (DeviceFlags & D3D11_CREATE_DEVICE_SINGLETHREADED) {
Flags |= D3D11_1_CREATE_DEVICE_CONTEXT_STATE_SINGLETHREADED;
}
D3D_FEATURE_LEVEL FeatureLevel = pD3D11Device1->GetFeatureLevel();
com_ptr<ID3DDeviceContextState> pState;
hr = pD3D11Device1->CreateDeviceContextState(Flags, &FeatureLevel, 1, D3D11_SDK_VERSION, IID_ID3D11Device1, NULL, &pState);
if (SUCCEEDED(hr)) {
com_ptr<ID3DDeviceContextState> pPreviousState;
pD3D11DeviceContext->SwapDeviceContextState(pState, &pPreviousState);
image::Image *image;
image = getSubResourceImage(pD3D11DeviceContext, pD3D11Resource, Format, 0, 0);
pD3D11DeviceContext->SwapDeviceContextState(pPreviousState, NULL);
return image;
}
}
com_ptr<ID3D11Device> pD3D11Device;
hr = pSwapChain->GetDevice(IID_ID3D11Device, (void **)&pD3D11Device);
if (SUCCEEDED(hr)) {
com_ptr<ID3D11Resource> pD3D11Resource;
hr = pSwapChain->GetBuffer(0, IID_ID3D11Resource, (void **)&pD3D11Resource);
assert(SUCCEEDED(hr));
if (FAILED(hr)) {
return NULL;
}
com_ptr<ID3D11DeviceContext> pD3D11DeviceContext;
pD3D11Device->GetImmediateContext(&pD3D11DeviceContext);
return getSubResourceImage(pD3D11DeviceContext, pD3D11Resource, Format, 0, 0);
}
com_ptr<ID3D10Device> pD3D10Device;
hr = pSwapChain->GetDevice(IID_ID3D10Device, (void **)&pD3D10Device);
if (SUCCEEDED(hr)) {
com_ptr<ID3D10Resource> pD3D10Resource;
hr = pSwapChain->GetBuffer(0, IID_ID3D10Resource, (void **)&pD3D10Resource);
assert(SUCCEEDED(hr));
if (FAILED(hr)) {
return NULL;
}
return getSubResourceImage(pD3D10Device, pD3D10Resource, Format, 0, 0);
}
return NULL;
}
void
dumpDevice(StateWriter &writer, IDXGISwapChain *pSwapChain)
{
HRESULT hr;
if (pSwapChain) {
com_ptr<ID3D10Device> pD3D10Device;
hr = pSwapChain->GetDevice(IID_ID3D10Device, (void **)&pD3D10Device);
if (SUCCEEDED(hr)) {
dumpDevice(writer, pD3D10Device);
return;
}
com_ptr<ID3D11Device> pD3D11Device;
hr = pSwapChain->GetDevice(IID_ID3D11Device, (void **)&pD3D11Device);
if (SUCCEEDED(hr)) {
com_ptr<ID3D11DeviceContext> pD3D11DeviceContext;
pD3D11Device->GetImmediateContext(&pD3D11DeviceContext);
dumpDevice(writer, pD3D11DeviceContext);
return;
}
}
// Fallback -- this should really never happen.
assert(0);
writer.beginMember("framebuffer");
writer.beginObject();
if (pSwapChain) {
image::Image *image;
image = getRenderTargetImage(pSwapChain);
if (image) {
writer.beginMember("SWAP_CHAIN");
writer.writeImage(image);
writer.endMember();
delete image;
}
}
writer.endObject();
writer.endMember(); // framebuffer
}
std::string
getDXGIFormatName(DXGI_FORMAT format)
{
switch (format) {
case DXGI_FORMAT_UNKNOWN:
return "DXGI_FORMAT_UNKNOWN";
case DXGI_FORMAT_R32G32B32A32_TYPELESS:
return "DXGI_FORMAT_R32G32B32A32_TYPELESS";
case DXGI_FORMAT_R32G32B32A32_FLOAT:
return "DXGI_FORMAT_R32G32B32A32_FLOAT";
case DXGI_FORMAT_R32G32B32A32_UINT:
return "DXGI_FORMAT_R32G32B32A32_UINT";
case DXGI_FORMAT_R32G32B32A32_SINT:
return "DXGI_FORMAT_R32G32B32A32_SINT";
case DXGI_FORMAT_R32G32B32_TYPELESS:
return "DXGI_FORMAT_R32G32B32_TYPELESS";
case DXGI_FORMAT_R32G32B32_FLOAT:
return "DXGI_FORMAT_R32G32B32_FLOAT";
case DXGI_FORMAT_R32G32B32_UINT:
return "DXGI_FORMAT_R32G32B32_UINT";
case DXGI_FORMAT_R32G32B32_SINT:
return "DXGI_FORMAT_R32G32B32_SINT";
case DXGI_FORMAT_R16G16B16A16_TYPELESS:
return "DXGI_FORMAT_R16G16B16A16_TYPELESS";
case DXGI_FORMAT_R16G16B16A16_FLOAT:
return "DXGI_FORMAT_R16G16B16A16_FLOAT";
case DXGI_FORMAT_R16G16B16A16_UNORM:
return "DXGI_FORMAT_R16G16B16A16_UNORM";
case DXGI_FORMAT_R16G16B16A16_UINT:
return "DXGI_FORMAT_R16G16B16A16_UINT";
case DXGI_FORMAT_R16G16B16A16_SNORM:
return "DXGI_FORMAT_R16G16B16A16_SNORM";
case DXGI_FORMAT_R16G16B16A16_SINT:
return "DXGI_FORMAT_R16G16B16A16_SINT";
case DXGI_FORMAT_R32G32_TYPELESS:
return "DXGI_FORMAT_R32G32_TYPELESS";
case DXGI_FORMAT_R32G32_FLOAT:
return "DXGI_FORMAT_R32G32_FLOAT";
case DXGI_FORMAT_R32G32_UINT:
return "DXGI_FORMAT_R32G32_UINT";
case DXGI_FORMAT_R32G32_SINT:
return "DXGI_FORMAT_R32G32_SINT";
case DXGI_FORMAT_R32G8X24_TYPELESS:
return "DXGI_FORMAT_R32G8X24_TYPELESS";
case DXGI_FORMAT_D32_FLOAT_S8X24_UINT:
return "DXGI_FORMAT_D32_FLOAT_S8X24_UINT";
case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS:
return "DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS";
case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT:
return "DXGI_FORMAT_X32_TYPELESS_G8X24_UINT";
case DXGI_FORMAT_R10G10B10A2_TYPELESS:
return "DXGI_FORMAT_R10G10B10A2_TYPELESS";
case DXGI_FORMAT_R10G10B10A2_UNORM:
return "DXGI_FORMAT_R10G10B10A2_UNORM";
case DXGI_FORMAT_R10G10B10A2_UINT:
return "DXGI_FORMAT_R10G10B10A2_UINT";
case DXGI_FORMAT_R11G11B10_FLOAT:
return "DXGI_FORMAT_R11G11B10_FLOAT";
case DXGI_FORMAT_R8G8B8A8_TYPELESS:
return "DXGI_FORMAT_R8G8B8A8_TYPELESS";
case DXGI_FORMAT_R8G8B8A8_UNORM:
return "DXGI_FORMAT_R8G8B8A8_UNORM";
case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
return "DXGI_FORMAT_R8G8B8A8_UNORM_SRGB";
case DXGI_FORMAT_R8G8B8A8_UINT:
return "DXGI_FORMAT_R8G8B8A8_UINT";
case DXGI_FORMAT_R8G8B8A8_SNORM:
return "DXGI_FORMAT_R8G8B8A8_SNORM";
case DXGI_FORMAT_R8G8B8A8_SINT:
return "DXGI_FORMAT_R8G8B8A8_SINT";
case DXGI_FORMAT_R16G16_TYPELESS:
return "DXGI_FORMAT_R16G16_TYPELESS";
case DXGI_FORMAT_R16G16_FLOAT:
return "DXGI_FORMAT_R16G16_FLOAT";
case DXGI_FORMAT_R16G16_UNORM:
return "DXGI_FORMAT_R16G16_UNORM";
case DXGI_FORMAT_R16G16_UINT:
return "DXGI_FORMAT_R16G16_UINT";
case DXGI_FORMAT_R16G16_SNORM:
return "DXGI_FORMAT_R16G16_SNORM";
case DXGI_FORMAT_R16G16_SINT:
return "DXGI_FORMAT_R16G16_SINT";
case DXGI_FORMAT_R32_TYPELESS:
return "DXGI_FORMAT_R32_TYPELESS";
case DXGI_FORMAT_D32_FLOAT:
return "DXGI_FORMAT_D32_FLOAT";
case DXGI_FORMAT_R32_FLOAT:
return "DXGI_FORMAT_R32_FLOAT";
case DXGI_FORMAT_R32_UINT:
return "DXGI_FORMAT_R32_UINT";
case DXGI_FORMAT_R32_SINT:
return "DXGI_FORMAT_R32_SINT";
case DXGI_FORMAT_R24G8_TYPELESS:
return "DXGI_FORMAT_R24G8_TYPELESS";
case DXGI_FORMAT_D24_UNORM_S8_UINT:
return "DXGI_FORMAT_D24_UNORM_S8_UINT";
case DXGI_FORMAT_R24_UNORM_X8_TYPELESS:
return "DXGI_FORMAT_R24_UNORM_X8_TYPELESS";
case DXGI_FORMAT_X24_TYPELESS_G8_UINT:
return "DXGI_FORMAT_X24_TYPELESS_G8_UINT";
case DXGI_FORMAT_R8G8_TYPELESS:
return "DXGI_FORMAT_R8G8_TYPELESS";
case DXGI_FORMAT_R8G8_UNORM:
return "DXGI_FORMAT_R8G8_UNORM";
case DXGI_FORMAT_R8G8_UINT:
return "DXGI_FORMAT_R8G8_UINT";
case DXGI_FORMAT_R8G8_SNORM:
return "DXGI_FORMAT_R8G8_SNORM";
case DXGI_FORMAT_R8G8_SINT:
return "DXGI_FORMAT_R8G8_SINT";
case DXGI_FORMAT_R16_TYPELESS:
return "DXGI_FORMAT_R16_TYPELESS";
case DXGI_FORMAT_R16_FLOAT:
return "DXGI_FORMAT_R16_FLOAT";
case DXGI_FORMAT_D16_UNORM:
return "DXGI_FORMAT_D16_UNORM";
case DXGI_FORMAT_R16_UNORM:
return "DXGI_FORMAT_R16_UNORM";
case DXGI_FORMAT_R16_UINT:
return "DXGI_FORMAT_R16_UINT";
case DXGI_FORMAT_R16_SNORM:
return "DXGI_FORMAT_R16_SNORM";
case DXGI_FORMAT_R16_SINT:
return "DXGI_FORMAT_R16_SINT";
case DXGI_FORMAT_R8_TYPELESS:
return "DXGI_FORMAT_R8_TYPELESS";
case DXGI_FORMAT_R8_UNORM:
return "DXGI_FORMAT_R8_UNORM";
case DXGI_FORMAT_R8_UINT:
return "DXGI_FORMAT_R8_UINT";
case DXGI_FORMAT_R8_SNORM:
return "DXGI_FORMAT_R8_SNORM";
case DXGI_FORMAT_R8_SINT:
return "DXGI_FORMAT_R8_SINT";
case DXGI_FORMAT_A8_UNORM:
return "DXGI_FORMAT_A8_UNORM";
case DXGI_FORMAT_R1_UNORM:
return "DXGI_FORMAT_R1_UNORM";
case DXGI_FORMAT_R9G9B9E5_SHAREDEXP:
return "DXGI_FORMAT_R9G9B9E5_SHAREDEXP";
case DXGI_FORMAT_R8G8_B8G8_UNORM:
return "DXGI_FORMAT_R8G8_B8G8_UNORM";
case DXGI_FORMAT_G8R8_G8B8_UNORM:
return "DXGI_FORMAT_G8R8_G8B8_UNORM";
case DXGI_FORMAT_BC1_TYPELESS:
return "DXGI_FORMAT_BC1_TYPELESS";
case DXGI_FORMAT_BC1_UNORM:
return "DXGI_FORMAT_BC1_UNORM";
case DXGI_FORMAT_BC1_UNORM_SRGB:
return "DXGI_FORMAT_BC1_UNORM_SRGB";
case DXGI_FORMAT_BC2_TYPELESS:
return "DXGI_FORMAT_BC2_TYPELESS";
case DXGI_FORMAT_BC2_UNORM:
return "DXGI_FORMAT_BC2_UNORM";
case DXGI_FORMAT_BC2_UNORM_SRGB:
return "DXGI_FORMAT_BC2_UNORM_SRGB";
case DXGI_FORMAT_BC3_TYPELESS:
return "DXGI_FORMAT_BC3_TYPELESS";
case DXGI_FORMAT_BC3_UNORM:
return "DXGI_FORMAT_BC3_UNORM";
case DXGI_FORMAT_BC3_UNORM_SRGB:
return "DXGI_FORMAT_BC3_UNORM_SRGB";
case DXGI_FORMAT_BC4_TYPELESS:
return "DXGI_FORMAT_BC4_TYPELESS";
case DXGI_FORMAT_BC4_UNORM:
return "DXGI_FORMAT_BC4_UNORM";
case DXGI_FORMAT_BC4_SNORM:
return "DXGI_FORMAT_BC4_SNORM";
case DXGI_FORMAT_BC5_TYPELESS:
return "DXGI_FORMAT_BC5_TYPELESS";
case DXGI_FORMAT_BC5_UNORM:
return "DXGI_FORMAT_BC5_UNORM";
case DXGI_FORMAT_BC5_SNORM:
return "DXGI_FORMAT_BC5_SNORM";
case DXGI_FORMAT_B5G6R5_UNORM:
return "DXGI_FORMAT_B5G6R5_UNORM";
case DXGI_FORMAT_B5G5R5A1_UNORM:
return "DXGI_FORMAT_B5G5R5A1_UNORM";
case DXGI_FORMAT_B8G8R8A8_UNORM:
return "DXGI_FORMAT_B8G8R8A8_UNORM";
case DXGI_FORMAT_B8G8R8X8_UNORM:
return "DXGI_FORMAT_B8G8R8X8_UNORM";
case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM:
return "DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM";
case DXGI_FORMAT_B8G8R8A8_TYPELESS:
return "DXGI_FORMAT_B8G8R8A8_TYPELESS";
case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB:
return "DXGI_FORMAT_B8G8R8A8_UNORM_SRGB";
case DXGI_FORMAT_B8G8R8X8_TYPELESS:
return "DXGI_FORMAT_B8G8R8X8_TYPELESS";
case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB:
return "DXGI_FORMAT_B8G8R8X8_UNORM_SRGB";
case DXGI_FORMAT_BC6H_TYPELESS:
return "DXGI_FORMAT_BC6H_TYPELESS";
case DXGI_FORMAT_BC6H_UF16:
return "DXGI_FORMAT_BC6H_UF16";
case DXGI_FORMAT_BC6H_SF16:
return "DXGI_FORMAT_BC6H_SF16";
case DXGI_FORMAT_BC7_TYPELESS:
return "DXGI_FORMAT_BC7_TYPELESS";
case DXGI_FORMAT_BC7_UNORM:
return "DXGI_FORMAT_BC7_UNORM";
case DXGI_FORMAT_BC7_UNORM_SRGB:
return "DXGI_FORMAT_BC7_UNORM_SRGB";
case DXGI_FORMAT_AYUV:
return "DXGI_FORMAT_AYUV";
case DXGI_FORMAT_Y410:
return "DXGI_FORMAT_Y410";
case DXGI_FORMAT_Y416:
return "DXGI_FORMAT_Y416";
case DXGI_FORMAT_NV12:
return "DXGI_FORMAT_NV12";
case DXGI_FORMAT_P010:
return "DXGI_FORMAT_P010";
case DXGI_FORMAT_P016:
return "DXGI_FORMAT_P016";
case DXGI_FORMAT_420_OPAQUE:
return "DXGI_FORMAT_420_OPAQUE";
case DXGI_FORMAT_YUY2:
return "DXGI_FORMAT_YUY2";
case DXGI_FORMAT_Y210:
return "DXGI_FORMAT_Y210";
case DXGI_FORMAT_Y216:
return "DXGI_FORMAT_Y216";
case DXGI_FORMAT_NV11:
return "DXGI_FORMAT_NV11";
case DXGI_FORMAT_AI44:
return "DXGI_FORMAT_AI44";
case DXGI_FORMAT_IA44:
return "DXGI_FORMAT_IA44";
case DXGI_FORMAT_P8:
return "DXGI_FORMAT_P8";
case DXGI_FORMAT_A8P8:
return "DXGI_FORMAT_A8P8";
case DXGI_FORMAT_B4G4R4A4_UNORM:
return "DXGI_FORMAT_B4G4R4A4_UNORM";
case DXGI_FORMAT_FORCE_UINT:
return "DXGI_FORMAT_FORCE_UINT";
default:
return "DXGI_ERROR_FORMAT";
}
}
} /* namespace d3dstate */