From ff12dcaf0b08d126f7ea935fd5871f57c7880c99 Mon Sep 17 00:00:00 2001 From: CamilleLaVey Date: Mon, 16 Feb 2026 03:36:09 -0400 Subject: [PATCH] [vulkan] Fixing some incongruences with pipeline keys and dynamic state flags --- .../renderer_vulkan/vk_graphics_pipeline.cpp | 4 ++-- src/video_core/renderer_vulkan/vk_graphics_pipeline.h | 6 ++++++ src/video_core/renderer_vulkan/vk_rasterizer.cpp | 11 ++++++++--- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp index d1e4c0b31a..f6a51ec822 100644 --- a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp +++ b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp @@ -686,9 +686,9 @@ void GraphicsPipeline::MakePipeline(VkRenderPass render_pass) { .sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO, .pNext = nullptr, .flags = 0, - .viewportCount = num_viewports, + .viewportCount = key.state.extended_dynamic_state ? 0u : num_viewports, .pViewports = nullptr, - .scissorCount = num_viewports, + .scissorCount = key.state.extended_dynamic_state ? 0u : num_viewports, .pScissors = nullptr, }; if (device.IsNvViewportSwizzleSupported()) { diff --git a/src/video_core/renderer_vulkan/vk_graphics_pipeline.h b/src/video_core/renderer_vulkan/vk_graphics_pipeline.h index 29f5eba8dc..418a4cfd26 100644 --- a/src/video_core/renderer_vulkan/vk_graphics_pipeline.h +++ b/src/video_core/renderer_vulkan/vk_graphics_pipeline.h @@ -92,6 +92,12 @@ public: bool UsesExtendedDynamicState() const noexcept { return key.state.extended_dynamic_state != 0; } + bool UsesExtendedDynamicState2() const noexcept { + return key.state.extended_dynamic_state_2 != 0; + } + bool UsesExtendedDynamicState2LogicOp() const noexcept { + return key.state.extended_dynamic_state_2_logic_op != 0; + } GraphicsPipeline& operator=(GraphicsPipeline&&) noexcept = delete; GraphicsPipeline(GraphicsPipeline&&) noexcept = delete; diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 3eb05f3286..c18027b5cf 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -277,6 +277,10 @@ void RasterizerVulkan::PrepareDraw(bool is_indexed, Func&& draw_func) { if (!pipeline->Configure(is_indexed)) return; + if (pipeline->UsesExtendedDynamicState()) { + state_tracker.InvalidateStateEnableFlag(); + } + UpdateDynamicStates(); HandleTransformFeedback(); @@ -1064,6 +1068,7 @@ bool AccelerateDMA::BufferToImage(const Tegra::DMA::ImageCopy& copy_info, void RasterizerVulkan::UpdateDynamicStates() { auto& regs = maxwell3d->regs; + GraphicsPipeline* pipeline = pipeline_cache.CurrentGraphicsPipeline(); // Core Dynamic States (Vulkan 1.0) - Always active regardless of dyna_state setting UpdateViewportsState(regs); @@ -1076,7 +1081,7 @@ void RasterizerVulkan::UpdateDynamicStates() { UpdateLineStipple(regs); // EDS1: CullMode, DepthCompare, FrontFace, StencilOp, DepthBoundsTest, DepthTest, DepthWrite, StencilTest - if (device.IsExtExtendedDynamicStateSupported()) { + if (device.IsExtExtendedDynamicStateSupported() && pipeline && pipeline->UsesExtendedDynamicState()) { UpdateCullMode(regs); UpdateDepthCompareOp(regs); UpdateFrontFace(regs); @@ -1091,14 +1096,14 @@ void RasterizerVulkan::UpdateDynamicStates() { } // EDS2: PrimitiveRestart, RasterizerDiscard, DepthBias enable/disable - if (device.IsExtExtendedDynamicState2Supported()) { + if (device.IsExtExtendedDynamicState2Supported() && pipeline && pipeline->UsesExtendedDynamicState2()) { UpdatePrimitiveRestartEnable(regs); UpdateRasterizerDiscardEnable(regs); UpdateDepthBiasEnable(regs); } // EDS2 Extras: LogicOp operation selection - if (device.IsExtExtendedDynamicState2ExtrasSupported()) { + if (device.IsExtExtendedDynamicState2ExtrasSupported() && pipeline && pipeline->UsesExtendedDynamicState2LogicOp()) { UpdateLogicOp(regs); }