From 4a7aa1618a87bf2b388b8bbb65b9de3a889feb16 Mon Sep 17 00:00:00 2001 From: CamilleLaVey Date: Sun, 8 Mar 2026 01:48:23 -0400 Subject: [PATCH] [vulkan] Add InvalidateState for old topology draw --- src/video_core/renderer_vulkan/vk_scheduler.cpp | 5 +++++ src/video_core/renderer_vulkan/vk_state_tracker.h | 15 +++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/video_core/renderer_vulkan/vk_scheduler.cpp b/src/video_core/renderer_vulkan/vk_scheduler.cpp index 710bfddc74..dba18a91cb 100644 --- a/src/video_core/renderer_vulkan/vk_scheduler.cpp +++ b/src/video_core/renderer_vulkan/vk_scheduler.cpp @@ -168,6 +168,11 @@ bool Scheduler::UpdateGraphicsPipeline(GraphicsPipeline* pipeline) { return true; } + if (pipeline->UsesExtendedDynamicState() || pipeline->UsesExtendedDynamicState2() || + pipeline->UsesExtendedDynamicState2LogicOp()) { + state_tracker.InvalidateExtendedDynamicStates(); + } + if (!pipeline->UsesExtendedDynamicState()) { state.needs_state_enable_refresh = true; } else if (state.needs_state_enable_refresh) { diff --git a/src/video_core/renderer_vulkan/vk_state_tracker.h b/src/video_core/renderer_vulkan/vk_state_tracker.h index 81cd4d9631..47948ddc64 100644 --- a/src/video_core/renderer_vulkan/vk_state_tracker.h +++ b/src/video_core/renderer_vulkan/vk_state_tracker.h @@ -94,6 +94,21 @@ public: (*flags)[Dirty::StateEnable] = true; } + void InvalidateExtendedDynamicStates() { + (*flags)[Dirty::Viewports] = true; + (*flags)[Dirty::Scissors] = true; + (*flags)[Dirty::CullMode] = true; + (*flags)[Dirty::DepthCompareOp] = true; + (*flags)[Dirty::FrontFace] = true; + (*flags)[Dirty::StencilOp] = true; + (*flags)[Dirty::StateEnable] = true; + (*flags)[Dirty::PrimitiveRestartEnable] = true; + (*flags)[Dirty::RasterizerDiscardEnable] = true; + (*flags)[Dirty::DepthBiasEnable] = true; + (*flags)[Dirty::LogicOp] = true; + current_topology = INVALID_TOPOLOGY; + } + bool TouchViewports() { const bool dirty_viewports = Exchange(Dirty::Viewports, false); const bool rescale_viewports = Exchange(VideoCommon::Dirty::RescaleViewports, false);