private void PickPhysicalDevice() { uint deviceCount = 0; Helpers.CheckErrors(VulkanNative.vkEnumeratePhysicalDevices(instance, &deviceCount, null)); if (deviceCount == 0) { throw new Exception("Failed to find GPUs with Vulkan support!"); } VkPhysicalDevice *devices = stackalloc VkPhysicalDevice[(int)deviceCount]; Helpers.CheckErrors(VulkanNative.vkEnumeratePhysicalDevices(instance, &deviceCount, devices)); for (int i = 0; i < deviceCount; i++) { var device = devices[i]; if (this.IsPhysicalDeviceSuitable(device)) { this.physicalDevice = device; break; } } if (this.physicalDevice == default) { throw new Exception("failed to find a suitable GPU!"); } }
private void CreatePhysicalDevice() { uint deviceCount = 0; VulkanNative.vkEnumeratePhysicalDevices(this.vkInstance, &deviceCount, null); if (deviceCount == 0) { throw new InvalidOperationException("No physical devices exist."); } VkPhysicalDevice *physicalDevicesPtr = stackalloc VkPhysicalDevice[(int)deviceCount]; VulkanNative.vkEnumeratePhysicalDevices(this.vkInstance, &deviceCount, physicalDevicesPtr); this.vkPhysicalDevice = physicalDevicesPtr[0]; }
internal List <VkPhysicalDevice> GetPhysicalDevice() { // Physical Device uint Count = 0; vkEnumeratePhysicalDevices(DefaultInstance.NativeInstance, &Count, null); // Enumerate devices VkPhysicalDevice *physicalDevices = stackalloc VkPhysicalDevice[(int)Count]; vkEnumeratePhysicalDevices(DefaultInstance.NativeInstance, &Count, physicalDevices); List <VkPhysicalDevice> vkPhysicalDevices = new List <VkPhysicalDevice>(); for (int i = 0; i < Count; i++) { vkPhysicalDevices.Add(physicalDevices[i]); } return(vkPhysicalDevices); }
private VkPhysicalDevice PickPhysicalDevice() { uint deviceCount; VK.EnumeratePhysicalDevices(Instance, &deviceCount, null); if (deviceCount > 0) { VkPhysicalDevice *devices = stackalloc VkPhysicalDevice[(int)deviceCount]; VkPhysicalDevice *valid = stackalloc VkPhysicalDevice[(int)deviceCount]; VK.EnumeratePhysicalDevices(Instance, &deviceCount, devices); // find valid devices int validCount = 0; for (int i = 0; i < deviceCount; i++) { if (IsValidPhysicalDevice(devices[i])) { valid[validCount++] = devices[i]; } } // find the best device if (validCount > 0) { for (int i = 0; i < validCount; i++) { VkPhysicalDeviceProperties properties; VK.GetPhysicalDeviceProperties(devices[i], &properties); if (properties.deviceType == VkPhysicalDeviceType.DiscreteGpu) { return(valid[i]); } } return(valid[0]); } } throw new Exception("Failed to find any GPUs that support Vulkan"); bool IsValidPhysicalDevice(VkPhysicalDevice device) { if (!TryGetQueueFamilyIndex(device, VkQueueFlags.GraphicsBit, out _)) { return(false); } uint extensionCount; VK.EnumerateDeviceExtensionProperties(device, null, &extensionCount, null); VkExtensionProperties *availableExtensions = stackalloc VkExtensionProperties[(int)extensionCount]; VK.EnumerateDeviceExtensionProperties(device, null, &extensionCount, availableExtensions); foreach (var str in deviceExtensions) { var hasExtension = false; for (int j = 0; j < extensionCount && !hasExtension; j++) { if (str == VK.STRING(availableExtensions[j].extensionName)) { hasExtension = true; } } if (!hasExtension) { return(false); } } return(true); } }