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 | 13 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_state_tracker.h | 5 |
3 files changed, 21 insertions, 0 deletions
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 7029b3d5e..eb9c49d5e 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp | |||
| @@ -1046,6 +1046,9 @@ void RasterizerVulkan::UpdateDepthBounds(Tegra::Engines::Maxwell3D& gpu) { | |||
| 1046 | } | 1046 | } |
| 1047 | 1047 | ||
| 1048 | void RasterizerVulkan::UpdateStencilFaces(Tegra::Engines::Maxwell3D& gpu) { | 1048 | void RasterizerVulkan::UpdateStencilFaces(Tegra::Engines::Maxwell3D& gpu) { |
| 1049 | if (!state_tracker.TouchStencilProperties()) { | ||
| 1050 | return; | ||
| 1051 | } | ||
| 1049 | const auto& regs = gpu.regs; | 1052 | const auto& regs = gpu.regs; |
| 1050 | if (regs.stencil_two_side_enable) { | 1053 | if (regs.stencil_two_side_enable) { |
| 1051 | // Separate values per face | 1054 | // Separate values per face |
diff --git a/src/video_core/renderer_vulkan/vk_state_tracker.cpp b/src/video_core/renderer_vulkan/vk_state_tracker.cpp index b55180dd8..3fd0476b6 100644 --- a/src/video_core/renderer_vulkan/vk_state_tracker.cpp +++ b/src/video_core/renderer_vulkan/vk_state_tracker.cpp | |||
| @@ -33,6 +33,7 @@ Flags MakeInvalidationFlags() { | |||
| 33 | flags[DepthBias] = true; | 33 | flags[DepthBias] = true; |
| 34 | flags[BlendConstants] = true; | 34 | flags[BlendConstants] = true; |
| 35 | flags[DepthBounds] = true; | 35 | flags[DepthBounds] = true; |
| 36 | flags[StencilProperties] = true; | ||
| 36 | return flags; | 37 | return flags; |
| 37 | } | 38 | } |
| 38 | 39 | ||
| @@ -94,6 +95,17 @@ void SetupDirtyDepthBounds(Tables& tables) { | |||
| 94 | FillBlock(tables[0], OFF(depth_bounds), NUM(depth_bounds), DepthBounds); | 95 | FillBlock(tables[0], OFF(depth_bounds), NUM(depth_bounds), DepthBounds); |
| 95 | } | 96 | } |
| 96 | 97 | ||
| 98 | void SetupDirtyStencilProperties(Tables& tables) { | ||
| 99 | auto& table = tables[0]; | ||
| 100 | table[OFF(stencil_two_side_enable)] = StencilProperties; | ||
| 101 | table[OFF(stencil_front_func_ref)] = StencilProperties; | ||
| 102 | table[OFF(stencil_front_mask)] = StencilProperties; | ||
| 103 | table[OFF(stencil_front_func_mask)] = StencilProperties; | ||
| 104 | table[OFF(stencil_back_func_ref)] = StencilProperties; | ||
| 105 | table[OFF(stencil_back_mask)] = StencilProperties; | ||
| 106 | table[OFF(stencil_back_func_mask)] = StencilProperties; | ||
| 107 | } | ||
| 108 | |||
| 97 | } // Anonymous namespace | 109 | } // Anonymous namespace |
| 98 | 110 | ||
| 99 | StateTracker::StateTracker(Core::System& system) | 111 | StateTracker::StateTracker(Core::System& system) |
| @@ -108,6 +120,7 @@ void StateTracker::Initialize() { | |||
| 108 | SetupDirtyDepthBias(tables); | 120 | SetupDirtyDepthBias(tables); |
| 109 | SetupDirtyBlendConstants(tables); | 121 | SetupDirtyBlendConstants(tables); |
| 110 | SetupDirtyDepthBounds(tables); | 122 | SetupDirtyDepthBounds(tables); |
| 123 | SetupDirtyStencilProperties(tables); | ||
| 111 | 124 | ||
| 112 | auto& store = dirty.on_write_stores; | 125 | auto& store = dirty.on_write_stores; |
| 113 | store[RenderTargets] = true; | 126 | 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 25b5c647b..1d8434dd0 100644 --- a/src/video_core/renderer_vulkan/vk_state_tracker.h +++ b/src/video_core/renderer_vulkan/vk_state_tracker.h | |||
| @@ -24,6 +24,7 @@ enum : u8 { | |||
| 24 | DepthBias, | 24 | DepthBias, |
| 25 | BlendConstants, | 25 | BlendConstants, |
| 26 | DepthBounds, | 26 | DepthBounds, |
| 27 | StencilProperties, | ||
| 27 | }; | 28 | }; |
| 28 | 29 | ||
| 29 | } // namespace Dirty | 30 | } // namespace Dirty |
| @@ -56,6 +57,10 @@ public: | |||
| 56 | return Exchange(Dirty::DepthBounds, false); | 57 | return Exchange(Dirty::DepthBounds, false); |
| 57 | } | 58 | } |
| 58 | 59 | ||
| 60 | bool TouchStencilProperties() { | ||
| 61 | return Exchange(Dirty::StencilProperties, false); | ||
| 62 | } | ||
| 63 | |||
| 59 | private: | 64 | private: |
| 60 | using Flags = std::remove_reference_t<decltype(Tegra::Engines::Maxwell3D::dirty.flags)>; | 65 | using Flags = std::remove_reference_t<decltype(Tegra::Engines::Maxwell3D::dirty.flags)>; |
| 61 | 66 | ||