From b738c4220b7f2ea71cf2f1f61521a08606ee7022 Mon Sep 17 00:00:00 2001 From: Joshua Ashton Date: Tue, 7 Jan 2020 23:34:35 +0000 Subject: [PATCH] [d3d9] Scale depth bias value based on current format's `r` value --- src/d3d9/d3d9_device.cpp | 13 +++++++++---- src/d3d9/d3d9_device.h | 2 ++ src/d3d9/d3d9_util.h | 16 ++++++++++++++++ 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/d3d9/d3d9_device.cpp b/src/d3d9/d3d9_device.cpp index 0f0cafbb9..bf6dfab28 100644 --- a/src/d3d9/d3d9_device.cpp +++ b/src/d3d9/d3d9_device.cpp @@ -1231,6 +1231,14 @@ namespace dxvk { FlushImplicit(FALSE); m_flags.set(D3D9DeviceFlag::DirtyFramebuffer); + if (ds != nullptr) { + float rValue = GetDepthBufferRValue(ds->GetCommonTexture()->GetFormatMapping().FormatColor); + if (m_depthBiasScale != rValue) { + m_depthBiasScale = rValue; + m_flags.set(D3D9DeviceFlag::DirtyDepthBias); + } + } + m_state.depthStencil = ds; return D3D_OK; @@ -5096,12 +5104,9 @@ namespace dxvk { void D3D9DeviceEx::BindDepthBias() { m_flags.clr(D3D9DeviceFlag::DirtyDepthBias); - // TODO: Can we get a specific non-magic number in Vulkan for this based on device/adapter? - constexpr float DepthBiasFactor = float(1 << 23); - auto& rs = m_state.renderStates; - float depthBias = bit::cast(rs[D3DRS_DEPTHBIAS]) * DepthBiasFactor; + float depthBias = bit::cast(rs[D3DRS_DEPTHBIAS]) * m_depthBiasScale; float slopeScaledDepthBias = bit::cast(rs[D3DRS_SLOPESCALEDEPTHBIAS]); DxvkDepthBias biases; diff --git a/src/d3d9/d3d9_device.h b/src/d3d9/d3d9_device.h index bf287cc4a..7fffa50b9 100644 --- a/src/d3d9/d3d9_device.h +++ b/src/d3d9/d3d9_device.h @@ -1025,6 +1025,8 @@ namespace dxvk { bool m_nvATOC = false; bool m_ffZTest = false; + float m_depthBiasScale = 0.0f; + D3D9ConstantLayout m_vsLayout; D3D9ConstantLayout m_psLayout; diff --git a/src/d3d9/d3d9_util.h b/src/d3d9/d3d9_util.h index 86585647e..50be2daf0 100644 --- a/src/d3d9/d3d9_util.h +++ b/src/d3d9/d3d9_util.h @@ -176,6 +176,22 @@ namespace dxvk { void ConvertRect(RECT rect, VkOffset2D& offset, VkExtent2D& extent); + inline float GetDepthBufferRValue(VkFormat Format) { + switch (Format) { + case VK_FORMAT_D16_UNORM_S8_UINT: + case VK_FORMAT_D16_UNORM: + return float(1 << 16); + + case VK_FORMAT_D24_UNORM_S8_UINT: + return float(1 << 24); + + default: + case VK_FORMAT_D32_SFLOAT_S8_UINT: + case VK_FORMAT_D32_SFLOAT: + return float(1 << 23); + } + } + template UINT CompactSparseList(T* pData, UINT Mask) { uint32_t count = 0;