mirror of
https://github.com/Ryujinx/Ryujinx.git
synced 2024-11-28 01:24:02 +00:00
c95be55091
* vulkan: Move most of the properties enumeration to VulkanPhysicalDevice That clean up a bit of duplicate logic. Also move to use an hashset for device extensions. * vulkan: Move instance querying to VulkanInstance Also cleanup code to use span when possible instead of unsafe pointers. * Address gdkchan's comments
70 lines
2.9 KiB
C#
70 lines
2.9 KiB
C#
using Ryujinx.Common.Utilities;
|
|
using Ryujinx.Graphics.GAL;
|
|
using Silk.NET.Vulkan;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Collections.Immutable;
|
|
using System.Linq;
|
|
using System.Runtime.InteropServices;
|
|
|
|
namespace Ryujinx.Graphics.Vulkan
|
|
{
|
|
readonly struct VulkanPhysicalDevice
|
|
{
|
|
public readonly PhysicalDevice PhysicalDevice;
|
|
public readonly PhysicalDeviceFeatures PhysicalDeviceFeatures;
|
|
public readonly PhysicalDeviceProperties PhysicalDeviceProperties;
|
|
public readonly PhysicalDeviceMemoryProperties PhysicalDeviceMemoryProperties;
|
|
public readonly QueueFamilyProperties[] QueueFamilyProperties;
|
|
public readonly string DeviceName;
|
|
public readonly IReadOnlySet<string> DeviceExtensions;
|
|
|
|
public VulkanPhysicalDevice(Vk api, PhysicalDevice physicalDevice)
|
|
{
|
|
PhysicalDevice = physicalDevice;
|
|
PhysicalDeviceFeatures = api.GetPhysicalDeviceFeature(PhysicalDevice);
|
|
|
|
api.GetPhysicalDeviceProperties(PhysicalDevice, out var physicalDeviceProperties);
|
|
PhysicalDeviceProperties = physicalDeviceProperties;
|
|
|
|
api.GetPhysicalDeviceMemoryProperties(PhysicalDevice, out PhysicalDeviceMemoryProperties);
|
|
|
|
unsafe
|
|
{
|
|
DeviceName = Marshal.PtrToStringAnsi((IntPtr)physicalDeviceProperties.DeviceName);
|
|
}
|
|
|
|
uint propertiesCount = 0;
|
|
|
|
api.GetPhysicalDeviceQueueFamilyProperties(physicalDevice, SpanHelpers.AsSpan(ref propertiesCount), Span<QueueFamilyProperties>.Empty);
|
|
|
|
QueueFamilyProperties = new QueueFamilyProperties[propertiesCount];
|
|
|
|
api.GetPhysicalDeviceQueueFamilyProperties(physicalDevice, SpanHelpers.AsSpan(ref propertiesCount), QueueFamilyProperties);
|
|
|
|
api.EnumerateDeviceExtensionProperties(PhysicalDevice, Span<byte>.Empty, SpanHelpers.AsSpan(ref propertiesCount), Span<ExtensionProperties>.Empty).ThrowOnError();
|
|
|
|
ExtensionProperties[] extensionProperties = new ExtensionProperties[propertiesCount];
|
|
|
|
api.EnumerateDeviceExtensionProperties(PhysicalDevice, Span<byte>.Empty, SpanHelpers.AsSpan(ref propertiesCount), extensionProperties).ThrowOnError();
|
|
|
|
unsafe
|
|
{
|
|
DeviceExtensions = extensionProperties.Select(x => Marshal.PtrToStringAnsi((IntPtr)x.ExtensionName)).ToImmutableHashSet();
|
|
}
|
|
}
|
|
|
|
public string Id => $"0x{PhysicalDeviceProperties.VendorID:X}_0x{PhysicalDeviceProperties.DeviceID:X}";
|
|
|
|
public bool IsDeviceExtensionPresent(string extension) => DeviceExtensions.Contains(extension);
|
|
|
|
public DeviceInfo ToDeviceInfo()
|
|
{
|
|
return new DeviceInfo(
|
|
Id,
|
|
VendorUtils.GetNameFromId(PhysicalDeviceProperties.VendorID),
|
|
DeviceName,
|
|
PhysicalDeviceProperties.DeviceType == PhysicalDeviceType.DiscreteGpu);
|
|
}
|
|
}
|
|
}
|