From 66524a73309b2056f891c4fd9d1c3cf42eadca7a Mon Sep 17 00:00:00 2001 From: baldurk Date: Tue, 5 Jul 2016 15:52:12 +0300 Subject: [PATCH] Move common code into DXGI out of D3D11, to share with D3D12 --- renderdoc/driver/d3d11/d3d11_common.cpp | 815 ------- renderdoc/driver/d3d11/d3d11_common.h | 6 +- renderdoc/driver/d3d11/d3d11_debug.cpp | 4 +- renderdoc/driver/d3d11/d3d11_resources.h | 382 --- renderdoc/driver/dxgi/dxgi_common.cpp | 2054 +++++++++++++++++ renderdoc/driver/dxgi/dxgi_common.h | 60 + renderdoc/driver/dxgi/dxgi_wrapped.h | 362 +++ renderdoc/driver/dxgi/renderdoc_dxgi.vcxproj | 2 + .../dxgi/renderdoc_dxgi.vcxproj.filters | 27 +- 9 files changed, 2505 insertions(+), 1207 deletions(-) create mode 100644 renderdoc/driver/dxgi/dxgi_common.cpp create mode 100644 renderdoc/driver/dxgi/dxgi_common.h diff --git a/renderdoc/driver/d3d11/d3d11_common.cpp b/renderdoc/driver/d3d11/d3d11_common.cpp index 83948187c..242a80b7b 100644 --- a/renderdoc/driver/d3d11/d3d11_common.cpp +++ b/renderdoc/driver/d3d11/d3d11_common.cpp @@ -30,640 +30,6 @@ #include "serialise/serialiser.h" #include "serialise/string_utils.h" -D3D11_PRIMITIVE_TOPOLOGY MakeD3D11PrimitiveTopology(PrimitiveTopology Topo) -{ - switch(Topo) - { - case eTopology_LineLoop: - case eTopology_TriangleFan: RDCWARN("Unsupported primitive topology on D3D11: %x", Topo); break; - default: - case eTopology_Unknown: return D3D11_PRIMITIVE_TOPOLOGY_UNDEFINED; - case eTopology_PointList: return D3D11_PRIMITIVE_TOPOLOGY_POINTLIST; - case eTopology_LineList: return D3D11_PRIMITIVE_TOPOLOGY_LINELIST; - case eTopology_LineStrip: return D3D11_PRIMITIVE_TOPOLOGY_LINESTRIP; - case eTopology_TriangleList: return D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST; - case eTopology_TriangleStrip: return D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP; - case eTopology_LineList_Adj: return D3D11_PRIMITIVE_TOPOLOGY_LINELIST_ADJ; - case eTopology_LineStrip_Adj: return D3D11_PRIMITIVE_TOPOLOGY_LINESTRIP_ADJ; - case eTopology_TriangleList_Adj: return D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST_ADJ; - case eTopology_TriangleStrip_Adj: return D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP_ADJ; - case eTopology_PatchList_1CPs: - case eTopology_PatchList_2CPs: - case eTopology_PatchList_3CPs: - case eTopology_PatchList_4CPs: - case eTopology_PatchList_5CPs: - case eTopology_PatchList_6CPs: - case eTopology_PatchList_7CPs: - case eTopology_PatchList_8CPs: - case eTopology_PatchList_9CPs: - case eTopology_PatchList_10CPs: - case eTopology_PatchList_11CPs: - case eTopology_PatchList_12CPs: - case eTopology_PatchList_13CPs: - case eTopology_PatchList_14CPs: - case eTopology_PatchList_15CPs: - case eTopology_PatchList_16CPs: - case eTopology_PatchList_17CPs: - case eTopology_PatchList_18CPs: - case eTopology_PatchList_19CPs: - case eTopology_PatchList_20CPs: - case eTopology_PatchList_21CPs: - case eTopology_PatchList_22CPs: - case eTopology_PatchList_23CPs: - case eTopology_PatchList_24CPs: - case eTopology_PatchList_25CPs: - case eTopology_PatchList_26CPs: - case eTopology_PatchList_27CPs: - case eTopology_PatchList_28CPs: - case eTopology_PatchList_29CPs: - case eTopology_PatchList_30CPs: - case eTopology_PatchList_31CPs: - case eTopology_PatchList_32CPs: - return D3D11_PRIMITIVE_TOPOLOGY(D3D11_PRIMITIVE_TOPOLOGY_1_CONTROL_POINT_PATCHLIST + - (Topo - eTopology_PatchList_1CPs)); - } - - return D3D11_PRIMITIVE_TOPOLOGY_UNDEFINED; -} - -PrimitiveTopology MakePrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY Topo) -{ - switch(Topo) - { - default: - case D3D_PRIMITIVE_TOPOLOGY_UNDEFINED: break; - case D3D_PRIMITIVE_TOPOLOGY_POINTLIST: return eTopology_PointList; break; - case D3D_PRIMITIVE_TOPOLOGY_LINELIST: return eTopology_LineList; break; - case D3D_PRIMITIVE_TOPOLOGY_LINESTRIP: return eTopology_LineStrip; break; - case D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST: return eTopology_TriangleList; break; - case D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP: return eTopology_TriangleStrip; break; - case D3D_PRIMITIVE_TOPOLOGY_LINELIST_ADJ: return eTopology_LineList_Adj; break; - case D3D_PRIMITIVE_TOPOLOGY_LINESTRIP_ADJ: return eTopology_LineStrip_Adj; break; - case D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST_ADJ: return eTopology_TriangleList_Adj; break; - case D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP_ADJ: return eTopology_TriangleStrip_Adj; break; - case D3D_PRIMITIVE_TOPOLOGY_1_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_2_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_3_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_4_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_5_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_6_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_7_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_8_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_9_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_10_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_11_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_12_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_13_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_14_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_15_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_16_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_17_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_18_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_19_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_20_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_21_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_22_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_23_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_24_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_25_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_26_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_27_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_28_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_29_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_30_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_31_CONTROL_POINT_PATCHLIST: - case D3D_PRIMITIVE_TOPOLOGY_32_CONTROL_POINT_PATCHLIST: - return PrimitiveTopology(eTopology_PatchList_1CPs + - (Topo - D3D_PRIMITIVE_TOPOLOGY_1_CONTROL_POINT_PATCHLIST)); - break; - } - - return eTopology_Unknown; -} - -DXGI_FORMAT MakeDXGIFormat(ResourceFormat fmt) -{ - DXGI_FORMAT ret = DXGI_FORMAT_UNKNOWN; - - if(fmt.special) - { - switch(fmt.specialFormat) - { - case eSpecial_BC1: ret = DXGI_FORMAT_BC1_UNORM; break; - case eSpecial_BC2: ret = DXGI_FORMAT_BC2_UNORM; break; - case eSpecial_BC3: ret = DXGI_FORMAT_BC3_UNORM; break; - case eSpecial_BC4: ret = DXGI_FORMAT_BC4_UNORM; break; - case eSpecial_BC5: ret = DXGI_FORMAT_BC5_UNORM; break; - case eSpecial_BC6: ret = DXGI_FORMAT_BC6H_UF16; break; - case eSpecial_BC7: ret = DXGI_FORMAT_BC7_UNORM; break; - case eSpecial_R10G10B10A2: - if(fmt.compType == eCompType_UNorm) - ret = DXGI_FORMAT_R10G10B10A2_UNORM; - else - ret = DXGI_FORMAT_R10G10B10A2_UINT; - break; - case eSpecial_R11G11B10: ret = DXGI_FORMAT_R11G11B10_FLOAT; break; - case eSpecial_R5G6B5: - RDCASSERT(fmt.bgraOrder); - ret = DXGI_FORMAT_B5G6R5_UNORM; - break; - case eSpecial_R5G5B5A1: - RDCASSERT(fmt.bgraOrder); - ret = DXGI_FORMAT_B5G5R5A1_UNORM; - break; - case eSpecial_R9G9B9E5: ret = DXGI_FORMAT_R9G9B9E5_SHAREDEXP; break; - case eSpecial_R4G4B4A4: - RDCASSERT(fmt.bgraOrder); - ret = DXGI_FORMAT_B4G4R4A4_UNORM; - break; - case eSpecial_D24S8: ret = DXGI_FORMAT_R24G8_TYPELESS; break; - case eSpecial_D32S8: ret = DXGI_FORMAT_R32G8X24_TYPELESS; break; - case eSpecial_YUV: - RDCERR("Video format not unambiguously encoded"); - ret = DXGI_FORMAT_AYUV; - break; - case eSpecial_S8: RDCERR("D3D11 has no stencil-only format"); break; - case eSpecial_D16S8: RDCERR("D3D11 has no D16S8 format"); break; - default: RDCERR("Unrecognised/unsupported special format %u", fmt.specialFormat); break; - } - } - else if(fmt.compCount == 4) - { - if(fmt.compByteWidth == 4) - ret = DXGI_FORMAT_R32G32B32A32_TYPELESS; - else if(fmt.compByteWidth == 2) - ret = DXGI_FORMAT_R16G16B16A16_TYPELESS; - else if(fmt.compByteWidth == 1) - ret = DXGI_FORMAT_R8G8B8A8_TYPELESS; - else - RDCERR("Unrecognised 4-component byte width: %d", fmt.compByteWidth); - - if(fmt.bgraOrder) - ret = DXGI_FORMAT_B8G8R8A8_UNORM; - } - else if(fmt.compCount == 3) - { - if(fmt.compByteWidth == 4) - ret = DXGI_FORMAT_R32G32B32_TYPELESS; - // else if(fmt.compByteWidth == 2) ret = DXGI_FORMAT_R16G16B16_TYPELESS; // format doesn't exist - // else if(fmt.compByteWidth == 1) ret = DXGI_FORMAT_R8G8B8_TYPELESS; // format doesn't exist - else - RDCERR("Unrecognised 3-component byte width: %d", fmt.compByteWidth); - } - else if(fmt.compCount == 2) - { - if(fmt.compByteWidth == 4) - ret = DXGI_FORMAT_R32G32_TYPELESS; - else if(fmt.compByteWidth == 2) - ret = DXGI_FORMAT_R16G16_TYPELESS; - else if(fmt.compByteWidth == 1) - ret = DXGI_FORMAT_R8G8_TYPELESS; - else - RDCERR("Unrecognised 2-component byte width: %d", fmt.compByteWidth); - } - else if(fmt.compCount == 1) - { - if(fmt.compByteWidth == 4) - ret = DXGI_FORMAT_R32_TYPELESS; - else if(fmt.compByteWidth == 2) - ret = DXGI_FORMAT_R16_TYPELESS; - else if(fmt.compByteWidth == 1) - ret = DXGI_FORMAT_R8_TYPELESS; - else - RDCERR("Unrecognised 1-component byte width: %d", fmt.compByteWidth); - } - else - { - RDCERR("Unrecognised component count: %d", fmt.compCount); - } - - if(fmt.compType == eCompType_None) - ret = GetTypelessFormat(ret); - else if(fmt.compType == eCompType_Float) - ret = GetFloatTypedFormat(ret); - else if(fmt.compType == eCompType_Depth) - ret = GetDepthTypedFormat(ret); - else if(fmt.compType == eCompType_UNorm) - ret = GetUnormTypedFormat(ret); - else if(fmt.compType == eCompType_SNorm) - ret = GetSnormTypedFormat(ret); - else if(fmt.compType == eCompType_UInt) - ret = GetUIntTypedFormat(ret); - else if(fmt.compType == eCompType_SInt) - ret = GetSIntTypedFormat(ret); - else - RDCERR("Unrecognised component type"); - - if(fmt.srgbCorrected) - ret = GetSRGBFormat(ret); - - if(ret == DXGI_FORMAT_UNKNOWN) - RDCERR("No known DXGI_FORMAT corresponding to resource format!"); - - return ret; -} - -ResourceFormat MakeResourceFormat(DXGI_FORMAT fmt) -{ - ResourceFormat ret; - - ret.rawType = fmt; - ret.special = false; - ret.strname = ToStr::Get(fmt).substr(12); // 12 == strlen("DXGI_FORMAT_") - - ret.compCount = ret.compByteWidth = 0; - ret.compType = eCompType_Float; - - ret.srgbCorrected = IsSRGBFormat(fmt); - - switch(fmt) - { - case DXGI_FORMAT_R32G32B32A32_TYPELESS: - case DXGI_FORMAT_R32G32B32A32_FLOAT: - case DXGI_FORMAT_R32G32B32A32_UINT: - case DXGI_FORMAT_R32G32B32A32_SINT: - case DXGI_FORMAT_R16G16B16A16_TYPELESS: - case DXGI_FORMAT_R16G16B16A16_FLOAT: - case DXGI_FORMAT_R16G16B16A16_UNORM: - case DXGI_FORMAT_R16G16B16A16_UINT: - case DXGI_FORMAT_R16G16B16A16_SNORM: - case DXGI_FORMAT_R16G16B16A16_SINT: - case DXGI_FORMAT_R8G8B8A8_TYPELESS: - case DXGI_FORMAT_R8G8B8A8_UNORM: - case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: - case DXGI_FORMAT_R8G8B8A8_UINT: - case DXGI_FORMAT_R8G8B8A8_SNORM: - case DXGI_FORMAT_R8G8B8A8_SINT: ret.compCount = 4; break; - case DXGI_FORMAT_R32G32B32_TYPELESS: - case DXGI_FORMAT_R32G32B32_FLOAT: - case DXGI_FORMAT_R32G32B32_UINT: - case DXGI_FORMAT_R32G32B32_SINT: ret.compCount = 3; break; - case DXGI_FORMAT_R32G32_TYPELESS: - case DXGI_FORMAT_R32G32_FLOAT: - case DXGI_FORMAT_R32G32_UINT: - case DXGI_FORMAT_R32G32_SINT: - case DXGI_FORMAT_R16G16_TYPELESS: - case DXGI_FORMAT_R16G16_FLOAT: - case DXGI_FORMAT_R16G16_UNORM: - case DXGI_FORMAT_R16G16_UINT: - case DXGI_FORMAT_R16G16_SNORM: - case DXGI_FORMAT_R16G16_SINT: - case DXGI_FORMAT_R8G8_TYPELESS: - case DXGI_FORMAT_R8G8_UNORM: - case DXGI_FORMAT_R8G8_UINT: - case DXGI_FORMAT_R8G8_SNORM: - case DXGI_FORMAT_R8G8_SINT: ret.compCount = 2; break; - case DXGI_FORMAT_R32_TYPELESS: - case DXGI_FORMAT_D32_FLOAT: - case DXGI_FORMAT_R32_FLOAT: - case DXGI_FORMAT_R32_UINT: - case DXGI_FORMAT_R32_SINT: - case DXGI_FORMAT_R16_TYPELESS: - case DXGI_FORMAT_R16_FLOAT: - case DXGI_FORMAT_D16_UNORM: - case DXGI_FORMAT_R16_UNORM: - case DXGI_FORMAT_R16_UINT: - case DXGI_FORMAT_R16_SNORM: - case DXGI_FORMAT_R16_SINT: - case DXGI_FORMAT_R8_TYPELESS: - case DXGI_FORMAT_R8_UNORM: - case DXGI_FORMAT_R8_UINT: - case DXGI_FORMAT_R8_SNORM: - case DXGI_FORMAT_R8_SINT: - case DXGI_FORMAT_A8_UNORM: ret.compCount = 1; break; - - case DXGI_FORMAT_R32G8X24_TYPELESS: - case DXGI_FORMAT_D32_FLOAT_S8X24_UINT: - case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS: - case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT: - case DXGI_FORMAT_R24G8_TYPELESS: - case DXGI_FORMAT_D24_UNORM_S8_UINT: - case DXGI_FORMAT_R24_UNORM_X8_TYPELESS: - case DXGI_FORMAT_X24_TYPELESS_G8_UINT: - - case DXGI_FORMAT_BC5_TYPELESS: - case DXGI_FORMAT_BC5_UNORM: - case DXGI_FORMAT_BC5_SNORM: ret.compCount = 2; break; - - case DXGI_FORMAT_R11G11B10_FLOAT: - case DXGI_FORMAT_R9G9B9E5_SHAREDEXP: - case DXGI_FORMAT_R8G8_B8G8_UNORM: - case DXGI_FORMAT_G8R8_G8B8_UNORM: - case DXGI_FORMAT_B5G6R5_UNORM: - - case DXGI_FORMAT_BC6H_TYPELESS: - case DXGI_FORMAT_BC6H_UF16: - case DXGI_FORMAT_BC6H_SF16: ret.compCount = 3; break; - - case DXGI_FORMAT_R10G10B10A2_TYPELESS: - case DXGI_FORMAT_R10G10B10A2_UNORM: - case DXGI_FORMAT_R10G10B10A2_UINT: - case DXGI_FORMAT_B8G8R8A8_UNORM: - case DXGI_FORMAT_B8G8R8A8_TYPELESS: - case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: - case DXGI_FORMAT_B8G8R8X8_UNORM: - case DXGI_FORMAT_B8G8R8X8_TYPELESS: - case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: - case DXGI_FORMAT_B5G5R5A1_UNORM: - case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM: - - case DXGI_FORMAT_BC1_TYPELESS: - case DXGI_FORMAT_BC1_UNORM: - case DXGI_FORMAT_BC1_UNORM_SRGB: - case DXGI_FORMAT_BC2_TYPELESS: - case DXGI_FORMAT_BC2_UNORM: - case DXGI_FORMAT_BC2_UNORM_SRGB: - case DXGI_FORMAT_BC3_TYPELESS: - case DXGI_FORMAT_BC3_UNORM: - case DXGI_FORMAT_BC3_UNORM_SRGB: - case DXGI_FORMAT_BC7_TYPELESS: - case DXGI_FORMAT_BC7_UNORM: - case DXGI_FORMAT_BC7_UNORM_SRGB: ret.compCount = 4; break; - - case DXGI_FORMAT_R1_UNORM: - - case DXGI_FORMAT_BC4_TYPELESS: - case DXGI_FORMAT_BC4_UNORM: - case DXGI_FORMAT_BC4_SNORM: ret.compCount = 1; break; - - case DXGI_FORMAT_UNKNOWN: ret.compCount = 0; - - default: ret.special = true; - } - - switch(fmt) - { - case DXGI_FORMAT_R32G32B32A32_TYPELESS: - case DXGI_FORMAT_R32G32B32A32_FLOAT: - case DXGI_FORMAT_R32G32B32A32_UINT: - case DXGI_FORMAT_R32G32B32A32_SINT: - case DXGI_FORMAT_R32G32B32_TYPELESS: - case DXGI_FORMAT_R32G32B32_FLOAT: - case DXGI_FORMAT_R32G32B32_UINT: - case DXGI_FORMAT_R32G32B32_SINT: - case DXGI_FORMAT_R32G32_TYPELESS: - case DXGI_FORMAT_R32G32_FLOAT: - case DXGI_FORMAT_R32G32_UINT: - case DXGI_FORMAT_R32G32_SINT: - case DXGI_FORMAT_R32_TYPELESS: - case DXGI_FORMAT_D32_FLOAT: - case DXGI_FORMAT_R32_FLOAT: - case DXGI_FORMAT_R32_UINT: - case DXGI_FORMAT_R32_SINT: ret.compByteWidth = 4; break; - case DXGI_FORMAT_R16G16B16A16_TYPELESS: - case DXGI_FORMAT_R16G16B16A16_FLOAT: - case DXGI_FORMAT_R16G16B16A16_UNORM: - case DXGI_FORMAT_R16G16B16A16_UINT: - case DXGI_FORMAT_R16G16B16A16_SNORM: - case DXGI_FORMAT_R16G16B16A16_SINT: - case DXGI_FORMAT_R16G16_TYPELESS: - case DXGI_FORMAT_R16G16_FLOAT: - case DXGI_FORMAT_R16G16_UNORM: - case DXGI_FORMAT_R16G16_UINT: - case DXGI_FORMAT_R16G16_SNORM: - case DXGI_FORMAT_R16G16_SINT: - case DXGI_FORMAT_R16_TYPELESS: - case DXGI_FORMAT_R16_FLOAT: - case DXGI_FORMAT_D16_UNORM: - case DXGI_FORMAT_R16_UNORM: - case DXGI_FORMAT_R16_UINT: - case DXGI_FORMAT_R16_SNORM: - case DXGI_FORMAT_R16_SINT: ret.compByteWidth = 2; break; - case DXGI_FORMAT_R8G8B8A8_TYPELESS: - case DXGI_FORMAT_R8G8B8A8_UNORM: - case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: - case DXGI_FORMAT_R8G8B8A8_UINT: - case DXGI_FORMAT_R8G8B8A8_SNORM: - case DXGI_FORMAT_R8G8B8A8_SINT: - case DXGI_FORMAT_R8G8_TYPELESS: - case DXGI_FORMAT_R8G8_UNORM: - case DXGI_FORMAT_R8G8_UINT: - case DXGI_FORMAT_R8G8_SNORM: - case DXGI_FORMAT_R8G8_SINT: - case DXGI_FORMAT_R8_TYPELESS: - case DXGI_FORMAT_R8_UNORM: - case DXGI_FORMAT_R8_UINT: - case DXGI_FORMAT_R8_SNORM: - case DXGI_FORMAT_R8_SINT: - case DXGI_FORMAT_A8_UNORM: ret.compByteWidth = 1; break; - - case DXGI_FORMAT_B8G8R8A8_UNORM: - case DXGI_FORMAT_B8G8R8A8_TYPELESS: - case DXGI_FORMAT_B8G8R8X8_TYPELESS: - case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: - case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: ret.compByteWidth = 1; break; - - case DXGI_FORMAT_UNKNOWN: ret.compByteWidth = 0; - - default: ret.special = true; - } - - switch(fmt) - { - case DXGI_FORMAT_R32G32B32A32_TYPELESS: - case DXGI_FORMAT_R32G32B32_TYPELESS: - case DXGI_FORMAT_R32G32_TYPELESS: - case DXGI_FORMAT_R32_TYPELESS: - case DXGI_FORMAT_R16G16B16A16_TYPELESS: - case DXGI_FORMAT_R16G16_TYPELESS: - case DXGI_FORMAT_R16_TYPELESS: - case DXGI_FORMAT_R8G8B8A8_TYPELESS: - case DXGI_FORMAT_R8G8_TYPELESS: - case DXGI_FORMAT_R8_TYPELESS: ret.compType = eCompType_None; break; - case DXGI_FORMAT_R32G32B32A32_FLOAT: - case DXGI_FORMAT_R32G32B32_FLOAT: - case DXGI_FORMAT_R16G16B16A16_FLOAT: - case DXGI_FORMAT_R32G32_FLOAT: - case DXGI_FORMAT_R16G16_FLOAT: - case DXGI_FORMAT_R32_FLOAT: - case DXGI_FORMAT_R16_FLOAT: ret.compType = eCompType_Float; break; - case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: - case DXGI_FORMAT_R8G8B8A8_UNORM: - case DXGI_FORMAT_R16G16B16A16_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: ret.compType = eCompType_UNorm; break; - case DXGI_FORMAT_R8G8B8A8_SNORM: - case DXGI_FORMAT_R16G16B16A16_SNORM: - case DXGI_FORMAT_R16G16_SNORM: - case DXGI_FORMAT_R8G8_SNORM: - case DXGI_FORMAT_R16_SNORM: - case DXGI_FORMAT_R8_SNORM: ret.compType = eCompType_SNorm; break; - case DXGI_FORMAT_R32G32B32A32_UINT: - case DXGI_FORMAT_R32G32B32_UINT: - case DXGI_FORMAT_R16G16B16A16_UINT: - case DXGI_FORMAT_R32G32_UINT: - case DXGI_FORMAT_R8G8B8A8_UINT: - case DXGI_FORMAT_R16G16_UINT: - case DXGI_FORMAT_R32_UINT: - case DXGI_FORMAT_R8G8_UINT: - case DXGI_FORMAT_R16_UINT: - case DXGI_FORMAT_R8_UINT: ret.compType = eCompType_UInt; break; - case DXGI_FORMAT_R32G32B32A32_SINT: - case DXGI_FORMAT_R32G32B32_SINT: - case DXGI_FORMAT_R16G16B16A16_SINT: - case DXGI_FORMAT_R32G32_SINT: - case DXGI_FORMAT_R8G8B8A8_SINT: - case DXGI_FORMAT_R16G16_SINT: - case DXGI_FORMAT_R32_SINT: - case DXGI_FORMAT_R8G8_SINT: - case DXGI_FORMAT_R16_SINT: - case DXGI_FORMAT_R8_SINT: ret.compType = eCompType_SInt; break; - - case DXGI_FORMAT_R10G10B10A2_UINT: - case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM: ret.compType = eCompType_UInt; break; - - case DXGI_FORMAT_R9G9B9E5_SHAREDEXP: - case DXGI_FORMAT_R11G11B10_FLOAT: ret.compType = eCompType_Float; break; - - case DXGI_FORMAT_BC4_SNORM: - case DXGI_FORMAT_BC5_SNORM: - case DXGI_FORMAT_BC6H_SF16: ret.compType = eCompType_SNorm; break; - - case DXGI_FORMAT_R24G8_TYPELESS: - case DXGI_FORMAT_R32G8X24_TYPELESS: ret.compType = eCompType_None; break; - case DXGI_FORMAT_X24_TYPELESS_G8_UINT: - case DXGI_FORMAT_D32_FLOAT_S8X24_UINT: - case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS: - case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT: - case DXGI_FORMAT_D32_FLOAT: - case DXGI_FORMAT_R24_UNORM_X8_TYPELESS: - case DXGI_FORMAT_D24_UNORM_S8_UINT: - case DXGI_FORMAT_D16_UNORM: ret.compType = eCompType_Depth; break; - - case DXGI_FORMAT_R10G10B10A2_TYPELESS: - case DXGI_FORMAT_B8G8R8A8_TYPELESS: - case DXGI_FORMAT_B8G8R8X8_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_BC6H_TYPELESS: - case DXGI_FORMAT_BC7_TYPELESS: ret.compType = eCompType_None; break; - case DXGI_FORMAT_R8G8_B8G8_UNORM: - case DXGI_FORMAT_G8R8_G8B8_UNORM: - case DXGI_FORMAT_R10G10B10A2_UNORM: - case DXGI_FORMAT_B5G6R5_UNORM: - case DXGI_FORMAT_B5G5R5A1_UNORM: - case DXGI_FORMAT_B8G8R8A8_UNORM: - case DXGI_FORMAT_B8G8R8X8_UNORM: - case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: - case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: - case DXGI_FORMAT_R1_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_BC6H_UF16: - case DXGI_FORMAT_BC7_UNORM: - case DXGI_FORMAT_BC1_UNORM_SRGB: - case DXGI_FORMAT_BC2_UNORM_SRGB: - case DXGI_FORMAT_BC3_UNORM_SRGB: - case DXGI_FORMAT_BC7_UNORM_SRGB: ret.compType = eCompType_UNorm; break; - - case DXGI_FORMAT_UNKNOWN: ret.compType = eCompType_None; - - default: ret.special = true; - } - - switch(fmt) - { - case DXGI_FORMAT_B8G8R8A8_UNORM: - case DXGI_FORMAT_B8G8R8X8_UNORM: - case DXGI_FORMAT_B8G8R8A8_TYPELESS: - case DXGI_FORMAT_B8G8R8X8_TYPELESS: - case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: - case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: ret.bgraOrder = true; break; - } - - ret.specialFormat = eSpecial_Unknown; - - switch(fmt) - { - case DXGI_FORMAT_R24_UNORM_X8_TYPELESS: - case DXGI_FORMAT_X24_TYPELESS_G8_UINT: - case DXGI_FORMAT_D24_UNORM_S8_UINT: - case DXGI_FORMAT_R24G8_TYPELESS: ret.specialFormat = eSpecial_D24S8; break; - case DXGI_FORMAT_D32_FLOAT_S8X24_UINT: - case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS: - case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT: - case DXGI_FORMAT_R32G8X24_TYPELESS: ret.specialFormat = eSpecial_D32S8; break; - - case DXGI_FORMAT_BC1_TYPELESS: - case DXGI_FORMAT_BC1_UNORM_SRGB: - case DXGI_FORMAT_BC1_UNORM: ret.specialFormat = eSpecial_BC1; break; - case DXGI_FORMAT_BC2_TYPELESS: - case DXGI_FORMAT_BC2_UNORM_SRGB: - case DXGI_FORMAT_BC2_UNORM: ret.specialFormat = eSpecial_BC2; break; - case DXGI_FORMAT_BC3_TYPELESS: - case DXGI_FORMAT_BC3_UNORM_SRGB: - case DXGI_FORMAT_BC3_UNORM: ret.specialFormat = eSpecial_BC3; break; - case DXGI_FORMAT_BC4_TYPELESS: - case DXGI_FORMAT_BC4_UNORM: - case DXGI_FORMAT_BC4_SNORM: ret.specialFormat = eSpecial_BC4; break; - case DXGI_FORMAT_BC5_TYPELESS: - case DXGI_FORMAT_BC5_UNORM: - case DXGI_FORMAT_BC5_SNORM: ret.specialFormat = eSpecial_BC5; break; - case DXGI_FORMAT_BC6H_UF16: - case DXGI_FORMAT_BC6H_SF16: - case DXGI_FORMAT_BC6H_TYPELESS: ret.specialFormat = eSpecial_BC6; break; - case DXGI_FORMAT_BC7_TYPELESS: - case DXGI_FORMAT_BC7_UNORM_SRGB: - case DXGI_FORMAT_BC7_UNORM: ret.specialFormat = eSpecial_BC7; break; - case DXGI_FORMAT_R10G10B10A2_TYPELESS: - case DXGI_FORMAT_R10G10B10A2_UINT: - case DXGI_FORMAT_R10G10B10A2_UNORM: - case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM: ret.specialFormat = eSpecial_R10G10B10A2; break; - case DXGI_FORMAT_R11G11B10_FLOAT: ret.specialFormat = eSpecial_R11G11B10; break; - case DXGI_FORMAT_B5G6R5_UNORM: - ret.specialFormat = eSpecial_R5G6B5; - ret.bgraOrder = true; - break; - case DXGI_FORMAT_B5G5R5A1_UNORM: - ret.specialFormat = eSpecial_R5G5B5A1; - ret.bgraOrder = true; - break; - case DXGI_FORMAT_R9G9B9E5_SHAREDEXP: ret.specialFormat = eSpecial_R9G9B9E5; break; - - case DXGI_FORMAT_AYUV: - case DXGI_FORMAT_Y410: - case DXGI_FORMAT_Y416: - case DXGI_FORMAT_NV12: - case DXGI_FORMAT_P010: - case DXGI_FORMAT_P016: - case DXGI_FORMAT_420_OPAQUE: - case DXGI_FORMAT_YUY2: - case DXGI_FORMAT_Y210: - case DXGI_FORMAT_Y216: - case DXGI_FORMAT_NV11: - case DXGI_FORMAT_AI44: - case DXGI_FORMAT_IA44: - case DXGI_FORMAT_P8: - case DXGI_FORMAT_A8P8: - case DXGI_FORMAT_P208: - case DXGI_FORMAT_V208: - case DXGI_FORMAT_V408: ret.specialFormat = eSpecial_YUV; break; - - case DXGI_FORMAT_B4G4R4A4_UNORM: - ret.specialFormat = eSpecial_R4G4B4A4; - ret.bgraOrder = true; - break; - - default: break; - } - - if(ret.specialFormat != eSpecial_Unknown) - { - ret.special = true; - } - - return ret; -} - static ShaderConstant MakeConstantBufferVariable(const DXBC::CBufferVariable &var, uint32_t &offset); static ShaderVariableType MakeShaderVariableType(DXBC::CBufferVariableType type, uint32_t &offset) @@ -1655,14 +1021,6 @@ string ToStrHelper::Get(const D3D11_BOX &el) return tostrBuf; } -string ToStrHelper::Get(const DXGI_SAMPLE_DESC &el) -{ - char tostrBuf[256] = {0}; - StringFormat::snprintf(tostrBuf, 255, "DXGI_SAMPLE_DESC<%d,%d>", el.Count, el.Quality); - - return tostrBuf; -} - string ToStrHelper::Get(const D3D11_BIND_FLAG &el) { string ret; @@ -2026,46 +1384,6 @@ string ToStrHelper::Get(const D3D11_DSV_DIMENSION &e return tostrBuf; } -string ToStrHelper::Get(const D3D_FEATURE_LEVEL &el) -{ - switch(el) - { - TOSTR_CASE_STRINGIZE(D3D_FEATURE_LEVEL_9_1) - TOSTR_CASE_STRINGIZE(D3D_FEATURE_LEVEL_9_2) - TOSTR_CASE_STRINGIZE(D3D_FEATURE_LEVEL_9_3) - TOSTR_CASE_STRINGIZE(D3D_FEATURE_LEVEL_10_0) - TOSTR_CASE_STRINGIZE(D3D_FEATURE_LEVEL_10_1) - TOSTR_CASE_STRINGIZE(D3D_FEATURE_LEVEL_11_0) - TOSTR_CASE_STRINGIZE(D3D_FEATURE_LEVEL_11_1) - TOSTR_CASE_STRINGIZE(D3D_FEATURE_LEVEL_12_0) - TOSTR_CASE_STRINGIZE(D3D_FEATURE_LEVEL_12_1) - default: break; - } - - char tostrBuf[256] = {0}; - StringFormat::snprintf(tostrBuf, 255, "D3D_FEATURE_LEVEL<%d>", el); - - return tostrBuf; -} - -string ToStrHelper::Get(const D3D_DRIVER_TYPE &el) -{ - switch(el) - { - TOSTR_CASE_STRINGIZE(D3D_DRIVER_TYPE_HARDWARE) - TOSTR_CASE_STRINGIZE(D3D_DRIVER_TYPE_REFERENCE) - TOSTR_CASE_STRINGIZE(D3D_DRIVER_TYPE_NULL) - TOSTR_CASE_STRINGIZE(D3D_DRIVER_TYPE_SOFTWARE) - TOSTR_CASE_STRINGIZE(D3D_DRIVER_TYPE_WARP) - default: break; - } - - char tostrBuf[256] = {0}; - StringFormat::snprintf(tostrBuf, 255, "D3D_DRIVER_TYPE<%d>", el); - - return tostrBuf; -} - string ToStrHelper::Get(const D3D11_CONTEXT_TYPE &el) { switch(el) @@ -2241,136 +1559,3 @@ string ToStrHelper::Get(const long &el) { return ToStr::Get((uint64_t)el); } - -string ToStrHelper::Get(const DXGI_FORMAT &el) -{ - switch(el) - { - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R32G32B32A32_TYPELESS) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R32G32B32A32_FLOAT) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R32G32B32A32_UINT) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R32G32B32A32_SINT) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R32G32B32_TYPELESS) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R32G32B32_FLOAT) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R32G32B32_UINT) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R32G32B32_SINT) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R16G16B16A16_TYPELESS) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R16G16B16A16_FLOAT) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R16G16B16A16_UNORM) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R16G16B16A16_UINT) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R16G16B16A16_SNORM) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R16G16B16A16_SINT) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R32G32_TYPELESS) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R32G32_FLOAT) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R32G32_UINT) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R32G32_SINT) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R32G8X24_TYPELESS) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_D32_FLOAT_S8X24_UINT) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_X32_TYPELESS_G8X24_UINT) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R10G10B10A2_TYPELESS) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R10G10B10A2_UNORM) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R10G10B10A2_UINT) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R11G11B10_FLOAT) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R8G8B8A8_TYPELESS) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R8G8B8A8_UNORM) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R8G8B8A8_UNORM_SRGB) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R8G8B8A8_UINT) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R8G8B8A8_SNORM) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R8G8B8A8_SINT) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R16G16_TYPELESS) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R16G16_FLOAT) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R16G16_UNORM) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R16G16_UINT) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R16G16_SNORM) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R16G16_SINT) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R32_TYPELESS) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_D32_FLOAT) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R32_FLOAT) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R32_UINT) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R32_SINT) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R24G8_TYPELESS) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_D24_UNORM_S8_UINT) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R24_UNORM_X8_TYPELESS) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_X24_TYPELESS_G8_UINT) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R8G8_TYPELESS) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R8G8_UNORM) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R8G8_UINT) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R8G8_SNORM) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R8G8_SINT) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R16_TYPELESS) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R16_FLOAT) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_D16_UNORM) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R16_UNORM) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R16_UINT) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R16_SNORM) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R16_SINT) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R8_TYPELESS) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R8_UNORM) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R8_UINT) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R8_SNORM) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R8_SINT) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_A8_UNORM) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R1_UNORM) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R9G9B9E5_SHAREDEXP) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R8G8_B8G8_UNORM) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_G8R8_G8B8_UNORM) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_BC1_TYPELESS) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_BC1_UNORM) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_BC1_UNORM_SRGB) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_BC2_TYPELESS) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_BC2_UNORM) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_BC2_UNORM_SRGB) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_BC3_TYPELESS) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_BC3_UNORM) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_BC3_UNORM_SRGB) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_BC4_TYPELESS) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_BC4_UNORM) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_BC4_SNORM) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_BC5_TYPELESS) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_BC5_UNORM) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_BC5_SNORM) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_B5G6R5_UNORM) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_B5G5R5A1_UNORM) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_B8G8R8A8_UNORM) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_B8G8R8X8_UNORM) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_B8G8R8A8_TYPELESS) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_B8G8R8A8_UNORM_SRGB) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_B8G8R8X8_TYPELESS) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_B8G8R8X8_UNORM_SRGB) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_BC6H_TYPELESS) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_BC6H_UF16) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_BC6H_SF16) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_BC7_TYPELESS) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_BC7_UNORM) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_BC7_UNORM_SRGB) - // D3D11.1 formats - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_AYUV) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_Y410) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_Y416) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_NV12) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_P010) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_P016) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_420_OPAQUE) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_YUY2) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_Y210) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_Y216) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_NV11) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_AI44) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_IA44) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_P8) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_A8P8) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_B4G4R4A4_UNORM) - // D3D11.2 formats - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_P208) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_V208) - TOSTR_CASE_STRINGIZE(DXGI_FORMAT_V408) - default: break; - } - - char tostrBuf[256] = {0}; - StringFormat::snprintf(tostrBuf, 255, "DXGI_FORMAT<%d>", el); - - return tostrBuf; -} diff --git a/renderdoc/driver/d3d11/d3d11_common.h b/renderdoc/driver/d3d11/d3d11_common.h index e197c4c68..65f8fc1f0 100644 --- a/renderdoc/driver/d3d11/d3d11_common.h +++ b/renderdoc/driver/d3d11/d3d11_common.h @@ -31,16 +31,12 @@ #include "core/core.h" #include "driver/dx/official/d3d11_4.h" #include "driver/dx/official/dxgi1_3.h" +#include "driver/dxgi/dxgi_common.h" #include "driver/shaders/dxbc/dxbc_compile.h" class WrappedID3D11Device; struct D3D11RenderState; -ResourceFormat MakeResourceFormat(DXGI_FORMAT fmt); -DXGI_FORMAT MakeDXGIFormat(ResourceFormat fmt); -PrimitiveTopology MakePrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY Topo); -D3D11_PRIMITIVE_TOPOLOGY MakeD3D11PrimitiveTopology(PrimitiveTopology Topo); - ShaderReflection *MakeShaderReflection(DXBC::DXBCFile *dxbc); template diff --git a/renderdoc/driver/d3d11/d3d11_debug.cpp b/renderdoc/driver/d3d11/d3d11_debug.cpp index fd9fdf4ea..264c56c22 100644 --- a/renderdoc/driver/d3d11/d3d11_debug.cpp +++ b/renderdoc/driver/d3d11/d3d11_debug.cpp @@ -4702,7 +4702,7 @@ void D3D11DebugManager::RenderMesh(uint32_t eventID, const vector &s DXGI_FORMAT ifmt = DXGI_FORMAT_R16_UINT; UINT ioffs = (UINT)cfg.position.idxoffs; - D3D11_PRIMITIVE_TOPOLOGY topo = MakeD3D11PrimitiveTopology(cfg.position.topo); + D3D11_PRIMITIVE_TOPOLOGY topo = MakeD3DPrimitiveTopology(cfg.position.topo); // render the mesh itself (solid, then wireframe) { @@ -4756,7 +4756,7 @@ void D3D11DebugManager::RenderMesh(uint32_t eventID, const vector &s FillCBuffer(m_DebugRender.GenericPSCBuffer, (float *)&pixelData, sizeof(DebugPixelCBufferData)); - m_pImmediateContext->IASetPrimitiveTopology(MakeD3D11PrimitiveTopology(fmt.topo)); + m_pImmediateContext->IASetPrimitiveTopology(MakeD3DPrimitiveTopology(fmt.topo)); auto it = WrappedID3D11Buffer::m_BufferList.find(fmt.buf); diff --git a/renderdoc/driver/d3d11/d3d11_resources.h b/renderdoc/driver/d3d11/d3d11_resources.h index a26f494bf..3508a0e40 100644 --- a/renderdoc/driver/d3d11/d3d11_resources.h +++ b/renderdoc/driver/d3d11/d3d11_resources.h @@ -62,35 +62,12 @@ enum ResourceType ResourceType IdentifyTypeByPtr(IUnknown *ptr); ResourceId GetIDForResource(ID3D11DeviceChild *ptr); -UINT GetByteSize(int Width, int Height, int Depth, DXGI_FORMAT Format, int mip); UINT GetByteSize(ID3D11Texture1D *tex, int SubResource); UINT GetByteSize(ID3D11Texture2D *tex, int SubResource); UINT GetByteSize(ID3D11Texture3D *tex, int SubResource); UINT GetMipForSubresource(ID3D11Resource *res, int Subresource); -// returns block size for block-compressed formats -UINT GetFormatBPP(DXGI_FORMAT f); - -DXGI_FORMAT GetTypelessFormat(DXGI_FORMAT f); -DXGI_FORMAT GetTypedFormat(DXGI_FORMAT f); -DXGI_FORMAT GetTypedFormat(DXGI_FORMAT f, FormatComponentType hint); -DXGI_FORMAT GetDepthTypedFormat(DXGI_FORMAT f); -DXGI_FORMAT GetFloatTypedFormat(DXGI_FORMAT f); -DXGI_FORMAT GetUnormTypedFormat(DXGI_FORMAT f); -DXGI_FORMAT GetSnormTypedFormat(DXGI_FORMAT f); -DXGI_FORMAT GetUIntTypedFormat(DXGI_FORMAT f); -DXGI_FORMAT GetSIntTypedFormat(DXGI_FORMAT f); -DXGI_FORMAT GetSRGBFormat(DXGI_FORMAT f); -DXGI_FORMAT GetNonSRGBFormat(DXGI_FORMAT f); -bool IsBlockFormat(DXGI_FORMAT f); -bool IsDepthFormat(DXGI_FORMAT f); - -bool IsUIntFormat(DXGI_FORMAT f); -bool IsTypelessFormat(DXGI_FORMAT f); -bool IsIntFormat(DXGI_FORMAT f); -bool IsSRGBFormat(DXGI_FORMAT f); - template bool CanQuery(base *b) { @@ -115,365 +92,6 @@ private: ResourceId m_ID; }; -template -class WrappedDXGIInterface : public RefCounter, - public IDXGIKeyedMutex, - public IDXGISurface2, - public IDXGIResource1 -{ -public: - WrappedID3D11Device *m_pDevice; - NestedType *m_pWrapped; - - WrappedDXGIInterface(NestedType *wrapped, WrappedID3D11Device *device) - : RefCounter(NULL), m_pDevice(device), m_pWrapped(wrapped) - { - m_pWrapped->AddRef(); - m_pDevice->AddRef(); - } - - virtual ~WrappedDXGIInterface() - { - m_pWrapped->Release(); - m_pDevice->Release(); - } - - ////////////////////////////// - // Implement IUnknown - ULONG STDMETHODCALLTYPE AddRef() { return RefCounter::AddRef(); } - ULONG STDMETHODCALLTYPE Release() { return RefCounter::Release(); } - HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject) - { - // ensure the real object has this interface - void *outObj; - HRESULT hr = m_pWrapped->QueryInterface(riid, &outObj); - - IUnknown *unk = (IUnknown *)outObj; - SAFE_RELEASE(unk); - - if(FAILED(hr)) - { - return hr; - } - - if(riid == __uuidof(IUnknown)) - { - *ppvObject = (IUnknown *)(IDXGIKeyedMutex *)this; - AddRef(); - return S_OK; - } - if(riid == __uuidof(IDXGIObject)) - { - *ppvObject = (IDXGIObject *)(IDXGIKeyedMutex *)this; - AddRef(); - return S_OK; - } - if(riid == __uuidof(IDXGIDeviceSubObject)) - { - *ppvObject = (IDXGIDeviceSubObject *)(IDXGIKeyedMutex *)this; - AddRef(); - return S_OK; - } - if(riid == __uuidof(IDXGIResource)) - { - *ppvObject = (IDXGIResource *)this; - AddRef(); - return S_OK; - } - if(riid == __uuidof(IDXGIKeyedMutex)) - { - *ppvObject = (IDXGIKeyedMutex *)this; - AddRef(); - return S_OK; - } - if(riid == __uuidof(IDXGISurface)) - { - *ppvObject = (IDXGISurface *)this; - AddRef(); - return S_OK; - } - if(riid == __uuidof(IDXGISurface1)) - { - *ppvObject = (IDXGISurface1 *)this; - AddRef(); - return S_OK; - } - if(riid == __uuidof(IDXGIResource1)) - { - *ppvObject = (IDXGIResource1 *)this; - AddRef(); - return S_OK; - } - if(riid == __uuidof(IDXGISurface2)) - { - *ppvObject = (IDXGISurface2 *)this; - AddRef(); - return S_OK; - } - - return m_pWrapped->QueryInterface(riid, ppvObject); - } - - ////////////////////////////// - // Implement IDXGIObject - HRESULT STDMETHODCALLTYPE SetPrivateData(REFGUID Name, UINT DataSize, const void *pData) - { - return m_pWrapped->SetPrivateData(Name, DataSize, pData); - } - - HRESULT STDMETHODCALLTYPE SetPrivateDataInterface(REFGUID Name, const IUnknown *pUnknown) - { - return m_pWrapped->SetPrivateDataInterface(Name, pUnknown); - } - - HRESULT STDMETHODCALLTYPE GetPrivateData(REFGUID Name, UINT *pDataSize, void *pData) - { - return m_pWrapped->GetPrivateData(Name, pDataSize, pData); - } - - // this should only be called for adapters, devices, factories etc - // so we pass it onto the device - HRESULT STDMETHODCALLTYPE GetParent(REFIID riid, void **ppParent) - { - return m_pDevice->QueryInterface(riid, ppParent); - } - - ////////////////////////////// - // Implement IDXGIDeviceSubObject - - // same as GetParent - HRESULT STDMETHODCALLTYPE GetDevice(REFIID riid, void **ppDevice) - { - return m_pDevice->QueryInterface(riid, ppDevice); - } - - ////////////////////////////// - // Implement IDXGIKeyedMutex - HRESULT STDMETHODCALLTYPE AcquireSync(UINT64 Key, DWORD dwMilliseconds) - { - // temporarily get the real interface - IDXGIKeyedMutex *mutex = NULL; - HRESULT hr = m_pWrapped->GetReal()->QueryInterface(__uuidof(IDXGIKeyedMutex), (void **)&mutex); - if(FAILED(hr)) - { - SAFE_RELEASE(mutex); - return hr; - } - - hr = mutex->AcquireSync(Key, dwMilliseconds); - SAFE_RELEASE(mutex); - return hr; - } - - HRESULT STDMETHODCALLTYPE ReleaseSync(UINT64 Key) - { - // temporarily get the real interface - IDXGIKeyedMutex *mutex = NULL; - HRESULT hr = m_pWrapped->GetReal()->QueryInterface(__uuidof(IDXGIKeyedMutex), (void **)&mutex); - if(FAILED(hr)) - { - SAFE_RELEASE(mutex); - return hr; - } - - hr = mutex->ReleaseSync(Key); - SAFE_RELEASE(mutex); - return hr; - } - - ////////////////////////////// - // Implement IDXGIResource - virtual HRESULT STDMETHODCALLTYPE GetSharedHandle(HANDLE *pSharedHandle) - { - // temporarily get the real interface - IDXGIResource *res = NULL; - HRESULT hr = m_pWrapped->GetReal()->QueryInterface(__uuidof(IDXGIResource), (void **)&res); - if(FAILED(hr)) - { - SAFE_RELEASE(res); - return hr; - } - - hr = res->GetSharedHandle(pSharedHandle); - SAFE_RELEASE(res); - return hr; - } - - virtual HRESULT STDMETHODCALLTYPE GetUsage(DXGI_USAGE *pUsage) - { - // temporarily get the real interface - IDXGIResource *res = NULL; - HRESULT hr = m_pWrapped->GetReal()->QueryInterface(__uuidof(IDXGIResource), (void **)&res); - if(FAILED(hr)) - { - SAFE_RELEASE(res); - return hr; - } - - hr = res->GetUsage(pUsage); - SAFE_RELEASE(res); - return hr; - } - - virtual HRESULT STDMETHODCALLTYPE SetEvictionPriority(UINT EvictionPriority) - { - // temporarily get the real interface - IDXGIResource *res = NULL; - HRESULT hr = m_pWrapped->GetReal()->QueryInterface(__uuidof(IDXGIResource), (void **)&res); - if(FAILED(hr)) - { - SAFE_RELEASE(res); - return hr; - } - - hr = res->SetEvictionPriority(EvictionPriority); - SAFE_RELEASE(res); - return hr; - } - - virtual HRESULT STDMETHODCALLTYPE GetEvictionPriority(UINT *pEvictionPriority) - { - // temporarily get the real interface - IDXGIResource *res = NULL; - HRESULT hr = m_pWrapped->GetReal()->QueryInterface(__uuidof(IDXGIResource), (void **)&res); - if(FAILED(hr)) - { - SAFE_RELEASE(res); - return hr; - } - - hr = res->GetEvictionPriority(pEvictionPriority); - SAFE_RELEASE(res); - return hr; - } - - ////////////////////////////// - // Implement IDXGISurface - virtual HRESULT STDMETHODCALLTYPE GetDesc(DXGI_SURFACE_DESC *pDesc) - { - // temporarily get the real interface - IDXGISurface *surf = NULL; - HRESULT hr = m_pWrapped->GetReal()->QueryInterface(__uuidof(IDXGISurface), (void **)&surf); - if(FAILED(hr)) - { - SAFE_RELEASE(surf); - return hr; - } - - hr = surf->GetDesc(pDesc); - SAFE_RELEASE(surf); - return hr; - } - - virtual HRESULT STDMETHODCALLTYPE Map(DXGI_MAPPED_RECT *pLockedRect, UINT MapFlags) - { - // temporarily get the real interface - IDXGISurface *surf = NULL; - HRESULT hr = m_pWrapped->GetReal()->QueryInterface(__uuidof(IDXGISurface), (void **)&surf); - if(FAILED(hr)) - { - SAFE_RELEASE(surf); - return hr; - } - - hr = surf->Map(pLockedRect, MapFlags); - SAFE_RELEASE(surf); - return hr; - } - - virtual HRESULT STDMETHODCALLTYPE Unmap(void) - { - // temporarily get the real interface - IDXGISurface *surf = NULL; - HRESULT hr = m_pWrapped->GetReal()->QueryInterface(__uuidof(IDXGISurface), (void **)&surf); - if(FAILED(hr)) - { - SAFE_RELEASE(surf); - return hr; - } - - hr = surf->Unmap(); - SAFE_RELEASE(surf); - return hr; - } - - ////////////////////////////// - // Implement IDXGISurface1 - virtual HRESULT STDMETHODCALLTYPE GetDC(BOOL Discard, HDC *phdc) - { - // temporarily get the real interface - IDXGISurface1 *surf = NULL; - HRESULT hr = m_pWrapped->GetReal()->QueryInterface(__uuidof(IDXGISurface1), (void **)&surf); - if(FAILED(hr)) - { - SAFE_RELEASE(surf); - return hr; - } - - hr = surf->GetDC(Discard, phdc); - SAFE_RELEASE(surf); - return hr; - } - - virtual HRESULT STDMETHODCALLTYPE ReleaseDC(RECT *pDirtyRect) - { - // temporarily get the real interface - IDXGISurface1 *surf = NULL; - HRESULT hr = m_pWrapped->GetReal()->QueryInterface(__uuidof(IDXGISurface1), (void **)&surf); - if(FAILED(hr)) - { - SAFE_RELEASE(surf); - return hr; - } - - hr = surf->ReleaseDC(pDirtyRect); - SAFE_RELEASE(surf); - return hr; - } - - ////////////////////////////// - // Implement IDXGIResource1 - virtual HRESULT STDMETHODCALLTYPE CreateSubresourceSurface(UINT index, IDXGISurface2 **ppSurface) - { - if(ppSurface == NULL) - return E_INVALIDARG; - - // maybe this will work?!? - AddRef(); - *ppSurface = (IDXGISurface2 *)this; - return S_OK; - } - - virtual HRESULT STDMETHODCALLTYPE CreateSharedHandle(const SECURITY_ATTRIBUTES *pAttributes, - DWORD dwAccess, LPCWSTR lpName, - HANDLE *pHandle) - { - // temporarily get the real interface - IDXGIResource1 *res = NULL; - HRESULT hr = m_pWrapped->GetReal()->QueryInterface(__uuidof(IDXGIResource1), (void **)&res); - if(FAILED(hr)) - { - SAFE_RELEASE(res); - return hr; - } - - hr = res->CreateSharedHandle(pAttributes, dwAccess, lpName, pHandle); - SAFE_RELEASE(res); - return hr; - } - - ////////////////////////////// - // Implement IDXGISurface2 - virtual HRESULT STDMETHODCALLTYPE GetResource(REFIID riid, void **ppParentResource, - UINT *pSubresourceIndex) - { - // not really sure how to implement this :(. - if(pSubresourceIndex) - pSubresourceIndex = 0; - return QueryInterface(riid, ppParentResource); - } -}; - extern const GUID RENDERDOC_ID3D11ShaderGUID_ShaderDebugMagicValue; template diff --git a/renderdoc/driver/dxgi/dxgi_common.cpp b/renderdoc/driver/dxgi/dxgi_common.cpp new file mode 100644 index 000000000..df7730277 --- /dev/null +++ b/renderdoc/driver/dxgi/dxgi_common.cpp @@ -0,0 +1,2054 @@ +/****************************************************************************** + * The MIT License (MIT) + * + * Copyright (c) 2016 Baldur Karlsson + * + * 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 "dxgi_common.h" +#include "common/common.h" +#include "serialise/serialiser.h" + +UINT GetFormatBPP(DXGI_FORMAT f) +{ + UINT ret = 8; + + switch(f) + { + case DXGI_FORMAT_R32G32B32A32_TYPELESS: + case DXGI_FORMAT_R32G32B32A32_FLOAT: + case DXGI_FORMAT_R32G32B32A32_UINT: + case DXGI_FORMAT_R32G32B32A32_SINT: ret *= 16; break; + case DXGI_FORMAT_R32G32B32_TYPELESS: + case DXGI_FORMAT_R32G32B32_FLOAT: + case DXGI_FORMAT_R32G32B32_UINT: + case DXGI_FORMAT_R32G32B32_SINT: ret *= 12; break; + case DXGI_FORMAT_R16G16B16A16_TYPELESS: + case DXGI_FORMAT_R16G16B16A16_FLOAT: + case DXGI_FORMAT_R16G16B16A16_UNORM: + case DXGI_FORMAT_R16G16B16A16_UINT: + case DXGI_FORMAT_R16G16B16A16_SNORM: + case DXGI_FORMAT_R16G16B16A16_SINT: + case DXGI_FORMAT_R32G32_TYPELESS: + case DXGI_FORMAT_R32G32_FLOAT: + case DXGI_FORMAT_R32G32_UINT: + case DXGI_FORMAT_R32G32_SINT: + case DXGI_FORMAT_R32G8X24_TYPELESS: + case DXGI_FORMAT_D32_FLOAT_S8X24_UINT: + case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS: + case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT: ret *= 8; break; + case DXGI_FORMAT_R10G10B10A2_TYPELESS: + case DXGI_FORMAT_R10G10B10A2_UNORM: + case DXGI_FORMAT_R10G10B10A2_UINT: + case DXGI_FORMAT_R11G11B10_FLOAT: + case DXGI_FORMAT_R8G8B8A8_TYPELESS: + case DXGI_FORMAT_R8G8B8A8_UNORM: + case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: + case DXGI_FORMAT_R8G8B8A8_UINT: + case DXGI_FORMAT_R8G8B8A8_SNORM: + case DXGI_FORMAT_R8G8B8A8_SINT: + case DXGI_FORMAT_R16G16_TYPELESS: + case DXGI_FORMAT_R16G16_FLOAT: + case DXGI_FORMAT_R16G16_UNORM: + case DXGI_FORMAT_R16G16_UINT: + case DXGI_FORMAT_R16G16_SNORM: + case DXGI_FORMAT_R16G16_SINT: + case DXGI_FORMAT_R32_TYPELESS: + case DXGI_FORMAT_D32_FLOAT: + case DXGI_FORMAT_R32_FLOAT: + case DXGI_FORMAT_R32_UINT: + case DXGI_FORMAT_R32_SINT: + case DXGI_FORMAT_R24G8_TYPELESS: + case DXGI_FORMAT_D24_UNORM_S8_UINT: + case DXGI_FORMAT_R24_UNORM_X8_TYPELESS: + case DXGI_FORMAT_X24_TYPELESS_G8_UINT: + case DXGI_FORMAT_R9G9B9E5_SHAREDEXP: + case DXGI_FORMAT_R8G8_B8G8_UNORM: + case DXGI_FORMAT_G8R8_G8B8_UNORM: + case DXGI_FORMAT_B8G8R8A8_UNORM: + case DXGI_FORMAT_B8G8R8X8_UNORM: + case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM: + case DXGI_FORMAT_B8G8R8A8_TYPELESS: + case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: + case DXGI_FORMAT_B8G8R8X8_TYPELESS: + case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: ret *= 4; break; + case DXGI_FORMAT_R8G8_TYPELESS: + case DXGI_FORMAT_R8G8_UNORM: + case DXGI_FORMAT_R8G8_UINT: + case DXGI_FORMAT_R8G8_SNORM: + case DXGI_FORMAT_R8G8_SINT: + case DXGI_FORMAT_R16_TYPELESS: + case DXGI_FORMAT_R16_FLOAT: + case DXGI_FORMAT_D16_UNORM: + case DXGI_FORMAT_R16_UNORM: + case DXGI_FORMAT_R16_UINT: + case DXGI_FORMAT_R16_SNORM: + case DXGI_FORMAT_R16_SINT: + case DXGI_FORMAT_B5G6R5_UNORM: + case DXGI_FORMAT_B5G5R5A1_UNORM: ret *= 2; break; + case DXGI_FORMAT_R8_TYPELESS: + case DXGI_FORMAT_R8_UNORM: + case DXGI_FORMAT_R8_UINT: + case DXGI_FORMAT_R8_SNORM: + case DXGI_FORMAT_R8_SINT: + case DXGI_FORMAT_A8_UNORM: ret *= 1; break; + case DXGI_FORMAT_R1_UNORM: ret /= 8; break; + case DXGI_FORMAT_BC1_TYPELESS: + case DXGI_FORMAT_BC1_UNORM: + case DXGI_FORMAT_BC1_UNORM_SRGB: + case DXGI_FORMAT_BC4_TYPELESS: + case DXGI_FORMAT_BC4_UNORM: + case DXGI_FORMAT_BC4_SNORM: + // return block size (in bits) + ret *= 8; + break; + case DXGI_FORMAT_BC2_TYPELESS: + case DXGI_FORMAT_BC2_UNORM: + case DXGI_FORMAT_BC2_UNORM_SRGB: + case DXGI_FORMAT_BC3_TYPELESS: + case DXGI_FORMAT_BC3_UNORM: + case DXGI_FORMAT_BC3_UNORM_SRGB: + case DXGI_FORMAT_BC5_TYPELESS: + case DXGI_FORMAT_BC5_UNORM: + case DXGI_FORMAT_BC5_SNORM: + case DXGI_FORMAT_BC6H_TYPELESS: + case DXGI_FORMAT_BC6H_UF16: + case DXGI_FORMAT_BC6H_SF16: + case DXGI_FORMAT_BC7_TYPELESS: + case DXGI_FORMAT_BC7_UNORM: + case DXGI_FORMAT_BC7_UNORM_SRGB: + // return block size (in bits) + ret *= 16; + break; + + case DXGI_FORMAT_AYUV: + case DXGI_FORMAT_Y410: + case DXGI_FORMAT_YUY2: + case DXGI_FORMAT_Y416: + case DXGI_FORMAT_NV12: + case DXGI_FORMAT_P010: + case DXGI_FORMAT_P016: + case DXGI_FORMAT_420_OPAQUE: + case DXGI_FORMAT_Y210: + case DXGI_FORMAT_Y216: + case DXGI_FORMAT_NV11: + case DXGI_FORMAT_AI44: + case DXGI_FORMAT_IA44: + case DXGI_FORMAT_P8: + case DXGI_FORMAT_A8P8: + case DXGI_FORMAT_P208: + case DXGI_FORMAT_V208: + case DXGI_FORMAT_V408: RDCERR("Video formats not supported"); break; + + case DXGI_FORMAT_B4G4R4A4_UNORM: + ret *= 2; // 4 channels, half a byte each + break; + + case DXGI_FORMAT_UNKNOWN: + ret = 0; + RDCWARN("Getting BPP of DXGI_FORMAT_UNKNOWN"); + break; + + default: RDCERR("Unrecognised DXGI Format: %d", f); break; + } + + return ret; +} + +UINT GetByteSize(int Width, int Height, int Depth, DXGI_FORMAT Format, int mip) +{ + UINT ret = RDCMAX(Width >> mip, 1) * RDCMAX(Height >> mip, 1) * RDCMAX(Depth >> mip, 1); + + switch(Format) + { + case DXGI_FORMAT_R32G32B32A32_TYPELESS: + case DXGI_FORMAT_R32G32B32A32_FLOAT: + case DXGI_FORMAT_R32G32B32A32_UINT: + case DXGI_FORMAT_R32G32B32A32_SINT: ret *= 16; break; + case DXGI_FORMAT_R32G32B32_TYPELESS: + case DXGI_FORMAT_R32G32B32_FLOAT: + case DXGI_FORMAT_R32G32B32_UINT: + case DXGI_FORMAT_R32G32B32_SINT: ret *= 12; break; + case DXGI_FORMAT_R16G16B16A16_TYPELESS: + case DXGI_FORMAT_R16G16B16A16_FLOAT: + case DXGI_FORMAT_R16G16B16A16_UNORM: + case DXGI_FORMAT_R16G16B16A16_UINT: + case DXGI_FORMAT_R16G16B16A16_SNORM: + case DXGI_FORMAT_R16G16B16A16_SINT: + case DXGI_FORMAT_R32G32_TYPELESS: + case DXGI_FORMAT_R32G32_FLOAT: + case DXGI_FORMAT_R32G32_UINT: + case DXGI_FORMAT_R32G32_SINT: + case DXGI_FORMAT_R32G8X24_TYPELESS: + case DXGI_FORMAT_D32_FLOAT_S8X24_UINT: + case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS: + case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT: ret *= 8; break; + case DXGI_FORMAT_R10G10B10A2_TYPELESS: + case DXGI_FORMAT_R10G10B10A2_UNORM: + case DXGI_FORMAT_R10G10B10A2_UINT: + case DXGI_FORMAT_R11G11B10_FLOAT: + case DXGI_FORMAT_R8G8B8A8_TYPELESS: + case DXGI_FORMAT_R8G8B8A8_UNORM: + case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: + case DXGI_FORMAT_R8G8B8A8_UINT: + case DXGI_FORMAT_R8G8B8A8_SNORM: + case DXGI_FORMAT_R8G8B8A8_SINT: + case DXGI_FORMAT_R16G16_TYPELESS: + case DXGI_FORMAT_R16G16_FLOAT: + case DXGI_FORMAT_R16G16_UNORM: + case DXGI_FORMAT_R16G16_UINT: + case DXGI_FORMAT_R16G16_SNORM: + case DXGI_FORMAT_R16G16_SINT: + case DXGI_FORMAT_R32_TYPELESS: + case DXGI_FORMAT_D32_FLOAT: + case DXGI_FORMAT_R32_FLOAT: + case DXGI_FORMAT_R32_UINT: + case DXGI_FORMAT_R32_SINT: + case DXGI_FORMAT_R24G8_TYPELESS: + case DXGI_FORMAT_D24_UNORM_S8_UINT: + case DXGI_FORMAT_R24_UNORM_X8_TYPELESS: + case DXGI_FORMAT_X24_TYPELESS_G8_UINT: + case DXGI_FORMAT_R9G9B9E5_SHAREDEXP: + case DXGI_FORMAT_R8G8_B8G8_UNORM: + case DXGI_FORMAT_G8R8_G8B8_UNORM: + case DXGI_FORMAT_B8G8R8A8_UNORM: + case DXGI_FORMAT_B8G8R8X8_UNORM: + case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM: + case DXGI_FORMAT_B8G8R8A8_TYPELESS: + case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: + case DXGI_FORMAT_B8G8R8X8_TYPELESS: + case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: ret *= 4; break; + case DXGI_FORMAT_R8G8_TYPELESS: + case DXGI_FORMAT_R8G8_UNORM: + case DXGI_FORMAT_R8G8_UINT: + case DXGI_FORMAT_R8G8_SNORM: + case DXGI_FORMAT_R8G8_SINT: + case DXGI_FORMAT_R16_TYPELESS: + case DXGI_FORMAT_R16_FLOAT: + case DXGI_FORMAT_D16_UNORM: + case DXGI_FORMAT_R16_UNORM: + case DXGI_FORMAT_R16_UINT: + case DXGI_FORMAT_R16_SNORM: + case DXGI_FORMAT_R16_SINT: + case DXGI_FORMAT_B5G6R5_UNORM: + case DXGI_FORMAT_B5G5R5A1_UNORM: ret *= 2; break; + case DXGI_FORMAT_R8_TYPELESS: + case DXGI_FORMAT_R8_UNORM: + case DXGI_FORMAT_R8_UINT: + case DXGI_FORMAT_R8_SNORM: + case DXGI_FORMAT_R8_SINT: + case DXGI_FORMAT_A8_UNORM: ret *= 1; break; + case DXGI_FORMAT_R1_UNORM: ret = RDCMAX(ret / 8, 1U); break; + case DXGI_FORMAT_BC1_TYPELESS: + case DXGI_FORMAT_BC1_UNORM: + case DXGI_FORMAT_BC1_UNORM_SRGB: + case DXGI_FORMAT_BC4_TYPELESS: + case DXGI_FORMAT_BC4_UNORM: + case DXGI_FORMAT_BC4_SNORM: + ret = AlignUp4(RDCMAX(Width >> mip, 1)) * AlignUp4(RDCMAX(Height >> mip, 1)) * + RDCMAX(Depth >> mip, 1); + ret /= 2; + break; + case DXGI_FORMAT_BC2_TYPELESS: + case DXGI_FORMAT_BC2_UNORM: + case DXGI_FORMAT_BC2_UNORM_SRGB: + case DXGI_FORMAT_BC3_TYPELESS: + case DXGI_FORMAT_BC3_UNORM: + case DXGI_FORMAT_BC3_UNORM_SRGB: + case DXGI_FORMAT_BC5_TYPELESS: + case DXGI_FORMAT_BC5_UNORM: + case DXGI_FORMAT_BC5_SNORM: + case DXGI_FORMAT_BC6H_TYPELESS: + case DXGI_FORMAT_BC6H_UF16: + case DXGI_FORMAT_BC6H_SF16: + case DXGI_FORMAT_BC7_TYPELESS: + case DXGI_FORMAT_BC7_UNORM: + case DXGI_FORMAT_BC7_UNORM_SRGB: + ret = AlignUp4(RDCMAX(Width >> mip, 1)) * AlignUp4(RDCMAX(Height >> mip, 1)) * + RDCMAX(Depth >> mip, 1); + ret *= 1; + break; + case DXGI_FORMAT_AYUV: + case DXGI_FORMAT_Y410: + case DXGI_FORMAT_YUY2: + case DXGI_FORMAT_Y416: + case DXGI_FORMAT_NV12: + case DXGI_FORMAT_P010: + case DXGI_FORMAT_P016: + case DXGI_FORMAT_420_OPAQUE: + case DXGI_FORMAT_Y210: + case DXGI_FORMAT_Y216: + case DXGI_FORMAT_NV11: + case DXGI_FORMAT_AI44: + case DXGI_FORMAT_IA44: + case DXGI_FORMAT_P8: + case DXGI_FORMAT_A8P8: + case DXGI_FORMAT_P208: + case DXGI_FORMAT_V208: + case DXGI_FORMAT_V408: RDCERR("Video formats not supported"); break; + + case DXGI_FORMAT_B4G4R4A4_UNORM: + ret *= 2; // 4 channels, half a byte each + break; + case DXGI_FORMAT_UNKNOWN: + RDCERR("Getting byte size of unknown DXGI format"); + ret = 0; + break; + default: RDCERR("Unrecognised DXGI Format: %d", Format); break; + } + + return ret; +} + +bool IsBlockFormat(DXGI_FORMAT f) +{ + switch(f) + { + case DXGI_FORMAT_BC1_TYPELESS: + case DXGI_FORMAT_BC1_UNORM: + case DXGI_FORMAT_BC1_UNORM_SRGB: + case DXGI_FORMAT_BC4_TYPELESS: + case DXGI_FORMAT_BC4_UNORM: + case DXGI_FORMAT_BC4_SNORM: + case DXGI_FORMAT_BC2_TYPELESS: + case DXGI_FORMAT_BC2_UNORM: + case DXGI_FORMAT_BC2_UNORM_SRGB: + case DXGI_FORMAT_BC3_TYPELESS: + case DXGI_FORMAT_BC3_UNORM: + case DXGI_FORMAT_BC3_UNORM_SRGB: + case DXGI_FORMAT_BC5_TYPELESS: + case DXGI_FORMAT_BC5_UNORM: + case DXGI_FORMAT_BC5_SNORM: + case DXGI_FORMAT_BC6H_TYPELESS: + case DXGI_FORMAT_BC6H_UF16: + case DXGI_FORMAT_BC6H_SF16: + case DXGI_FORMAT_BC7_TYPELESS: + case DXGI_FORMAT_BC7_UNORM: + case DXGI_FORMAT_BC7_UNORM_SRGB: return true; + default: break; + } + + return false; +} + +bool IsDepthFormat(DXGI_FORMAT f) +{ + switch(f) + { + case DXGI_FORMAT_R32G8X24_TYPELESS: + case DXGI_FORMAT_D32_FLOAT_S8X24_UINT: + case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS: + case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT: + + case DXGI_FORMAT_D24_UNORM_S8_UINT: + case DXGI_FORMAT_R24_UNORM_X8_TYPELESS: + case DXGI_FORMAT_X24_TYPELESS_G8_UINT: + case DXGI_FORMAT_R24G8_TYPELESS: + + case DXGI_FORMAT_D32_FLOAT: + case DXGI_FORMAT_D16_UNORM: return true; + } + + return false; +} + +bool IsTypelessFormat(DXGI_FORMAT f) +{ + switch(f) + { + 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_R32_FLOAT_X8X24_TYPELESS: + case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT: + case DXGI_FORMAT_R10G10B10A2_TYPELESS: + case DXGI_FORMAT_R8G8B8A8_TYPELESS: + case DXGI_FORMAT_R16G16_TYPELESS: + case DXGI_FORMAT_R32_TYPELESS: + case DXGI_FORMAT_R24G8_TYPELESS: + case DXGI_FORMAT_R24_UNORM_X8_TYPELESS: + case DXGI_FORMAT_X24_TYPELESS_G8_UINT: + 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: return true; + } + + return false; +} + +bool IsUIntFormat(DXGI_FORMAT f) +{ + switch(f) + { + case DXGI_FORMAT_R32G32B32A32_UINT: + case DXGI_FORMAT_R32G32B32_UINT: + case DXGI_FORMAT_R16G16B16A16_UINT: + case DXGI_FORMAT_R32G32_UINT: + case DXGI_FORMAT_R10G10B10A2_UINT: + case DXGI_FORMAT_R8G8B8A8_UINT: + case DXGI_FORMAT_R16G16_UINT: + case DXGI_FORMAT_R32_UINT: + case DXGI_FORMAT_R8G8_UINT: + case DXGI_FORMAT_R16_UINT: + case DXGI_FORMAT_R8_UINT: return true; + } + + return false; +} + +bool IsIntFormat(DXGI_FORMAT f) +{ + switch(f) + { + case DXGI_FORMAT_R32G32B32A32_SINT: + case DXGI_FORMAT_R32G32B32_SINT: + case DXGI_FORMAT_R16G16B16A16_SINT: + case DXGI_FORMAT_R32G32_SINT: + case DXGI_FORMAT_R8G8B8A8_SINT: + case DXGI_FORMAT_R16G16_SINT: + case DXGI_FORMAT_R32_SINT: + case DXGI_FORMAT_R8G8_SINT: + case DXGI_FORMAT_R16_SINT: + case DXGI_FORMAT_R8_SINT: return true; + } + + return false; +} + +bool IsSRGBFormat(DXGI_FORMAT f) +{ + switch(f) + { + 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_BC7_UNORM_SRGB: + case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: + case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: return true; + + default: break; + } + + return false; +} + +DXGI_FORMAT GetDepthTypedFormat(DXGI_FORMAT f) +{ + switch(f) + { + case DXGI_FORMAT_R32_FLOAT: + case DXGI_FORMAT_R32_TYPELESS: return DXGI_FORMAT_D32_FLOAT; + + case DXGI_FORMAT_R32G8X24_TYPELESS: + case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS: + case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT: return DXGI_FORMAT_D32_FLOAT_S8X24_UINT; + + case DXGI_FORMAT_R24G8_TYPELESS: + case DXGI_FORMAT_R24_UNORM_X8_TYPELESS: + case DXGI_FORMAT_X24_TYPELESS_G8_UINT: return DXGI_FORMAT_D24_UNORM_S8_UINT; + + case DXGI_FORMAT_R16_FLOAT: + case DXGI_FORMAT_R16_TYPELESS: return DXGI_FORMAT_D16_UNORM; + + default: break; + } + return f; +} + +DXGI_FORMAT GetNonSRGBFormat(DXGI_FORMAT f) +{ + switch(f) + { + case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: return DXGI_FORMAT_R8G8B8A8_UNORM; + case DXGI_FORMAT_BC1_UNORM_SRGB: return DXGI_FORMAT_BC1_UNORM; + case DXGI_FORMAT_BC2_UNORM_SRGB: return DXGI_FORMAT_BC2_UNORM; + case DXGI_FORMAT_BC3_UNORM_SRGB: return DXGI_FORMAT_BC3_UNORM; + case DXGI_FORMAT_BC7_UNORM_SRGB: return DXGI_FORMAT_BC7_UNORM; + case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: return DXGI_FORMAT_B8G8R8A8_UNORM; + case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: return DXGI_FORMAT_B8G8R8X8_UNORM; + + default: break; + } + + return f; +} + +DXGI_FORMAT GetSRGBFormat(DXGI_FORMAT f) +{ + switch(f) + { + case DXGI_FORMAT_R8G8B8A8_TYPELESS: + case DXGI_FORMAT_R8G8B8A8_UNORM: return DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; + + case DXGI_FORMAT_BC1_TYPELESS: + case DXGI_FORMAT_BC1_UNORM: return DXGI_FORMAT_BC1_UNORM_SRGB; + + case DXGI_FORMAT_BC2_TYPELESS: + case DXGI_FORMAT_BC2_UNORM: return DXGI_FORMAT_BC2_UNORM_SRGB; + + case DXGI_FORMAT_BC3_TYPELESS: + case DXGI_FORMAT_BC3_UNORM: return DXGI_FORMAT_BC3_UNORM_SRGB; + + case DXGI_FORMAT_BC7_TYPELESS: + case DXGI_FORMAT_BC7_UNORM: return DXGI_FORMAT_BC7_UNORM_SRGB; + + case DXGI_FORMAT_B8G8R8A8_TYPELESS: + case DXGI_FORMAT_B8G8R8A8_UNORM: return DXGI_FORMAT_B8G8R8A8_UNORM_SRGB; + + case DXGI_FORMAT_B8G8R8X8_TYPELESS: + case DXGI_FORMAT_B8G8R8X8_UNORM: return DXGI_FORMAT_B8G8R8X8_UNORM_SRGB; + + default: break; + } + return f; +} + +DXGI_FORMAT GetUnormTypedFormat(DXGI_FORMAT f) +{ + switch(f) + { + case DXGI_FORMAT_R16G16B16A16_TYPELESS: + case DXGI_FORMAT_R16G16B16A16_FLOAT: + case DXGI_FORMAT_R16G16B16A16_UINT: + case DXGI_FORMAT_R16G16B16A16_SNORM: + case DXGI_FORMAT_R16G16B16A16_SINT: return DXGI_FORMAT_R16G16B16A16_UNORM; + + case DXGI_FORMAT_R10G10B10A2_TYPELESS: + case DXGI_FORMAT_R10G10B10A2_UINT: return DXGI_FORMAT_R10G10B10A2_UNORM; + + case DXGI_FORMAT_R8G8B8A8_TYPELESS: + case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: + case DXGI_FORMAT_R8G8B8A8_UINT: + case DXGI_FORMAT_R8G8B8A8_SNORM: + case DXGI_FORMAT_R8G8B8A8_SINT: return DXGI_FORMAT_R8G8B8A8_UNORM; + + case DXGI_FORMAT_R16G16_TYPELESS: + case DXGI_FORMAT_R16G16_FLOAT: + case DXGI_FORMAT_R16G16_UINT: + case DXGI_FORMAT_R16G16_SNORM: + case DXGI_FORMAT_R16G16_SINT: return DXGI_FORMAT_R16G16_UNORM; + + case DXGI_FORMAT_R24G8_TYPELESS: + case DXGI_FORMAT_D24_UNORM_S8_UINT: + case DXGI_FORMAT_X24_TYPELESS_G8_UINT: return DXGI_FORMAT_R24_UNORM_X8_TYPELESS; + + case DXGI_FORMAT_R8G8_TYPELESS: + case DXGI_FORMAT_R8G8_UINT: + case DXGI_FORMAT_R8G8_SNORM: + case DXGI_FORMAT_R8G8_SINT: return DXGI_FORMAT_R8G8_UNORM; + + case DXGI_FORMAT_R16_TYPELESS: + case DXGI_FORMAT_R16_FLOAT: + case DXGI_FORMAT_D16_UNORM: + case DXGI_FORMAT_R16_UINT: + case DXGI_FORMAT_R16_SNORM: + case DXGI_FORMAT_R16_SINT: return DXGI_FORMAT_R16_UNORM; + + case DXGI_FORMAT_R8_TYPELESS: + case DXGI_FORMAT_R8_UINT: + case DXGI_FORMAT_R8_SNORM: + case DXGI_FORMAT_R8_SINT: return DXGI_FORMAT_R8_UNORM; + + case DXGI_FORMAT_BC1_TYPELESS: + case DXGI_FORMAT_BC1_UNORM_SRGB: return DXGI_FORMAT_BC1_UNORM; + + case DXGI_FORMAT_BC2_TYPELESS: + case DXGI_FORMAT_BC2_UNORM_SRGB: return DXGI_FORMAT_BC2_UNORM; + + case DXGI_FORMAT_BC3_TYPELESS: + case DXGI_FORMAT_BC3_UNORM_SRGB: return DXGI_FORMAT_BC3_UNORM; + + case DXGI_FORMAT_BC4_TYPELESS: + case DXGI_FORMAT_BC4_SNORM: return DXGI_FORMAT_BC4_UNORM; + + case DXGI_FORMAT_BC5_TYPELESS: + case DXGI_FORMAT_BC5_SNORM: return DXGI_FORMAT_BC5_UNORM; + + case DXGI_FORMAT_B8G8R8A8_TYPELESS: return DXGI_FORMAT_B8G8R8A8_UNORM; + + case DXGI_FORMAT_B8G8R8X8_TYPELESS: return DXGI_FORMAT_B8G8R8X8_UNORM; + + case DXGI_FORMAT_BC6H_TYPELESS: + case DXGI_FORMAT_BC6H_SF16: return DXGI_FORMAT_BC6H_UF16; + + case DXGI_FORMAT_BC7_TYPELESS: + case DXGI_FORMAT_BC7_UNORM_SRGB: return DXGI_FORMAT_BC7_UNORM; + + default: break; + } + + return f; +} + +DXGI_FORMAT GetSnormTypedFormat(DXGI_FORMAT f) +{ + switch(f) + { + case DXGI_FORMAT_R16G16B16A16_TYPELESS: + case DXGI_FORMAT_R16G16B16A16_FLOAT: + case DXGI_FORMAT_R16G16B16A16_UNORM: + case DXGI_FORMAT_R16G16B16A16_UINT: + case DXGI_FORMAT_R16G16B16A16_SINT: return DXGI_FORMAT_R16G16B16A16_SNORM; + + case DXGI_FORMAT_R8G8B8A8_TYPELESS: + case DXGI_FORMAT_R8G8B8A8_UNORM: + case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: + case DXGI_FORMAT_R8G8B8A8_UINT: + case DXGI_FORMAT_R8G8B8A8_SINT: return DXGI_FORMAT_R8G8B8A8_SNORM; + + case DXGI_FORMAT_R16G16_TYPELESS: + case DXGI_FORMAT_R16G16_FLOAT: + case DXGI_FORMAT_R16G16_UNORM: + case DXGI_FORMAT_R16G16_UINT: + case DXGI_FORMAT_R16G16_SINT: return DXGI_FORMAT_R16G16_SNORM; + + case DXGI_FORMAT_R8G8_TYPELESS: + case DXGI_FORMAT_R8G8_UNORM: + case DXGI_FORMAT_R8G8_UINT: + case DXGI_FORMAT_R8G8_SINT: return DXGI_FORMAT_R8G8_SNORM; + + case DXGI_FORMAT_R16_TYPELESS: + case DXGI_FORMAT_R16_FLOAT: + case DXGI_FORMAT_D16_UNORM: + case DXGI_FORMAT_R16_UNORM: + case DXGI_FORMAT_R16_UINT: + case DXGI_FORMAT_R16_SINT: return DXGI_FORMAT_R16_SNORM; + + case DXGI_FORMAT_R8_TYPELESS: + case DXGI_FORMAT_R8_UNORM: + case DXGI_FORMAT_R8_UINT: + case DXGI_FORMAT_R8_SINT: + case DXGI_FORMAT_A8_UNORM: return DXGI_FORMAT_R8_SNORM; + + case DXGI_FORMAT_BC4_TYPELESS: + case DXGI_FORMAT_BC4_UNORM: return DXGI_FORMAT_BC4_SNORM; + + case DXGI_FORMAT_BC5_TYPELESS: + case DXGI_FORMAT_BC5_UNORM: return DXGI_FORMAT_BC5_SNORM; + + case DXGI_FORMAT_BC6H_TYPELESS: + case DXGI_FORMAT_BC6H_UF16: return DXGI_FORMAT_BC6H_SF16; + + default: break; + } + + return f; +} + +DXGI_FORMAT GetUIntTypedFormat(DXGI_FORMAT f) +{ + switch(f) + { + case DXGI_FORMAT_R32G32B32A32_TYPELESS: + case DXGI_FORMAT_R32G32B32A32_FLOAT: + case DXGI_FORMAT_R32G32B32A32_SINT: return DXGI_FORMAT_R32G32B32A32_UINT; + + case DXGI_FORMAT_R32G32B32_TYPELESS: + case DXGI_FORMAT_R32G32B32_FLOAT: + case DXGI_FORMAT_R32G32B32_SINT: return DXGI_FORMAT_R32G32B32_UINT; + + case DXGI_FORMAT_R16G16B16A16_TYPELESS: + case DXGI_FORMAT_R16G16B16A16_FLOAT: + case DXGI_FORMAT_R16G16B16A16_UNORM: + case DXGI_FORMAT_R16G16B16A16_SNORM: + case DXGI_FORMAT_R16G16B16A16_SINT: return DXGI_FORMAT_R16G16B16A16_UINT; + + case DXGI_FORMAT_R32G32_TYPELESS: + case DXGI_FORMAT_R32G32_FLOAT: + case DXGI_FORMAT_R32G32_SINT: return DXGI_FORMAT_R32G32_UINT; + + case DXGI_FORMAT_R32G8X24_TYPELESS: + case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS: return DXGI_FORMAT_X32_TYPELESS_G8X24_UINT; + + case DXGI_FORMAT_R10G10B10A2_TYPELESS: + case DXGI_FORMAT_R10G10B10A2_UNORM: return DXGI_FORMAT_R10G10B10A2_UINT; + + case DXGI_FORMAT_R8G8B8A8_TYPELESS: + case DXGI_FORMAT_R8G8B8A8_UNORM: + case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: + case DXGI_FORMAT_R8G8B8A8_SNORM: + case DXGI_FORMAT_R8G8B8A8_SINT: return DXGI_FORMAT_R8G8B8A8_UINT; + + case DXGI_FORMAT_R16G16_TYPELESS: + case DXGI_FORMAT_R16G16_FLOAT: + case DXGI_FORMAT_R16G16_UNORM: + case DXGI_FORMAT_R16G16_SNORM: + case DXGI_FORMAT_R16G16_SINT: return DXGI_FORMAT_R16G16_UINT; + + case DXGI_FORMAT_R32_TYPELESS: + case DXGI_FORMAT_D32_FLOAT: + case DXGI_FORMAT_R32_FLOAT: + case DXGI_FORMAT_R32_SINT: return DXGI_FORMAT_R32_UINT; + + case DXGI_FORMAT_R24G8_TYPELESS: + case DXGI_FORMAT_R24_UNORM_X8_TYPELESS: return DXGI_FORMAT_X24_TYPELESS_G8_UINT; + + case DXGI_FORMAT_R8G8_TYPELESS: + case DXGI_FORMAT_R8G8_UNORM: + case DXGI_FORMAT_R8G8_SNORM: + case DXGI_FORMAT_R8G8_SINT: return DXGI_FORMAT_R8G8_UINT; + + case DXGI_FORMAT_R16_TYPELESS: + case DXGI_FORMAT_R16_FLOAT: + case DXGI_FORMAT_D16_UNORM: + case DXGI_FORMAT_R16_UNORM: + case DXGI_FORMAT_R16_SNORM: + case DXGI_FORMAT_R16_SINT: return DXGI_FORMAT_R16_UINT; + + case DXGI_FORMAT_R8_TYPELESS: + case DXGI_FORMAT_R8_UNORM: + case DXGI_FORMAT_R8_SNORM: + case DXGI_FORMAT_R8_SINT: + case DXGI_FORMAT_A8_UNORM: return DXGI_FORMAT_R8_UINT; + + default: break; + } + + return f; +} + +DXGI_FORMAT GetSIntTypedFormat(DXGI_FORMAT f) +{ + switch(f) + { + case DXGI_FORMAT_R32G32B32A32_TYPELESS: + case DXGI_FORMAT_R32G32B32A32_FLOAT: + case DXGI_FORMAT_R32G32B32A32_UINT: return DXGI_FORMAT_R32G32B32A32_SINT; + + case DXGI_FORMAT_R32G32B32_TYPELESS: + case DXGI_FORMAT_R32G32B32_FLOAT: + case DXGI_FORMAT_R32G32B32_UINT: return DXGI_FORMAT_R32G32B32_SINT; + + case DXGI_FORMAT_R16G16B16A16_TYPELESS: + case DXGI_FORMAT_R16G16B16A16_FLOAT: + case DXGI_FORMAT_R16G16B16A16_UNORM: + case DXGI_FORMAT_R16G16B16A16_UINT: + case DXGI_FORMAT_R16G16B16A16_SNORM: return DXGI_FORMAT_R16G16B16A16_SINT; + + case DXGI_FORMAT_R32G32_TYPELESS: + case DXGI_FORMAT_R32G32_FLOAT: + case DXGI_FORMAT_R32G32_UINT: return DXGI_FORMAT_R32G32_SINT; + + case DXGI_FORMAT_R8G8B8A8_TYPELESS: + case DXGI_FORMAT_R8G8B8A8_UNORM: + case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: + case DXGI_FORMAT_R8G8B8A8_UINT: + case DXGI_FORMAT_R8G8B8A8_SNORM: return DXGI_FORMAT_R8G8B8A8_SINT; + + case DXGI_FORMAT_R16G16_TYPELESS: + case DXGI_FORMAT_R16G16_FLOAT: + case DXGI_FORMAT_R16G16_UNORM: + case DXGI_FORMAT_R16G16_UINT: + case DXGI_FORMAT_R16G16_SNORM: return DXGI_FORMAT_R16G16_SINT; + + case DXGI_FORMAT_R32_TYPELESS: + case DXGI_FORMAT_D32_FLOAT: + case DXGI_FORMAT_R32_FLOAT: + case DXGI_FORMAT_R32_UINT: return DXGI_FORMAT_R32_SINT; + + case DXGI_FORMAT_R8G8_TYPELESS: + case DXGI_FORMAT_R8G8_UNORM: + case DXGI_FORMAT_R8G8_UINT: + case DXGI_FORMAT_R8G8_SNORM: return DXGI_FORMAT_R8G8_SINT; + + case DXGI_FORMAT_R16_TYPELESS: + case DXGI_FORMAT_R16_FLOAT: + case DXGI_FORMAT_D16_UNORM: + case DXGI_FORMAT_R16_UNORM: + case DXGI_FORMAT_R16_UINT: + case DXGI_FORMAT_R16_SNORM: return DXGI_FORMAT_R16_SINT; + + case DXGI_FORMAT_R8_TYPELESS: + case DXGI_FORMAT_R8_UNORM: + case DXGI_FORMAT_R8_UINT: + case DXGI_FORMAT_R8_SNORM: return DXGI_FORMAT_R8_SINT; + + default: break; + } + + return f; +} + +DXGI_FORMAT GetFloatTypedFormat(DXGI_FORMAT f) +{ + switch(f) + { + case DXGI_FORMAT_R32G32B32A32_TYPELESS: + case DXGI_FORMAT_R32G32B32A32_SINT: + case DXGI_FORMAT_R32G32B32A32_UINT: return DXGI_FORMAT_R32G32B32A32_FLOAT; + + case DXGI_FORMAT_R32G32B32_TYPELESS: + case DXGI_FORMAT_R32G32B32_SINT: + case DXGI_FORMAT_R32G32B32_UINT: return DXGI_FORMAT_R32G32B32_FLOAT; + + case DXGI_FORMAT_R16G16B16A16_TYPELESS: + case DXGI_FORMAT_R16G16B16A16_SINT: + case DXGI_FORMAT_R16G16B16A16_UINT: return DXGI_FORMAT_R16G16B16A16_FLOAT; + + case DXGI_FORMAT_R32G32_TYPELESS: + case DXGI_FORMAT_R32G32_SINT: + case DXGI_FORMAT_R32G32_UINT: return DXGI_FORMAT_R32G32_FLOAT; + + case DXGI_FORMAT_R10G10B10A2_TYPELESS: + case DXGI_FORMAT_R10G10B10A2_UINT: return DXGI_FORMAT_R10G10B10A2_UNORM; + + case DXGI_FORMAT_R8G8B8A8_TYPELESS: + case DXGI_FORMAT_R8G8B8A8_UNORM: + case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: + case DXGI_FORMAT_R8G8B8A8_UINT: + case DXGI_FORMAT_R8G8B8A8_SNORM: return DXGI_FORMAT_R8G8B8A8_UNORM; + + case DXGI_FORMAT_R16G16_TYPELESS: + case DXGI_FORMAT_R16G16_FLOAT: + case DXGI_FORMAT_R16G16_UNORM: + case DXGI_FORMAT_R16G16_UINT: + case DXGI_FORMAT_R16G16_SNORM: return DXGI_FORMAT_R16G16_FLOAT; + + case DXGI_FORMAT_R32_TYPELESS: + case DXGI_FORMAT_D32_FLOAT: + case DXGI_FORMAT_R32_FLOAT: + case DXGI_FORMAT_R32_UINT: return DXGI_FORMAT_R32_FLOAT; + + case DXGI_FORMAT_R8G8_TYPELESS: + case DXGI_FORMAT_R8G8_UNORM: + case DXGI_FORMAT_R8G8_UINT: + case DXGI_FORMAT_R8G8_SNORM: return DXGI_FORMAT_R8G8_UNORM; + + case DXGI_FORMAT_R16_TYPELESS: + case DXGI_FORMAT_R16_FLOAT: + case DXGI_FORMAT_D16_UNORM: + case DXGI_FORMAT_R16_UNORM: + case DXGI_FORMAT_R16_UINT: + case DXGI_FORMAT_R16_SNORM: return DXGI_FORMAT_R16_FLOAT; + + case DXGI_FORMAT_R8_TYPELESS: + case DXGI_FORMAT_R8_UNORM: + case DXGI_FORMAT_R8_UINT: + case DXGI_FORMAT_R8_SNORM: return DXGI_FORMAT_R8_UNORM; + } + + return GetTypedFormat(f); +} + +DXGI_FORMAT GetTypedFormat(DXGI_FORMAT f) +{ + switch(f) + { + case DXGI_FORMAT_R32G32B32A32_TYPELESS: return DXGI_FORMAT_R32G32B32A32_FLOAT; + + case DXGI_FORMAT_R32G32B32_TYPELESS: return DXGI_FORMAT_R32G32B32_FLOAT; + + case DXGI_FORMAT_R16G16B16A16_TYPELESS: return DXGI_FORMAT_R16G16B16A16_FLOAT; + + case DXGI_FORMAT_R32G32_TYPELESS: return DXGI_FORMAT_R32G32_FLOAT; + + case DXGI_FORMAT_R32G8X24_TYPELESS: return DXGI_FORMAT_R32G8X24_TYPELESS; + + case DXGI_FORMAT_R10G10B10A2_TYPELESS: return DXGI_FORMAT_R10G10B10A2_UNORM; + + case DXGI_FORMAT_R8G8B8A8_TYPELESS: return DXGI_FORMAT_R8G8B8A8_UNORM; + + case DXGI_FORMAT_R16G16_TYPELESS: return DXGI_FORMAT_R16G16_FLOAT; + + case DXGI_FORMAT_R32_TYPELESS: + return DXGI_FORMAT_R32_FLOAT; + + // maybe not valid casts? + case DXGI_FORMAT_R24G8_TYPELESS: return DXGI_FORMAT_R24_UNORM_X8_TYPELESS; + + case DXGI_FORMAT_B8G8R8A8_TYPELESS: return DXGI_FORMAT_B8G8R8A8_UNORM; + + case DXGI_FORMAT_B8G8R8X8_TYPELESS: return DXGI_FORMAT_B8G8R8X8_UNORM; + + case DXGI_FORMAT_R8G8_TYPELESS: return DXGI_FORMAT_R8G8_UNORM; + + case DXGI_FORMAT_R16_TYPELESS: return DXGI_FORMAT_R16_UNORM; + + case DXGI_FORMAT_R8_TYPELESS: return DXGI_FORMAT_R8_UNORM; + + case DXGI_FORMAT_BC1_TYPELESS: return DXGI_FORMAT_BC1_UNORM; + + case DXGI_FORMAT_BC4_TYPELESS: return DXGI_FORMAT_BC4_UNORM; + + case DXGI_FORMAT_BC2_TYPELESS: return DXGI_FORMAT_BC2_UNORM; + + case DXGI_FORMAT_BC3_TYPELESS: return DXGI_FORMAT_BC3_UNORM; + + case DXGI_FORMAT_BC5_TYPELESS: return DXGI_FORMAT_BC5_UNORM; + + case DXGI_FORMAT_BC6H_TYPELESS: return DXGI_FORMAT_BC6H_UF16; + + case DXGI_FORMAT_BC7_TYPELESS: return DXGI_FORMAT_BC7_UNORM; + + default: break; + } + + return f; +} + +DXGI_FORMAT GetTypedFormat(DXGI_FORMAT f, FormatComponentType typeHint) +{ + switch(f) + { + // these formats have multiple typed formats - use the hint to decide which to use + + case DXGI_FORMAT_R8_TYPELESS: + { + if(typeHint == eCompType_UInt) + return DXGI_FORMAT_R8_UINT; + if(typeHint == eCompType_SInt) + return DXGI_FORMAT_R8_SINT; + if(typeHint == eCompType_SNorm) + return DXGI_FORMAT_R8_SNORM; + return DXGI_FORMAT_R8_UNORM; + } + + case DXGI_FORMAT_R8G8_TYPELESS: + { + if(typeHint == eCompType_UInt) + return DXGI_FORMAT_R8G8_UINT; + if(typeHint == eCompType_SInt) + return DXGI_FORMAT_R8G8_SINT; + if(typeHint == eCompType_SNorm) + return DXGI_FORMAT_R8G8_SNORM; + return DXGI_FORMAT_R8G8_UNORM; + } + + case DXGI_FORMAT_R8G8B8A8_TYPELESS: + { + if(typeHint == eCompType_UInt) + return DXGI_FORMAT_R8G8B8A8_UINT; + if(typeHint == eCompType_SInt) + return DXGI_FORMAT_R8G8B8A8_SINT; + if(typeHint == eCompType_SNorm) + return DXGI_FORMAT_R8G8B8A8_SNORM; + return DXGI_FORMAT_R8G8B8A8_UNORM; + } + + case DXGI_FORMAT_R16_TYPELESS: + { + if(typeHint == eCompType_UInt) + return DXGI_FORMAT_R16_UINT; + if(typeHint == eCompType_SInt) + return DXGI_FORMAT_R16_SINT; + if(typeHint == eCompType_SNorm) + return DXGI_FORMAT_R16_SNORM; + if(typeHint == eCompType_Float) + return DXGI_FORMAT_R16_FLOAT; + if(typeHint == eCompType_Depth) + return DXGI_FORMAT_D16_UNORM; + return DXGI_FORMAT_R16_UNORM; + } + + case DXGI_FORMAT_R16G16_TYPELESS: + { + if(typeHint == eCompType_UInt) + return DXGI_FORMAT_R16G16_UINT; + if(typeHint == eCompType_SInt) + return DXGI_FORMAT_R16G16_SINT; + if(typeHint == eCompType_SNorm) + return DXGI_FORMAT_R16G16_SNORM; + if(typeHint == eCompType_Float) + return DXGI_FORMAT_R16G16_FLOAT; + return DXGI_FORMAT_R16G16_UNORM; + } + + case DXGI_FORMAT_R16G16B16A16_TYPELESS: + { + if(typeHint == eCompType_UInt) + return DXGI_FORMAT_R16G16B16A16_UINT; + if(typeHint == eCompType_SInt) + return DXGI_FORMAT_R16G16B16A16_SINT; + if(typeHint == eCompType_SNorm) + return DXGI_FORMAT_R16G16B16A16_SNORM; + if(typeHint == eCompType_Float) + return DXGI_FORMAT_R16G16B16A16_FLOAT; + return DXGI_FORMAT_R16G16B16A16_UNORM; + } + + case DXGI_FORMAT_R32_TYPELESS: + { + if(typeHint == eCompType_UInt) + return DXGI_FORMAT_R32_UINT; + if(typeHint == eCompType_SInt) + return DXGI_FORMAT_R32_SINT; + if(typeHint == eCompType_Depth) + return DXGI_FORMAT_D32_FLOAT; + return DXGI_FORMAT_R32_FLOAT; + } + + case DXGI_FORMAT_R32G32_TYPELESS: + { + if(typeHint == eCompType_UInt) + return DXGI_FORMAT_R32G32_UINT; + if(typeHint == eCompType_SInt) + return DXGI_FORMAT_R32G32_SINT; + return DXGI_FORMAT_R32G32_FLOAT; + } + + case DXGI_FORMAT_R32G32B32_TYPELESS: + { + if(typeHint == eCompType_UInt) + return DXGI_FORMAT_R32G32B32_UINT; + if(typeHint == eCompType_SInt) + return DXGI_FORMAT_R32G32B32_SINT; + return DXGI_FORMAT_R32G32B32_FLOAT; + } + + case DXGI_FORMAT_R32G32B32A32_TYPELESS: + { + if(typeHint == eCompType_UInt) + return DXGI_FORMAT_R32G32B32A32_UINT; + if(typeHint == eCompType_SInt) + return DXGI_FORMAT_R32G32B32A32_SINT; + return DXGI_FORMAT_R32G32B32A32_FLOAT; + } + + case DXGI_FORMAT_R32G8X24_TYPELESS: + { + if(typeHint == eCompType_UInt) + return DXGI_FORMAT_X32_TYPELESS_G8X24_UINT; + if(typeHint == eCompType_Depth) + return DXGI_FORMAT_D32_FLOAT_S8X24_UINT; + return DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS; + } + + case DXGI_FORMAT_R24G8_TYPELESS: + { + if(typeHint == eCompType_UInt) + return DXGI_FORMAT_X24_TYPELESS_G8_UINT; + if(typeHint == eCompType_Depth) + return DXGI_FORMAT_D24_UNORM_S8_UINT; + return DXGI_FORMAT_R24_UNORM_X8_TYPELESS; + } + + case DXGI_FORMAT_R10G10B10A2_TYPELESS: + return typeHint == eCompType_UInt ? DXGI_FORMAT_R10G10B10A2_UINT + : DXGI_FORMAT_R10G10B10A2_UNORM; + + case DXGI_FORMAT_BC4_TYPELESS: + return typeHint == eCompType_SNorm ? DXGI_FORMAT_BC4_SNORM : DXGI_FORMAT_BC4_UNORM; + + case DXGI_FORMAT_BC5_TYPELESS: + return typeHint == eCompType_SNorm ? DXGI_FORMAT_BC5_SNORM : DXGI_FORMAT_BC5_UNORM; + + case DXGI_FORMAT_BC6H_TYPELESS: + return typeHint == eCompType_SNorm ? DXGI_FORMAT_BC6H_SF16 : DXGI_FORMAT_BC6H_UF16; + + // these formats have only one valid non-typeless format (ignoring SRGB) + case DXGI_FORMAT_B8G8R8A8_TYPELESS: return DXGI_FORMAT_B8G8R8A8_UNORM; + case DXGI_FORMAT_B8G8R8X8_TYPELESS: return DXGI_FORMAT_B8G8R8X8_UNORM; + case DXGI_FORMAT_BC1_TYPELESS: return DXGI_FORMAT_BC1_UNORM; + case DXGI_FORMAT_BC2_TYPELESS: return DXGI_FORMAT_BC2_UNORM; + case DXGI_FORMAT_BC3_TYPELESS: return DXGI_FORMAT_BC3_UNORM; + case DXGI_FORMAT_BC7_TYPELESS: return DXGI_FORMAT_BC7_UNORM; + + default: break; + } + + return f; +} + +DXGI_FORMAT GetTypelessFormat(DXGI_FORMAT f) +{ + switch(f) + { + case DXGI_FORMAT_R32G32B32A32_TYPELESS: + case DXGI_FORMAT_R32G32B32A32_FLOAT: + case DXGI_FORMAT_R32G32B32A32_UINT: + case DXGI_FORMAT_R32G32B32A32_SINT: return DXGI_FORMAT_R32G32B32A32_TYPELESS; + + case DXGI_FORMAT_R32G32B32_TYPELESS: + case DXGI_FORMAT_R32G32B32_FLOAT: + case DXGI_FORMAT_R32G32B32_UINT: + case DXGI_FORMAT_R32G32B32_SINT: return DXGI_FORMAT_R32G32B32_TYPELESS; + + case DXGI_FORMAT_R16G16B16A16_TYPELESS: + case DXGI_FORMAT_R16G16B16A16_FLOAT: + case DXGI_FORMAT_R16G16B16A16_UNORM: + case DXGI_FORMAT_R16G16B16A16_UINT: + case DXGI_FORMAT_R16G16B16A16_SNORM: + case DXGI_FORMAT_R16G16B16A16_SINT: return DXGI_FORMAT_R16G16B16A16_TYPELESS; + + case DXGI_FORMAT_R32G32_TYPELESS: + case DXGI_FORMAT_R32G32_FLOAT: + case DXGI_FORMAT_R32G32_UINT: + case DXGI_FORMAT_R32G32_SINT: return DXGI_FORMAT_R32G32_TYPELESS; + + case DXGI_FORMAT_R32G8X24_TYPELESS: + case DXGI_FORMAT_D32_FLOAT_S8X24_UINT: + case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS: + case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT: return DXGI_FORMAT_R32G8X24_TYPELESS; + + case DXGI_FORMAT_R10G10B10A2_TYPELESS: + case DXGI_FORMAT_R10G10B10A2_UNORM: + case DXGI_FORMAT_R10G10B10A2_UINT: + case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM: // maybe not valid cast? + return DXGI_FORMAT_R10G10B10A2_TYPELESS; + + case DXGI_FORMAT_R8G8B8A8_TYPELESS: + case DXGI_FORMAT_R8G8B8A8_UNORM: + case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: + case DXGI_FORMAT_R8G8B8A8_UINT: + case DXGI_FORMAT_R8G8B8A8_SNORM: + case DXGI_FORMAT_R8G8B8A8_SINT: return DXGI_FORMAT_R8G8B8A8_TYPELESS; + + case DXGI_FORMAT_R16G16_TYPELESS: + case DXGI_FORMAT_R16G16_FLOAT: + case DXGI_FORMAT_R16G16_UNORM: + case DXGI_FORMAT_R16G16_UINT: + case DXGI_FORMAT_R16G16_SNORM: + case DXGI_FORMAT_R16G16_SINT: return DXGI_FORMAT_R16G16_TYPELESS; + + case DXGI_FORMAT_R32_TYPELESS: + case DXGI_FORMAT_D32_FLOAT: // maybe not valid cast? + case DXGI_FORMAT_R32_FLOAT: + case DXGI_FORMAT_R32_UINT: + case DXGI_FORMAT_R32_SINT: + return DXGI_FORMAT_R32_TYPELESS; + + // maybe not valid casts? + case DXGI_FORMAT_R24G8_TYPELESS: + case DXGI_FORMAT_D24_UNORM_S8_UINT: + case DXGI_FORMAT_R24_UNORM_X8_TYPELESS: + case DXGI_FORMAT_X24_TYPELESS_G8_UINT: return DXGI_FORMAT_R24G8_TYPELESS; + + case DXGI_FORMAT_B8G8R8A8_TYPELESS: + case DXGI_FORMAT_B8G8R8A8_UNORM: + case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: + case DXGI_FORMAT_R8G8_B8G8_UNORM: // maybe not valid cast? + case DXGI_FORMAT_G8R8_G8B8_UNORM: // maybe not valid cast? + return DXGI_FORMAT_B8G8R8A8_TYPELESS; + + case DXGI_FORMAT_B8G8R8X8_UNORM: + case DXGI_FORMAT_B8G8R8X8_TYPELESS: + case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: return DXGI_FORMAT_B8G8R8X8_TYPELESS; + + case DXGI_FORMAT_R8G8_TYPELESS: + case DXGI_FORMAT_R8G8_UNORM: + case DXGI_FORMAT_R8G8_UINT: + case DXGI_FORMAT_R8G8_SNORM: + case DXGI_FORMAT_R8G8_SINT: return DXGI_FORMAT_R8G8_TYPELESS; + + case DXGI_FORMAT_R16_TYPELESS: + case DXGI_FORMAT_R16_FLOAT: + case DXGI_FORMAT_D16_UNORM: + case DXGI_FORMAT_R16_UNORM: + case DXGI_FORMAT_R16_UINT: + case DXGI_FORMAT_R16_SNORM: + case DXGI_FORMAT_R16_SINT: return DXGI_FORMAT_R16_TYPELESS; + + case DXGI_FORMAT_R8_TYPELESS: + case DXGI_FORMAT_R8_UNORM: + case DXGI_FORMAT_R8_UINT: + case DXGI_FORMAT_R8_SNORM: + case DXGI_FORMAT_R8_SINT: + case DXGI_FORMAT_A8_UNORM: return DXGI_FORMAT_R8_TYPELESS; + + case DXGI_FORMAT_BC1_TYPELESS: + case DXGI_FORMAT_BC1_UNORM: + case DXGI_FORMAT_BC1_UNORM_SRGB: return DXGI_FORMAT_BC1_TYPELESS; + + case DXGI_FORMAT_BC4_TYPELESS: + case DXGI_FORMAT_BC4_UNORM: + case DXGI_FORMAT_BC4_SNORM: return DXGI_FORMAT_BC4_TYPELESS; + + case DXGI_FORMAT_BC2_TYPELESS: + case DXGI_FORMAT_BC2_UNORM: + case DXGI_FORMAT_BC2_UNORM_SRGB: return DXGI_FORMAT_BC2_TYPELESS; + + case DXGI_FORMAT_BC3_TYPELESS: + case DXGI_FORMAT_BC3_UNORM: + case DXGI_FORMAT_BC3_UNORM_SRGB: return DXGI_FORMAT_BC3_TYPELESS; + + case DXGI_FORMAT_BC5_TYPELESS: + case DXGI_FORMAT_BC5_UNORM: + case DXGI_FORMAT_BC5_SNORM: return DXGI_FORMAT_BC5_TYPELESS; + + case DXGI_FORMAT_BC6H_TYPELESS: + case DXGI_FORMAT_BC6H_UF16: + case DXGI_FORMAT_BC6H_SF16: return DXGI_FORMAT_BC6H_TYPELESS; + + case DXGI_FORMAT_BC7_TYPELESS: + case DXGI_FORMAT_BC7_UNORM: + case DXGI_FORMAT_BC7_UNORM_SRGB: return DXGI_FORMAT_BC7_TYPELESS; + + case DXGI_FORMAT_R1_UNORM: + case DXGI_FORMAT_R9G9B9E5_SHAREDEXP: + case DXGI_FORMAT_B5G6R5_UNORM: + case DXGI_FORMAT_B5G5R5A1_UNORM: + case DXGI_FORMAT_R11G11B10_FLOAT: + case DXGI_FORMAT_AYUV: + case DXGI_FORMAT_Y410: + case DXGI_FORMAT_YUY2: + case DXGI_FORMAT_Y416: + case DXGI_FORMAT_NV12: + case DXGI_FORMAT_P010: + case DXGI_FORMAT_P016: + case DXGI_FORMAT_420_OPAQUE: + case DXGI_FORMAT_Y210: + case DXGI_FORMAT_Y216: + case DXGI_FORMAT_NV11: + case DXGI_FORMAT_AI44: + case DXGI_FORMAT_IA44: + case DXGI_FORMAT_P8: + case DXGI_FORMAT_A8P8: + case DXGI_FORMAT_P208: + case DXGI_FORMAT_V208: + case DXGI_FORMAT_V408: + case DXGI_FORMAT_B4G4R4A4_UNORM: + RDCERR("No Typeless DXGI Format for %d", f); + return DXGI_FORMAT_UNKNOWN; + + case DXGI_FORMAT_UNKNOWN: + RDCWARN("Getting Typeless format of DXGI_FORMAT_UNKNOWN"); + return DXGI_FORMAT_UNKNOWN; + + default: RDCERR("Unrecognised DXGI Format: %d", f); return DXGI_FORMAT_UNKNOWN; + } +} + +D3D_PRIMITIVE_TOPOLOGY MakeD3DPrimitiveTopology(PrimitiveTopology Topo) +{ + switch(Topo) + { + case eTopology_LineLoop: + case eTopology_TriangleFan: RDCWARN("Unsupported primitive topology on D3D: %x", Topo); break; + default: + case eTopology_Unknown: return D3D_PRIMITIVE_TOPOLOGY_UNDEFINED; + case eTopology_PointList: return D3D_PRIMITIVE_TOPOLOGY_POINTLIST; + case eTopology_LineList: return D3D_PRIMITIVE_TOPOLOGY_LINELIST; + case eTopology_LineStrip: return D3D_PRIMITIVE_TOPOLOGY_LINESTRIP; + case eTopology_TriangleList: return D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST; + case eTopology_TriangleStrip: return D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP; + case eTopology_LineList_Adj: return D3D_PRIMITIVE_TOPOLOGY_LINELIST_ADJ; + case eTopology_LineStrip_Adj: return D3D_PRIMITIVE_TOPOLOGY_LINESTRIP_ADJ; + case eTopology_TriangleList_Adj: return D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST_ADJ; + case eTopology_TriangleStrip_Adj: return D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP_ADJ; + case eTopology_PatchList_1CPs: + case eTopology_PatchList_2CPs: + case eTopology_PatchList_3CPs: + case eTopology_PatchList_4CPs: + case eTopology_PatchList_5CPs: + case eTopology_PatchList_6CPs: + case eTopology_PatchList_7CPs: + case eTopology_PatchList_8CPs: + case eTopology_PatchList_9CPs: + case eTopology_PatchList_10CPs: + case eTopology_PatchList_11CPs: + case eTopology_PatchList_12CPs: + case eTopology_PatchList_13CPs: + case eTopology_PatchList_14CPs: + case eTopology_PatchList_15CPs: + case eTopology_PatchList_16CPs: + case eTopology_PatchList_17CPs: + case eTopology_PatchList_18CPs: + case eTopology_PatchList_19CPs: + case eTopology_PatchList_20CPs: + case eTopology_PatchList_21CPs: + case eTopology_PatchList_22CPs: + case eTopology_PatchList_23CPs: + case eTopology_PatchList_24CPs: + case eTopology_PatchList_25CPs: + case eTopology_PatchList_26CPs: + case eTopology_PatchList_27CPs: + case eTopology_PatchList_28CPs: + case eTopology_PatchList_29CPs: + case eTopology_PatchList_30CPs: + case eTopology_PatchList_31CPs: + case eTopology_PatchList_32CPs: + return D3D_PRIMITIVE_TOPOLOGY(D3D_PRIMITIVE_TOPOLOGY_1_CONTROL_POINT_PATCHLIST + + (Topo - eTopology_PatchList_1CPs)); + } + + return D3D_PRIMITIVE_TOPOLOGY_UNDEFINED; +} + +PrimitiveTopology MakePrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY Topo) +{ + switch(Topo) + { + default: + case D3D_PRIMITIVE_TOPOLOGY_UNDEFINED: break; + case D3D_PRIMITIVE_TOPOLOGY_POINTLIST: return eTopology_PointList; break; + case D3D_PRIMITIVE_TOPOLOGY_LINELIST: return eTopology_LineList; break; + case D3D_PRIMITIVE_TOPOLOGY_LINESTRIP: return eTopology_LineStrip; break; + case D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST: return eTopology_TriangleList; break; + case D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP: return eTopology_TriangleStrip; break; + case D3D_PRIMITIVE_TOPOLOGY_LINELIST_ADJ: return eTopology_LineList_Adj; break; + case D3D_PRIMITIVE_TOPOLOGY_LINESTRIP_ADJ: return eTopology_LineStrip_Adj; break; + case D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST_ADJ: return eTopology_TriangleList_Adj; break; + case D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP_ADJ: return eTopology_TriangleStrip_Adj; break; + case D3D_PRIMITIVE_TOPOLOGY_1_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_2_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_3_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_4_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_5_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_6_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_7_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_8_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_9_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_10_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_11_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_12_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_13_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_14_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_15_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_16_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_17_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_18_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_19_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_20_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_21_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_22_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_23_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_24_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_25_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_26_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_27_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_28_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_29_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_30_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_31_CONTROL_POINT_PATCHLIST: + case D3D_PRIMITIVE_TOPOLOGY_32_CONTROL_POINT_PATCHLIST: + return PrimitiveTopology(eTopology_PatchList_1CPs + + (Topo - D3D_PRIMITIVE_TOPOLOGY_1_CONTROL_POINT_PATCHLIST)); + break; + } + + return eTopology_Unknown; +} + +DXGI_FORMAT MakeDXGIFormat(ResourceFormat fmt) +{ + DXGI_FORMAT ret = DXGI_FORMAT_UNKNOWN; + + if(fmt.special) + { + switch(fmt.specialFormat) + { + case eSpecial_BC1: ret = DXGI_FORMAT_BC1_UNORM; break; + case eSpecial_BC2: ret = DXGI_FORMAT_BC2_UNORM; break; + case eSpecial_BC3: ret = DXGI_FORMAT_BC3_UNORM; break; + case eSpecial_BC4: ret = DXGI_FORMAT_BC4_UNORM; break; + case eSpecial_BC5: ret = DXGI_FORMAT_BC5_UNORM; break; + case eSpecial_BC6: ret = DXGI_FORMAT_BC6H_UF16; break; + case eSpecial_BC7: ret = DXGI_FORMAT_BC7_UNORM; break; + case eSpecial_R10G10B10A2: + if(fmt.compType == eCompType_UNorm) + ret = DXGI_FORMAT_R10G10B10A2_UNORM; + else + ret = DXGI_FORMAT_R10G10B10A2_UINT; + break; + case eSpecial_R11G11B10: ret = DXGI_FORMAT_R11G11B10_FLOAT; break; + case eSpecial_R5G6B5: + RDCASSERT(fmt.bgraOrder); + ret = DXGI_FORMAT_B5G6R5_UNORM; + break; + case eSpecial_R5G5B5A1: + RDCASSERT(fmt.bgraOrder); + ret = DXGI_FORMAT_B5G5R5A1_UNORM; + break; + case eSpecial_R9G9B9E5: ret = DXGI_FORMAT_R9G9B9E5_SHAREDEXP; break; + case eSpecial_R4G4B4A4: + RDCASSERT(fmt.bgraOrder); + ret = DXGI_FORMAT_B4G4R4A4_UNORM; + break; + case eSpecial_D24S8: ret = DXGI_FORMAT_R24G8_TYPELESS; break; + case eSpecial_D32S8: ret = DXGI_FORMAT_R32G8X24_TYPELESS; break; + case eSpecial_YUV: + RDCERR("Video format not unambiguously encoded"); + ret = DXGI_FORMAT_AYUV; + break; + case eSpecial_S8: RDCERR("D3D has no stencil-only format"); break; + case eSpecial_D16S8: RDCERR("D3D has no D16S8 format"); break; + default: RDCERR("Unrecognised/unsupported special format %u", fmt.specialFormat); break; + } + } + else if(fmt.compCount == 4) + { + if(fmt.compByteWidth == 4) + ret = DXGI_FORMAT_R32G32B32A32_TYPELESS; + else if(fmt.compByteWidth == 2) + ret = DXGI_FORMAT_R16G16B16A16_TYPELESS; + else if(fmt.compByteWidth == 1) + ret = DXGI_FORMAT_R8G8B8A8_TYPELESS; + else + RDCERR("Unrecognised 4-component byte width: %d", fmt.compByteWidth); + + if(fmt.bgraOrder) + ret = DXGI_FORMAT_B8G8R8A8_UNORM; + } + else if(fmt.compCount == 3) + { + if(fmt.compByteWidth == 4) + ret = DXGI_FORMAT_R32G32B32_TYPELESS; + // else if(fmt.compByteWidth == 2) ret = DXGI_FORMAT_R16G16B16_TYPELESS; // format doesn't exist + // else if(fmt.compByteWidth == 1) ret = DXGI_FORMAT_R8G8B8_TYPELESS; // format doesn't exist + else + RDCERR("Unrecognised 3-component byte width: %d", fmt.compByteWidth); + } + else if(fmt.compCount == 2) + { + if(fmt.compByteWidth == 4) + ret = DXGI_FORMAT_R32G32_TYPELESS; + else if(fmt.compByteWidth == 2) + ret = DXGI_FORMAT_R16G16_TYPELESS; + else if(fmt.compByteWidth == 1) + ret = DXGI_FORMAT_R8G8_TYPELESS; + else + RDCERR("Unrecognised 2-component byte width: %d", fmt.compByteWidth); + } + else if(fmt.compCount == 1) + { + if(fmt.compByteWidth == 4) + ret = DXGI_FORMAT_R32_TYPELESS; + else if(fmt.compByteWidth == 2) + ret = DXGI_FORMAT_R16_TYPELESS; + else if(fmt.compByteWidth == 1) + ret = DXGI_FORMAT_R8_TYPELESS; + else + RDCERR("Unrecognised 1-component byte width: %d", fmt.compByteWidth); + } + else + { + RDCERR("Unrecognised component count: %d", fmt.compCount); + } + + if(fmt.compType == eCompType_None) + ret = GetTypelessFormat(ret); + else if(fmt.compType == eCompType_Float) + ret = GetFloatTypedFormat(ret); + else if(fmt.compType == eCompType_Depth) + ret = GetDepthTypedFormat(ret); + else if(fmt.compType == eCompType_UNorm) + ret = GetUnormTypedFormat(ret); + else if(fmt.compType == eCompType_SNorm) + ret = GetSnormTypedFormat(ret); + else if(fmt.compType == eCompType_UInt) + ret = GetUIntTypedFormat(ret); + else if(fmt.compType == eCompType_SInt) + ret = GetSIntTypedFormat(ret); + else + RDCERR("Unrecognised component type"); + + if(fmt.srgbCorrected) + ret = GetSRGBFormat(ret); + + if(ret == DXGI_FORMAT_UNKNOWN) + RDCERR("No known DXGI_FORMAT corresponding to resource format!"); + + return ret; +} + +ResourceFormat MakeResourceFormat(DXGI_FORMAT fmt) +{ + ResourceFormat ret; + + ret.rawType = fmt; + ret.special = false; + ret.strname = ToStr::Get(fmt).substr(12); // 12 == strlen("DXGI_FORMAT_") + + ret.compCount = ret.compByteWidth = 0; + ret.compType = eCompType_Float; + + ret.srgbCorrected = IsSRGBFormat(fmt); + + switch(fmt) + { + case DXGI_FORMAT_R32G32B32A32_TYPELESS: + case DXGI_FORMAT_R32G32B32A32_FLOAT: + case DXGI_FORMAT_R32G32B32A32_UINT: + case DXGI_FORMAT_R32G32B32A32_SINT: + case DXGI_FORMAT_R16G16B16A16_TYPELESS: + case DXGI_FORMAT_R16G16B16A16_FLOAT: + case DXGI_FORMAT_R16G16B16A16_UNORM: + case DXGI_FORMAT_R16G16B16A16_UINT: + case DXGI_FORMAT_R16G16B16A16_SNORM: + case DXGI_FORMAT_R16G16B16A16_SINT: + case DXGI_FORMAT_R8G8B8A8_TYPELESS: + case DXGI_FORMAT_R8G8B8A8_UNORM: + case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: + case DXGI_FORMAT_R8G8B8A8_UINT: + case DXGI_FORMAT_R8G8B8A8_SNORM: + case DXGI_FORMAT_R8G8B8A8_SINT: ret.compCount = 4; break; + case DXGI_FORMAT_R32G32B32_TYPELESS: + case DXGI_FORMAT_R32G32B32_FLOAT: + case DXGI_FORMAT_R32G32B32_UINT: + case DXGI_FORMAT_R32G32B32_SINT: ret.compCount = 3; break; + case DXGI_FORMAT_R32G32_TYPELESS: + case DXGI_FORMAT_R32G32_FLOAT: + case DXGI_FORMAT_R32G32_UINT: + case DXGI_FORMAT_R32G32_SINT: + case DXGI_FORMAT_R16G16_TYPELESS: + case DXGI_FORMAT_R16G16_FLOAT: + case DXGI_FORMAT_R16G16_UNORM: + case DXGI_FORMAT_R16G16_UINT: + case DXGI_FORMAT_R16G16_SNORM: + case DXGI_FORMAT_R16G16_SINT: + case DXGI_FORMAT_R8G8_TYPELESS: + case DXGI_FORMAT_R8G8_UNORM: + case DXGI_FORMAT_R8G8_UINT: + case DXGI_FORMAT_R8G8_SNORM: + case DXGI_FORMAT_R8G8_SINT: ret.compCount = 2; break; + case DXGI_FORMAT_R32_TYPELESS: + case DXGI_FORMAT_D32_FLOAT: + case DXGI_FORMAT_R32_FLOAT: + case DXGI_FORMAT_R32_UINT: + case DXGI_FORMAT_R32_SINT: + case DXGI_FORMAT_R16_TYPELESS: + case DXGI_FORMAT_R16_FLOAT: + case DXGI_FORMAT_D16_UNORM: + case DXGI_FORMAT_R16_UNORM: + case DXGI_FORMAT_R16_UINT: + case DXGI_FORMAT_R16_SNORM: + case DXGI_FORMAT_R16_SINT: + case DXGI_FORMAT_R8_TYPELESS: + case DXGI_FORMAT_R8_UNORM: + case DXGI_FORMAT_R8_UINT: + case DXGI_FORMAT_R8_SNORM: + case DXGI_FORMAT_R8_SINT: + case DXGI_FORMAT_A8_UNORM: ret.compCount = 1; break; + + case DXGI_FORMAT_R32G8X24_TYPELESS: + case DXGI_FORMAT_D32_FLOAT_S8X24_UINT: + case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS: + case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT: + case DXGI_FORMAT_R24G8_TYPELESS: + case DXGI_FORMAT_D24_UNORM_S8_UINT: + case DXGI_FORMAT_R24_UNORM_X8_TYPELESS: + case DXGI_FORMAT_X24_TYPELESS_G8_UINT: + + case DXGI_FORMAT_BC5_TYPELESS: + case DXGI_FORMAT_BC5_UNORM: + case DXGI_FORMAT_BC5_SNORM: ret.compCount = 2; break; + + case DXGI_FORMAT_R11G11B10_FLOAT: + case DXGI_FORMAT_R9G9B9E5_SHAREDEXP: + case DXGI_FORMAT_R8G8_B8G8_UNORM: + case DXGI_FORMAT_G8R8_G8B8_UNORM: + case DXGI_FORMAT_B5G6R5_UNORM: + + case DXGI_FORMAT_BC6H_TYPELESS: + case DXGI_FORMAT_BC6H_UF16: + case DXGI_FORMAT_BC6H_SF16: ret.compCount = 3; break; + + case DXGI_FORMAT_R10G10B10A2_TYPELESS: + case DXGI_FORMAT_R10G10B10A2_UNORM: + case DXGI_FORMAT_R10G10B10A2_UINT: + case DXGI_FORMAT_B8G8R8A8_UNORM: + case DXGI_FORMAT_B8G8R8A8_TYPELESS: + case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: + case DXGI_FORMAT_B8G8R8X8_UNORM: + case DXGI_FORMAT_B8G8R8X8_TYPELESS: + case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: + case DXGI_FORMAT_B5G5R5A1_UNORM: + case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM: + + case DXGI_FORMAT_BC1_TYPELESS: + case DXGI_FORMAT_BC1_UNORM: + case DXGI_FORMAT_BC1_UNORM_SRGB: + case DXGI_FORMAT_BC2_TYPELESS: + case DXGI_FORMAT_BC2_UNORM: + case DXGI_FORMAT_BC2_UNORM_SRGB: + case DXGI_FORMAT_BC3_TYPELESS: + case DXGI_FORMAT_BC3_UNORM: + case DXGI_FORMAT_BC3_UNORM_SRGB: + case DXGI_FORMAT_BC7_TYPELESS: + case DXGI_FORMAT_BC7_UNORM: + case DXGI_FORMAT_BC7_UNORM_SRGB: ret.compCount = 4; break; + + case DXGI_FORMAT_R1_UNORM: + + case DXGI_FORMAT_BC4_TYPELESS: + case DXGI_FORMAT_BC4_UNORM: + case DXGI_FORMAT_BC4_SNORM: ret.compCount = 1; break; + + case DXGI_FORMAT_UNKNOWN: ret.compCount = 0; + + default: ret.special = true; + } + + switch(fmt) + { + case DXGI_FORMAT_R32G32B32A32_TYPELESS: + case DXGI_FORMAT_R32G32B32A32_FLOAT: + case DXGI_FORMAT_R32G32B32A32_UINT: + case DXGI_FORMAT_R32G32B32A32_SINT: + case DXGI_FORMAT_R32G32B32_TYPELESS: + case DXGI_FORMAT_R32G32B32_FLOAT: + case DXGI_FORMAT_R32G32B32_UINT: + case DXGI_FORMAT_R32G32B32_SINT: + case DXGI_FORMAT_R32G32_TYPELESS: + case DXGI_FORMAT_R32G32_FLOAT: + case DXGI_FORMAT_R32G32_UINT: + case DXGI_FORMAT_R32G32_SINT: + case DXGI_FORMAT_R32_TYPELESS: + case DXGI_FORMAT_D32_FLOAT: + case DXGI_FORMAT_R32_FLOAT: + case DXGI_FORMAT_R32_UINT: + case DXGI_FORMAT_R32_SINT: ret.compByteWidth = 4; break; + case DXGI_FORMAT_R16G16B16A16_TYPELESS: + case DXGI_FORMAT_R16G16B16A16_FLOAT: + case DXGI_FORMAT_R16G16B16A16_UNORM: + case DXGI_FORMAT_R16G16B16A16_UINT: + case DXGI_FORMAT_R16G16B16A16_SNORM: + case DXGI_FORMAT_R16G16B16A16_SINT: + case DXGI_FORMAT_R16G16_TYPELESS: + case DXGI_FORMAT_R16G16_FLOAT: + case DXGI_FORMAT_R16G16_UNORM: + case DXGI_FORMAT_R16G16_UINT: + case DXGI_FORMAT_R16G16_SNORM: + case DXGI_FORMAT_R16G16_SINT: + case DXGI_FORMAT_R16_TYPELESS: + case DXGI_FORMAT_R16_FLOAT: + case DXGI_FORMAT_D16_UNORM: + case DXGI_FORMAT_R16_UNORM: + case DXGI_FORMAT_R16_UINT: + case DXGI_FORMAT_R16_SNORM: + case DXGI_FORMAT_R16_SINT: ret.compByteWidth = 2; break; + case DXGI_FORMAT_R8G8B8A8_TYPELESS: + case DXGI_FORMAT_R8G8B8A8_UNORM: + case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: + case DXGI_FORMAT_R8G8B8A8_UINT: + case DXGI_FORMAT_R8G8B8A8_SNORM: + case DXGI_FORMAT_R8G8B8A8_SINT: + case DXGI_FORMAT_R8G8_TYPELESS: + case DXGI_FORMAT_R8G8_UNORM: + case DXGI_FORMAT_R8G8_UINT: + case DXGI_FORMAT_R8G8_SNORM: + case DXGI_FORMAT_R8G8_SINT: + case DXGI_FORMAT_R8_TYPELESS: + case DXGI_FORMAT_R8_UNORM: + case DXGI_FORMAT_R8_UINT: + case DXGI_FORMAT_R8_SNORM: + case DXGI_FORMAT_R8_SINT: + case DXGI_FORMAT_A8_UNORM: ret.compByteWidth = 1; break; + + case DXGI_FORMAT_B8G8R8A8_UNORM: + case DXGI_FORMAT_B8G8R8A8_TYPELESS: + case DXGI_FORMAT_B8G8R8X8_TYPELESS: + case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: + case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: ret.compByteWidth = 1; break; + + case DXGI_FORMAT_UNKNOWN: ret.compByteWidth = 0; + + default: ret.special = true; + } + + switch(fmt) + { + case DXGI_FORMAT_R32G32B32A32_TYPELESS: + case DXGI_FORMAT_R32G32B32_TYPELESS: + case DXGI_FORMAT_R32G32_TYPELESS: + case DXGI_FORMAT_R32_TYPELESS: + case DXGI_FORMAT_R16G16B16A16_TYPELESS: + case DXGI_FORMAT_R16G16_TYPELESS: + case DXGI_FORMAT_R16_TYPELESS: + case DXGI_FORMAT_R8G8B8A8_TYPELESS: + case DXGI_FORMAT_R8G8_TYPELESS: + case DXGI_FORMAT_R8_TYPELESS: ret.compType = eCompType_None; break; + case DXGI_FORMAT_R32G32B32A32_FLOAT: + case DXGI_FORMAT_R32G32B32_FLOAT: + case DXGI_FORMAT_R16G16B16A16_FLOAT: + case DXGI_FORMAT_R32G32_FLOAT: + case DXGI_FORMAT_R16G16_FLOAT: + case DXGI_FORMAT_R32_FLOAT: + case DXGI_FORMAT_R16_FLOAT: ret.compType = eCompType_Float; break; + case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: + case DXGI_FORMAT_R8G8B8A8_UNORM: + case DXGI_FORMAT_R16G16B16A16_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: ret.compType = eCompType_UNorm; break; + case DXGI_FORMAT_R8G8B8A8_SNORM: + case DXGI_FORMAT_R16G16B16A16_SNORM: + case DXGI_FORMAT_R16G16_SNORM: + case DXGI_FORMAT_R8G8_SNORM: + case DXGI_FORMAT_R16_SNORM: + case DXGI_FORMAT_R8_SNORM: ret.compType = eCompType_SNorm; break; + case DXGI_FORMAT_R32G32B32A32_UINT: + case DXGI_FORMAT_R32G32B32_UINT: + case DXGI_FORMAT_R16G16B16A16_UINT: + case DXGI_FORMAT_R32G32_UINT: + case DXGI_FORMAT_R8G8B8A8_UINT: + case DXGI_FORMAT_R16G16_UINT: + case DXGI_FORMAT_R32_UINT: + case DXGI_FORMAT_R8G8_UINT: + case DXGI_FORMAT_R16_UINT: + case DXGI_FORMAT_R8_UINT: ret.compType = eCompType_UInt; break; + case DXGI_FORMAT_R32G32B32A32_SINT: + case DXGI_FORMAT_R32G32B32_SINT: + case DXGI_FORMAT_R16G16B16A16_SINT: + case DXGI_FORMAT_R32G32_SINT: + case DXGI_FORMAT_R8G8B8A8_SINT: + case DXGI_FORMAT_R16G16_SINT: + case DXGI_FORMAT_R32_SINT: + case DXGI_FORMAT_R8G8_SINT: + case DXGI_FORMAT_R16_SINT: + case DXGI_FORMAT_R8_SINT: ret.compType = eCompType_SInt; break; + + case DXGI_FORMAT_R10G10B10A2_UINT: + case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM: ret.compType = eCompType_UInt; break; + + case DXGI_FORMAT_R9G9B9E5_SHAREDEXP: + case DXGI_FORMAT_R11G11B10_FLOAT: ret.compType = eCompType_Float; break; + + case DXGI_FORMAT_BC4_SNORM: + case DXGI_FORMAT_BC5_SNORM: + case DXGI_FORMAT_BC6H_SF16: ret.compType = eCompType_SNorm; break; + + case DXGI_FORMAT_R24G8_TYPELESS: + case DXGI_FORMAT_R32G8X24_TYPELESS: ret.compType = eCompType_None; break; + case DXGI_FORMAT_X24_TYPELESS_G8_UINT: + case DXGI_FORMAT_D32_FLOAT_S8X24_UINT: + case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS: + case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT: + case DXGI_FORMAT_D32_FLOAT: + case DXGI_FORMAT_R24_UNORM_X8_TYPELESS: + case DXGI_FORMAT_D24_UNORM_S8_UINT: + case DXGI_FORMAT_D16_UNORM: ret.compType = eCompType_Depth; break; + + case DXGI_FORMAT_R10G10B10A2_TYPELESS: + case DXGI_FORMAT_B8G8R8A8_TYPELESS: + case DXGI_FORMAT_B8G8R8X8_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_BC6H_TYPELESS: + case DXGI_FORMAT_BC7_TYPELESS: ret.compType = eCompType_None; break; + case DXGI_FORMAT_R8G8_B8G8_UNORM: + case DXGI_FORMAT_G8R8_G8B8_UNORM: + case DXGI_FORMAT_R10G10B10A2_UNORM: + case DXGI_FORMAT_B5G6R5_UNORM: + case DXGI_FORMAT_B5G5R5A1_UNORM: + case DXGI_FORMAT_B8G8R8A8_UNORM: + case DXGI_FORMAT_B8G8R8X8_UNORM: + case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: + case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: + case DXGI_FORMAT_R1_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_BC6H_UF16: + case DXGI_FORMAT_BC7_UNORM: + case DXGI_FORMAT_BC1_UNORM_SRGB: + case DXGI_FORMAT_BC2_UNORM_SRGB: + case DXGI_FORMAT_BC3_UNORM_SRGB: + case DXGI_FORMAT_BC7_UNORM_SRGB: ret.compType = eCompType_UNorm; break; + + case DXGI_FORMAT_UNKNOWN: ret.compType = eCompType_None; + + default: ret.special = true; + } + + switch(fmt) + { + case DXGI_FORMAT_B8G8R8A8_UNORM: + case DXGI_FORMAT_B8G8R8X8_UNORM: + case DXGI_FORMAT_B8G8R8A8_TYPELESS: + case DXGI_FORMAT_B8G8R8X8_TYPELESS: + case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: + case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: ret.bgraOrder = true; break; + } + + ret.specialFormat = eSpecial_Unknown; + + switch(fmt) + { + case DXGI_FORMAT_R24_UNORM_X8_TYPELESS: + case DXGI_FORMAT_X24_TYPELESS_G8_UINT: + case DXGI_FORMAT_D24_UNORM_S8_UINT: + case DXGI_FORMAT_R24G8_TYPELESS: ret.specialFormat = eSpecial_D24S8; break; + case DXGI_FORMAT_D32_FLOAT_S8X24_UINT: + case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS: + case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT: + case DXGI_FORMAT_R32G8X24_TYPELESS: ret.specialFormat = eSpecial_D32S8; break; + + case DXGI_FORMAT_BC1_TYPELESS: + case DXGI_FORMAT_BC1_UNORM_SRGB: + case DXGI_FORMAT_BC1_UNORM: ret.specialFormat = eSpecial_BC1; break; + case DXGI_FORMAT_BC2_TYPELESS: + case DXGI_FORMAT_BC2_UNORM_SRGB: + case DXGI_FORMAT_BC2_UNORM: ret.specialFormat = eSpecial_BC2; break; + case DXGI_FORMAT_BC3_TYPELESS: + case DXGI_FORMAT_BC3_UNORM_SRGB: + case DXGI_FORMAT_BC3_UNORM: ret.specialFormat = eSpecial_BC3; break; + case DXGI_FORMAT_BC4_TYPELESS: + case DXGI_FORMAT_BC4_UNORM: + case DXGI_FORMAT_BC4_SNORM: ret.specialFormat = eSpecial_BC4; break; + case DXGI_FORMAT_BC5_TYPELESS: + case DXGI_FORMAT_BC5_UNORM: + case DXGI_FORMAT_BC5_SNORM: ret.specialFormat = eSpecial_BC5; break; + case DXGI_FORMAT_BC6H_UF16: + case DXGI_FORMAT_BC6H_SF16: + case DXGI_FORMAT_BC6H_TYPELESS: ret.specialFormat = eSpecial_BC6; break; + case DXGI_FORMAT_BC7_TYPELESS: + case DXGI_FORMAT_BC7_UNORM_SRGB: + case DXGI_FORMAT_BC7_UNORM: ret.specialFormat = eSpecial_BC7; break; + case DXGI_FORMAT_R10G10B10A2_TYPELESS: + case DXGI_FORMAT_R10G10B10A2_UINT: + case DXGI_FORMAT_R10G10B10A2_UNORM: + case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM: ret.specialFormat = eSpecial_R10G10B10A2; break; + case DXGI_FORMAT_R11G11B10_FLOAT: ret.specialFormat = eSpecial_R11G11B10; break; + case DXGI_FORMAT_B5G6R5_UNORM: + ret.specialFormat = eSpecial_R5G6B5; + ret.bgraOrder = true; + break; + case DXGI_FORMAT_B5G5R5A1_UNORM: + ret.specialFormat = eSpecial_R5G5B5A1; + ret.bgraOrder = true; + break; + case DXGI_FORMAT_R9G9B9E5_SHAREDEXP: ret.specialFormat = eSpecial_R9G9B9E5; break; + + case DXGI_FORMAT_AYUV: + case DXGI_FORMAT_Y410: + case DXGI_FORMAT_Y416: + case DXGI_FORMAT_NV12: + case DXGI_FORMAT_P010: + case DXGI_FORMAT_P016: + case DXGI_FORMAT_420_OPAQUE: + case DXGI_FORMAT_YUY2: + case DXGI_FORMAT_Y210: + case DXGI_FORMAT_Y216: + case DXGI_FORMAT_NV11: + case DXGI_FORMAT_AI44: + case DXGI_FORMAT_IA44: + case DXGI_FORMAT_P8: + case DXGI_FORMAT_A8P8: + case DXGI_FORMAT_P208: + case DXGI_FORMAT_V208: + case DXGI_FORMAT_V408: ret.specialFormat = eSpecial_YUV; break; + + case DXGI_FORMAT_B4G4R4A4_UNORM: + ret.specialFormat = eSpecial_R4G4B4A4; + ret.bgraOrder = true; + break; + + default: break; + } + + if(ret.specialFormat != eSpecial_Unknown) + { + ret.special = true; + } + + return ret; +} + +string ToStrHelper::Get(const DXGI_SAMPLE_DESC &el) +{ + char tostrBuf[256] = {0}; + StringFormat::snprintf(tostrBuf, 255, "DXGI_SAMPLE_DESC<%d,%d>", el.Count, el.Quality); + + return tostrBuf; +} + +string ToStrHelper::Get(const DXGI_FORMAT &el) +{ + switch(el) + { + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R32G32B32A32_TYPELESS) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R32G32B32A32_FLOAT) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R32G32B32A32_UINT) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R32G32B32A32_SINT) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R32G32B32_TYPELESS) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R32G32B32_FLOAT) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R32G32B32_UINT) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R32G32B32_SINT) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R16G16B16A16_TYPELESS) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R16G16B16A16_FLOAT) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R16G16B16A16_UNORM) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R16G16B16A16_UINT) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R16G16B16A16_SNORM) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R16G16B16A16_SINT) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R32G32_TYPELESS) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R32G32_FLOAT) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R32G32_UINT) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R32G32_SINT) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R32G8X24_TYPELESS) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_D32_FLOAT_S8X24_UINT) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_X32_TYPELESS_G8X24_UINT) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R10G10B10A2_TYPELESS) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R10G10B10A2_UNORM) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R10G10B10A2_UINT) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R11G11B10_FLOAT) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R8G8B8A8_TYPELESS) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R8G8B8A8_UNORM) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R8G8B8A8_UNORM_SRGB) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R8G8B8A8_UINT) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R8G8B8A8_SNORM) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R8G8B8A8_SINT) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R16G16_TYPELESS) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R16G16_FLOAT) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R16G16_UNORM) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R16G16_UINT) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R16G16_SNORM) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R16G16_SINT) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R32_TYPELESS) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_D32_FLOAT) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R32_FLOAT) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R32_UINT) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R32_SINT) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R24G8_TYPELESS) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_D24_UNORM_S8_UINT) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R24_UNORM_X8_TYPELESS) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_X24_TYPELESS_G8_UINT) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R8G8_TYPELESS) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R8G8_UNORM) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R8G8_UINT) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R8G8_SNORM) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R8G8_SINT) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R16_TYPELESS) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R16_FLOAT) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_D16_UNORM) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R16_UNORM) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R16_UINT) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R16_SNORM) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R16_SINT) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R8_TYPELESS) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R8_UNORM) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R8_UINT) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R8_SNORM) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R8_SINT) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_A8_UNORM) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R1_UNORM) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R9G9B9E5_SHAREDEXP) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R8G8_B8G8_UNORM) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_G8R8_G8B8_UNORM) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_BC1_TYPELESS) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_BC1_UNORM) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_BC1_UNORM_SRGB) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_BC2_TYPELESS) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_BC2_UNORM) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_BC2_UNORM_SRGB) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_BC3_TYPELESS) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_BC3_UNORM) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_BC3_UNORM_SRGB) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_BC4_TYPELESS) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_BC4_UNORM) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_BC4_SNORM) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_BC5_TYPELESS) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_BC5_UNORM) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_BC5_SNORM) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_B5G6R5_UNORM) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_B5G5R5A1_UNORM) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_B8G8R8A8_UNORM) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_B8G8R8X8_UNORM) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_B8G8R8A8_TYPELESS) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_B8G8R8A8_UNORM_SRGB) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_B8G8R8X8_TYPELESS) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_B8G8R8X8_UNORM_SRGB) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_BC6H_TYPELESS) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_BC6H_UF16) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_BC6H_SF16) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_BC7_TYPELESS) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_BC7_UNORM) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_BC7_UNORM_SRGB) + // D3D11.1 formats + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_AYUV) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_Y410) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_Y416) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_NV12) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_P010) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_P016) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_420_OPAQUE) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_YUY2) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_Y210) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_Y216) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_NV11) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_AI44) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_IA44) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_P8) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_A8P8) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_B4G4R4A4_UNORM) + // D3D11.2 formats + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_P208) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_V208) + TOSTR_CASE_STRINGIZE(DXGI_FORMAT_V408) + default: break; + } + + char tostrBuf[256] = {0}; + StringFormat::snprintf(tostrBuf, 255, "DXGI_FORMAT<%d>", el); + + return tostrBuf; +} + +// not technically DXGI, but makes more sense to have it here common between D3D versions +string ToStrHelper::Get(const D3D_FEATURE_LEVEL &el) +{ + switch(el) + { + TOSTR_CASE_STRINGIZE(D3D_FEATURE_LEVEL_9_1) + TOSTR_CASE_STRINGIZE(D3D_FEATURE_LEVEL_9_2) + TOSTR_CASE_STRINGIZE(D3D_FEATURE_LEVEL_9_3) + TOSTR_CASE_STRINGIZE(D3D_FEATURE_LEVEL_10_0) + TOSTR_CASE_STRINGIZE(D3D_FEATURE_LEVEL_10_1) + TOSTR_CASE_STRINGIZE(D3D_FEATURE_LEVEL_11_0) + TOSTR_CASE_STRINGIZE(D3D_FEATURE_LEVEL_11_1) + TOSTR_CASE_STRINGIZE(D3D_FEATURE_LEVEL_12_0) + TOSTR_CASE_STRINGIZE(D3D_FEATURE_LEVEL_12_1) + default: break; + } + + char tostrBuf[256] = {0}; + StringFormat::snprintf(tostrBuf, 255, "D3D_FEATURE_LEVEL<%d>", el); + + return tostrBuf; +} + +string ToStrHelper::Get(const D3D_DRIVER_TYPE &el) +{ + switch(el) + { + TOSTR_CASE_STRINGIZE(D3D_DRIVER_TYPE_HARDWARE) + TOSTR_CASE_STRINGIZE(D3D_DRIVER_TYPE_REFERENCE) + TOSTR_CASE_STRINGIZE(D3D_DRIVER_TYPE_NULL) + TOSTR_CASE_STRINGIZE(D3D_DRIVER_TYPE_SOFTWARE) + TOSTR_CASE_STRINGIZE(D3D_DRIVER_TYPE_WARP) + default: break; + } + + char tostrBuf[256] = {0}; + StringFormat::snprintf(tostrBuf, 255, "D3D_DRIVER_TYPE<%d>", el); + + return tostrBuf; +} diff --git a/renderdoc/driver/dxgi/dxgi_common.h b/renderdoc/driver/dxgi/dxgi_common.h new file mode 100644 index 000000000..6c7082598 --- /dev/null +++ b/renderdoc/driver/dxgi/dxgi_common.h @@ -0,0 +1,60 @@ +/****************************************************************************** + * The MIT License (MIT) + * + * Copyright (c) 2016 Baldur Karlsson + * + * 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. + ******************************************************************************/ + +#pragma once + +#include "api/replay/renderdoc_replay.h" +#include "driver/dx/official/d3dcommon.h" +#include "driver/dx/official/dxgi1_5.h" + +ResourceFormat MakeResourceFormat(DXGI_FORMAT fmt); +DXGI_FORMAT MakeDXGIFormat(ResourceFormat fmt); + +UINT GetByteSize(int Width, int Height, int Depth, DXGI_FORMAT Format, int mip); + +// returns block size for block-compressed formats +UINT GetFormatBPP(DXGI_FORMAT f); + +DXGI_FORMAT GetTypelessFormat(DXGI_FORMAT f); +DXGI_FORMAT GetTypedFormat(DXGI_FORMAT f); +DXGI_FORMAT GetTypedFormat(DXGI_FORMAT f, FormatComponentType hint); +DXGI_FORMAT GetDepthTypedFormat(DXGI_FORMAT f); +DXGI_FORMAT GetFloatTypedFormat(DXGI_FORMAT f); +DXGI_FORMAT GetUnormTypedFormat(DXGI_FORMAT f); +DXGI_FORMAT GetSnormTypedFormat(DXGI_FORMAT f); +DXGI_FORMAT GetUIntTypedFormat(DXGI_FORMAT f); +DXGI_FORMAT GetSIntTypedFormat(DXGI_FORMAT f); +DXGI_FORMAT GetSRGBFormat(DXGI_FORMAT f); +DXGI_FORMAT GetNonSRGBFormat(DXGI_FORMAT f); +bool IsBlockFormat(DXGI_FORMAT f); +bool IsDepthFormat(DXGI_FORMAT f); + +bool IsUIntFormat(DXGI_FORMAT f); +bool IsTypelessFormat(DXGI_FORMAT f); +bool IsIntFormat(DXGI_FORMAT f); +bool IsSRGBFormat(DXGI_FORMAT f); + +// not technically DXGI, but makes more sense to have it here common between D3D versions +PrimitiveTopology MakePrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY Topo); +D3D_PRIMITIVE_TOPOLOGY MakeD3DPrimitiveTopology(PrimitiveTopology Topo); diff --git a/renderdoc/driver/dxgi/dxgi_wrapped.h b/renderdoc/driver/dxgi/dxgi_wrapped.h index b3736bd47..1621a4e6a 100644 --- a/renderdoc/driver/dxgi/dxgi_wrapped.h +++ b/renderdoc/driver/dxgi/dxgi_wrapped.h @@ -155,8 +155,11 @@ class WrappedIDXGISwapChain3; struct ID3DDevice { + // re-use IUnknown virtual ULONG STDMETHODCALLTYPE AddRef() = 0; virtual ULONG STDMETHODCALLTYPE Release() = 0; + virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject) = 0; + virtual IUnknown *GetRealIUnknown() = 0; virtual IID GetBackbufferUUID() = 0; @@ -177,6 +180,365 @@ struct ID3DDevice typedef ID3DDevice *(*D3DDeviceCallback)(IUnknown *dev); +template +class WrappedDXGIInterface : public RefCountDXGIObject, + public IDXGIKeyedMutex, + public IDXGISurface2, + public IDXGIResource1 +{ +public: + ID3DDevice *m_pDevice; + NestedType *m_pWrapped; + + WrappedDXGIInterface(NestedType *wrapped, ID3DDevice *device) + : RefCountDXGIObject(NULL), m_pDevice(device), m_pWrapped(wrapped) + { + m_pWrapped->AddRef(); + m_pDevice->AddRef(); + } + + virtual ~WrappedDXGIInterface() + { + m_pWrapped->Release(); + m_pDevice->Release(); + } + + ////////////////////////////// + // Implement IUnknown + ULONG STDMETHODCALLTYPE AddRef() { return RefCountDXGIObject::AddRef(); } + ULONG STDMETHODCALLTYPE Release() { return RefCountDXGIObject::Release(); } + HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject) + { + // ensure the real object has this interface + void *outObj; + HRESULT hr = m_pWrapped->QueryInterface(riid, &outObj); + + IUnknown *unk = (IUnknown *)outObj; + SAFE_RELEASE(unk); + + if(FAILED(hr)) + { + return hr; + } + + if(riid == __uuidof(IUnknown)) + { + *ppvObject = (IUnknown *)(IDXGIKeyedMutex *)this; + AddRef(); + return S_OK; + } + if(riid == __uuidof(IDXGIObject)) + { + *ppvObject = (IDXGIObject *)(IDXGIKeyedMutex *)this; + AddRef(); + return S_OK; + } + if(riid == __uuidof(IDXGIDeviceSubObject)) + { + *ppvObject = (IDXGIDeviceSubObject *)(IDXGIKeyedMutex *)this; + AddRef(); + return S_OK; + } + if(riid == __uuidof(IDXGIResource)) + { + *ppvObject = (IDXGIResource *)this; + AddRef(); + return S_OK; + } + if(riid == __uuidof(IDXGIKeyedMutex)) + { + *ppvObject = (IDXGIKeyedMutex *)this; + AddRef(); + return S_OK; + } + if(riid == __uuidof(IDXGISurface)) + { + *ppvObject = (IDXGISurface *)this; + AddRef(); + return S_OK; + } + if(riid == __uuidof(IDXGISurface1)) + { + *ppvObject = (IDXGISurface1 *)this; + AddRef(); + return S_OK; + } + if(riid == __uuidof(IDXGIResource1)) + { + *ppvObject = (IDXGIResource1 *)this; + AddRef(); + return S_OK; + } + if(riid == __uuidof(IDXGISurface2)) + { + *ppvObject = (IDXGISurface2 *)this; + AddRef(); + return S_OK; + } + + return m_pWrapped->QueryInterface(riid, ppvObject); + } + + ////////////////////////////// + // Implement IDXGIObject + HRESULT STDMETHODCALLTYPE SetPrivateData(REFGUID Name, UINT DataSize, const void *pData) + { + return m_pWrapped->SetPrivateData(Name, DataSize, pData); + } + + HRESULT STDMETHODCALLTYPE SetPrivateDataInterface(REFGUID Name, const IUnknown *pUnknown) + { + return m_pWrapped->SetPrivateDataInterface(Name, pUnknown); + } + + HRESULT STDMETHODCALLTYPE GetPrivateData(REFGUID Name, UINT *pDataSize, void *pData) + { + return m_pWrapped->GetPrivateData(Name, pDataSize, pData); + } + + // this should only be called for adapters, devices, factories etc + // so we pass it onto the device + HRESULT STDMETHODCALLTYPE GetParent(REFIID riid, void **ppParent) + { + return m_pDevice->QueryInterface(riid, ppParent); + } + + ////////////////////////////// + // Implement IDXGIDeviceSubObject + + // same as GetParent + HRESULT STDMETHODCALLTYPE GetDevice(REFIID riid, void **ppDevice) + { + return m_pDevice->QueryInterface(riid, ppDevice); + } + + ////////////////////////////// + // Implement IDXGIKeyedMutex + HRESULT STDMETHODCALLTYPE AcquireSync(UINT64 Key, DWORD dwMilliseconds) + { + // temporarily get the real interface + IDXGIKeyedMutex *mutex = NULL; + HRESULT hr = m_pWrapped->GetReal()->QueryInterface(__uuidof(IDXGIKeyedMutex), (void **)&mutex); + if(FAILED(hr)) + { + SAFE_RELEASE(mutex); + return hr; + } + + hr = mutex->AcquireSync(Key, dwMilliseconds); + SAFE_RELEASE(mutex); + return hr; + } + + HRESULT STDMETHODCALLTYPE ReleaseSync(UINT64 Key) + { + // temporarily get the real interface + IDXGIKeyedMutex *mutex = NULL; + HRESULT hr = m_pWrapped->GetReal()->QueryInterface(__uuidof(IDXGIKeyedMutex), (void **)&mutex); + if(FAILED(hr)) + { + SAFE_RELEASE(mutex); + return hr; + } + + hr = mutex->ReleaseSync(Key); + SAFE_RELEASE(mutex); + return hr; + } + + ////////////////////////////// + // Implement IDXGIResource + virtual HRESULT STDMETHODCALLTYPE GetSharedHandle(HANDLE *pSharedHandle) + { + // temporarily get the real interface + IDXGIResource *res = NULL; + HRESULT hr = m_pWrapped->GetReal()->QueryInterface(__uuidof(IDXGIResource), (void **)&res); + if(FAILED(hr)) + { + SAFE_RELEASE(res); + return hr; + } + + hr = res->GetSharedHandle(pSharedHandle); + SAFE_RELEASE(res); + return hr; + } + + virtual HRESULT STDMETHODCALLTYPE GetUsage(DXGI_USAGE *pUsage) + { + // temporarily get the real interface + IDXGIResource *res = NULL; + HRESULT hr = m_pWrapped->GetReal()->QueryInterface(__uuidof(IDXGIResource), (void **)&res); + if(FAILED(hr)) + { + SAFE_RELEASE(res); + return hr; + } + + hr = res->GetUsage(pUsage); + SAFE_RELEASE(res); + return hr; + } + + virtual HRESULT STDMETHODCALLTYPE SetEvictionPriority(UINT EvictionPriority) + { + // temporarily get the real interface + IDXGIResource *res = NULL; + HRESULT hr = m_pWrapped->GetReal()->QueryInterface(__uuidof(IDXGIResource), (void **)&res); + if(FAILED(hr)) + { + SAFE_RELEASE(res); + return hr; + } + + hr = res->SetEvictionPriority(EvictionPriority); + SAFE_RELEASE(res); + return hr; + } + + virtual HRESULT STDMETHODCALLTYPE GetEvictionPriority(UINT *pEvictionPriority) + { + // temporarily get the real interface + IDXGIResource *res = NULL; + HRESULT hr = m_pWrapped->GetReal()->QueryInterface(__uuidof(IDXGIResource), (void **)&res); + if(FAILED(hr)) + { + SAFE_RELEASE(res); + return hr; + } + + hr = res->GetEvictionPriority(pEvictionPriority); + SAFE_RELEASE(res); + return hr; + } + + ////////////////////////////// + // Implement IDXGISurface + virtual HRESULT STDMETHODCALLTYPE GetDesc(DXGI_SURFACE_DESC *pDesc) + { + // temporarily get the real interface + IDXGISurface *surf = NULL; + HRESULT hr = m_pWrapped->GetReal()->QueryInterface(__uuidof(IDXGISurface), (void **)&surf); + if(FAILED(hr)) + { + SAFE_RELEASE(surf); + return hr; + } + + hr = surf->GetDesc(pDesc); + SAFE_RELEASE(surf); + return hr; + } + + virtual HRESULT STDMETHODCALLTYPE Map(DXGI_MAPPED_RECT *pLockedRect, UINT MapFlags) + { + // temporarily get the real interface + IDXGISurface *surf = NULL; + HRESULT hr = m_pWrapped->GetReal()->QueryInterface(__uuidof(IDXGISurface), (void **)&surf); + if(FAILED(hr)) + { + SAFE_RELEASE(surf); + return hr; + } + + hr = surf->Map(pLockedRect, MapFlags); + SAFE_RELEASE(surf); + return hr; + } + + virtual HRESULT STDMETHODCALLTYPE Unmap(void) + { + // temporarily get the real interface + IDXGISurface *surf = NULL; + HRESULT hr = m_pWrapped->GetReal()->QueryInterface(__uuidof(IDXGISurface), (void **)&surf); + if(FAILED(hr)) + { + SAFE_RELEASE(surf); + return hr; + } + + hr = surf->Unmap(); + SAFE_RELEASE(surf); + return hr; + } + + ////////////////////////////// + // Implement IDXGISurface1 + virtual HRESULT STDMETHODCALLTYPE GetDC(BOOL Discard, HDC *phdc) + { + // temporarily get the real interface + IDXGISurface1 *surf = NULL; + HRESULT hr = m_pWrapped->GetReal()->QueryInterface(__uuidof(IDXGISurface1), (void **)&surf); + if(FAILED(hr)) + { + SAFE_RELEASE(surf); + return hr; + } + + hr = surf->GetDC(Discard, phdc); + SAFE_RELEASE(surf); + return hr; + } + + virtual HRESULT STDMETHODCALLTYPE ReleaseDC(RECT *pDirtyRect) + { + // temporarily get the real interface + IDXGISurface1 *surf = NULL; + HRESULT hr = m_pWrapped->GetReal()->QueryInterface(__uuidof(IDXGISurface1), (void **)&surf); + if(FAILED(hr)) + { + SAFE_RELEASE(surf); + return hr; + } + + hr = surf->ReleaseDC(pDirtyRect); + SAFE_RELEASE(surf); + return hr; + } + + ////////////////////////////// + // Implement IDXGIResource1 + virtual HRESULT STDMETHODCALLTYPE CreateSubresourceSurface(UINT index, IDXGISurface2 **ppSurface) + { + if(ppSurface == NULL) + return E_INVALIDARG; + + // maybe this will work?!? + AddRef(); + *ppSurface = (IDXGISurface2 *)this; + return S_OK; + } + + virtual HRESULT STDMETHODCALLTYPE CreateSharedHandle(const SECURITY_ATTRIBUTES *pAttributes, + DWORD dwAccess, LPCWSTR lpName, + HANDLE *pHandle) + { + // temporarily get the real interface + IDXGIResource1 *res = NULL; + HRESULT hr = m_pWrapped->GetReal()->QueryInterface(__uuidof(IDXGIResource1), (void **)&res); + if(FAILED(hr)) + { + SAFE_RELEASE(res); + return hr; + } + + hr = res->CreateSharedHandle(pAttributes, dwAccess, lpName, pHandle); + SAFE_RELEASE(res); + return hr; + } + + ////////////////////////////// + // Implement IDXGISurface2 + virtual HRESULT STDMETHODCALLTYPE GetResource(REFIID riid, void **ppParentResource, + UINT *pSubresourceIndex) + { + // not really sure how to implement this :(. + if(pSubresourceIndex) + pSubresourceIndex = 0; + return QueryInterface(riid, ppParentResource); + } +}; + class WrappedIDXGISwapChain3 : public IDXGISwapChain3, public RefCountDXGIObject { IDXGISwapChain *m_pReal; diff --git a/renderdoc/driver/dxgi/renderdoc_dxgi.vcxproj b/renderdoc/driver/dxgi/renderdoc_dxgi.vcxproj index 70c5b439f..f1cac9da2 100644 --- a/renderdoc/driver/dxgi/renderdoc_dxgi.vcxproj +++ b/renderdoc/driver/dxgi/renderdoc_dxgi.vcxproj @@ -184,6 +184,7 @@ + @@ -195,6 +196,7 @@ + diff --git a/renderdoc/driver/dxgi/renderdoc_dxgi.vcxproj.filters b/renderdoc/driver/dxgi/renderdoc_dxgi.vcxproj.filters index 458aa3be0..27f68a57d 100644 --- a/renderdoc/driver/dxgi/renderdoc_dxgi.vcxproj.filters +++ b/renderdoc/driver/dxgi/renderdoc_dxgi.vcxproj.filters @@ -1,11 +1,17 @@  - - + + Hooks + + + Wrapped + + + Util + - official @@ -27,10 +33,25 @@ official + + Wrapped + + + Util + {285b6e05-2a6b-4161-9d67-e24933eebb28} + + {3f3ebf0f-cc7d-47c0-b114-a519e439e6fb} + + + {d6e37369-52fe-45c1-b4c4-9f97a0886fde} + + + {846e54d9-08da-4d5a-aac1-250f6be13e33} + \ No newline at end of file