Direct3D 9 versions of texture loaders (#176)

This commit is contained in:
Chuck Walbourn
2020-05-09 17:22:35 -07:00
committed by GitHub
parent fdd7a70c44
commit 45fb8623d2
18 changed files with 3307 additions and 114 deletions

View File

@@ -27,6 +27,8 @@
#pragma clang diagnostic ignored "-Wswitch-enum"
#endif
#pragma warning(disable : 4062)
#define D3DX12_NO_STATE_OBJECT_HELPERS
#include "d3dx12.h"
@@ -654,12 +656,12 @@ namespace
return DXGI_FORMAT_B8G8R8A8_UNORM;
}
if (ISBITMASK(0x00ff0000,0x0000ff00,0x000000ff,0x00000000))
if (ISBITMASK(0x00ff0000,0x0000ff00,0x000000ff,0))
{
return DXGI_FORMAT_B8G8R8X8_UNORM;
}
// No DXGI format maps to ISBITMASK(0x000000ff,0x0000ff00,0x00ff0000,0x00000000) aka D3DFMT_X8B8G8R8
// No DXGI format maps to ISBITMASK(0x000000ff,0x0000ff00,0x00ff0000,0) aka D3DFMT_X8B8G8R8
// Note that many common DDS reader/writers (including D3DX) swap the
// the RED/BLUE masks for 10:10:10:2 formats. We assume
@@ -675,12 +677,12 @@ namespace
// No DXGI format maps to ISBITMASK(0x000003ff,0x000ffc00,0x3ff00000,0xc0000000) aka D3DFMT_A2R10G10B10
if (ISBITMASK(0x0000ffff,0xffff0000,0x00000000,0x00000000))
if (ISBITMASK(0x0000ffff,0xffff0000,0,0))
{
return DXGI_FORMAT_R16G16_UNORM;
}
if (ISBITMASK(0xffffffff,0x00000000,0x00000000,0x00000000))
if (ISBITMASK(0xffffffff,0,0,0))
{
// Only 32-bit color channel format in D3D9 was R32F
return DXGI_FORMAT_R32_FLOAT; // D3DX writes this out as a FourCC of 114
@@ -696,19 +698,19 @@ namespace
{
return DXGI_FORMAT_B5G5R5A1_UNORM;
}
if (ISBITMASK(0xf800,0x07e0,0x001f,0x0000))
if (ISBITMASK(0xf800,0x07e0,0x001f,0))
{
return DXGI_FORMAT_B5G6R5_UNORM;
}
// No DXGI format maps to ISBITMASK(0x7c00,0x03e0,0x001f,0x0000) aka D3DFMT_X1R5G5B5
// No DXGI format maps to ISBITMASK(0x7c00,0x03e0,0x001f,0) aka D3DFMT_X1R5G5B5
if (ISBITMASK(0x0f00,0x00f0,0x000f,0xf000))
{
return DXGI_FORMAT_B4G4R4A4_UNORM;
}
// No DXGI format maps to ISBITMASK(0x0f00,0x00f0,0x000f,0x0000) aka D3DFMT_X4R4G4B4
// No DXGI format maps to ISBITMASK(0x0f00,0x00f0,0x000f,0) aka D3DFMT_X4R4G4B4
// No 3:3:2, 3:3:2:8, or paletted DXGI formats aka D3DFMT_A8R3G3B2, D3DFMT_R3G3B2, D3DFMT_P8, D3DFMT_A8P8, etc.
break;
@@ -718,14 +720,14 @@ namespace
{
if (8 == ddpf.RGBBitCount)
{
if (ISBITMASK(0x000000ff,0x00000000,0x00000000,0x00000000))
if (ISBITMASK(0xff,0,0,0))
{
return DXGI_FORMAT_R8_UNORM; // D3DX10/11 writes this out as DX10 extension
}
// No DXGI format maps to ISBITMASK(0x0f,0x00,0x00,0xf0) aka D3DFMT_A4L4
// No DXGI format maps to ISBITMASK(0x0f,0,0,0xf0) aka D3DFMT_A4L4
if (ISBITMASK(0x000000ff, 0x00000000, 0x00000000, 0x0000ff00))
if (ISBITMASK(0x00ff, 0, 0, 0xff00))
{
return DXGI_FORMAT_R8G8_UNORM; // Some DDS writers assume the bitcount should be 8 instead of 16
}
@@ -733,11 +735,11 @@ namespace
if (16 == ddpf.RGBBitCount)
{
if (ISBITMASK(0x0000ffff,0x00000000,0x00000000,0x00000000))
if (ISBITMASK(0xffff,0,0,0))
{
return DXGI_FORMAT_R16_UNORM; // D3DX10/11 writes this out as DX10 extension
}
if (ISBITMASK(0x000000ff,0x00000000,0x00000000,0x0000ff00))
if (ISBITMASK(0x00ff,0,0,0xff00))
{
return DXGI_FORMAT_R8G8_UNORM; // D3DX10/11 writes this out as DX10 extension
}
@@ -754,7 +756,7 @@ namespace
{
if (16 == ddpf.RGBBitCount)
{
if (ISBITMASK(0x00ff, 0xff00, 0x0000, 0x0000))
if (ISBITMASK(0x00ff, 0xff00, 0, 0))
{
return DXGI_FORMAT_R8G8_SNORM; // D3DX10/11 writes this out as DX10 extension
}
@@ -766,13 +768,15 @@ namespace
{
return DXGI_FORMAT_R8G8B8A8_SNORM; // D3DX10/11 writes this out as DX10 extension
}
if (ISBITMASK(0x0000ffff, 0xffff0000, 0x00000000, 0x00000000))
if (ISBITMASK(0x0000ffff, 0xffff0000, 0, 0))
{
return DXGI_FORMAT_R16G16_SNORM; // D3DX10/11 writes this out as DX10 extension
}
// No DXGI format maps to ISBITMASK(0x3ff00000, 0x000ffc00, 0x000003ff, 0xc0000000) aka D3DFMT_A2W10V10U10
}
// No DXGI format maps to DDPF_BUMPLUMINANCE aka D3DFMT_L6V5U5, D3DFMT_X8L8V8U8
}
else if (ddpf.flags & DDS_FOURCC)
{
@@ -868,6 +872,8 @@ namespace
case 116: // D3DFMT_A32B32G32R32F
return DXGI_FORMAT_R32G32B32A32_FLOAT;
// No DXGI format maps to D3DFMT_CxV8U8
}
}
@@ -1355,7 +1361,8 @@ namespace
size_t reservedMips = mipCount;
if (loadFlags & DDS_LOADER_MIP_RESERVE)
{
reservedMips = std::min<size_t>(D3D12_REQ_MIP_LEVELS, CountMips(width, height));
reservedMips = std::min<size_t>(D3D12_REQ_MIP_LEVELS,
CountMips(width, height));
}
hr = CreateTextureResource(d3dDevice, resDim, twidth, theight, tdepth, reservedMips - skipMip, arraySize,