mirror of
https://github.com/yuzu-emu/yuzu-mainline
synced 2024-11-22 13:43:37 +00:00
Rework nvidia architecture detection, disable push descriptor for Pascal and older
This commit is contained in:
parent
257a6aa2ba
commit
71044f6def
1 changed files with 43 additions and 12 deletions
|
@ -84,9 +84,12 @@ constexpr std::array VK_FORMAT_A4B4G4R4_UNORM_PACK16{
|
|||
} // namespace Alternatives
|
||||
|
||||
enum class NvidiaArchitecture {
|
||||
AmpereOrNewer,
|
||||
KeplerOrOlder,
|
||||
Maxwell,
|
||||
Pascal,
|
||||
Volta,
|
||||
Turing,
|
||||
VoltaOrOlder,
|
||||
AmpereOrNewer,
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
|
@ -321,13 +324,38 @@ NvidiaArchitecture GetNvidiaArchitecture(vk::PhysicalDevice physical,
|
|||
physical.GetProperties2(physical_properties);
|
||||
if (shading_rate_props.primitiveFragmentShadingRateWithMultipleViewports) {
|
||||
// Only Ampere and newer support this feature
|
||||
// TODO: Find a way to differentiate Ampere and Ada
|
||||
return NvidiaArchitecture::AmpereOrNewer;
|
||||
}
|
||||
}
|
||||
if (exts.contains(VK_NV_SHADING_RATE_IMAGE_EXTENSION_NAME)) {
|
||||
return NvidiaArchitecture::Turing;
|
||||
}
|
||||
return NvidiaArchitecture::VoltaOrOlder;
|
||||
|
||||
if (exts.contains(VK_EXT_BLEND_OPERATION_ADVANCED_EXTENSION_NAME)) {
|
||||
VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT advanced_blending_props{};
|
||||
advanced_blending_props.sType =
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT;
|
||||
VkPhysicalDeviceProperties2 physical_properties{};
|
||||
physical_properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
|
||||
physical_properties.pNext = &advanced_blending_props;
|
||||
physical.GetProperties2(physical_properties);
|
||||
if (advanced_blending_props.advancedBlendMaxColorAttachments == 1) {
|
||||
return NvidiaArchitecture::Maxwell;
|
||||
}
|
||||
|
||||
if (exts.contains(VK_EXT_CONSERVATIVE_RASTERIZATION_EXTENSION_NAME)) {
|
||||
VkPhysicalDeviceConservativeRasterizationPropertiesEXT conservative_raster_props{};
|
||||
conservative_raster_props.sType =
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT;
|
||||
physical_properties.pNext = &conservative_raster_props;
|
||||
physical.GetProperties2(physical_properties);
|
||||
if (conservative_raster_props.degenerateLinesRasterized) {
|
||||
return NvidiaArchitecture::Volta;
|
||||
}
|
||||
return NvidiaArchitecture::Pascal;
|
||||
}
|
||||
}
|
||||
|
||||
return NvidiaArchitecture::KeplerOrOlder;
|
||||
}
|
||||
|
||||
std::vector<const char*> ExtensionListForVulkan(
|
||||
|
@ -504,19 +532,14 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR
|
|||
if (is_nvidia) {
|
||||
const u32 nv_major_version = (properties.properties.driverVersion >> 22) & 0x3ff;
|
||||
const auto arch = GetNvidiaArchitecture(physical, supported_extensions);
|
||||
switch (arch) {
|
||||
case NvidiaArchitecture::AmpereOrNewer:
|
||||
if (arch >= NvidiaArchitecture::AmpereOrNewer) {
|
||||
LOG_WARNING(Render_Vulkan, "Ampere and newer have broken float16 math");
|
||||
features.shader_float16_int8.shaderFloat16 = false;
|
||||
break;
|
||||
case NvidiaArchitecture::Turing:
|
||||
break;
|
||||
case NvidiaArchitecture::VoltaOrOlder:
|
||||
} else if (arch <= NvidiaArchitecture::Volta) {
|
||||
if (nv_major_version < 527) {
|
||||
LOG_WARNING(Render_Vulkan, "Volta and older have broken VK_KHR_push_descriptor");
|
||||
RemoveExtension(extensions.push_descriptor, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (nv_major_version >= 510) {
|
||||
LOG_WARNING(Render_Vulkan, "NVIDIA Drivers >= 510 do not support MSAA image blits");
|
||||
|
@ -661,7 +684,15 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR
|
|||
"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);
|
||||
}
|
||||
} else if (extensions.push_descriptor && is_nvidia) {
|
||||
const auto arch = GetNvidiaArchitecture(physical, supported_extensions);
|
||||
if (arch <= NvidiaArchitecture::Pascal) {
|
||||
LOG_WARNING(Render_Vulkan,
|
||||
"Pascal and older architectures have broken VK_KHR_push_descriptor");
|
||||
RemoveExtension(extensions.push_descriptor, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
|
||||
}
|
||||
}
|
||||
|
||||
if (is_mvk) {
|
||||
LOG_WARNING(Render_Vulkan,
|
||||
"MVK driver breaks when using more than 16 vertex attributes/bindings");
|
||||
|
|
Loading…
Reference in a new issue