Пример #1
0
        public void Recreate()
        {
            NativePhysicalDevices = new List <VkPhysicalDevice>();

            NativePhysicalDevices = GetPhysicalDevice();

            foreach (var item in NativePhysicalDevices)
            {
                NativePhysicalDevice = item;
            }


            Properties = GetProperties();
        }
Пример #2
0
        /// <summary>
        /// Gets the version-aware properties associated with the physical device.
        /// </summary>
        /// <param name="device">The device to get the properties for.</param>
        /// <param name="props">The Vulkan 1.0 properties.</param>
        /// <param name="props11">The Vulkan 1.1 properties.</param>
        /// <param name="props12">The Vulkan 1.2 properties.</param>
        public static void GetProperties(VkPhysicalDevice device,
                                         out VkPhysicalDeviceProperties props,
                                         out VkPhysicalDeviceVulkan11Properties props11,
                                         out VkPhysicalDeviceVulkan12Properties props12)
        {
            if (!device)
            {
                throw new ArgumentNullException(nameof(device), "Cannot pass null device or device handle");
            }

            VkPhysicalDeviceProperties.New(out props);
            VkPhysicalDeviceVulkan11Properties.New(out props11);
            VkPhysicalDeviceVulkan12Properties.New(out props12);
            var version = device.Parent.Functions.CoreVersion;

            // 1.0
            if (version < VkVersion.VK_VERSION_1_1)
            {
                device.GetPhysicalDeviceProperties(out props);
            }
            // 1.1
            else if (version < VkVersion.VK_VERSION_1_2)
            {
                VkPhysicalDeviceProperties2.New(out var props2);
                fixed(VkPhysicalDeviceVulkan11Properties *ptr11 = &props11)
                {
                    props2.pNext = ptr11;
                    device.GetPhysicalDeviceProperties2(&props2);
                    props = props2.Properties;
                }
            }
            // 1.2
            else
            {
                VkPhysicalDeviceProperties2.New(out var props2);
                fixed(VkPhysicalDeviceVulkan11Properties *ptr11 = &props11)
                fixed(VkPhysicalDeviceVulkan12Properties * ptr12 = &props12)
                {
                    props2.pNext = ptr11;
                    ptr11->pNext = ptr12;
                    device.GetPhysicalDeviceProperties2(&props2);
                    props        = props2.Properties;
                    ptr11->pNext = null;
                }
            }
        }
Пример #3
0
        internal PhysicalDevice(Instance instance, VkPhysicalDevice handle)
        {
            Instance = instance;
            Handle   = handle;
            unsafe
            {
                var props = Handle.GetPhysicalDeviceProperties();
                _properties = props;
                DeviceName  = Marshal.PtrToStringAnsi(new IntPtr(props.DeviceName));
                {
                    var memProps = Handle.GetPhysicalDeviceMemoryProperties();
                    var heapList = new List <MemoryHeap>((int)memProps.MemoryHeapCount);
                    for (uint i = 0; i < memProps.MemoryHeapCount; i++)
                    {
                        heapList.Add(new MemoryHeap(i, memProps.MemoryHeaps[(int)i]));
                    }
                    MemoryHeaps = heapList;
                    var typeList = new List <MemoryType>((int)memProps.MemoryTypeCount);
                    for (uint i = 0; i < memProps.MemoryTypeCount; i++)
                    {
                        typeList.Add(new MemoryType(i, heapList[(int)memProps.MemoryTypes[(int)i].HeapIndex],
                                                    (VkMemoryPropertyFlag)memProps.MemoryTypes[(int)i].PropertyFlags));
                    }
                    MemoryTypes = typeList;
                }
            }

            {
                ExtensionProperties = new List <VkExtensionProperties>(Handle.EnumerateExtensionProperties(null));
                LayerProperties     = new List <VkLayerProperties>(Handle.EnumerateLayerProperties());
                var availableExt = new HashSet <ExtensionDescriptionAttribute>();
                foreach (var ext in ExtensionProperties)
                {
                    var desc = VkExtensionDatabase.Extension(ext.ExtensionNameString);
                    if (desc != null)
                    {
                        availableExt.Add(desc);
                    }
                }
                AvailableExtensions = availableExt;
            }
        }
Пример #4
0
 internal PhysicalDeviceProperties(VkPhysicalDeviceProperties prop)
 {
     unsafe
     {
         Name = Interop.GetString(&prop.deviceName);
         byte[] uuid = new byte[16];
         for (int i = 0; i < 16; i++)
         {
             uuid[i] = (&prop.pipelineCacheUUID)[i];
         }
         PipelineCache = new Guid(uuid);
     }
     APIVersion       = prop.apiVersion;
     Type             = prop.deviceType;
     DriverVersion    = prop.driverVersion;
     VendorID         = prop.vendorID;
     DeviceID         = prop.deviceID;
     Limits           = prop.limits;
     SparseProperties = prop.sparseProperties;
 }
Пример #5
0
        public static VkSampleCountFlags ExtractMaxSampleCount(VkPhysicalDeviceProperties physical)
        {
            VkSampleCountFlags counts = physical.limits.framebufferColorSampleCounts & physical.limits.framebufferDepthSampleCounts;

            if ((counts & VkSampleCountFlags.Count64) != 0)
            {
                return(VkSampleCountFlags.Count64);
            }

            if ((counts & VkSampleCountFlags.Count32) != 0)
            {
                return(VkSampleCountFlags.Count32);
            }

            if ((counts & VkSampleCountFlags.Count16) != 0)
            {
                return(VkSampleCountFlags.Count16);
            }

            if ((counts & VkSampleCountFlags.Count8) != 0)
            {
                return(VkSampleCountFlags.Count8);
            }

            if ((counts & VkSampleCountFlags.Count4) != 0)
            {
                return(VkSampleCountFlags.Count4);
            }

            if ((counts & VkSampleCountFlags.Count2) != 0)
            {
                return(VkSampleCountFlags.Count2);
            }

            return(VkSampleCountFlags.Count1);
        }
Пример #6
0
 public static string GetDeviceName(this VkPhysicalDeviceProperties properties)
 {
     return(Interop.GetString(properties.deviceName));
 }
Пример #7
0
 public abstract void GetPhysicalDeviceProperties(out VkPhysicalDeviceProperties pProperties);
Пример #8
0
 public override void GetPhysicalDeviceProperties(out VkPhysicalDeviceProperties pProperties)
 {
     throw new NotImplementedException();
 }
Пример #9
0
        static VkPhysicalDevice PickPhysicalDevice(VkInstance instance, VkSurfaceKHR surface, out uint queueFamilyIndex)
        {
            queueFamilyIndex = 0;
            uint deviceCount = 0;

            vkEnumeratePhysicalDevices(instance, &deviceCount, null);
            Console.WriteLine($"There are {deviceCount} devices available.");
            VkPhysicalDevice[] devices = new VkPhysicalDevice[deviceCount];
            if (deviceCount <= 0)
                return(VkPhysicalDevice.Null);

            fixed(VkPhysicalDevice *ptr = &devices[0])
            vkEnumeratePhysicalDevices(instance, &deviceCount, ptr);

            VkPhysicalDeviceProperties props = new VkPhysicalDeviceProperties();


            for (int i = 0; i < deviceCount; i++)
            {
                bool badGpu           = true;
                bool onlyPickDiscrete = true;

                vkGetPhysicalDeviceProperties(devices[i], &props);

                uint familyQueueCount = 0;
                vkGetPhysicalDeviceQueueFamilyProperties(devices[i], &familyQueueCount, null);
                VkQueueFamilyProperties[] famProps = new VkQueueFamilyProperties[familyQueueCount];

                fixed(VkQueueFamilyProperties *ptr = famProps)
                vkGetPhysicalDeviceQueueFamilyProperties(devices[i], &familyQueueCount, ptr);

                VkPhysicalDeviceFeatures deviceFeatures;
                vkGetPhysicalDeviceFeatures(devices[i], &deviceFeatures);
                if (deviceFeatures.samplerAnisotropy == VkBool32.False)
                {
                    continue;
                }

                for (uint k = 0; k < familyQueueCount; k++)
                {
                    if ((int)(famProps[k].queueFlags & VkQueueFlags.Graphics) <= 0)
                    {
                        continue;
                    }
                    VkBool32 supported = VkBool32.False;
                    Assert(vkGetPhysicalDeviceSurfaceSupportKHR(devices[i], k, surface, &supported));
                    if (supported == VkBool32.False)
                    {
                        continue;
                    }

                    /*fixed (VkPhysicalDevice* ptr = &(devices[i]))
                     *  if (!GLFW.Vulkan.GetPhysicalDevicePresentationSupport((IntPtr)(&instance), (IntPtr)ptr, k))//Throws exception
                     *  {
                     *      continue;
                     *  }*/
                    if (onlyPickDiscrete && !(props.deviceType == VkPhysicalDeviceType.DiscreteGpu))
                    {
                        continue;
                    }

                    queueFamilyIndex = k;
                    badGpu           = false;
                }



                //Here we pick if its acceptable
                if (badGpu)
                {
                    continue;
                }


                Console.WriteLine($"Picking GPU: {Marshal.PtrToStringUTF8((IntPtr)props.deviceName)}");
                return(devices[i]);
            }

            throw new System.Exception("There was no GPU that filled our needs.");
        }