diff options
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_rasterizer.cpp | 3 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_state_tracker.cpp | 9 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_state_tracker.h | 5 |
3 files changed, 17 insertions, 0 deletions
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 207ef0f0d..be2c4d149 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp | |||
| @@ -1015,6 +1015,9 @@ void RasterizerVulkan::UpdateScissorsState(Tegra::Engines::Maxwell3D& gpu) { | |||
| 1015 | } | 1015 | } |
| 1016 | 1016 | ||
| 1017 | void RasterizerVulkan::UpdateDepthBias(Tegra::Engines::Maxwell3D& gpu) { | 1017 | void RasterizerVulkan::UpdateDepthBias(Tegra::Engines::Maxwell3D& gpu) { |
| 1018 | if (!state_tracker.TouchDepthBias()) { | ||
| 1019 | return; | ||
| 1020 | } | ||
| 1018 | const auto& regs = gpu.regs; | 1021 | const auto& regs = gpu.regs; |
| 1019 | scheduler.Record([constant = regs.polygon_offset_units, clamp = regs.polygon_offset_clamp, | 1022 | scheduler.Record([constant = regs.polygon_offset_units, clamp = regs.polygon_offset_clamp, |
| 1020 | factor = regs.polygon_offset_factor](auto cmdbuf, auto& dld) { | 1023 | factor = regs.polygon_offset_factor](auto cmdbuf, auto& dld) { |
diff --git a/src/video_core/renderer_vulkan/vk_state_tracker.cpp b/src/video_core/renderer_vulkan/vk_state_tracker.cpp index 0e00a9079..c75caaa56 100644 --- a/src/video_core/renderer_vulkan/vk_state_tracker.cpp +++ b/src/video_core/renderer_vulkan/vk_state_tracker.cpp | |||
| @@ -30,6 +30,7 @@ Flags MakeInvalidationFlags() { | |||
| 30 | Flags flags{}; | 30 | Flags flags{}; |
| 31 | flags[Viewports] = true; | 31 | flags[Viewports] = true; |
| 32 | flags[Scissors] = true; | 32 | flags[Scissors] = true; |
| 33 | flags[DepthBias] = true; | ||
| 33 | return flags; | 34 | return flags; |
| 34 | } | 35 | } |
| 35 | 36 | ||
| @@ -76,6 +77,13 @@ void SetupDirtyScissors(Tables& tables) { | |||
| 76 | FillBlock(tables[0], OFF(scissor_test), NUM(scissor_test), Scissors); | 77 | FillBlock(tables[0], OFF(scissor_test), NUM(scissor_test), Scissors); |
| 77 | } | 78 | } |
| 78 | 79 | ||
| 80 | void SetupDirtyDepthBias(Tables& tables) { | ||
| 81 | auto& table = tables[0]; | ||
| 82 | table[OFF(polygon_offset_units)] = DepthBias; | ||
| 83 | table[OFF(polygon_offset_clamp)] = DepthBias; | ||
| 84 | table[OFF(polygon_offset_factor)] = DepthBias; | ||
| 85 | } | ||
| 86 | |||
| 79 | } // Anonymous namespace | 87 | } // Anonymous namespace |
| 80 | 88 | ||
| 81 | StateTracker::StateTracker(Core::System& system) | 89 | StateTracker::StateTracker(Core::System& system) |
| @@ -87,6 +95,7 @@ void StateTracker::Initialize() { | |||
| 87 | SetupDirtyRenderTargets(tables); | 95 | SetupDirtyRenderTargets(tables); |
| 88 | SetupDirtyViewports(tables); | 96 | SetupDirtyViewports(tables); |
| 89 | SetupDirtyScissors(tables); | 97 | SetupDirtyScissors(tables); |
| 98 | SetupDirtyDepthBias(tables); | ||
| 90 | 99 | ||
| 91 | auto& store = dirty.on_write_stores; | 100 | auto& store = dirty.on_write_stores; |
| 92 | store[RenderTargets] = true; | 101 | store[RenderTargets] = true; |
diff --git a/src/video_core/renderer_vulkan/vk_state_tracker.h b/src/video_core/renderer_vulkan/vk_state_tracker.h index ba8f3a854..088b47145 100644 --- a/src/video_core/renderer_vulkan/vk_state_tracker.h +++ b/src/video_core/renderer_vulkan/vk_state_tracker.h | |||
| @@ -21,6 +21,7 @@ enum : u8 { | |||
| 21 | 21 | ||
| 22 | Viewports, | 22 | Viewports, |
| 23 | Scissors, | 23 | Scissors, |
| 24 | DepthBias, | ||
| 24 | }; | 25 | }; |
| 25 | 26 | ||
| 26 | } // namespace Dirty | 27 | } // namespace Dirty |
| @@ -41,6 +42,10 @@ public: | |||
| 41 | return Exchange(Dirty::Scissors, false); | 42 | return Exchange(Dirty::Scissors, false); |
| 42 | } | 43 | } |
| 43 | 44 | ||
| 45 | bool TouchDepthBias() { | ||
| 46 | return Exchange(Dirty::DepthBias, false); | ||
| 47 | } | ||
| 48 | |||
| 44 | private: | 49 | private: |
| 45 | using Flags = std::remove_reference_t<decltype(Tegra::Engines::Maxwell3D::dirty.flags)>; | 50 | using Flags = std::remove_reference_t<decltype(Tegra::Engines::Maxwell3D::dirty.flags)>; |
| 46 | 51 | ||