Skip to content

Commit 15ff1d7

Browse files
committed
xrRenderDX10: select the best available format for depth-stencil buffer
1 parent 0d2c68b commit 15ff1d7

File tree

5 files changed

+74
-24
lines changed

5 files changed

+74
-24
lines changed

src/Layers/xrRenderDX10/dx10HW.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -319,13 +319,12 @@ void CHW::UpdateViews()
319319
descDepth.ArraySize = 1;
320320

321321
// Select depth-stencil format
322-
// TODO: DX10: test and support other formats
323322
constexpr DXGI_FORMAT formats[] =
324323
{
325-
//DXGI_FORMAT_D32_FLOAT_S8X24_UINT,
324+
DXGI_FORMAT_D32_FLOAT_S8X24_UINT,
326325
DXGI_FORMAT_D24_UNORM_S8_UINT,
327-
//DXGI_FORMAT_D32_FLOAT,
328-
//DXGI_FORMAT_D16_UNORM
326+
DXGI_FORMAT_D32_FLOAT,
327+
DXGI_FORMAT_D16_UNORM
329328
};
330329
descDepth.Format = SelectFormat(D3D_FORMAT_SUPPORT_DEPTH_STENCIL, formats, std::size(formats));
331330
Caps.fDepth = dx10TextureUtils::ConvertTextureFormat(descDepth.Format);

src/Layers/xrRenderDX10/dx10SH_RT.cpp

Lines changed: 46 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -61,29 +61,48 @@ void CRT::create(LPCSTR Name, u32 w, u32 h, D3DFORMAT f, u32 SampleCount)
6161
u32 usage = 0;
6262
if (D3DFMT_D24X8 == fmt)
6363
usage = D3DUSAGE_DEPTHSTENCIL;
64-
else if (D3DFMT_D24S8 == fmt)
65-
usage = D3DUSAGE_DEPTHSTENCIL;
6664
else if (D3DFMT_D15S1 == fmt)
6765
usage = D3DUSAGE_DEPTHSTENCIL;
68-
else if (D3DFMT_D16 == fmt)
69-
usage = D3DUSAGE_DEPTHSTENCIL;
70-
else if (D3DFMT_D16_LOCKABLE == fmt)
71-
usage = D3DUSAGE_DEPTHSTENCIL;
72-
else if (D3DFMT_D32F_LOCKABLE == fmt)
73-
usage = D3DUSAGE_DEPTHSTENCIL;
7466
else if ((D3DFORMAT)MAKEFOURCC('D', 'F', '2', '4') == fmt)
7567
usage = D3DUSAGE_DEPTHSTENCIL;
7668
else
7769
usage = D3DUSAGE_RENDERTARGET;
7870

7971
DXGI_FORMAT dx10FMT;
8072

81-
if (fmt != D3DFMT_D24S8)
82-
dx10FMT = dx10TextureUtils::ConvertTextureFormat(fmt);
83-
else
73+
switch (fmt)
8474
{
75+
case D3DFMT_D32S8X24:
76+
dx10FMT = DXGI_FORMAT_R32G8X24_TYPELESS;
77+
usage = D3DUSAGE_DEPTHSTENCIL;
78+
break;
79+
80+
case D3DFMT_D24S8:
8581
dx10FMT = DXGI_FORMAT_R24G8_TYPELESS;
8682
usage = D3DUSAGE_DEPTHSTENCIL;
83+
break;
84+
85+
case D3DFMT_D32:
86+
VERIFY(false, "What? How this happen?");
87+
[[fallthrough]];
88+
89+
case D3DFMT_D32F_LOCKABLE:
90+
dx10FMT = DXGI_FORMAT_R32_TYPELESS;
91+
usage = D3DUSAGE_DEPTHSTENCIL;
92+
break;
93+
94+
case D3DFMT_D16:
95+
VERIFY(false, "What? How this happen?");
96+
[[fallthrough]];
97+
98+
case D3DFMT_D16_LOCKABLE:
99+
dx10FMT = DXGI_FORMAT_R16_TYPELESS;
100+
usage = D3DUSAGE_DEPTHSTENCIL;
101+
break;
102+
103+
default:
104+
dx10FMT = dx10TextureUtils::ConvertTextureFormat(fmt);
105+
break;
87106
}
88107

89108
const bool useAsDepth = usage != D3DUSAGE_RENDERTARGET;
@@ -154,10 +173,24 @@ void CRT::create(LPCSTR Name, u32 w, u32 h, D3DFORMAT f, u32 SampleCount)
154173
}
155174

156175
ViewDesc.Texture2D.MipSlice = 0;
176+
157177
switch (desc.Format)
158178
{
159-
case DXGI_FORMAT_R24G8_TYPELESS: ViewDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT; break;
160-
case DXGI_FORMAT_R32_TYPELESS: ViewDesc.Format = DXGI_FORMAT_D32_FLOAT; break;
179+
case DXGI_FORMAT_R16_TYPELESS:
180+
ViewDesc.Format = DXGI_FORMAT_D16_UNORM;
181+
break;
182+
183+
case DXGI_FORMAT_R24G8_TYPELESS:
184+
ViewDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
185+
break;
186+
187+
case DXGI_FORMAT_R32_TYPELESS:
188+
ViewDesc.Format = DXGI_FORMAT_D32_FLOAT;
189+
break;
190+
191+
case DXGI_FORMAT_R32G8X24_TYPELESS:
192+
ViewDesc.Format = DXGI_FORMAT_D32_FLOAT_S8X24_UINT;
193+
break;
161194
}
162195

163196
CHK_DX(HW.pDevice->CreateDepthStencilView(pSurface, &ViewDesc, &pZRT));

src/Layers/xrRenderDX10/dx10SH_Texture.cpp

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -89,11 +89,24 @@ void CTexture::surface_set(ID3DBaseTexture* surf)
8989

9090
switch (desc.Format)
9191
{
92-
case DXGI_FORMAT_R24G8_TYPELESS: ViewDesc.Format = DXGI_FORMAT_R24_UNORM_X8_TYPELESS; break;
93-
case DXGI_FORMAT_R32_TYPELESS: ViewDesc.Format = DXGI_FORMAT_R32_FLOAT; break;
92+
case DXGI_FORMAT_R32G8X24_TYPELESS:
93+
ViewDesc.Format = DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS;
94+
break;
95+
96+
case DXGI_FORMAT_R24G8_TYPELESS:
97+
ViewDesc.Format = DXGI_FORMAT_R24_UNORM_X8_TYPELESS;
98+
break;
99+
100+
case DXGI_FORMAT_R32_TYPELESS:
101+
ViewDesc.Format = DXGI_FORMAT_R32_FLOAT;
102+
break;
103+
104+
case DXGI_FORMAT_R16_TYPELESS:
105+
ViewDesc.Format = DXGI_FORMAT_R16_FLOAT;
106+
break;
94107
}
95108

96-
// this would be supported by DX10.1 but is not needed for stalker
109+
// this would be supported by DX10.1 but is not needed for stalker // XXX: why?
97110
// if( ViewDesc.Format != DXGI_FORMAT_R24_UNORM_X8_TYPELESS )
98111
if ((desc.SampleDesc.Count <= 1) || (ViewDesc.Format != DXGI_FORMAT_R24_UNORM_X8_TYPELESS))
99112
CHK_DX(HW.pDevice->CreateShaderResourceView(pSurface, &ViewDesc, &m_pSRView));

src/Layers/xrRenderDX10/dx10TextureUtils.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,12 +65,13 @@ TextureFormatPairs TextureFormatList[] = {
6565
// D3DFMT_D32 Not available
6666
// D3DFMT_D15S1 Not available
6767
// D3DFMT_D24S8 Not available
68-
{D3DFMT_D24S8, DXGI_FORMAT_D24_UNORM_S8_UINT}, // XXX: documentation says that D3DFMT_D24S8 is unavailable
68+
{D3DFMT_D24S8, DXGI_FORMAT_D24_UNORM_S8_UINT},
6969
{D3DFMT_D24X8, DXGI_FORMAT_R24G8_TYPELESS}, // DXGI_FORMAT_D24_UNORM_S8_UINT}, // Not available
7070
// D3DFMT_D24X4S4 Not available
71-
// D3DFMT_D16 DXGI_FORMAT_D16_UNORM
72-
//{ D3DFMT_D32F_LOCKABLE, DXGI_FORMAT_D32_FLOAT},
73-
{D3DFMT_D32F_LOCKABLE, DXGI_FORMAT_R32_TYPELESS},
71+
{ D3DFMT_D16_LOCKABLE, DXGI_FORMAT_D16_UNORM },
72+
{ D3DFMT_D32F_LOCKABLE, DXGI_FORMAT_R32_TYPELESS },
73+
{ D3DFMT_D32F_LOCKABLE, DXGI_FORMAT_D32_FLOAT },
74+
{ D3DFMT_D32S8X24, DXGI_FORMAT_D32_FLOAT_S8X24_UINT},
7475
// D3DFMT_D24FS8 Not available
7576
// D3DFMT_S1D15 Not available
7677
// D3DFMT_S8D24 DXGI_FORMAT_D24_UNORM_S8_UINT

src/Layers/xrRenderDX10/dx10TextureUtils.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22
#define dx10TextureUtils_included
33
#pragma once
44

5+
// hack for dx9... That's it. I don't know if there's already DS64 format.
6+
// If true, then replace with another 4 chars
7+
#define D3DFMT_D32S8X24 (D3DFORMAT)MAKEFOURCC('D', 'S', '6', '4')
8+
59
namespace dx10TextureUtils
610
{
711
DXGI_FORMAT ConvertTextureFormat(D3DFORMAT dx9FMT);

0 commit comments

Comments
 (0)