Mesa (master): vk-device-select: add device group support

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Sun Jan 24 21:22:42 UTC 2021


Module: Mesa
Branch: master
Commit: c196ffaca6d927e213d1c39ec9eed611fd01e2e1
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=c196ffaca6d927e213d1c39ec9eed611fd01e2e1

Author: Dave Airlie <airlied at redhat.com>
Date:   Mon Jan 18 15:12:49 2021 +1000

vk-device-select: add device group support

This just sorts CPU device groups last in case an app tries to
use the first device group.

Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8551>

---

 .../device-select-layer/device_select_layer.c      | 60 ++++++++++++++++++++--
 1 file changed, 57 insertions(+), 3 deletions(-)

diff --git a/src/vulkan/device-select-layer/device_select_layer.c b/src/vulkan/device-select-layer/device_select_layer.c
index c381ac33fd1..cdd92685515 100644
--- a/src/vulkan/device-select-layer/device_select_layer.c
+++ b/src/vulkan/device-select-layer/device_select_layer.c
@@ -474,11 +474,65 @@ static VkResult device_select_EnumeratePhysicalDevices(VkInstance instance,
 }
 
 static VkResult device_select_EnumeratePhysicalDeviceGroups(VkInstance instance,
-							    uint32_t* pPhysicalDeviceGroupCount,
-							    VkPhysicalDeviceGroupProperties *pPhysicalDeviceGroups)
+                                                            uint32_t* pPhysicalDeviceGroupCount,
+                                                            VkPhysicalDeviceGroupProperties *pPhysicalDeviceGroups)
 {
    struct instance_info *info = device_select_layer_get_instance(instance);
-   VkResult result = info->EnumeratePhysicalDeviceGroups(instance, pPhysicalDeviceGroupCount, pPhysicalDeviceGroups);
+   uint32_t physical_device_group_count = 0;
+   uint32_t selected_physical_device_group_count = 0;
+   VkResult result = info->EnumeratePhysicalDeviceGroups(instance, &physical_device_group_count, NULL);
+   VK_OUTARRAY_MAKE(out, pPhysicalDeviceGroups, pPhysicalDeviceGroupCount);
+
+   if (result != VK_SUCCESS)
+      return result;
+
+   VkPhysicalDeviceGroupProperties *physical_device_groups = (VkPhysicalDeviceGroupProperties*)calloc(sizeof(VkPhysicalDeviceGroupProperties), physical_device_group_count);
+   VkPhysicalDeviceGroupProperties *selected_physical_device_groups = (VkPhysicalDeviceGroupProperties*)calloc(sizeof(VkPhysicalDeviceGroupProperties), physical_device_group_count);
+
+   if (!physical_device_groups || !selected_physical_device_groups) {
+      result = VK_ERROR_OUT_OF_HOST_MEMORY;
+      goto out;
+   }
+
+   result = info->EnumeratePhysicalDeviceGroups(instance, &physical_device_group_count, physical_device_groups);
+   if (result != VK_SUCCESS)
+      goto out;
+
+   /* just sort groups with CPU devices to the end? - assume nobody will mix these */
+   int num_gpu_groups = 0;
+   int num_cpu_groups = 0;
+   selected_physical_device_group_count = physical_device_group_count;
+   for (unsigned i = 0; i < physical_device_group_count; i++) {
+      bool group_has_cpu_device = false;
+      for (unsigned j = 0; j < physical_device_groups[i].physicalDeviceCount; j++) {
+         VkPhysicalDevice physical_device = physical_device_groups[i].physicalDevices[j];
+         VkPhysicalDeviceProperties2KHR properties = (VkPhysicalDeviceProperties2KHR){
+            .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR
+         };
+         info->GetPhysicalDeviceProperties(physical_device, &properties.properties);
+         group_has_cpu_device = properties.properties.deviceType == VK_PHYSICAL_DEVICE_TYPE_CPU;
+      }
+
+      if (group_has_cpu_device) {
+         selected_physical_device_groups[physical_device_group_count - num_cpu_groups - 1] = physical_device_groups[i];
+         num_cpu_groups++;
+      } else {
+         selected_physical_device_groups[num_gpu_groups] = physical_device_groups[i];
+         num_gpu_groups++;
+      }
+   }
+
+   assert(result == VK_SUCCESS);
+
+   for (unsigned i = 0; i < selected_physical_device_group_count; i++) {
+      vk_outarray_append(&out, ent) {
+         *ent = selected_physical_device_groups[i];
+      }
+   }
+   result = vk_outarray_status(&out);
+out:
+   free(physical_device_groups);
+   free(selected_physical_device_groups);
    return result;
 }
 



More information about the mesa-commit mailing list