tu: Don't preload variable-count descriptors
authorConnor Abbott <cwabbott0@gmail.com>
Tue, 26 Jul 2022 10:20:16 +0000 (12:20 +0200)
committerMarge Bot <emma+marge@anholt.net>
Wed, 14 Sep 2022 12:46:01 +0000 (12:46 +0000)
We don't know how many descriptors will actually be valid, which could
lead to preloading descriptors out-of-bounds of the descriptor size.
This was leading to GPU hangs on some tests once we enabled inline
uniforms.

Fixes: d9fcf5de55a ("turnip: Enable nonuniform descriptor indexing")
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17960>

src/freedreno/vulkan/tu_pipeline.c

index e5d15bb..d2391d1 100644 (file)
@@ -150,6 +150,15 @@ tu6_emit_load_state(struct tu_pipeline *pipeline,
           */
          VkShaderStageFlags stages = pipeline->active_stages & binding->shader_stages;
          unsigned count = binding->array_size;
+
+         /* If this is a variable-count descriptor, then the array_size is an
+          * upper bound on the size, but we don't know how many descriptors
+          * will actually be used. Therefore we can't pre-load them here.
+          */
+         if (j == set_layout->binding_count - 1 &&
+             set_layout->has_variable_descriptors)
+            continue;
+
          if (count == 0 || stages == 0)
             continue;
          switch (binding->type) {