Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/doitsujin/dxvk.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoshua Ashton <joshua@froggi.es>2020-01-08 02:34:35 +0300
committerJoshua Ashton <joshua@froggi.es>2020-01-08 22:38:18 +0300
commitb738c4220b7f2ea71cf2f1f61521a08606ee7022 (patch)
tree606e6e8b3a274223f899566334d82606f91a0b6e
parent2d7f4b1a2cb49b5b02905e10b06a232f2b317f60 (diff)
[d3d9] Scale depth bias value based on current format's `r` valued3d9-depth-bias-scale
-rw-r--r--src/d3d9/d3d9_device.cpp13
-rw-r--r--src/d3d9/d3d9_device.h2
-rw-r--r--src/d3d9/d3d9_util.h16
3 files changed, 27 insertions, 4 deletions
diff --git a/src/d3d9/d3d9_device.cpp b/src/d3d9/d3d9_device.cpp
index 0f0cafbb..bf6dfab2 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<float>(rs[D3DRS_DEPTHBIAS]) * DepthBiasFactor;
+ float depthBias = bit::cast<float>(rs[D3DRS_DEPTHBIAS]) * m_depthBiasScale;
float slopeScaledDepthBias = bit::cast<float>(rs[D3DRS_SLOPESCALEDEPTHBIAS]);
DxvkDepthBias biases;
diff --git a/src/d3d9/d3d9_device.h b/src/d3d9/d3d9_device.h
index bf287cc4..7fffa50b 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 86585647..50be2daf 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<typename T>
UINT CompactSparseList(T* pData, UINT Mask) {
uint32_t count = 0;