Skip to content

Commit

Permalink
xrRenderDX10: select the best available format for depth-stencil buffer
Browse files Browse the repository at this point in the history
  • Loading branch information
Xottab-DUTY committed Oct 2, 2018
1 parent 0d2c68b commit 15ff1d7
Show file tree
Hide file tree
Showing 5 changed files with 74 additions and 24 deletions.
7 changes: 3 additions & 4 deletions src/Layers/xrRenderDX10/dx10HW.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
59 changes: 46 additions & 13 deletions src/Layers/xrRenderDX10/dx10SH_RT.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -61,29 +61,48 @@ 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
usage = D3DUSAGE_RENDERTARGET;

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;
Expand Down Expand Up @@ -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));
Expand Down
19 changes: 16 additions & 3 deletions src/Layers/xrRenderDX10/dx10SH_Texture.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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));
Expand Down
9 changes: 5 additions & 4 deletions src/Layers/xrRenderDX10/dx10TextureUtils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 4 additions & 0 deletions src/Layers/xrRenderDX10/dx10TextureUtils.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit 15ff1d7

Please sign in to comment.