Mesa (main): Refactor the descriptor enums to be extensible

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Jul 7 02:45:46 UTC 2022


Module: Mesa
Branch: main
Commit: 78e637f857d0a58a7e35371cf3f7b8c2d17fbf1a
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=78e637f857d0a58a7e35371cf3f7b8c2d17fbf1a

Author: Dawn Han <dawnhan at google.com>
Date:   Mon Jun 27 19:23:22 2022 +0000

Refactor the descriptor enums to be extensible

Signed-off-by: Dawn Han <dawnhan at google.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16699>

---

 src/virtio/vulkan/vn_descriptor_set.c | 50 ++++++++++++++++++++++++++++++-----
 src/virtio/vulkan/vn_descriptor_set.h | 26 ++++++++++++++----
 2 files changed, 64 insertions(+), 12 deletions(-)

diff --git a/src/virtio/vulkan/vn_descriptor_set.c b/src/virtio/vulkan/vn_descriptor_set.c
index 0c428b57ce6..9da279f87d0 100644
--- a/src/virtio/vulkan/vn_descriptor_set.c
+++ b/src/virtio/vulkan/vn_descriptor_set.c
@@ -62,6 +62,40 @@ vn_descriptor_set_destroy(struct vn_device *dev,
    vk_free(alloc, set);
 }
 
+/* Mapping VkDescriptorType to array index */
+static enum vn_descriptor_type
+vn_descriptor_type_index(VkDescriptorType type)
+{
+   switch (type) {
+   case VK_DESCRIPTOR_TYPE_SAMPLER:
+      return VN_DESCRIPTOR_TYPE_SAMPLER;
+   case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
+      return VN_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
+   case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
+      return VN_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
+   case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
+      return VN_DESCRIPTOR_TYPE_STORAGE_IMAGE;
+   case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
+      return VN_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
+   case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
+      return VN_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
+   case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
+      return VN_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
+   case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
+      return VN_DESCRIPTOR_TYPE_STORAGE_BUFFER;
+   case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
+      return VN_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
+   case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
+      return VN_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC;
+   case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
+      return VN_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
+   default:
+      break;
+   }
+
+   unreachable("bad VkDescriptorType");
+}
+
 /* descriptor set layout commands */
 
 void
@@ -268,11 +302,11 @@ vn_CreateDescriptorPool(VkDevice device,
 
    for (uint32_t i = 0; i < pCreateInfo->poolSizeCount; i++) {
       const VkDescriptorPoolSize *pool_size = &pCreateInfo->pPoolSizes[i];
+      const uint32_t type_index = vn_descriptor_type_index(pool_size->type);
 
-      assert(pool_size->type < VN_NUM_DESCRIPTOR_TYPES);
+      assert(type_index < VN_NUM_DESCRIPTOR_TYPES);
 
-      pool->max.descriptor_counts[pool_size->type] +=
-         pool_size->descriptorCount;
+      pool->max.descriptor_counts[type_index] += pool_size->descriptorCount;
    }
 
    list_inithead(&pool->descriptor_sets);
@@ -341,10 +375,11 @@ vn_descriptor_pool_alloc_descriptors(
                                 ? last_binding_descriptor_count
                                 : layout->bindings[i].count;
 
-      pool->used.descriptor_counts[type] += count;
+      const uint32_t type_index = vn_descriptor_type_index(type);
+      pool->used.descriptor_counts[type_index] += count;
 
-      if (pool->used.descriptor_counts[type] >
-          pool->max.descriptor_counts[type]) {
+      if (pool->used.descriptor_counts[type_index] >
+          pool->max.descriptor_counts[type_index]) {
          /* restore pool state before this allocation */
          pool->used = recovery;
          return false;
@@ -368,7 +403,8 @@ vn_descriptor_pool_free_descriptors(
                                 ? last_binding_descriptor_count
                                 : layout->bindings[i].count;
 
-      pool->used.descriptor_counts[layout->bindings[i].type] -= count;
+      pool->used.descriptor_counts[vn_descriptor_type_index(
+         layout->bindings[i].type)] -= count;
    }
 
    --pool->used.set_count;
diff --git a/src/virtio/vulkan/vn_descriptor_set.h b/src/virtio/vulkan/vn_descriptor_set.h
index 240a52d48dd..a06d79924cd 100644
--- a/src/virtio/vulkan/vn_descriptor_set.h
+++ b/src/virtio/vulkan/vn_descriptor_set.h
@@ -13,12 +13,28 @@
 
 #include "vn_common.h"
 
-/* TODO accommodate new discrete type enums by:
- * 1. increase the number of types here
- * 2. add a helper to map to continuous array index
- */
-#define VN_NUM_DESCRIPTOR_TYPES (VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT + 1)
+enum vn_descriptor_type {
+   VN_DESCRIPTOR_TYPE_SAMPLER,
+   VN_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
+   VN_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
+   VN_DESCRIPTOR_TYPE_STORAGE_IMAGE,
+   VN_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER,
+   VN_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER,
+   VN_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
+   VN_DESCRIPTOR_TYPE_STORAGE_BUFFER,
+   VN_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC,
+   VN_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC,
+   VN_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,
+
+   /* add new enum types before this line */
+   VN_NUM_DESCRIPTOR_TYPES,
+};
 
+/* TODO refactor struct to track enum vn_descriptor_type type.
+ * On VkDescriptorSetLayout creation. When we check against
+ * VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK, it will be against
+ * VN_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK instead
+ */
 struct vn_descriptor_set_layout_binding {
    VkDescriptorType type;
    uint32_t count;



More information about the mesa-commit mailing list