From 0f50de72beb52585ee032a72990bb505885eab19 Mon Sep 17 00:00:00 2001 From: Georg Lehmann <49841484+DadSchoorse@users.noreply.github.com> Date: Thu, 15 Dec 2022 00:53:33 +0100 Subject: [PATCH] Vulkan: enable VK_EXT_custom_border_color features (#4116) * Vulkan: enable VK_EXT_custom_border_color features radv only create the border color bo if this feature is enabled, so it crashed when creating samplers with custom border colors Fixes #4072 Fixes #3993 * Address gdkchan's comment Co-authored-by: Mary --- .../VulkanInitialization.cs | 36 ++++++++++++++++++- Ryujinx.Graphics.Vulkan/VulkanRenderer.cs | 17 ++++++++- 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/Ryujinx.Graphics.Vulkan/VulkanInitialization.cs b/Ryujinx.Graphics.Vulkan/VulkanInitialization.cs index 942970c27b..68462825f3 100644 --- a/Ryujinx.Graphics.Vulkan/VulkanInitialization.cs +++ b/Ryujinx.Graphics.Vulkan/VulkanInitialization.cs @@ -374,7 +374,24 @@ namespace Ryujinx.Graphics.Vulkan api.GetPhysicalDeviceProperties(physicalDevice, out var properties); bool useRobustBufferAccess = VendorUtils.FromId(properties.VendorID) == Vendor.Nvidia; - var supportedFeatures = api.GetPhysicalDeviceFeature(physicalDevice); + PhysicalDeviceFeatures2 features2 = new PhysicalDeviceFeatures2() + { + SType = StructureType.PhysicalDeviceFeatures2 + }; + + PhysicalDeviceCustomBorderColorFeaturesEXT featuresCustomBorderColorSupported = new PhysicalDeviceCustomBorderColorFeaturesEXT() + { + SType = StructureType.PhysicalDeviceCustomBorderColorFeaturesExt + }; + + if (supportedExtensions.Contains("VK_EXT_custom_border_color")) + { + features2.PNext = &featuresCustomBorderColorSupported; + } + + api.GetPhysicalDeviceFeatures2(physicalDevice, &features2); + + var supportedFeatures = features2.Features; var features = new PhysicalDeviceFeatures() { @@ -491,6 +508,23 @@ namespace Ryujinx.Graphics.Vulkan pExtendedFeatures = &featuresSubgroupSizeControl; } + PhysicalDeviceCustomBorderColorFeaturesEXT featuresCustomBorderColor; + + if (supportedExtensions.Contains("VK_EXT_custom_border_color") && + featuresCustomBorderColorSupported.CustomBorderColors && + featuresCustomBorderColorSupported.CustomBorderColorWithoutFormat) + { + featuresCustomBorderColor = new PhysicalDeviceCustomBorderColorFeaturesEXT() + { + SType = StructureType.PhysicalDeviceCustomBorderColorFeaturesExt, + PNext = pExtendedFeatures, + CustomBorderColors = true, + CustomBorderColorWithoutFormat = true, + }; + + pExtendedFeatures = &featuresCustomBorderColor; + } + var enabledExtensions = RequiredExtensions.Union(DesirableExtensions.Intersect(supportedExtensions)).ToArray(); IntPtr* ppEnabledExtensions = stackalloc IntPtr[enabledExtensions.Length]; diff --git a/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs b/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs index e947206724..fa9d4cb0c0 100644 --- a/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs +++ b/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs @@ -177,6 +177,11 @@ namespace Ryujinx.Graphics.Vulkan SType = StructureType.PhysicalDeviceShaderFloat16Int8Features }; + PhysicalDeviceCustomBorderColorFeaturesEXT featuresCustomBorderColor = new PhysicalDeviceCustomBorderColorFeaturesEXT() + { + SType = StructureType.PhysicalDeviceCustomBorderColorFeaturesExt + }; + if (supportedExtensions.Contains("VK_EXT_robustness2")) { features2.PNext = &featuresRobustness2; @@ -188,8 +193,18 @@ namespace Ryujinx.Graphics.Vulkan features2.PNext = &featuresShaderInt8; } + if (supportedExtensions.Contains("VK_EXT_custom_border_color")) + { + featuresCustomBorderColor.PNext = features2.PNext; + features2.PNext = &featuresCustomBorderColor; + } + Api.GetPhysicalDeviceFeatures2(_physicalDevice, &features2); + bool customBorderColorSupported = supportedExtensions.Contains("VK_EXT_custom_border_color") && + featuresCustomBorderColor.CustomBorderColors && + featuresCustomBorderColor.CustomBorderColorWithoutFormat; + ref var properties = ref properties2.Properties; SampleCountFlags supportedSampleCounts = @@ -199,7 +214,7 @@ namespace Ryujinx.Graphics.Vulkan Capabilities = new HardwareCapabilities( supportedExtensions.Contains("VK_EXT_index_type_uint8"), - supportedExtensions.Contains("VK_EXT_custom_border_color"), + customBorderColorSupported, supportedExtensions.Contains(KhrDrawIndirectCount.ExtensionName), supportedExtensions.Contains("VK_EXT_fragment_shader_interlock"), supportedExtensions.Contains("VK_NV_geometry_shader_passthrough"),