|
|
|
@ -561,7 +561,7 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR |
|
|
|
is_blit_depth24_stencil8_supported); |
|
|
|
LOG_INFO(Render_Vulkan, " D32S8 hardware blit support: {}", |
|
|
|
is_blit_depth32_stencil8_supported); |
|
|
|
|
|
|
|
|
|
|
|
if (!is_blit_depth24_stencil8_supported && !is_blit_depth32_stencil8_supported) { |
|
|
|
LOG_WARNING(Render_Vulkan, |
|
|
|
"NVIDIA: Neither shader export nor hardware blits available for " |
|
|
|
@ -622,7 +622,7 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR |
|
|
|
} |
|
|
|
|
|
|
|
if (is_intel_windows) { |
|
|
|
LOG_WARNING(Render_Vulkan, |
|
|
|
LOG_WARNING(Render_Vulkan, |
|
|
|
"Intel proprietary drivers do not support MSAA->MSAA image blits. " |
|
|
|
"MSAA scaling will use 3D helpers. MSAA resolves work normally."); |
|
|
|
cant_blit_msaa = true; |
|
|
|
@ -646,7 +646,7 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR |
|
|
|
properties.properties.limits.maxVertexInputBindings = 32; |
|
|
|
} |
|
|
|
|
|
|
|
const auto dyna_state = Settings::values.dyna_state.GetValue(); |
|
|
|
const auto dyna_state = u32(Settings::values.dyna_state.GetValue()); |
|
|
|
|
|
|
|
// Base dynamic states (VIEWPORT, SCISSOR, DEPTH_BIAS, etc.) are ALWAYS active in vk_graphics_pipeline.cpp
|
|
|
|
// This slider controls EXTENDED dynamic states with accumulative levels per Vulkan specs:
|
|
|
|
@ -654,36 +654,36 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR |
|
|
|
// Level 1 = Core + VK_EXT_extended_dynamic_state
|
|
|
|
// Level 2 = Core + VK_EXT_extended_dynamic_state + VK_EXT_extended_dynamic_state2
|
|
|
|
// Level 3 = Core + VK_EXT_extended_dynamic_state + VK_EXT_extended_dynamic_state2 + VK_EXT_extended_dynamic_state3
|
|
|
|
|
|
|
|
|
|
|
|
switch (dyna_state) { |
|
|
|
case Settings::ExtendedDynamicState::Disabled: |
|
|
|
case 0: |
|
|
|
// Level 0: Disable all extended dynamic state extensions
|
|
|
|
RemoveExtensionFeature(extensions.extended_dynamic_state, features.extended_dynamic_state, |
|
|
|
RemoveExtensionFeature(extensions.extended_dynamic_state, features.extended_dynamic_state, |
|
|
|
VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME); |
|
|
|
RemoveExtensionFeature(extensions.extended_dynamic_state2, features.extended_dynamic_state2, |
|
|
|
RemoveExtensionFeature(extensions.extended_dynamic_state2, features.extended_dynamic_state2, |
|
|
|
VK_EXT_EXTENDED_DYNAMIC_STATE_2_EXTENSION_NAME); |
|
|
|
RemoveExtensionFeature(extensions.extended_dynamic_state3, features.extended_dynamic_state3, |
|
|
|
RemoveExtensionFeature(extensions.extended_dynamic_state3, features.extended_dynamic_state3, |
|
|
|
VK_EXT_EXTENDED_DYNAMIC_STATE_3_EXTENSION_NAME); |
|
|
|
dynamic_state3_blending = false; |
|
|
|
dynamic_state3_enables = false; |
|
|
|
break; |
|
|
|
case Settings::ExtendedDynamicState::EDS1: |
|
|
|
case 1: |
|
|
|
// Level 1: Enable EDS1, disable EDS2 and EDS3
|
|
|
|
RemoveExtensionFeature(extensions.extended_dynamic_state2, features.extended_dynamic_state2, |
|
|
|
RemoveExtensionFeature(extensions.extended_dynamic_state2, features.extended_dynamic_state2, |
|
|
|
VK_EXT_EXTENDED_DYNAMIC_STATE_2_EXTENSION_NAME); |
|
|
|
RemoveExtensionFeature(extensions.extended_dynamic_state3, features.extended_dynamic_state3, |
|
|
|
RemoveExtensionFeature(extensions.extended_dynamic_state3, features.extended_dynamic_state3, |
|
|
|
VK_EXT_EXTENDED_DYNAMIC_STATE_3_EXTENSION_NAME); |
|
|
|
dynamic_state3_blending = false; |
|
|
|
dynamic_state3_enables = false; |
|
|
|
break; |
|
|
|
case Settings::ExtendedDynamicState::EDS2: |
|
|
|
case 2: |
|
|
|
// Level 2: Enable EDS1 + EDS2, disable EDS3
|
|
|
|
RemoveExtensionFeature(extensions.extended_dynamic_state3, features.extended_dynamic_state3, |
|
|
|
RemoveExtensionFeature(extensions.extended_dynamic_state3, features.extended_dynamic_state3, |
|
|
|
VK_EXT_EXTENDED_DYNAMIC_STATE_3_EXTENSION_NAME); |
|
|
|
dynamic_state3_blending = false; |
|
|
|
dynamic_state3_enables = false; |
|
|
|
break; |
|
|
|
case Settings::ExtendedDynamicState::EDS3: |
|
|
|
case 3: |
|
|
|
default: |
|
|
|
// Level 3: Enable all (EDS1 + EDS2 + EDS3)
|
|
|
|
break; |
|
|
|
@ -1114,24 +1114,21 @@ bool Device::GetSuitability(bool requires_swapchain) { |
|
|
|
} |
|
|
|
|
|
|
|
// VK_DYNAMIC_STATE
|
|
|
|
|
|
|
|
|
|
|
|
// Driver detection variables for workarounds in GetSuitability
|
|
|
|
const VkDriverId driver_id = properties.driver.driverID; |
|
|
|
|
|
|
|
// VK_EXT_extended_dynamic_state2 below this will appear drivers that need workarounds.
|
|
|
|
|
|
|
|
// VK_EXT_extended_dynamic_state3 below this will appear drivers that need workarounds.
|
|
|
|
|
|
|
|
// Samsung: Broken extendedDynamicState3ColorBlendEquation
|
|
|
|
// Disable blend equation dynamic state, force static pipeline state
|
|
|
|
if (extensions.extended_dynamic_state3 && |
|
|
|
if (extensions.extended_dynamic_state3 && |
|
|
|
(driver_id == VK_DRIVER_ID_SAMSUNG_PROPRIETARY)) { |
|
|
|
LOG_WARNING(Render_Vulkan, |
|
|
|
"Samsung: Disabling broken extendedDynamicState3ColorBlendEquation"); |
|
|
|
features.extended_dynamic_state3.extendedDynamicState3ColorBlendEnable = false; |
|
|
|
features.extended_dynamic_state3.extendedDynamicState3ColorBlendEquation = false; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Intel Windows < 27.20.100.0: Broken VertexInputDynamicState
|
|
|
|
// Same for NVIDIA Proprietary < 580.119.02, unknown when VIDS was first NOT broken
|
|
|
|
// Disable VertexInputDynamicState on old Intel Windows drivers
|
|
|
|
@ -1143,7 +1140,7 @@ bool Device::GetSuitability(bool requires_swapchain) { |
|
|
|
RemoveExtensionFeature(extensions.vertex_input_dynamic_state, features.vertex_input_dynamic_state, VK_EXT_VERTEX_INPUT_DYNAMIC_STATE_EXTENSION_NAME); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (u32(Settings::values.dyna_state.GetValue()) == 0) { |
|
|
|
LOG_INFO(Render_Vulkan, "Extended Dynamic State disabled by user setting, clearing all EDS features"); |
|
|
|
features.extended_dynamic_state.extendedDynamicState = false; |
|
|
|
|