Move common code into DXGI out of D3D11, to share with D3D12

This commit is contained in:
baldurk
2016-07-10 18:09:29 +02:00
parent b505cfaceb
commit 66524a7330
9 changed files with 2505 additions and 1207 deletions
-815
View File
@@ -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<false, D3D11_BOX>::Get(const D3D11_BOX &el)
return tostrBuf;
}
string ToStrHelper<false, DXGI_SAMPLE_DESC>::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<false, D3D11_BIND_FLAG>::Get(const D3D11_BIND_FLAG &el)
{
string ret;
@@ -2026,46 +1384,6 @@ string ToStrHelper<false, D3D11_DSV_DIMENSION>::Get(const D3D11_DSV_DIMENSION &e
return tostrBuf;
}
string ToStrHelper<false, D3D_FEATURE_LEVEL>::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<false, D3D_DRIVER_TYPE>::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<false, D3D11_CONTEXT_TYPE>::Get(const D3D11_CONTEXT_TYPE &el)
{
switch(el)
@@ -2241,136 +1559,3 @@ string ToStrHelper<false, long>::Get(const long &el)
{
return ToStr::Get((uint64_t)el);
}
string ToStrHelper<false, DXGI_FORMAT>::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;
}
+1 -5
View File
@@ -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 <class T>
+2 -2
View File
@@ -4702,7 +4702,7 @@ void D3D11DebugManager::RenderMesh(uint32_t eventID, const vector<MeshFormat> &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<MeshFormat> &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);
-382
View File
@@ -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 <typename derived, typename base>
bool CanQuery(base *b)
{
@@ -115,365 +92,6 @@ private:
ResourceId m_ID;
};
template <typename NestedType>
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 <typename NestedType, typename NestedType1 = NestedType, typename NestedType2 = NestedType1>
File diff suppressed because it is too large Load Diff
+60
View File
@@ -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);
+362
View File
@@ -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 <typename NestedType>
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;
@@ -184,6 +184,7 @@
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="dxgi_common.cpp" />
<ClCompile Include="dxgi_hooks.cpp" />
<ClCompile Include="dxgi_wrapped.cpp" />
</ItemGroup>
@@ -195,6 +196,7 @@
<ClInclude Include="..\dx\official\dxgi1_5.h" />
<ClInclude Include="..\dx\official\dxgiformat.h" />
<ClInclude Include="..\dx\official\dxgitype.h" />
<ClInclude Include="dxgi_common.h" />
<ClInclude Include="dxgi_wrapped.h" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
@@ -1,11 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<ClCompile Include="dxgi_wrapped.cpp" />
<ClCompile Include="dxgi_hooks.cpp" />
<ClCompile Include="dxgi_hooks.cpp">
<Filter>Hooks</Filter>
</ClCompile>
<ClCompile Include="dxgi_wrapped.cpp">
<Filter>Wrapped</Filter>
</ClCompile>
<ClCompile Include="dxgi_common.cpp">
<Filter>Util</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="dxgi_wrapped.h" />
<ClInclude Include="..\dx\official\dxgi.h">
<Filter>official</Filter>
</ClInclude>
@@ -27,10 +33,25 @@
<ClInclude Include="..\dx\official\dxgitype.h">
<Filter>official</Filter>
</ClInclude>
<ClInclude Include="dxgi_wrapped.h">
<Filter>Wrapped</Filter>
</ClInclude>
<ClInclude Include="dxgi_common.h">
<Filter>Util</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<Filter Include="official">
<UniqueIdentifier>{285b6e05-2a6b-4161-9d67-e24933eebb28}</UniqueIdentifier>
</Filter>
<Filter Include="Util">
<UniqueIdentifier>{3f3ebf0f-cc7d-47c0-b114-a519e439e6fb}</UniqueIdentifier>
</Filter>
<Filter Include="Hooks">
<UniqueIdentifier>{d6e37369-52fe-45c1-b4c4-9f97a0886fde}</UniqueIdentifier>
</Filter>
<Filter Include="Wrapped">
<UniqueIdentifier>{846e54d9-08da-4d5a-aac1-250f6be13e33}</UniqueIdentifier>
</Filter>
</ItemGroup>
</Project>