[Mesa-dev] [PATCH] anv: fix enumeration of properties

Emil Velikov emil.l.velikov at gmail.com
Thu Oct 6 13:12:27 UTC 2016


From: Emil Velikov <emil.velikov at collabora.com>

Driver should enumerate only up-to min2(num_available, num_requested)
properties and return VK_INCOMPLETE if the # of requested props is
smaller than the ones available.

Presently we assert out in such cases.

Inspired by a similar fix for RADV.

Should fix: dEQP-VK.api.info.device.extensions
Signed-off-by: Emil Velikov <emil.velikov at collabora.com>
---
 src/intel/vulkan/anv_device.c | 20 ++++++++++++++------
 1 file changed, 14 insertions(+), 6 deletions(-)

diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c
index c7b9979..497bf9f 100644
--- a/src/intel/vulkan/anv_device.c
+++ b/src/intel/vulkan/anv_device.c
@@ -1003,15 +1003,19 @@ VkResult anv_EnumerateInstanceExtensionProperties(
     uint32_t*                                   pPropertyCount,
     VkExtensionProperties*                      pProperties)
 {
+   unsigned i;
+
    if (pProperties == NULL) {
       *pPropertyCount = ARRAY_SIZE(global_extensions);
       return VK_SUCCESS;
    }
 
-   assert(*pPropertyCount >= ARRAY_SIZE(global_extensions));
+   for (i = 0; i < MIN2(*pPropertyCount, ARRAY_SIZE(global_extensions)); i++)
+      memcpy(&pProperties[i], &global_extensions[i], sizeof(VkExtensionProperties));
 
-   *pPropertyCount = ARRAY_SIZE(global_extensions);
-   memcpy(pProperties, global_extensions, sizeof(global_extensions));
+   *pPropertyCount = i;
+   if (i < ARRAY_SIZE(global_extensions))
+      return VK_INCOMPLETE;
 
    return VK_SUCCESS;
 }
@@ -1022,15 +1026,19 @@ VkResult anv_EnumerateDeviceExtensionProperties(
     uint32_t*                                   pPropertyCount,
     VkExtensionProperties*                      pProperties)
 {
+   unsigned i;
+
    if (pProperties == NULL) {
       *pPropertyCount = ARRAY_SIZE(device_extensions);
       return VK_SUCCESS;
    }
 
-   assert(*pPropertyCount >= ARRAY_SIZE(device_extensions));
+   for (i = 0; i < MIN2(*pPropertyCount, ARRAY_SIZE(device_extensions)); i++)
+      memcpy(&pProperties[i], &device_extensions[i], sizeof(VkExtensionProperties));
 
-   *pPropertyCount = ARRAY_SIZE(device_extensions);
-   memcpy(pProperties, device_extensions, sizeof(device_extensions));
+   *pPropertyCount = i;
+   if (i < ARRAY_SIZE(device_extensions))
+      return VK_INCOMPLETE;
 
    return VK_SUCCESS;
 }
-- 
2.9.3



More information about the mesa-dev mailing list