Mesa (master): lavapipe: implement physical device group enumeration

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Feb 19 02:40:58 UTC 2021


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

Author: Dave Airlie <airlied at redhat.com>
Date:   Fri Feb 19 10:25:13 2021 +1000

lavapipe: implement physical device group enumeration

This was missing when I added physical device groups, and
was causing crashes on win32.

Fixes: 6af87193c ("lavapipe: add basic vulkan device group support.")
Acked-by: Jesse Natalie <jenatali at microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9120>

---

 src/gallium/frontends/lavapipe/lvp_device.c | 73 +++++++++++++++++++++--------
 1 file changed, 53 insertions(+), 20 deletions(-)

diff --git a/src/gallium/frontends/lavapipe/lvp_device.c b/src/gallium/frontends/lavapipe/lvp_device.c
index 11bc75b67d9..5bcae80659e 100644
--- a/src/gallium/frontends/lavapipe/lvp_device.c
+++ b/src/gallium/frontends/lavapipe/lvp_device.c
@@ -206,35 +206,44 @@ static struct drisw_loader_funcs lvp_sw_lf = {
    .put_image2 = lvp_put_image2,
 };
 
-VKAPI_ATTR VkResult VKAPI_CALL lvp_EnumeratePhysicalDevices(
-   VkInstance                                  _instance,
-   uint32_t*                                   pPhysicalDeviceCount,
-   VkPhysicalDevice*                           pPhysicalDevices)
+static VkResult
+lvp_enumerate_physical_devices(struct lvp_instance *instance)
 {
-   LVP_FROM_HANDLE(lvp_instance, instance, _instance);
    VkResult result;
 
-   if (instance->physicalDeviceCount < 0) {
-
-      /* sw only for now */
-      instance->num_devices = pipe_loader_sw_probe(NULL, 0);
+   if (instance->physicalDeviceCount != -1)
+      return VK_SUCCESS;
 
-      assert(instance->num_devices == 1);
+   /* sw only for now */
+   instance->num_devices = pipe_loader_sw_probe(NULL, 0);
 
-      pipe_loader_sw_probe_dri(&instance->devs, &lvp_sw_lf);
+   assert(instance->num_devices == 1);
 
+   pipe_loader_sw_probe_dri(&instance->devs, &lvp_sw_lf);
 
-      result = lvp_physical_device_init(&instance->physicalDevice,
-                                        instance, &instance->devs[0]);
-      if (result == VK_ERROR_INCOMPATIBLE_DRIVER) {
-         instance->physicalDeviceCount = 0;
-      } else if (result == VK_SUCCESS) {
-         instance->physicalDeviceCount = 1;
-      } else {
-         return result;
-      }
+   result = lvp_physical_device_init(&instance->physicalDevice,
+                                     instance, &instance->devs[0]);
+   if (result == VK_ERROR_INCOMPATIBLE_DRIVER) {
+      instance->physicalDeviceCount = 0;
+   } else if (result == VK_SUCCESS) {
+      instance->physicalDeviceCount = 1;
    }
 
+   return result;
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL lvp_EnumeratePhysicalDevices(
+   VkInstance                                  _instance,
+   uint32_t*                                   pPhysicalDeviceCount,
+   VkPhysicalDevice*                           pPhysicalDevices)
+{
+   LVP_FROM_HANDLE(lvp_instance, instance, _instance);
+   VkResult result;
+
+   result = lvp_enumerate_physical_devices(instance);
+   if (result != VK_SUCCESS)
+      return result;
+
    if (!pPhysicalDevices) {
       *pPhysicalDeviceCount = instance->physicalDeviceCount;
    } else if (*pPhysicalDeviceCount >= 1) {
@@ -247,6 +256,30 @@ VKAPI_ATTR VkResult VKAPI_CALL lvp_EnumeratePhysicalDevices(
    return VK_SUCCESS;
 }
 
+VKAPI_ATTR VkResult VKAPI_CALL lvp_EnumeratePhysicalDeviceGroups(
+   VkInstance                                 _instance,
+   uint32_t*                                   pPhysicalDeviceGroupCount,
+   VkPhysicalDeviceGroupProperties*            pPhysicalDeviceGroupProperties)
+{
+   LVP_FROM_HANDLE(lvp_instance, instance, _instance);
+   VK_OUTARRAY_MAKE_TYPED(VkPhysicalDeviceGroupProperties, out,
+                          pPhysicalDeviceGroupProperties,
+                          pPhysicalDeviceGroupCount);
+
+   VkResult result = lvp_enumerate_physical_devices(instance);
+   if (result != VK_SUCCESS)
+      return result;
+
+   vk_outarray_append_typed(VkPhysicalDeviceGroupProperties, &out, p) {
+      p->physicalDeviceCount = 1;
+      memset(p->physicalDevices, 0, sizeof(p->physicalDevices));
+      p->physicalDevices[0] = lvp_physical_device_to_handle(&instance->physicalDevice);
+      p->subsetAllocation = false;
+   }
+
+   return vk_outarray_status(&out);
+}
+
 VKAPI_ATTR void VKAPI_CALL lvp_GetPhysicalDeviceFeatures(
    VkPhysicalDevice                            physicalDevice,
    VkPhysicalDeviceFeatures*                   pFeatures)



More information about the mesa-commit mailing list