forked from Mirror/Ryujinx
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 <mary@mary.zone>
This commit is contained in:
parent
df758eddd1
commit
0f50de72be
2 changed files with 51 additions and 2 deletions
|
@ -374,7 +374,24 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
api.GetPhysicalDeviceProperties(physicalDevice, out var properties);
|
api.GetPhysicalDeviceProperties(physicalDevice, out var properties);
|
||||||
bool useRobustBufferAccess = VendorUtils.FromId(properties.VendorID) == Vendor.Nvidia;
|
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()
|
var features = new PhysicalDeviceFeatures()
|
||||||
{
|
{
|
||||||
|
@ -491,6 +508,23 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
pExtendedFeatures = &featuresSubgroupSizeControl;
|
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();
|
var enabledExtensions = RequiredExtensions.Union(DesirableExtensions.Intersect(supportedExtensions)).ToArray();
|
||||||
|
|
||||||
IntPtr* ppEnabledExtensions = stackalloc IntPtr[enabledExtensions.Length];
|
IntPtr* ppEnabledExtensions = stackalloc IntPtr[enabledExtensions.Length];
|
||||||
|
|
|
@ -177,6 +177,11 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
SType = StructureType.PhysicalDeviceShaderFloat16Int8Features
|
SType = StructureType.PhysicalDeviceShaderFloat16Int8Features
|
||||||
};
|
};
|
||||||
|
|
||||||
|
PhysicalDeviceCustomBorderColorFeaturesEXT featuresCustomBorderColor = new PhysicalDeviceCustomBorderColorFeaturesEXT()
|
||||||
|
{
|
||||||
|
SType = StructureType.PhysicalDeviceCustomBorderColorFeaturesExt
|
||||||
|
};
|
||||||
|
|
||||||
if (supportedExtensions.Contains("VK_EXT_robustness2"))
|
if (supportedExtensions.Contains("VK_EXT_robustness2"))
|
||||||
{
|
{
|
||||||
features2.PNext = &featuresRobustness2;
|
features2.PNext = &featuresRobustness2;
|
||||||
|
@ -188,8 +193,18 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
features2.PNext = &featuresShaderInt8;
|
features2.PNext = &featuresShaderInt8;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (supportedExtensions.Contains("VK_EXT_custom_border_color"))
|
||||||
|
{
|
||||||
|
featuresCustomBorderColor.PNext = features2.PNext;
|
||||||
|
features2.PNext = &featuresCustomBorderColor;
|
||||||
|
}
|
||||||
|
|
||||||
Api.GetPhysicalDeviceFeatures2(_physicalDevice, &features2);
|
Api.GetPhysicalDeviceFeatures2(_physicalDevice, &features2);
|
||||||
|
|
||||||
|
bool customBorderColorSupported = supportedExtensions.Contains("VK_EXT_custom_border_color") &&
|
||||||
|
featuresCustomBorderColor.CustomBorderColors &&
|
||||||
|
featuresCustomBorderColor.CustomBorderColorWithoutFormat;
|
||||||
|
|
||||||
ref var properties = ref properties2.Properties;
|
ref var properties = ref properties2.Properties;
|
||||||
|
|
||||||
SampleCountFlags supportedSampleCounts =
|
SampleCountFlags supportedSampleCounts =
|
||||||
|
@ -199,7 +214,7 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
|
|
||||||
Capabilities = new HardwareCapabilities(
|
Capabilities = new HardwareCapabilities(
|
||||||
supportedExtensions.Contains("VK_EXT_index_type_uint8"),
|
supportedExtensions.Contains("VK_EXT_index_type_uint8"),
|
||||||
supportedExtensions.Contains("VK_EXT_custom_border_color"),
|
customBorderColorSupported,
|
||||||
supportedExtensions.Contains(KhrDrawIndirectCount.ExtensionName),
|
supportedExtensions.Contains(KhrDrawIndirectCount.ExtensionName),
|
||||||
supportedExtensions.Contains("VK_EXT_fragment_shader_interlock"),
|
supportedExtensions.Contains("VK_EXT_fragment_shader_interlock"),
|
||||||
supportedExtensions.Contains("VK_NV_geometry_shader_passthrough"),
|
supportedExtensions.Contains("VK_NV_geometry_shader_passthrough"),
|
||||||
|
|
Loading…
Reference in a new issue