anv: fix descriptor limits on gen8
authorArcady Goldmints-Orlov <agoldmints@igalia.com>
Thu, 12 Sep 2019 19:20:22 +0000 (14:20 -0500)
committerArcady Goldmints-Orlov <agoldmints@igalia.com>
Thu, 19 Sep 2019 14:10:40 +0000 (09:10 -0500)
Later generations support bindless for samplers, images, and buffers and
thus per-stage descriptors are not limited by the binding table size.
However, gen8 doesn't support bindless images and thus needs to report a
lower per-stage limit so that all combinations of descriptors that fit
within the advertised limits are reported as supported by
vkGetDescriptorSetLayoutSupport.

Fixes test dEQP-VK.api.maintenance3_check.descriptor_set
Fixes: 79fb0d27f3 ("anv: Implement SSBOs bindings with GPU addresses in the descriptor BO")
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
src/intel/vulkan/anv_descriptor_set.c
src/intel/vulkan/anv_device.c

index 8491436f14a5020b51bd68aadc37be7641accd5d..23d6ddede5b311a5a71d690803aae671de15e14c 100644 (file)
@@ -306,7 +306,7 @@ void anv_GetDescriptorSetLayoutSupport(
       /* Our maximum binding table size is 240 and we need to reserve 8 for
        * render targets.
        */
-      if (surface_count[s] >= MAX_BINDING_TABLE_SIZE - MAX_RTS)
+      if (surface_count[s] > MAX_BINDING_TABLE_SIZE - MAX_RTS)
          supported = false;
    }
 
index 3d0198958f308ea903a12161cc4b782823f36683..bb1834e18677180851607886d78a0c524a21fdb2 100644 (file)
@@ -1277,10 +1277,12 @@ void anv_GetPhysicalDeviceProperties(
    const uint32_t max_images =
       pdevice->has_bindless_images ? UINT16_MAX : MAX_IMAGES;
 
-   /* The moment we have anything bindless, claim a high per-stage limit */
+   /* If we can use bindless for everything, claim a high per-stage limit,
+    * otherwise use the binding table size, minus the slots reserved for
+    * render targets and one slot for the descriptor buffer. */
    const uint32_t max_per_stage =
-      pdevice->has_a64_buffer_access ? UINT32_MAX :
-                                       MAX_BINDING_TABLE_SIZE - MAX_RTS;
+      pdevice->has_bindless_images && pdevice->has_a64_buffer_access
+      ? UINT32_MAX : MAX_BINDING_TABLE_SIZE - MAX_RTS - 1;
 
    const uint32_t max_workgroup_size = 32 * devinfo->max_cs_threads;