blob: c4592dbb7eff5b9cae6fe233d6cacfeafabe3f2b [file] [log] [blame]
From 70b03e96f9c7b5a8cbe6478917d239b32602147a Mon Sep 17 00:00:00 2001
From: Yiwei Zhang <zzyiwei@chromium.org>
Date: Wed, 25 Aug 2021 01:17:58 +0000
Subject: [PATCH 6/8] venus: descriptor set to track descriptor count of last
binding
Track the descriptor count to be used instead of the variable descriptor
count to avoid duplicate checks in later accounting.
Signed-off-by: Yiwei Zhang <zzyiwei@chromium.org>
Reviewed-by: Chia-I Wu <olvaffe@gmail.com>
Reviewed-by: Ryan Neph <ryanneph@google.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12501>
---
src/virtio/vulkan/vn_descriptor_set.c | 42 +++++++++++++++++++++++----
src/virtio/vulkan/vn_descriptor_set.h | 2 ++
2 files changed, 39 insertions(+), 5 deletions(-)
diff --git a/src/virtio/vulkan/vn_descriptor_set.c b/src/virtio/vulkan/vn_descriptor_set.c
index 4b104e1aaf4..dbf9a879996 100644
--- a/src/virtio/vulkan/vn_descriptor_set.c
+++ b/src/virtio/vulkan/vn_descriptor_set.c
@@ -312,12 +312,43 @@ vn_AllocateDescriptorSets(VkDevice device,
struct vn_descriptor_pool *pool =
vn_descriptor_pool_from_handle(pAllocateInfo->descriptorPool);
const VkAllocationCallbacks *alloc = &pool->allocator;
+ const VkDescriptorSetVariableDescriptorCountAllocateInfo *variable_info =
+ NULL;
VkResult result;
+ /* 14.2.3. Allocation of Descriptor Sets
+ *
+ * If descriptorSetCount is zero or this structure is not included in
+ * the pNext chain, then the variable lengths are considered to be zero.
+ */
+ variable_info = vk_find_struct_const(
+ pAllocateInfo->pNext,
+ DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO);
+
+ if (variable_info && !variable_info->descriptorSetCount)
+ variable_info = NULL;
+
for (uint32_t i = 0; i < pAllocateInfo->descriptorSetCount; i++) {
- struct vn_descriptor_set *set =
- vk_zalloc(alloc, sizeof(*set), VN_DEFAULT_ALIGN,
- VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
+ const struct vn_descriptor_set_layout *layout =
+ vn_descriptor_set_layout_from_handle(pAllocateInfo->pSetLayouts[i]);
+ uint32_t last_binding_descriptor_count = 0;
+ struct vn_descriptor_set *set = NULL;
+
+ /* 14.2.3. Allocation of Descriptor Sets
+ *
+ * If VkDescriptorSetAllocateInfo::pSetLayouts[i] does not include a
+ * variable count descriptor binding, then pDescriptorCounts[i] is
+ * ignored.
+ */
+ if (!layout->has_variable_descriptor_count) {
+ last_binding_descriptor_count =
+ layout->bindings[layout->last_binding].count;
+ } else if (variable_info) {
+ last_binding_descriptor_count = variable_info->pDescriptorCounts[i];
+ }
+
+ set = vk_zalloc(alloc, sizeof(*set), VN_DEFAULT_ALIGN,
+ VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
if (!set) {
pDescriptorSets[i] = VK_NULL_HANDLE;
result = VK_ERROR_OUT_OF_HOST_MEMORY;
@@ -326,8 +357,9 @@ vn_AllocateDescriptorSets(VkDevice device,
vn_object_base_init(&set->base, VK_OBJECT_TYPE_DESCRIPTOR_SET,
&dev->base);
- set->layout =
- vn_descriptor_set_layout_from_handle(pAllocateInfo->pSetLayouts[i]);
+
+ set->layout = layout;
+ set->last_binding_descriptor_count = last_binding_descriptor_count;
list_addtail(&set->head, &pool->descriptor_sets);
VkDescriptorSet set_handle = vn_descriptor_set_to_handle(set);
diff --git a/src/virtio/vulkan/vn_descriptor_set.h b/src/virtio/vulkan/vn_descriptor_set.h
index 31611f74116..9eb100755aa 100644
--- a/src/virtio/vulkan/vn_descriptor_set.h
+++ b/src/virtio/vulkan/vn_descriptor_set.h
@@ -70,6 +70,8 @@ struct vn_descriptor_set {
struct vn_object_base base;
const struct vn_descriptor_set_layout *layout;
+ uint32_t last_binding_descriptor_count;
+
struct list_head head;
};
VK_DEFINE_NONDISP_HANDLE_CASTS(vn_descriptor_set,
--
2.33.0.259.gc128427fd7-goog