From 6ac3eb4d87af7793d805dc9f7fc43f45e59e212e Mon Sep 17 00:00:00 2001 From: ReinUsesLisp Date: Fri, 21 Feb 2020 01:09:02 -0300 Subject: [PATCH] vk_state_tracker: Implement dirty flags for stencil properties --- src/video_core/renderer_vulkan/vk_rasterizer.cpp | 3 +++ src/video_core/renderer_vulkan/vk_state_tracker.cpp | 13 +++++++++++++ src/video_core/renderer_vulkan/vk_state_tracker.h | 5 +++++ 3 files changed, 21 insertions(+) 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) { } void RasterizerVulkan::UpdateStencilFaces(Tegra::Engines::Maxwell3D& gpu) { + if (!state_tracker.TouchStencilProperties()) { + return; + } const auto& regs = gpu.regs; if (regs.stencil_two_side_enable) { // 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() { flags[DepthBias] = true; flags[BlendConstants] = true; flags[DepthBounds] = true; + flags[StencilProperties] = true; return flags; } @@ -94,6 +95,17 @@ void SetupDirtyDepthBounds(Tables& tables) { FillBlock(tables[0], OFF(depth_bounds), NUM(depth_bounds), DepthBounds); } +void SetupDirtyStencilProperties(Tables& tables) { + auto& table = tables[0]; + table[OFF(stencil_two_side_enable)] = StencilProperties; + table[OFF(stencil_front_func_ref)] = StencilProperties; + table[OFF(stencil_front_mask)] = StencilProperties; + table[OFF(stencil_front_func_mask)] = StencilProperties; + table[OFF(stencil_back_func_ref)] = StencilProperties; + table[OFF(stencil_back_mask)] = StencilProperties; + table[OFF(stencil_back_func_mask)] = StencilProperties; +} + } // Anonymous namespace StateTracker::StateTracker(Core::System& system) @@ -108,6 +120,7 @@ void StateTracker::Initialize() { SetupDirtyDepthBias(tables); SetupDirtyBlendConstants(tables); SetupDirtyDepthBounds(tables); + SetupDirtyStencilProperties(tables); auto& store = dirty.on_write_stores; 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 { DepthBias, BlendConstants, DepthBounds, + StencilProperties, }; } // namespace Dirty @@ -56,6 +57,10 @@ public: return Exchange(Dirty::DepthBounds, false); } + bool TouchStencilProperties() { + return Exchange(Dirty::StencilProperties, false); + } + private: using Flags = std::remove_reference_t;