From 60004ca2fe6dbb9e75b3a50fb39c80bf046c32fb Mon Sep 17 00:00:00 2001 From: JPikachu Date: Thu, 6 Nov 2025 23:58:32 +0000 Subject: [PATCH] one more try --- .../renderer_vulkan/vk_rasterizer.cpp | 32 +++++++++++++++---- .../vulkan_common/vulkan_device.cpp | 13 ++++++-- 2 files changed, 36 insertions(+), 9 deletions(-) diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 3b103da526..7ad609b8fe 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -952,7 +952,19 @@ void RasterizerVulkan::UpdateDynamicStates() { UpdateDepthBounds(regs); UpdateStencilFaces(regs); UpdateLineWidth(regs); - if (device.IsExtExtendedDynamicStateSupported()) { + + const u8 dynamic_state = Settings::values.dyna_state.GetValue(); + + auto features = DynamicFeatures{ + .has_extended_dynamic_state = device.IsExtExtendedDynamicStateSupported() && dynamic_state > 0, + .has_extended_dynamic_state_2 = device.IsExtExtendedDynamicState2Supported() && dynamic_state > 1, + .has_extended_dynamic_state_2_extra = device.IsExtExtendedDynamicState2ExtrasSupported() && dynamic_state > 1, + .has_extended_dynamic_state_3_blend = device.IsExtExtendedDynamicState3BlendingSupported() && dynamic_state > 2, + .has_extended_dynamic_state_3_enables = device.IsExtExtendedDynamicState3EnablesSupported() && dynamic_state > 2, + .has_dynamic_vertex_input = device.IsExtVertexInputDynamicStateSupported(), + }; + + if (features.has_extended_dynamic_state) { UpdateCullMode(regs); UpdateDepthCompareOp(regs); UpdateFrontFace(regs); @@ -963,13 +975,14 @@ void RasterizerVulkan::UpdateDynamicStates() { UpdateDepthTestEnable(regs); UpdateDepthWriteEnable(regs); UpdateStencilTestEnable(regs); - if (device.IsExtExtendedDynamicState2Supported()) { + + if (features.has_extended_dynamic_state_2) { UpdatePrimitiveRestartEnable(regs); UpdateRasterizerDiscardEnable(regs); UpdateDepthBiasEnable(regs); } - if (device.IsExtExtendedDynamicState3Supported()) { + if (features.has_extended_dynamic_state_3_enables) { using namespace Tegra::Engines; if (device.GetDriverID() == VkDriverIdKHR::VK_DRIVER_ID_AMD_OPEN_SOURCE || @@ -996,15 +1009,20 @@ void RasterizerVulkan::UpdateDynamicStates() { UpdateDepthClampEnable(regs); } } - if (device.IsExtExtendedDynamicState2ExtrasSupported()) { + if (features.has_extended_dynamic_state_2_extra) { UpdateLogicOp(regs); } - if (device.IsExtExtendedDynamicState3Supported()) { + if (features.has_extended_dynamic_state_3_enables) { UpdateBlending(regs); + UpdateLineStippleEnable(regs); + UpdateConservativeRasterizationMode(regs); } } - if (device.IsExtVertexInputDynamicStateSupported()) { - UpdateVertexInput(regs); + if (features.has_dynamic_vertex_input) { + if (auto* gp = pipeline_cache.CurrentGraphicsPipeline(); + gp && gp->HasDynamicVertexInput()) { + UpdateVertexInput(regs); + } } } diff --git a/src/video_core/vulkan_common/vulkan_device.cpp b/src/video_core/vulkan_common/vulkan_device.cpp index 7ccd59934d..1dbc5596cf 100644 --- a/src/video_core/vulkan_common/vulkan_device.cpp +++ b/src/video_core/vulkan_common/vulkan_device.cpp @@ -645,9 +645,17 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR } if (extensions.extended_dynamic_state3 && (is_amd_driver || driver_id == VK_DRIVER_ID_SAMSUNG_PROPRIETARY)) { + // Windows on AMD is really picky for some reason + #if defined (_WIN32) + LOG_WARNING(Render_Vulkan, + "AMD drivers have glitchy extendedDynamicState3ColorBlendEquation"); + features.extended_dynamic_state3.extendedDynamicState3ColorBlendEnable = true; + features.extended_dynamic_state3.extendedDynamicState3ColorBlendEquation = true; + dynamic_state3_blending = true; + #else // AMD and Samsung drivers have broken extendedDynamicState3ColorBlendEquation if (!force_extensions) { - LOG_WARNING(Render_Vulkan, + LOG_WARNING(Render_Vulkan, "AMD and Samsung drivers have broken extendedDynamicState3ColorBlendEquation"); features.extended_dynamic_state3.extendedDynamicState3ColorBlendEnable = false; features.extended_dynamic_state3.extendedDynamicState3ColorBlendEquation = false; @@ -657,6 +665,7 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR features.extended_dynamic_state3.extendedDynamicState3ColorBlendEquation = true; dynamic_state3_blending = true; } + #endif } if (extensions.vertex_input_dynamic_state && is_qualcomm && !force_extensions) { // Qualcomm drivers do not properly support vertex_input_dynamic_state. @@ -759,7 +768,7 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR VK_EXT_EXTENDED_DYNAMIC_STATE_2_EXTENSION_NAME); } - if (!extensions.extended_dynamic_state2 && extensions.extended_dynamic_state3 && !force_extensions) { + if (!extensions.extended_dynamic_state2 && extensions.extended_dynamic_state3) { LOG_INFO(Render_Vulkan, "Removing extendedDynamicState3 due to missing extendedDynamicState2"); RemoveExtensionFeature(extensions.extended_dynamic_state3, features.extended_dynamic_state3,