From c0c03f29e0b7680a5d62b151a92e1e66e456428c Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Fri, 19 Feb 2021 10:25:13 +1000 Subject: [PATCH] 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 Part-of: --- 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,6 +206,32 @@ static struct drisw_loader_funcs lvp_sw_lf = { .put_image2 = lvp_put_image2, }; +static VkResult +lvp_enumerate_physical_devices(struct lvp_instance *instance) +{ + VkResult result; + + if (instance->physicalDeviceCount != -1) + return VK_SUCCESS; + + /* sw only for now */ + instance->num_devices = pipe_loader_sw_probe(NULL, 0); + + 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; + } + + return result; +} + VKAPI_ATTR VkResult VKAPI_CALL lvp_EnumeratePhysicalDevices( VkInstance _instance, uint32_t* pPhysicalDeviceCount, @@ -214,26 +240,9 @@ VKAPI_ATTR VkResult VKAPI_CALL lvp_EnumeratePhysicalDevices( 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); - - 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_enumerate_physical_devices(instance); + if (result != VK_SUCCESS) + return result; if (!pPhysicalDevices) { *pPhysicalDeviceCount = instance->physicalDeviceCount; @@ -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)