From 72d61c38bec118e67fce004b5c52cb7ba1554702 Mon Sep 17 00:00:00 2001 From: CamilleLaVey Date: Mon, 24 Nov 2025 13:34:39 -0400 Subject: [PATCH] [vk] ExtendedDynamicState repair #1 --- .../renderer_vulkan/vk_rasterizer.cpp | 22 +++++++++++++++++++ .../renderer_vulkan/vk_rasterizer.h | 2 ++ .../renderer_vulkan/vk_state_tracker.cpp | 5 +++++ .../renderer_vulkan/vk_state_tracker.h | 10 +++++++++ .../vulkan_common/vulkan_wrapper.cpp | 2 ++ src/video_core/vulkan_common/vulkan_wrapper.h | 10 +++++++++ 6 files changed, 51 insertions(+) diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index a697b8dfae..a7479e2af1 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -1034,6 +1034,8 @@ void RasterizerVulkan::UpdateDynamicStates() { UpdateDepthClampEnable(regs); UpdateLineStippleEnable(regs); UpdateConservativeRasterizationMode(regs); + UpdateAlphaToCoverageEnable(regs); + UpdateAlphaToOneEnable(regs); } // EDS3 Blending: ColorBlendEnable, ColorBlendEquation, ColorWriteMask @@ -1483,6 +1485,26 @@ void RasterizerVulkan::UpdateDepthClampEnable(Tegra::Engines::Maxwell3D::Regs& r [is_enabled](vk::CommandBuffer cmdbuf) { cmdbuf.SetDepthClampEnableEXT(is_enabled); }); } +void RasterizerVulkan::UpdateAlphaToCoverageEnable(Tegra::Engines::Maxwell3D::Regs& regs) { + if (!state_tracker.TouchAlphaToCoverageEnable()) { + return; + } + scheduler.Record([enable = regs.anti_alias_alpha_control.alpha_to_coverage]( + vk::CommandBuffer cmdbuf) { + cmdbuf.SetAlphaToCoverageEnableEXT(enable != 0); + }); +} + +void RasterizerVulkan::UpdateAlphaToOneEnable(Tegra::Engines::Maxwell3D::Regs& regs) { + if (!state_tracker.TouchAlphaToOneEnable()) { + return; + } + scheduler.Record([enable = regs.anti_alias_alpha_control.alpha_to_one]( + vk::CommandBuffer cmdbuf) { + cmdbuf.SetAlphaToOneEnableEXT(enable != 0); + }); +} + void RasterizerVulkan::UpdateDepthCompareOp(Tegra::Engines::Maxwell3D::Regs& regs) { if (!state_tracker.TouchDepthCompareOp()) { return; diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.h b/src/video_core/renderer_vulkan/vk_rasterizer.h index 30780b9cbd..b689c6b660 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.h +++ b/src/video_core/renderer_vulkan/vk_rasterizer.h @@ -183,6 +183,8 @@ private: void UpdateDepthBiasEnable(Tegra::Engines::Maxwell3D::Regs& regs); void UpdateLogicOpEnable(Tegra::Engines::Maxwell3D::Regs& regs); void UpdateDepthClampEnable(Tegra::Engines::Maxwell3D::Regs& regs); + void UpdateAlphaToCoverageEnable(Tegra::Engines::Maxwell3D::Regs& regs); + void UpdateAlphaToOneEnable(Tegra::Engines::Maxwell3D::Regs& regs); void UpdateFrontFace(Tegra::Engines::Maxwell3D::Regs& regs); void UpdateStencilOp(Tegra::Engines::Maxwell3D::Regs& regs); void UpdateStencilTestEnable(Tegra::Engines::Maxwell3D::Regs& regs); diff --git a/src/video_core/renderer_vulkan/vk_state_tracker.cpp b/src/video_core/renderer_vulkan/vk_state_tracker.cpp index 242d03cf24..6af74cf0fc 100644 --- a/src/video_core/renderer_vulkan/vk_state_tracker.cpp +++ b/src/video_core/renderer_vulkan/vk_state_tracker.cpp @@ -48,6 +48,7 @@ Flags MakeInvalidationFlags() { FrontFace, StencilOp, StencilTestEnable, + RasterizerDiscardEnable, VertexBuffers, VertexInput, StateEnable, @@ -55,6 +56,8 @@ Flags MakeInvalidationFlags() { DepthBiasEnable, LogicOpEnable, DepthClampEnable, + AlphaToCoverageEnable, + AlphaToOneEnable, LogicOp, Blending, ColorMask, @@ -148,6 +151,8 @@ void SetupDirtyStateEnable(Tables& tables) { setup(OFF(logic_op.enable), LogicOpEnable); setup(OFF(viewport_clip_control.geometry_clip), DepthClampEnable); setup(OFF(line_stipple_enable), LineStippleEnable); + setup(OFF(anti_alias_alpha_control.alpha_to_coverage), AlphaToCoverageEnable); + setup(OFF(anti_alias_alpha_control.alpha_to_one), AlphaToOneEnable); } void SetupDirtyDepthCompareOp(Tables& tables) { diff --git a/src/video_core/renderer_vulkan/vk_state_tracker.h b/src/video_core/renderer_vulkan/vk_state_tracker.h index aef726658a..afd99ad7b7 100644 --- a/src/video_core/renderer_vulkan/vk_state_tracker.h +++ b/src/video_core/renderer_vulkan/vk_state_tracker.h @@ -61,6 +61,8 @@ enum : u8 { LogicOp, LogicOpEnable, DepthClampEnable, + AlphaToCoverageEnable, + AlphaToOneEnable, Blending, BlendEnable, @@ -225,6 +227,14 @@ public: return Exchange(Dirty::DepthClampEnable, false); } + bool TouchAlphaToCoverageEnable() { + return Exchange(Dirty::AlphaToCoverageEnable, false); + } + + bool TouchAlphaToOneEnable() { + return Exchange(Dirty::AlphaToOneEnable, false); + } + bool TouchDepthCompareOp() { return Exchange(Dirty::DepthCompareOp, false); } diff --git a/src/video_core/vulkan_common/vulkan_wrapper.cpp b/src/video_core/vulkan_common/vulkan_wrapper.cpp index 2f78f1818b..9ee93653d9 100644 --- a/src/video_core/vulkan_common/vulkan_wrapper.cpp +++ b/src/video_core/vulkan_common/vulkan_wrapper.cpp @@ -147,6 +147,8 @@ void Load(VkDevice device, DeviceDispatch& dld) noexcept { X(vkCmdSetDepthWriteEnableEXT); X(vkCmdSetPrimitiveRestartEnableEXT); X(vkCmdSetRasterizerDiscardEnableEXT); + X(vkCmdSetAlphaToCoverageEnableEXT); + X(vkCmdSetAlphaToOneEnableEXT); X(vkCmdSetConservativeRasterizationModeEXT); X(vkCmdSetLineRasterizationModeEXT); X(vkCmdSetLineStippleEnableEXT); diff --git a/src/video_core/vulkan_common/vulkan_wrapper.h b/src/video_core/vulkan_common/vulkan_wrapper.h index bdef05c4c5..39717affa1 100644 --- a/src/video_core/vulkan_common/vulkan_wrapper.h +++ b/src/video_core/vulkan_common/vulkan_wrapper.h @@ -240,6 +240,8 @@ struct DeviceDispatch : InstanceDispatch { PFN_vkCmdSetDepthWriteEnableEXT vkCmdSetDepthWriteEnableEXT{}; PFN_vkCmdSetPrimitiveRestartEnableEXT vkCmdSetPrimitiveRestartEnableEXT{}; PFN_vkCmdSetRasterizerDiscardEnableEXT vkCmdSetRasterizerDiscardEnableEXT{}; + PFN_vkCmdSetAlphaToCoverageEnableEXT vkCmdSetAlphaToCoverageEnableEXT{}; + PFN_vkCmdSetAlphaToOneEnableEXT vkCmdSetAlphaToOneEnableEXT{}; PFN_vkCmdSetConservativeRasterizationModeEXT vkCmdSetConservativeRasterizationModeEXT{}; PFN_vkCmdSetLineRasterizationModeEXT vkCmdSetLineRasterizationModeEXT{}; PFN_vkCmdSetLineStippleEnableEXT vkCmdSetLineStippleEnableEXT{}; @@ -1486,6 +1488,14 @@ public: dld->vkCmdSetLogicOpEnableEXT(handle, enable ? VK_TRUE : VK_FALSE); } + void SetAlphaToCoverageEnableEXT(bool enable) const noexcept { + dld->vkCmdSetAlphaToCoverageEnableEXT(handle, enable ? VK_TRUE : VK_FALSE); + } + + void SetAlphaToOneEnableEXT(bool enable) const noexcept { + dld->vkCmdSetAlphaToOneEnableEXT(handle, enable ? VK_TRUE : VK_FALSE); + } + void SetDepthClampEnableEXT(bool enable) const noexcept { dld->vkCmdSetDepthClampEnableEXT(handle, enable ? VK_TRUE : VK_FALSE); }