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