@ -494,17 +494,25 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR
CollectPhysicalMemoryInfo ( ) ;
CollectPhysicalMemoryInfo ( ) ;
CollectToolingInfo ( ) ;
CollectToolingInfo ( ) ;
if ( is_qualcomm | | is_turnip ) {
const bool force_extensions = Settings : : values . force_unsupported_extensions . GetValue ( ) ;
if ( force_extensions ) {
LOG_WARNING ( Render_Vulkan , " Force Unsupported Extensions is enabled - bypassing ALL driver workarounds and safety checks! " ) ;
}
if ( ( is_qualcomm | | is_turnip ) & & ! force_extensions ) {
LOG_WARNING ( Render_Vulkan ,
LOG_WARNING ( Render_Vulkan ,
" Qualcomm and Turnip drivers have broken VK_EXT_custom_border_color " ) ;
" Qualcomm and Turnip drivers have broken VK_EXT_custom_border_color " ) ;
//RemoveExtensionFeature(extensions.custom_border_color, features.custom_border_color,
//VK_EXT_CUSTOM_BORDER_COLOR_EXTENSION_NAME);
RemoveExtensionFeature ( extensions . custom_border_color , features . custom_border_color ,
VK_EXT_CUSTOM_BORDER_COLOR_EXTENSION_NAME ) ;
}
}
if ( is_qualcomm ) {
if ( is_qualcomm ) {
LOG_WARNING ( Render_Vulkan ,
" Qualcomm drivers have a slow VK_KHR_push_descriptor implementation " ) ;
//RemoveExtension(extensions.push_descriptor, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
if ( ! force_extensions ) {
LOG_WARNING ( Render_Vulkan ,
" Qualcomm drivers have a slow VK_KHR_push_descriptor implementation " ) ;
RemoveExtension ( extensions . push_descriptor , VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME ) ;
}
LOG_WARNING ( Render_Vulkan ,
LOG_WARNING ( Render_Vulkan ,
" Disabling shader float controls and 64-bit integer features on Qualcomm proprietary drivers " ) ;
" Disabling shader float controls and 64-bit integer features on Qualcomm proprietary drivers " ) ;
@ -545,9 +553,9 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR
LOG_WARNING ( Render_Vulkan , " Ampere and newer have broken float16 math " ) ;
LOG_WARNING ( Render_Vulkan , " Ampere and newer have broken float16 math " ) ;
features . shader_float16_int8 . shaderFloat16 = false ;
features . shader_float16_int8 . shaderFloat16 = false ;
} else if ( arch < = NvidiaArchitecture : : Arch_Volta ) {
} else if ( arch < = NvidiaArchitecture : : Arch_Volta ) {
if ( nv_major_version < 527 ) {
if ( nv_major_version < 527 & & ! force_extensions ) {
LOG_WARNING ( Render_Vulkan , " Volta and older have broken VK_KHR_push_descriptor " ) ;
LOG_WARNING ( Render_Vulkan , " Volta and older have broken VK_KHR_push_descriptor " ) ;
//RemoveExtension(extensions.push_descriptor, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
RemoveExtension ( extensions . push_descriptor , VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME ) ;
}
}
}
}
if ( nv_major_version > = 510 ) {
if ( nv_major_version > = 510 ) {
@ -558,79 +566,67 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR
if ( extensions . extended_dynamic_state & & is_radv ) {
if ( extensions . extended_dynamic_state & & is_radv ) {
// Mask driver version variant
// Mask driver version variant
const u32 version = ( properties . properties . driverVersion < < 3 ) > > 3 ;
const u32 version = ( properties . properties . driverVersion < < 3 ) > > 3 ;
if ( version < VK_MAKE_API_VERSION ( 0 , 21 , 2 , 0 ) ) {
if ( version < VK_MAKE_API_VERSION ( 0 , 21 , 2 , 0 ) & & ! force_extensions ) {
LOG_WARNING ( Render_Vulkan ,
LOG_WARNING ( Render_Vulkan ,
" RADV versions older than 21.2 have broken VK_EXT_extended_dynamic_state " ) ;
" RADV versions older than 21.2 have broken VK_EXT_extended_dynamic_state " ) ;
//RemoveExtensionFeature(extensions.extended_dynamic_state,
//features.extended_dynamic_state,
//VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME);
RemoveExtensionFeature ( extensions . extended_dynamic_state ,
features . extended_dynamic_state ,
VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME ) ;
}
}
}
}
if ( extensions . extended_dynamic_state2 & & is_radv ) {
if ( extensions . extended_dynamic_state2 & & is_radv ) {
const u32 version = ( properties . properties . driverVersion < < 3 ) > > 3 ;
const u32 version = ( properties . properties . driverVersion < < 3 ) > > 3 ;
if ( version < VK_MAKE_API_VERSION ( 0 , 22 , 3 , 1 ) ) {
if ( version < VK_MAKE_API_VERSION ( 0 , 22 , 3 , 1 ) & & ! force_extensions ) {
LOG_WARNING (
LOG_WARNING (
Render_Vulkan ,
Render_Vulkan ,
" RADV versions older than 22.3.1 have broken VK_EXT_extended_dynamic_state2 " ) ;
" RADV versions older than 22.3.1 have broken VK_EXT_extended_dynamic_state2 " ) ;
// RemoveExtensionFeature(extensions.extended_dynamic_state2,
// features.extended_dynamic_state2,
// VK_EXT_EXTENDED_DYNAMIC_STATE_2_EXTENSION_NAME);
RemoveExtensionFeature ( extensions . extended_dynamic_state2 ,
features . extended_dynamic_state2 ,
VK_EXT_EXTENDED_DYNAMIC_STATE_2_EXTENSION_NAME ) ;
}
}
}
}
if ( extensions . extended_dynamic_state2 & & is_qualcomm ) {
if ( extensions . extended_dynamic_state2 & & is_qualcomm ) {
const u32 version = ( properties . properties . driverVersion < < 3 ) > > 3 ;
const u32 version = ( properties . properties . driverVersion < < 3 ) > > 3 ;
if ( version > = VK_MAKE_API_VERSION ( 0 , 0 , 676 , 0 ) & &
if ( version > = VK_MAKE_API_VERSION ( 0 , 0 , 676 , 0 ) & &
version < VK_MAKE_API_VERSION ( 0 , 0 , 680 , 0 ) ) {
version < VK_MAKE_API_VERSION ( 0 , 0 , 680 , 0 ) & & ! force_extensions ) {
// Qualcomm Adreno 7xx drivers do not properly support extended_dynamic_state2.
// Qualcomm Adreno 7xx drivers do not properly support extended_dynamic_state2.
LOG_WARNING ( Render_Vulkan ,
LOG_WARNING ( Render_Vulkan ,
" Qualcomm Adreno 7xx drivers have broken VK_EXT_extended_dynamic_state2 " ) ;
" Qualcomm Adreno 7xx drivers have broken VK_EXT_extended_dynamic_state2 " ) ;
//RemoveExtensionFeature(extensions.extended_dynamic_state2,
//features.extended_dynamic_state2,
//VK_EXT_EXTENDED_DYNAMIC_STATE_2_EXTENSION_NAME);
RemoveExtensionFeature ( extensions . extended_dynamic_state2 ,
features . extended_dynamic_state2 ,
VK_EXT_EXTENDED_DYNAMIC_STATE_2_EXTENSION_NAME ) ;
}
}
}
}
if ( extensions . extended_dynamic_state3 & & is_radv ) {
if ( extensions . extended_dynamic_state3 & & is_radv & & ! force_extensions ) {
LOG_WARNING ( Render_Vulkan , " RADV has broken extendedDynamicState3ColorBlendEquation " ) ;
LOG_WARNING ( Render_Vulkan , " RADV has broken extendedDynamicState3ColorBlendEquation " ) ;
features . extended_dynamic_state3 . extendedDynamicState3ColorBlendEnable = true ;
features . extended_dynamic_state3 . extendedDynamicState3ColorBlendEnable = true ;
features . extended_dynamic_state3 . extendedDynamicState3ColorBlendEquation = true ;
features . extended_dynamic_state3 . extendedDynamicState3ColorBlendEquation = true ;
dynamic_state3_blending = tru e;
dynamic_state3_blending = fals e;
const u32 version = ( properties . properties . driverVersion < < 3 ) > > 3 ;
const u32 version = ( properties . properties . driverVersion < < 3 ) > > 3 ;
if ( version < VK_MAKE_API_VERSION ( 0 , 23 , 1 , 0 ) ) {
if ( version < VK_MAKE_API_VERSION ( 0 , 23 , 1 , 0 ) & & ! force_extensions ) {
LOG_WARNING ( Render_Vulkan ,
LOG_WARNING ( Render_Vulkan ,
" RADV versions older than 23.1.0 have broken depth clamp dynamic state " ) ;
" RADV versions older than 23.1.0 have broken depth clamp dynamic state " ) ;
features . extended_dynamic_state3 . extendedDynamicState3DepthClampEnable = true ;
features . extended_dynamic_state3 . extendedDynamicState3DepthClampEnable = true ;
dynamic_state3_enables = tru e;
dynamic_state3_enables = fals e;
}
}
}
}
if ( extensions . extended_dynamic_state3 & & ( is_amd_driver | | driver_id = = VK_DRIVER_ID_SAMSUNG_PROPRIETARY ) ) {
if ( extensions . extended_dynamic_state3 & &
( is_amd_driver | | driver_id = = VK_DRIVER_ID_SAMSUNG_PROPRIETARY ) & & ! force_extensions ) {
// AMD and Samsung drivers have broken extendedDynamicState3ColorBlendEquation
// AMD and Samsung drivers have broken extendedDynamicState3ColorBlendEquation
LOG_WARNING ( Render_Vulkan ,
LOG_WARNING ( Render_Vulkan ,
" AMD and Samsung drivers have broken extendedDynamicState3ColorBlendEquation " ) ;
" AMD and Samsung drivers have broken extendedDynamicState3ColorBlendEquation " ) ;
features . extended_dynamic_state3 . extendedDynamicState3ColorBlendEnable = true ;
features . extended_dynamic_state3 . extendedDynamicState3ColorBlendEnable = true ;
features . extended_dynamic_state3 . extendedDynamicState3ColorBlendEquation = true ;
features . extended_dynamic_state3 . extendedDynamicState3ColorBlendEquation = true ;
dynamic_state3_blending = true ;
}
if ( extensions . vertex_input_dynamic_state & & is_radv ) {
// TODO(ameerj): Blacklist only offending driver versions
// TODO(ameerj): Confirm if RDNA1 is affected
const bool is_rdna2 =
supported_extensions . contains ( VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME ) ;
if ( is_rdna2 ) {
LOG_WARNING ( Render_Vulkan ,
" RADV has broken VK_EXT_vertex_input_dynamic_state on RDNA2 hardware " ) ;
// RemoveExtensionFeature(extensions.vertex_input_dynamic_state,
// features.vertex_input_dynamic_state,
// VK_EXT_VERTEX_INPUT_DYNAMIC_STATE_EXTENSION_NAME);
}
dynamic_state3_blending = false ;
}
}
if ( extensions . vertex_input_dynamic_state & & is_qualcomm ) {
if ( extensions . vertex_input_dynamic_state & & is_qualcomm & & ! force_extensions ) {
// Qualcomm drivers do not properly support vertex_input_dynamic_state.
// Qualcomm drivers do not properly support vertex_input_dynamic_state.
LOG_WARNING ( Render_Vulkan ,
LOG_WARNING ( Render_Vulkan ,
" Qualcomm drivers have broken VK_EXT_vertex_input_dynamic_state " ) ;
" Qualcomm drivers have broken VK_EXT_vertex_input_dynamic_state " ) ;
//RemoveExtensionFeature(extensions.vertex_input_dynamic_state,
// features.vertex_input_dynamic_state,
// VK_EXT_VERTEX_INPUT_DYNAMIC_STATE_EXTENSION_NAME);
RemoveExtensionFeature ( extensions . vertex_input_dynamic_state ,
features . vertex_input_dynamic_state ,
VK_EXT_VERTEX_INPUT_DYNAMIC_STATE_EXTENSION_NAME ) ;
}
}
sets_per_pool = 64 ;
sets_per_pool = 64 ;
@ -660,13 +656,13 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR
}
}
}
}
if ( extensions . vertex_input_dynamic_state & & is_intel_windows ) {
if ( extensions . vertex_input_dynamic_state & & is_intel_windows & & ! force_extensions ) {
const u32 version = ( properties . properties . driverVersion < < 3 ) > > 3 ;
const u32 version = ( properties . properties . driverVersion < < 3 ) > > 3 ;
if ( version < VK_MAKE_API_VERSION ( 27 , 20 , 100 , 0 ) ) {
if ( version < VK_MAKE_API_VERSION ( 27 , 20 , 100 , 0 ) ) {
LOG_WARNING ( Render_Vulkan , " Intel has broken VK_EXT_vertex_input_dynamic_state " ) ;
LOG_WARNING ( Render_Vulkan , " Intel has broken VK_EXT_vertex_input_dynamic_state " ) ;
//RemoveExtensionFeature(extensions.vertex_input_dynamic_state,
//features.vertex_input_dynamic_state,
//VK_EXT_VERTEX_INPUT_DYNAMIC_STATE_EXTENSION_NAME);
RemoveExtensionFeature ( extensions . vertex_input_dynamic_state ,
features . vertex_input_dynamic_state ,
VK_EXT_VERTEX_INPUT_DYNAMIC_STATE_EXTENSION_NAME ) ;
}
}
}
}
if ( features . shader_float16_int8 . shaderFloat16 & & is_intel_windows ) {
if ( features . shader_float16_int8 . shaderFloat16 & & is_intel_windows ) {
@ -688,19 +684,19 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR
if ( extensions . push_descriptor & & is_intel_anv ) {
if ( extensions . push_descriptor & & is_intel_anv ) {
const u32 version = ( properties . properties . driverVersion < < 3 ) > > 3 ;
const u32 version = ( properties . properties . driverVersion < < 3 ) > > 3 ;
if ( version > = VK_MAKE_API_VERSION ( 0 , 22 , 3 , 0 ) & &
if ( version > = VK_MAKE_API_VERSION ( 0 , 22 , 3 , 0 ) & &
version < VK_MAKE_API_VERSION ( 0 , 23 , 2 , 0 ) ) {
version < VK_MAKE_API_VERSION ( 0 , 23 , 2 , 0 ) & & ! force_extensions ) {
// Disable VK_KHR_push_descriptor due to
// Disable VK_KHR_push_descriptor due to
// mesa/mesa/-/commit/ff91c5ca42bc80aa411cb3fd8f550aa6fdd16bdc
// mesa/mesa/-/commit/ff91c5ca42bc80aa411cb3fd8f550aa6fdd16bdc
LOG_WARNING ( Render_Vulkan ,
LOG_WARNING ( Render_Vulkan ,
" ANV drivers 22.3.0 to 23.1.0 have broken VK_KHR_push_descriptor " ) ;
" ANV drivers 22.3.0 to 23.1.0 have broken VK_KHR_push_descriptor " ) ;
//RemoveExtension(extensions.push_descriptor, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
RemoveExtension ( extensions . push_descriptor , VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME ) ;
}
}
} else if ( extensions . push_descriptor & & is_nvidia ) {
} else if ( extensions . push_descriptor & & is_nvidia ) {
const auto arch = GetNvidiaArch ( ) ;
const auto arch = GetNvidiaArch ( ) ;
if ( arch < = NvidiaArchitecture : : Arch_Pascal ) {
if ( arch < = NvidiaArchitecture : : Arch_Pascal & & ! force_extensions ) {
LOG_WARNING ( Render_Vulkan ,
LOG_WARNING ( Render_Vulkan ,
" Pascal and older architectures have broken VK_KHR_push_descriptor " ) ;
" Pascal and older architectures have broken VK_KHR_push_descriptor " ) ;
//RemoveExtension(extensions.push_descriptor, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
RemoveExtension ( extensions . push_descriptor , VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME ) ;
}
}
}
}
@ -725,13 +721,13 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR
VK_EXT_EXTENDED_DYNAMIC_STATE_2_EXTENSION_NAME ) ;
VK_EXT_EXTENDED_DYNAMIC_STATE_2_EXTENSION_NAME ) ;
}
}
if ( ! extensions . extended_dynamic_state2 & & extensions . extended_dynamic_state3 ) {
if ( ! extensions . extended_dynamic_state2 & & extensions . extended_dynamic_state3 & & ! force_extensions ) {
LOG_INFO ( Render_Vulkan ,
LOG_INFO ( Render_Vulkan ,
" Removing extendedDynamicState3 due to missing extendedDynamicState2 " ) ;
" Removing extendedDynamicState3 due to missing extendedDynamicState2 " ) ;
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 ) ;
VK_EXT_EXTENDED_DYNAMIC_STATE_3_EXTENSION_NAME ) ;
dynamic_state3_blending = tru e;
dynamic_state3_enables = tru e;
dynamic_state3_blending = fals e;
dynamic_state3_enables = fals e;
}
}
// Mesa Intel drivers on UHD 620 have broken EDS causing extreme flickering - unknown if it affects other iGPUs
// Mesa Intel drivers on UHD 620 have broken EDS causing extreme flickering - unknown if it affects other iGPUs
@ -743,25 +739,6 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR
Settings : : values . dyna_state . SetValue ( 0 ) ;
Settings : : values . dyna_state . SetValue ( 0 ) ;
}
}
if ( Settings : : values . dyna_state . GetValue ( ) = = 0 ) {
must_emulate_scaled_formats = true ;
LOG_INFO ( Render_Vulkan , " Dynamic state is disabled (dyna_state = 0), forcing scaled format emulation ON " ) ;
// Disable dynamic state 1-3 and all extensions
RemoveExtensionFeature ( extensions . custom_border_color , features . custom_border_color , VK_EXT_CUSTOM_BORDER_COLOR_EXTENSION_NAME ) ;
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 , VK_EXT_EXTENDED_DYNAMIC_STATE_2_EXTENSION_NAME ) ;
RemoveExtensionFeature ( extensions . vertex_input_dynamic_state , features . vertex_input_dynamic_state , VK_EXT_VERTEX_INPUT_DYNAMIC_STATE_EXTENSION_NAME ) ;
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 ;
LOG_INFO ( Render_Vulkan , " All dynamic state extensions and features have been disabled " ) ;
} else {
must_emulate_scaled_formats = false ;
LOG_INFO ( Render_Vulkan , " Dynamic state is enabled (dyna_state = 1-3), disabling scaled format emulation " ) ;
}
logical = vk : : Device : : Create ( physical , queue_cis , ExtensionListForVulkan ( loaded_extensions ) , first_next , dld ) ;
logical = vk : : Device : : Create ( physical , queue_cis , ExtensionListForVulkan ( loaded_extensions ) , first_next , dld ) ;
graphics_queue = logical . GetQueue ( graphics_family ) ;
graphics_queue = logical . GetQueue ( graphics_family ) ;
@ -1226,7 +1203,7 @@ void Device::RemoveUnsuitableExtensions() {
RemoveExtensionFeatureIfUnsuitable ( extensions . depth_clip_control , features . depth_clip_control ,
RemoveExtensionFeatureIfUnsuitable ( extensions . depth_clip_control , features . depth_clip_control ,
VK_EXT_DEPTH_CLIP_CONTROL_EXTENSION_NAME ) ;
VK_EXT_DEPTH_CLIP_CONTROL_EXTENSION_NAME ) ;
/* */ // VK_EXT_extended_dynamic_state
// VK_EXT_extended_dynamic_state
extensions . extended_dynamic_state = features . extended_dynamic_state . extendedDynamicState ;
extensions . extended_dynamic_state = features . extended_dynamic_state . extendedDynamicState ;
RemoveExtensionFeatureIfUnsuitable ( extensions . extended_dynamic_state ,
RemoveExtensionFeatureIfUnsuitable ( extensions . extended_dynamic_state ,
features . extended_dynamic_state ,
features . extended_dynamic_state ,