Mesa (staging/21.0): lavapipe: sort bindings before creating descriptor set

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Sat Apr 10 04:35:36 UTC 2021


Module: Mesa
Branch: staging/21.0
Commit: 662cef76da19954ae479b84bbda7d0ccc8f5b9a7
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=662cef76da19954ae479b84bbda7d0ccc8f5b9a7

Author: Dave Airlie <airlied at redhat.com>
Date:   Wed Mar  3 06:50:00 2021 +1000

lavapipe: sort bindings before creating descriptor set

This ensures the dynamic offsets are correct

Fixes: b38879f8c5f5 ("vallium: initial import of the vulkan frontend")
Reviewed-By: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10144>

---

 .../frontends/lavapipe/lvp_descriptor_set.c        | 34 ++++++++++++++++++++--
 1 file changed, 32 insertions(+), 2 deletions(-)

diff --git a/src/gallium/frontends/lavapipe/lvp_descriptor_set.c b/src/gallium/frontends/lavapipe/lvp_descriptor_set.c
index 8cbd77c3036..6e051a2a0db 100644
--- a/src/gallium/frontends/lavapipe/lvp_descriptor_set.c
+++ b/src/gallium/frontends/lavapipe/lvp_descriptor_set.c
@@ -25,6 +25,28 @@
 #include "vk_util.h"
 #include "u_math.h"
 
+static int binding_compare(const void* av, const void *bv)
+{
+   const VkDescriptorSetLayoutBinding *a = (const VkDescriptorSetLayoutBinding*)av;
+   const VkDescriptorSetLayoutBinding *b = (const VkDescriptorSetLayoutBinding*)bv;
+ 
+   return (a->binding < b->binding) ? -1 : (a->binding > b->binding) ? 1 : 0;
+}
+ 
+static VkDescriptorSetLayoutBinding *
+create_sorted_bindings(const VkDescriptorSetLayoutBinding *bindings, unsigned count) {
+   VkDescriptorSetLayoutBinding *sorted_bindings = malloc(MAX2(count * sizeof(VkDescriptorSetLayoutBinding), 1));
+   if (!sorted_bindings)
+      return NULL;
+ 
+   if (count) {
+      memcpy(sorted_bindings, bindings, count * sizeof(VkDescriptorSetLayoutBinding));
+      qsort(sorted_bindings, count, sizeof(VkDescriptorSetLayoutBinding), binding_compare);
+   }
+ 
+   return sorted_bindings;
+}
+
 VkResult lvp_CreateDescriptorSetLayout(
     VkDevice                                    _device,
     const VkDescriptorSetLayoutCreateInfo*      pCreateInfo,
@@ -62,10 +84,18 @@ VkResult lvp_CreateDescriptorSetLayout(
    set_layout->shader_stages = 0;
    set_layout->size = 0;
 
-   uint32_t dynamic_offset_count = 0;
+   VkDescriptorSetLayoutBinding *bindings = create_sorted_bindings(pCreateInfo->pBindings,
+                                   pCreateInfo->bindingCount);
+   if (!bindings) {
+      vk_object_base_finish(&set_layout->base);
+      vk_free2(&device->vk.alloc, pAllocator, set_layout);
+      return vk_error(device->instance, VK_ERROR_OUT_OF_HOST_MEMORY);
+   }
 
+
+   uint32_t dynamic_offset_count = 0;
    for (uint32_t j = 0; j < pCreateInfo->bindingCount; j++) {
-      const VkDescriptorSetLayoutBinding *binding = &pCreateInfo->pBindings[j];
+      const VkDescriptorSetLayoutBinding *binding = bindings + j;
       uint32_t b = binding->binding;
 
       set_layout->binding[b].array_size = binding->descriptorCount;



More information about the mesa-commit mailing list