panvk: Move CreateDescriptorSetLayout to per-arch
authorJason Ekstrand <jason.ekstrand@collabora.com>
Wed, 27 Apr 2022 19:53:38 +0000 (14:53 -0500)
committerMarge Bot <emma+marge@anholt.net>
Thu, 12 May 2022 10:53:15 +0000 (10:53 +0000)
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16276>

src/panfrost/vulkan/panvk_descriptor_set.c
src/panfrost/vulkan/panvk_vX_descriptor_set.c

index 7b2eb71..a152bd5 100644 (file)
 
 #include "pan_bo.h"
 
-VkResult
-panvk_CreateDescriptorSetLayout(VkDevice _device,
-                                const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
-                                const VkAllocationCallbacks *pAllocator,
-                                VkDescriptorSetLayout *pSetLayout)
-{
-   VK_FROM_HANDLE(panvk_device, device, _device);
-   struct panvk_descriptor_set_layout *set_layout;
-   VkDescriptorSetLayoutBinding *bindings = NULL;
-   unsigned num_bindings = 0;
-   VkResult result;
-
-   if (pCreateInfo->bindingCount) {
-      result =
-         vk_create_sorted_bindings(pCreateInfo->pBindings,
-                                   pCreateInfo->bindingCount,
-                                   &bindings);
-      if (result != VK_SUCCESS)
-         return vk_error(device, result);
-
-      num_bindings = bindings[pCreateInfo->bindingCount - 1].binding + 1;
-   }
-
-   unsigned num_immutable_samplers = 0;
-   for (unsigned i = 0; i < pCreateInfo->bindingCount; i++) {
-      if (bindings[i].pImmutableSamplers)
-         num_immutable_samplers += bindings[i].descriptorCount;
-   }
-
-   size_t size = sizeof(*set_layout) +
-                 (sizeof(struct panvk_descriptor_set_binding_layout) *
-                  num_bindings) +
-                 (sizeof(struct panvk_sampler *) * num_immutable_samplers);
-   set_layout = vk_object_zalloc(&device->vk, NULL, size,
-                                 VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT);
-   if (!set_layout) {
-      result = VK_ERROR_OUT_OF_HOST_MEMORY;
-      goto err_free_bindings;
-   }
-
-   struct panvk_sampler **immutable_samplers =
-      (struct panvk_sampler **)((uint8_t *)set_layout + sizeof(*set_layout) +
-                                (sizeof(struct panvk_descriptor_set_binding_layout) *
-                                 num_bindings));
-
-   set_layout->flags = pCreateInfo->flags;
-   set_layout->binding_count = num_bindings;
-
-   unsigned sampler_idx = 0, tex_idx = 0, ubo_idx = 0, ssbo_idx = 0;
-   unsigned dyn_ubo_idx = 0, dyn_ssbo_idx = 0, desc_idx = 0, img_idx = 0;
-
-   for (unsigned i = 0; i < pCreateInfo->bindingCount; i++) {
-      const VkDescriptorSetLayoutBinding *binding = &bindings[i];
-      struct panvk_descriptor_set_binding_layout *binding_layout =
-         &set_layout->bindings[binding->binding];
-
-      binding_layout->type = binding->descriptorType;
-      binding_layout->array_size = binding->descriptorCount;
-      binding_layout->shader_stages = binding->stageFlags;
-      if (binding->pImmutableSamplers) {
-         binding_layout->immutable_samplers = immutable_samplers;
-         immutable_samplers += binding_layout->array_size;
-         for (unsigned j = 0; j < binding_layout->array_size; j++) {
-            VK_FROM_HANDLE(panvk_sampler, sampler, binding->pImmutableSamplers[j]);
-            binding_layout->immutable_samplers[j] = sampler;
-         }
-      }
-
-      binding_layout->desc_idx = desc_idx;
-      desc_idx += binding->descriptorCount;
-      switch (binding_layout->type) {
-      case VK_DESCRIPTOR_TYPE_SAMPLER:
-         binding_layout->sampler_idx = sampler_idx;
-         sampler_idx += binding_layout->array_size;
-         break;
-      case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
-         binding_layout->sampler_idx = sampler_idx;
-         binding_layout->tex_idx = tex_idx;
-         sampler_idx += binding_layout->array_size;
-         tex_idx += binding_layout->array_size;
-         break;
-      case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
-      case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
-         binding_layout->tex_idx = tex_idx;
-         tex_idx += binding_layout->array_size;
-         break;
-      case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
-         binding_layout->tex_idx = tex_idx;
-         tex_idx += binding_layout->array_size;
-         break;
-      case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
-         binding_layout->dyn_ubo_idx = dyn_ubo_idx;
-         dyn_ubo_idx += binding_layout->array_size;
-         break;
-      case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
-         binding_layout->ubo_idx = ubo_idx;
-         ubo_idx += binding_layout->array_size;
-         break;
-      case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
-         binding_layout->dyn_ssbo_idx = dyn_ssbo_idx;
-         dyn_ssbo_idx += binding_layout->array_size;
-         break;
-      case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
-         binding_layout->ssbo_idx = ssbo_idx;
-         ssbo_idx += binding_layout->array_size;
-         break;
-      case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
-         binding_layout->img_idx = img_idx;
-         img_idx += binding_layout->array_size;
-         break;
-      case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
-         binding_layout->img_idx = img_idx;
-         img_idx += binding_layout->array_size;
-         break;
-      default:
-         unreachable("Invalid descriptor type");
-      }
-   }
-
-   set_layout->num_descs = desc_idx;
-   set_layout->num_samplers = sampler_idx;
-   set_layout->num_textures = tex_idx;
-   set_layout->num_ubos = ubo_idx;
-   set_layout->num_dyn_ubos = dyn_ubo_idx;
-   set_layout->num_ssbos = ssbo_idx;
-   set_layout->num_dyn_ssbos = dyn_ssbo_idx;
-   set_layout->num_imgs = img_idx;
-   p_atomic_set(&set_layout->refcount, 1);
-
-   free(bindings);
-   *pSetLayout = panvk_descriptor_set_layout_to_handle(set_layout);
-   return VK_SUCCESS;
-
-err_free_bindings:
-   free(bindings);
-   return vk_error(device, result);
-}
-
 void
 panvk_descriptor_set_layout_destroy(struct panvk_device *device,
                                     struct panvk_descriptor_set_layout *layout)
index 371e196..f11f8dd 100644 (file)
 #include "pan_bo.h"
 #include "panvk_cs.h"
 
+VkResult
+panvk_per_arch(CreateDescriptorSetLayout)(VkDevice _device,
+                                          const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
+                                          const VkAllocationCallbacks *pAllocator,
+                                          VkDescriptorSetLayout *pSetLayout)
+{
+   VK_FROM_HANDLE(panvk_device, device, _device);
+   struct panvk_descriptor_set_layout *set_layout;
+   VkDescriptorSetLayoutBinding *bindings = NULL;
+   unsigned num_bindings = 0;
+   VkResult result;
+
+   if (pCreateInfo->bindingCount) {
+      result =
+         vk_create_sorted_bindings(pCreateInfo->pBindings,
+                                   pCreateInfo->bindingCount,
+                                   &bindings);
+      if (result != VK_SUCCESS)
+         return vk_error(device, result);
+
+      num_bindings = bindings[pCreateInfo->bindingCount - 1].binding + 1;
+   }
+
+   unsigned num_immutable_samplers = 0;
+   for (unsigned i = 0; i < pCreateInfo->bindingCount; i++) {
+      if (bindings[i].pImmutableSamplers)
+         num_immutable_samplers += bindings[i].descriptorCount;
+   }
+
+   size_t size = sizeof(*set_layout) +
+                 (sizeof(struct panvk_descriptor_set_binding_layout) *
+                  num_bindings) +
+                 (sizeof(struct panvk_sampler *) * num_immutable_samplers);
+   set_layout = vk_object_zalloc(&device->vk, NULL, size,
+                                 VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT);
+   if (!set_layout) {
+      result = VK_ERROR_OUT_OF_HOST_MEMORY;
+      goto err_free_bindings;
+   }
+
+   struct panvk_sampler **immutable_samplers =
+      (struct panvk_sampler **)((uint8_t *)set_layout + sizeof(*set_layout) +
+                                (sizeof(struct panvk_descriptor_set_binding_layout) *
+                                 num_bindings));
+
+   set_layout->flags = pCreateInfo->flags;
+   set_layout->binding_count = num_bindings;
+
+   unsigned sampler_idx = 0, tex_idx = 0, ubo_idx = 0, ssbo_idx = 0;
+   unsigned dyn_ubo_idx = 0, dyn_ssbo_idx = 0, desc_idx = 0, img_idx = 0;
+
+   for (unsigned i = 0; i < pCreateInfo->bindingCount; i++) {
+      const VkDescriptorSetLayoutBinding *binding = &bindings[i];
+      struct panvk_descriptor_set_binding_layout *binding_layout =
+         &set_layout->bindings[binding->binding];
+
+      binding_layout->type = binding->descriptorType;
+      binding_layout->array_size = binding->descriptorCount;
+      binding_layout->shader_stages = binding->stageFlags;
+      if (binding->pImmutableSamplers) {
+         binding_layout->immutable_samplers = immutable_samplers;
+         immutable_samplers += binding_layout->array_size;
+         for (unsigned j = 0; j < binding_layout->array_size; j++) {
+            VK_FROM_HANDLE(panvk_sampler, sampler, binding->pImmutableSamplers[j]);
+            binding_layout->immutable_samplers[j] = sampler;
+         }
+      }
+
+      binding_layout->desc_idx = desc_idx;
+      desc_idx += binding->descriptorCount;
+      switch (binding_layout->type) {
+      case VK_DESCRIPTOR_TYPE_SAMPLER:
+         binding_layout->sampler_idx = sampler_idx;
+         sampler_idx += binding_layout->array_size;
+         break;
+      case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
+         binding_layout->sampler_idx = sampler_idx;
+         binding_layout->tex_idx = tex_idx;
+         sampler_idx += binding_layout->array_size;
+         tex_idx += binding_layout->array_size;
+         break;
+      case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
+      case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
+         binding_layout->tex_idx = tex_idx;
+         tex_idx += binding_layout->array_size;
+         break;
+      case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
+         binding_layout->tex_idx = tex_idx;
+         tex_idx += binding_layout->array_size;
+         break;
+      case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
+         binding_layout->dyn_ubo_idx = dyn_ubo_idx;
+         dyn_ubo_idx += binding_layout->array_size;
+         break;
+      case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
+         binding_layout->ubo_idx = ubo_idx;
+         ubo_idx += binding_layout->array_size;
+         break;
+      case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
+         binding_layout->dyn_ssbo_idx = dyn_ssbo_idx;
+         dyn_ssbo_idx += binding_layout->array_size;
+         break;
+      case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
+         binding_layout->ssbo_idx = ssbo_idx;
+         ssbo_idx += binding_layout->array_size;
+         break;
+      case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
+         binding_layout->img_idx = img_idx;
+         img_idx += binding_layout->array_size;
+         break;
+      case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
+         binding_layout->img_idx = img_idx;
+         img_idx += binding_layout->array_size;
+         break;
+      default:
+         unreachable("Invalid descriptor type");
+      }
+   }
+
+   set_layout->num_descs = desc_idx;
+   set_layout->num_samplers = sampler_idx;
+   set_layout->num_textures = tex_idx;
+   set_layout->num_ubos = ubo_idx;
+   set_layout->num_dyn_ubos = dyn_ubo_idx;
+   set_layout->num_ssbos = ssbo_idx;
+   set_layout->num_dyn_ssbos = dyn_ssbo_idx;
+   set_layout->num_imgs = img_idx;
+   p_atomic_set(&set_layout->refcount, 1);
+
+   free(bindings);
+   *pSetLayout = panvk_descriptor_set_layout_to_handle(set_layout);
+   return VK_SUCCESS;
+
+err_free_bindings:
+   free(bindings);
+   return vk_error(device, result);
+}
+
 static VkResult
 panvk_per_arch(descriptor_set_create)(struct panvk_device *device,
                                       struct panvk_descriptor_pool *pool,