Exemplo n.º 1
0
        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];
Exemplo n.º 2
0
        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();
        }