diff options
author | Christopher Joseph Dean Schaefer <disks86@gmail.com> | 2020-02-26 20:34:02 -0500 |
---|---|---|
committer | Christopher Joseph Dean Schaefer <disks86@gmail.com> | 2020-02-28 21:02:29 -0500 |
commit | 4f3006e5ac30d00b90eb531f3bdfd4bfa0d4025b (patch) | |
tree | e6f1b8308effd14f9a5738d2036b5d86661ffe2e /drivers/vulkan/vulkan_context.cpp | |
parent | f64342fca9f86d8d929257bf64fa7f3767987e61 (diff) |
Enhanced physical device selection to use device type and available memory in relation to issue #35397
Diffstat (limited to 'drivers/vulkan/vulkan_context.cpp')
-rw-r--r-- | drivers/vulkan/vulkan_context.cpp | 35 |
1 files changed, 33 insertions, 2 deletions
diff --git a/drivers/vulkan/vulkan_context.cpp b/drivers/vulkan/vulkan_context.cpp index 51d66cf97e..3a60d7502a 100644 --- a/drivers/vulkan/vulkan_context.cpp +++ b/drivers/vulkan/vulkan_context.cpp @@ -359,8 +359,39 @@ Error VulkanContext::_create_physical_device() { free(physical_devices); ERR_FAIL_V(ERR_CANT_CREATE); } - /* for now, just grab the first physical device */ - gpu = physical_devices[0]; + + /*Find the first discrete GPU with the most VRAM.*/ + { + print_line("Selecting primary GPU."); + VkPhysicalDeviceProperties device_properties; + VkPhysicalDeviceMemoryProperties memory_properties; + gpu = physical_devices[0]; + uint32_t largest_vram_size = 0; + VkPhysicalDeviceType gpu_type = VK_PHYSICAL_DEVICE_TYPE_OTHER; + for (uint32_t i = 0; i < gpu_count; i++) { + vkGetPhysicalDeviceProperties(physical_devices[i], &device_properties); + + /*Skip virtual and CPU devices for now.*/ + if (device_properties.deviceType > VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU) { + continue; + } + + vkGetPhysicalDeviceMemoryProperties(physical_devices[i], &memory_properties); + + /*Total all heaps in case of 3GB+1GB configurations and similar.*/ + uint32_t memory_size = 0; + for (uint32_t j = 0; j < memory_properties.memoryHeapCount; j++) { + memory_size += memory_properties.memoryHeaps[j].size; + } + + if ((device_properties.deviceType >= gpu_type) || (device_properties.deviceType == gpu_type && memory_size > largest_vram_size)) { + gpu = physical_devices[i]; + gpu_type = device_properties.deviceType; + largest_vram_size = memory_size; + print_line(device_properties.deviceName); + } + } + } free(physical_devices); /* Look for device extensions */ |