anv/descriptor_set: Ensure that bindings are always in increasing order
authorJason Ekstrand <jason.ekstrand@intel.com>
Mon, 6 Jun 2016 16:15:03 +0000 (09:15 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Fri, 10 Jun 2016 16:43:03 +0000 (09:43 -0700)
Since applications are allowed to specify some set of bindings which need
not be dense they also need not be in order.  For most things, this doesn't
matter, but it could result getting the wrong dynamic offsets. This adds a
quick-and-dirty sort to ensure that everything is always in increasing
order of binding index.

Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
Cc: "12.0" <mesa-stable@lists.freedesktop.org>
src/intel/vulkan/anv_descriptor_set.c

index c977318a058b3e97990dcd4a958c69fa008ca112..448ae0e2f31070d8622b66e736205583cfe1d8d2 100644 (file)
@@ -89,6 +89,19 @@ VkResult anv_CreateDescriptorSetLayout(
    for (uint32_t j = 0; j < pCreateInfo->bindingCount; j++) {
       const VkDescriptorSetLayoutBinding *binding = &pCreateInfo->pBindings[j];
       uint32_t b = binding->binding;
+      /* We temporarily store the pointer to the binding in the
+       * immutable_samplers pointer.  This provides us with a quick-and-dirty
+       * way to sort the bindings by binding number.
+       */
+      set_layout->binding[b].immutable_samplers = (void *)binding;
+   }
+
+   for (uint32_t b = 0; b <= max_binding; b++) {
+      const VkDescriptorSetLayoutBinding *binding =
+         (void *)set_layout->binding[b].immutable_samplers;
+
+      if (binding == NULL)
+         continue;
 
       assert(binding->descriptorCount > 0);
 #ifndef NDEBUG