From 60a39805615fb0480eb57416f5e9ec17e7c91ce4 Mon Sep 17 00:00:00 2001 From: Fernando Sahmkow Date: Thu, 23 Sep 2021 03:14:10 +0200 Subject: Vulkan Rasterizer: Correct DepthBias/PolygonOffset on Vulkan. --- src/video_core/renderer_vulkan/vk_rasterizer.cpp | 14 ++++++++++++-- src/video_core/renderer_vulkan/vk_state_tracker.h | 3 ++- 2 files changed, 14 insertions(+), 3 deletions(-) (limited to 'src/video_core/renderer_vulkan') diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 3bcd6d6cc..04ecc034d 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -627,9 +627,19 @@ void RasterizerVulkan::UpdateDepthBias(Tegra::Engines::Maxwell3D::Regs& regs) { if (!state_tracker.TouchDepthBias()) { return; } - scheduler.Record([constant = regs.polygon_offset_units, clamp = regs.polygon_offset_clamp, + float units = regs.polygon_offset_units / 2.0f; + const bool is_d24 = regs.zeta.format == Tegra::DepthFormat::S8_UINT_Z24_UNORM || + regs.zeta.format == Tegra::DepthFormat::D24X8_UNORM || + regs.zeta.format == Tegra::DepthFormat::D24S8_UNORM || + regs.zeta.format == Tegra::DepthFormat::D24C8_UNORM; + if (is_d24 && !device.SupportsD24DepthBuffer()) { + const double f = static_cast(1ULL << (32 - 24)) / (static_cast(0x1.ep+127)); + units = static_cast(static_cast(units) * f); + } + + scheduler.Record([constant = units, clamp = regs.polygon_offset_clamp, factor = regs.polygon_offset_factor](vk::CommandBuffer cmdbuf) { - cmdbuf.SetDepthBias(constant, clamp, factor / 2.0f); + cmdbuf.SetDepthBias(constant, clamp, factor); }); } diff --git a/src/video_core/renderer_vulkan/vk_state_tracker.h b/src/video_core/renderer_vulkan/vk_state_tracker.h index d90935f52..2f2d6b31f 100644 --- a/src/video_core/renderer_vulkan/vk_state_tracker.h +++ b/src/video_core/renderer_vulkan/vk_state_tracker.h @@ -79,7 +79,8 @@ public: } bool TouchDepthBias() { - return Exchange(Dirty::DepthBias, false); + return Exchange(Dirty::DepthBias, false) || + Exchange(VideoCommon::Dirty::DepthBiasGlobal, false); } bool TouchBlendConstants() { -- cgit v1.2.3 From ad8afaf1ef0c2f6c9ecb4e3670d4a3e4192ab0a9 Mon Sep 17 00:00:00 2001 From: Fernando Sahmkow Date: Sun, 17 Oct 2021 03:49:18 +0200 Subject: Vulran Rasterizer: address feedback. --- src/video_core/renderer_vulkan/vk_rasterizer.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'src/video_core/renderer_vulkan') diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 04ecc034d..30b47a7a0 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -633,10 +633,12 @@ void RasterizerVulkan::UpdateDepthBias(Tegra::Engines::Maxwell3D::Regs& regs) { regs.zeta.format == Tegra::DepthFormat::D24S8_UNORM || regs.zeta.format == Tegra::DepthFormat::D24C8_UNORM; if (is_d24 && !device.SupportsD24DepthBuffer()) { - const double f = static_cast(1ULL << (32 - 24)) / (static_cast(0x1.ep+127)); - units = static_cast(static_cast(units) * f); + // the base formulas can be obtained from here: + // https://docs.microsoft.com/en-us/windows/win32/direct3d11/d3d10-graphics-programming-guide-output-merger-stage-depth-bias + const double rescale_factor = + static_cast(1ULL << (32 - 24)) / (static_cast(0x1.ep+127)); + units = static_cast(static_cast(units) * rescale_factor); } - scheduler.Record([constant = units, clamp = regs.polygon_offset_clamp, factor = regs.polygon_offset_factor](vk::CommandBuffer cmdbuf) { cmdbuf.SetDepthBias(constant, clamp, factor); -- cgit v1.2.3