diff --git a/src/Layers/xrRenderDX10/dx10HW.cpp b/src/Layers/xrRenderDX10/dx10HW.cpp index ff2e308db49..e114cf3fd96 100644 --- a/src/Layers/xrRenderDX10/dx10HW.cpp +++ b/src/Layers/xrRenderDX10/dx10HW.cpp @@ -319,13 +319,12 @@ void CHW::UpdateViews() descDepth.ArraySize = 1; // Select depth-stencil format - // TODO: DX10: test and support other formats constexpr DXGI_FORMAT formats[] = { - //DXGI_FORMAT_D32_FLOAT_S8X24_UINT, + DXGI_FORMAT_D32_FLOAT_S8X24_UINT, DXGI_FORMAT_D24_UNORM_S8_UINT, - //DXGI_FORMAT_D32_FLOAT, - //DXGI_FORMAT_D16_UNORM + DXGI_FORMAT_D32_FLOAT, + DXGI_FORMAT_D16_UNORM }; descDepth.Format = SelectFormat(D3D_FORMAT_SUPPORT_DEPTH_STENCIL, formats, std::size(formats)); Caps.fDepth = dx10TextureUtils::ConvertTextureFormat(descDepth.Format); diff --git a/src/Layers/xrRenderDX10/dx10SH_RT.cpp b/src/Layers/xrRenderDX10/dx10SH_RT.cpp index 1274e10220e..868c3e82509 100644 --- a/src/Layers/xrRenderDX10/dx10SH_RT.cpp +++ b/src/Layers/xrRenderDX10/dx10SH_RT.cpp @@ -61,16 +61,8 @@ void CRT::create(LPCSTR Name, u32 w, u32 h, D3DFORMAT f, u32 SampleCount) u32 usage = 0; if (D3DFMT_D24X8 == fmt) usage = D3DUSAGE_DEPTHSTENCIL; - else if (D3DFMT_D24S8 == fmt) - usage = D3DUSAGE_DEPTHSTENCIL; else if (D3DFMT_D15S1 == fmt) usage = D3DUSAGE_DEPTHSTENCIL; - else if (D3DFMT_D16 == fmt) - usage = D3DUSAGE_DEPTHSTENCIL; - else if (D3DFMT_D16_LOCKABLE == fmt) - usage = D3DUSAGE_DEPTHSTENCIL; - else if (D3DFMT_D32F_LOCKABLE == fmt) - usage = D3DUSAGE_DEPTHSTENCIL; else if ((D3DFORMAT)MAKEFOURCC('D', 'F', '2', '4') == fmt) usage = D3DUSAGE_DEPTHSTENCIL; else @@ -78,12 +70,39 @@ void CRT::create(LPCSTR Name, u32 w, u32 h, D3DFORMAT f, u32 SampleCount) DXGI_FORMAT dx10FMT; - if (fmt != D3DFMT_D24S8) - dx10FMT = dx10TextureUtils::ConvertTextureFormat(fmt); - else + switch (fmt) { + case D3DFMT_D32S8X24: + dx10FMT = DXGI_FORMAT_R32G8X24_TYPELESS; + usage = D3DUSAGE_DEPTHSTENCIL; + break; + + case D3DFMT_D24S8: dx10FMT = DXGI_FORMAT_R24G8_TYPELESS; usage = D3DUSAGE_DEPTHSTENCIL; + break; + + case D3DFMT_D32: + VERIFY(false, "What? How this happen?"); + [[fallthrough]]; + + case D3DFMT_D32F_LOCKABLE: + dx10FMT = DXGI_FORMAT_R32_TYPELESS; + usage = D3DUSAGE_DEPTHSTENCIL; + break; + + case D3DFMT_D16: + VERIFY(false, "What? How this happen?"); + [[fallthrough]]; + + case D3DFMT_D16_LOCKABLE: + dx10FMT = DXGI_FORMAT_R16_TYPELESS; + usage = D3DUSAGE_DEPTHSTENCIL; + break; + + default: + dx10FMT = dx10TextureUtils::ConvertTextureFormat(fmt); + break; } const bool useAsDepth = usage != D3DUSAGE_RENDERTARGET; @@ -154,10 +173,24 @@ void CRT::create(LPCSTR Name, u32 w, u32 h, D3DFORMAT f, u32 SampleCount) } ViewDesc.Texture2D.MipSlice = 0; + switch (desc.Format) { - case DXGI_FORMAT_R24G8_TYPELESS: ViewDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT; break; - case DXGI_FORMAT_R32_TYPELESS: ViewDesc.Format = DXGI_FORMAT_D32_FLOAT; break; + case DXGI_FORMAT_R16_TYPELESS: + ViewDesc.Format = DXGI_FORMAT_D16_UNORM; + break; + + case DXGI_FORMAT_R24G8_TYPELESS: + ViewDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT; + break; + + case DXGI_FORMAT_R32_TYPELESS: + ViewDesc.Format = DXGI_FORMAT_D32_FLOAT; + break; + + case DXGI_FORMAT_R32G8X24_TYPELESS: + ViewDesc.Format = DXGI_FORMAT_D32_FLOAT_S8X24_UINT; + break; } CHK_DX(HW.pDevice->CreateDepthStencilView(pSurface, &ViewDesc, &pZRT)); diff --git a/src/Layers/xrRenderDX10/dx10SH_Texture.cpp b/src/Layers/xrRenderDX10/dx10SH_Texture.cpp index bddb370759d..203b2d4ea7d 100644 --- a/src/Layers/xrRenderDX10/dx10SH_Texture.cpp +++ b/src/Layers/xrRenderDX10/dx10SH_Texture.cpp @@ -89,11 +89,24 @@ void CTexture::surface_set(ID3DBaseTexture* surf) switch (desc.Format) { - case DXGI_FORMAT_R24G8_TYPELESS: ViewDesc.Format = DXGI_FORMAT_R24_UNORM_X8_TYPELESS; break; - case DXGI_FORMAT_R32_TYPELESS: ViewDesc.Format = DXGI_FORMAT_R32_FLOAT; break; + case DXGI_FORMAT_R32G8X24_TYPELESS: + ViewDesc.Format = DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS; + break; + + case DXGI_FORMAT_R24G8_TYPELESS: + ViewDesc.Format = DXGI_FORMAT_R24_UNORM_X8_TYPELESS; + break; + + case DXGI_FORMAT_R32_TYPELESS: + ViewDesc.Format = DXGI_FORMAT_R32_FLOAT; + break; + + case DXGI_FORMAT_R16_TYPELESS: + ViewDesc.Format = DXGI_FORMAT_R16_FLOAT; + break; } - // this would be supported by DX10.1 but is not needed for stalker + // this would be supported by DX10.1 but is not needed for stalker // XXX: why? // if( ViewDesc.Format != DXGI_FORMAT_R24_UNORM_X8_TYPELESS ) if ((desc.SampleDesc.Count <= 1) || (ViewDesc.Format != DXGI_FORMAT_R24_UNORM_X8_TYPELESS)) CHK_DX(HW.pDevice->CreateShaderResourceView(pSurface, &ViewDesc, &m_pSRView)); diff --git a/src/Layers/xrRenderDX10/dx10TextureUtils.cpp b/src/Layers/xrRenderDX10/dx10TextureUtils.cpp index 08ffd47a089..b64a62de501 100644 --- a/src/Layers/xrRenderDX10/dx10TextureUtils.cpp +++ b/src/Layers/xrRenderDX10/dx10TextureUtils.cpp @@ -65,12 +65,13 @@ TextureFormatPairs TextureFormatList[] = { // D3DFMT_D32 Not available // D3DFMT_D15S1 Not available // D3DFMT_D24S8 Not available - {D3DFMT_D24S8, DXGI_FORMAT_D24_UNORM_S8_UINT}, // XXX: documentation says that D3DFMT_D24S8 is unavailable + {D3DFMT_D24S8, DXGI_FORMAT_D24_UNORM_S8_UINT}, {D3DFMT_D24X8, DXGI_FORMAT_R24G8_TYPELESS}, // DXGI_FORMAT_D24_UNORM_S8_UINT}, // Not available // D3DFMT_D24X4S4 Not available - // D3DFMT_D16 DXGI_FORMAT_D16_UNORM - //{ D3DFMT_D32F_LOCKABLE, DXGI_FORMAT_D32_FLOAT}, - {D3DFMT_D32F_LOCKABLE, DXGI_FORMAT_R32_TYPELESS}, + { D3DFMT_D16_LOCKABLE, DXGI_FORMAT_D16_UNORM }, + { D3DFMT_D32F_LOCKABLE, DXGI_FORMAT_R32_TYPELESS }, + { D3DFMT_D32F_LOCKABLE, DXGI_FORMAT_D32_FLOAT }, + { D3DFMT_D32S8X24, DXGI_FORMAT_D32_FLOAT_S8X24_UINT}, // D3DFMT_D24FS8 Not available // D3DFMT_S1D15 Not available // D3DFMT_S8D24 DXGI_FORMAT_D24_UNORM_S8_UINT diff --git a/src/Layers/xrRenderDX10/dx10TextureUtils.h b/src/Layers/xrRenderDX10/dx10TextureUtils.h index 3614193eb1e..68f9054c5be 100644 --- a/src/Layers/xrRenderDX10/dx10TextureUtils.h +++ b/src/Layers/xrRenderDX10/dx10TextureUtils.h @@ -2,6 +2,10 @@ #define dx10TextureUtils_included #pragma once +// hack for dx9... That's it. I don't know if there's already DS64 format. +// If true, then replace with another 4 chars +#define D3DFMT_D32S8X24 (D3DFORMAT)MAKEFOURCC('D', 'S', '6', '4') + namespace dx10TextureUtils { DXGI_FORMAT ConvertTextureFormat(D3DFORMAT dx9FMT);