diff options
author | RĂ©mi Verschelde <rverschelde@gmail.com> | 2020-03-04 13:00:52 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-03-04 13:00:52 +0100 |
commit | 98f88a4102980e952b30da41f4887fab44ddbdd7 (patch) | |
tree | 3b02b9dce6a287946a1af46e5f02a51d998d4d79 | |
parent | 2eb8e3a40f8eb01c44b7946ee54f321d117f39e1 (diff) | |
parent | 4f3006e5ac30d00b90eb531f3bdfd4bfa0d4025b (diff) |
Merge pull request #36585 from disks86/master
Enhanced physical device selection
-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 7068f707e6..90d32c9703 100644 --- a/drivers/vulkan/vulkan_context.cpp +++ b/drivers/vulkan/vulkan_context.cpp @@ -358,8 +358,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 */ |