diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 26006802ae..e01bf3a11a 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -1075,7 +1075,6 @@ void RasterizerVulkan::UpdateDynamicStates() { UpdateDepthBias(regs); UpdateBlendConstants(regs); UpdateDepthBounds(regs); - UpdateStencilFaces(regs); UpdateLineWidth(regs); UpdateLineStipple(regs); @@ -1094,6 +1093,8 @@ void RasterizerVulkan::UpdateDynamicStates() { } } + UpdateStencilFaces(regs); + // EDS2: PrimitiveRestart, RasterizerDiscard, DepthBias enable/disable if (device.IsExtExtendedDynamicState2Supported() && pipeline && pipeline->UsesExtendedDynamicState2()) { UpdatePrimitiveRestartEnable(regs); @@ -1640,6 +1641,9 @@ void RasterizerVulkan::UpdateStencilTestEnable(Tegra::Engines::Maxwell3D::Regs& if (!state_tracker.TouchStencilTestEnable()) { return; } + if (regs.stencil_enable != 0) { + state_tracker.ResetStencilState(); + } scheduler.Record([enable = regs.stencil_enable](vk::CommandBuffer cmdbuf) { cmdbuf.SetStencilTestEnableEXT(enable); }); diff --git a/src/video_core/renderer_vulkan/vk_state_tracker.h b/src/video_core/renderer_vulkan/vk_state_tracker.h index 7282bc1f44..81cd4d9631 100644 --- a/src/video_core/renderer_vulkan/vk_state_tracker.h +++ b/src/video_core/renderer_vulkan/vk_state_tracker.h @@ -170,6 +170,10 @@ public: return ExchangeCheck(back.compare_mask, new_value) || stencil_reset; } + void ResetStencilState() { + stencil_reset = true; + } + void ClearStencilReset() { stencil_reset = false; }