vulkan: Fix EnumeratePhysicalDeviceGroups()
Fixes CTS failure in dEQP-VK.api.info.instance.physical_device_groups on
Eve (Pixelbook) with Pi.
The Vulkan spec requires that vkEnumeratePhysicalDeviceGroups return
VK_INCOMPLETE when (a) pPhysicalDeviceGroupProperties is not NULL and
(b) *pPhysicalDeviceGroupCount is less than the actual number of groups.
Bug libvulkan/driver.cpp:EnumeratePhysicalDeviceGroups() returned
VK_SUCCESS when (pPhysicalDeviceGroupProperties != NULL &&
*pPhysicalDeviceGroupCount == 0) regardless of the actual number of
groups.
V2: Simplify according to zzyiwei@'s suggestion
Bug: b/114614186
Test: dEQP-VK.api.info.instance.physical_device_groups on eve-arcnext
Change-Id: Ia3067e9d8125ff2b708a4fa674e8283a1f17ba0b
diff --git a/vulkan/libvulkan/driver.cpp b/vulkan/libvulkan/driver.cpp
index 56bc35e..fdbd969 100644
--- a/vulkan/libvulkan/driver.cpp
+++ b/vulkan/libvulkan/driver.cpp
@@ -1165,27 +1165,28 @@
result = EnumeratePhysicalDevices(instance, &device_count, nullptr);
if (result < 0)
return result;
+
if (!pPhysicalDeviceGroupProperties) {
*pPhysicalDeviceGroupCount = device_count;
return result;
}
- device_count = std::min(device_count, *pPhysicalDeviceGroupCount);
if (!device_count) {
*pPhysicalDeviceGroupCount = 0;
return result;
}
+ device_count = std::min(device_count, *pPhysicalDeviceGroupCount);
+ if (!device_count)
+ return VK_INCOMPLETE;
android::Vector<VkPhysicalDevice> devices;
devices.resize(device_count);
-
+ *pPhysicalDeviceGroupCount = device_count;
result = EnumeratePhysicalDevices(instance, &device_count,
devices.editArray());
if (result < 0)
return result;
- devices.resize(device_count);
- *pPhysicalDeviceGroupCount = device_count;
for (uint32_t i = 0; i < device_count; ++i) {
pPhysicalDeviceGroupProperties[i].physicalDeviceCount = 1;
pPhysicalDeviceGroupProperties[i].physicalDevices[0] = devices[i];