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) {  }  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<decltype(Tegra::Engines::Maxwell3D::dirty.flags)>; | 
