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);