vulkan: Enforce Vulkan 1.2+ at instance API level and 1.1+ at device level (#4408)
* vulkan: Enforce Vulkan 1.2+ at instance API level and 1.1+ at device level This ensure we don't end up trying to initialize with anything currently incompatible. * Address riperiperi's comment
This commit is contained in:
parent
052b23c83c
commit
fe9c49949a
1 changed files with 31 additions and 2 deletions
|
@ -14,6 +14,9 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
public unsafe static class VulkanInitialization
|
public unsafe static class VulkanInitialization
|
||||||
{
|
{
|
||||||
private const uint InvalidIndex = uint.MaxValue;
|
private const uint InvalidIndex = uint.MaxValue;
|
||||||
|
private static uint MinimalVulkanVersion = Vk.Version11.Value;
|
||||||
|
private static uint MinimalInstanceVulkanVersion = Vk.Version12.Value;
|
||||||
|
private static uint MaximumVulkanVersion = Vk.Version12.Value;
|
||||||
private const string AppName = "Ryujinx.Graphics.Vulkan";
|
private const string AppName = "Ryujinx.Graphics.Vulkan";
|
||||||
private const int QueuesCount = 2;
|
private const int QueuesCount = 2;
|
||||||
|
|
||||||
|
@ -99,7 +102,7 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
ApplicationVersion = 1,
|
ApplicationVersion = 1,
|
||||||
PEngineName = (byte*)appName,
|
PEngineName = (byte*)appName,
|
||||||
EngineVersion = 1,
|
EngineVersion = 1,
|
||||||
ApiVersion = Vk.Version12.Value
|
ApiVersion = MaximumVulkanVersion
|
||||||
};
|
};
|
||||||
|
|
||||||
IntPtr* ppEnabledExtensions = stackalloc IntPtr[enabledExtensions.Length];
|
IntPtr* ppEnabledExtensions = stackalloc IntPtr[enabledExtensions.Length];
|
||||||
|
@ -224,7 +227,7 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
ApplicationVersion = 1,
|
ApplicationVersion = 1,
|
||||||
PEngineName = (byte*)appName,
|
PEngineName = (byte*)appName,
|
||||||
EngineVersion = 1,
|
EngineVersion = 1,
|
||||||
ApiVersion = Vk.Version12.Value
|
ApiVersion = MaximumVulkanVersion
|
||||||
};
|
};
|
||||||
|
|
||||||
var instanceCreateInfo = new InstanceCreateInfo
|
var instanceCreateInfo = new InstanceCreateInfo
|
||||||
|
@ -239,6 +242,27 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
|
|
||||||
api.CreateInstance(in instanceCreateInfo, null, out var instance).ThrowOnError();
|
api.CreateInstance(in instanceCreateInfo, null, out var instance).ThrowOnError();
|
||||||
|
|
||||||
|
// We ensure that vkEnumerateInstanceVersion is present (added in 1.1).
|
||||||
|
// If the instance doesn't support it, no device is going to be 1.1 compatible.
|
||||||
|
if (api.GetInstanceProcAddr(instance, "vkEnumerateInstanceVersion") == IntPtr.Zero)
|
||||||
|
{
|
||||||
|
api.DestroyInstance(instance, null);
|
||||||
|
|
||||||
|
return Array.Empty<DeviceInfo>();
|
||||||
|
}
|
||||||
|
|
||||||
|
// We currently assume that the instance is compatible with Vulkan 1.2
|
||||||
|
// TODO: Remove this once we relax our initialization codepaths.
|
||||||
|
uint instanceApiVerison = 0;
|
||||||
|
api.EnumerateInstanceVersion(ref instanceApiVerison).ThrowOnError();
|
||||||
|
|
||||||
|
if (instanceApiVerison < MinimalInstanceVulkanVersion)
|
||||||
|
{
|
||||||
|
api.DestroyInstance(instance, null);
|
||||||
|
|
||||||
|
return Array.Empty<DeviceInfo>();
|
||||||
|
}
|
||||||
|
|
||||||
Marshal.FreeHGlobal(appName);
|
Marshal.FreeHGlobal(appName);
|
||||||
|
|
||||||
uint physicalDeviceCount;
|
uint physicalDeviceCount;
|
||||||
|
@ -259,6 +283,11 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
var physicalDevice = physicalDevices[i];
|
var physicalDevice = physicalDevices[i];
|
||||||
api.GetPhysicalDeviceProperties(physicalDevice, out var properties);
|
api.GetPhysicalDeviceProperties(physicalDevice, out var properties);
|
||||||
|
|
||||||
|
if (properties.ApiVersion < MinimalVulkanVersion)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
devices[i] = new DeviceInfo(
|
devices[i] = new DeviceInfo(
|
||||||
StringFromIdPair(properties.VendorID, properties.DeviceID),
|
StringFromIdPair(properties.VendorID, properties.DeviceID),
|
||||||
VendorUtils.GetNameFromId(properties.VendorID),
|
VendorUtils.GetNameFromId(properties.VendorID),
|
||||||
|
|
Reference in a new issue