public unsafe VulkanPhysicalDevice[] GetPhysicalDevices(Predicate <VulkanPhysicalDevice>?suitability) { suitability ??= _ => true; uint deviceCount = 0u; VK.EnumeratePhysicalDevices(_VKInstance, &deviceCount, Span <PhysicalDevice> .Empty); Span <PhysicalDevice> physicalDevices = stackalloc PhysicalDevice[(int)deviceCount]; VK.EnumeratePhysicalDevices(_VKInstance, &deviceCount, physicalDevices); VulkanPhysicalDevice[] tempSuitable = ArrayPool <VulkanPhysicalDevice> .Shared.Rent((int)deviceCount); int index = 0; foreach (PhysicalDevice physicalDevice in physicalDevices) { VulkanPhysicalDevice vulkanPhysicalDevice = new VulkanPhysicalDevice(VK, new VulkanContext { Instance = this }, physicalDevice); if (suitability(vulkanPhysicalDevice)) { tempSuitable[index] = vulkanPhysicalDevice; index += 1; } } VulkanPhysicalDevice[] finalSuitable = tempSuitable[..index];
void PickPhysicalDevice() { uint count = 0; VK.EnumeratePhysicalDevices(instance, ref count, IntPtr.Zero); var devices = new NativeArray <VkPhysicalDevice>(count); VK.EnumeratePhysicalDevices(instance, ref count, devices.Address); physicalDevice = devices[0]; devices.Dispose(); }