From 15be43acc17038ab06e749dd742bfdc6ac9b249c Mon Sep 17 00:00:00 2001 From: "Thomas H.P. Andersen" Date: Wed, 28 Sep 2022 18:15:35 +0200 Subject: [PATCH] nvk: KHR_descriptor_update_template Part-of: --- src/nouveau/vulkan/nvk_descriptor_set.c | 89 ++++++++++++++++++++++++++++++++ src/nouveau/vulkan/nvk_descriptor_set.h | 1 + src/nouveau/vulkan/nvk_physical_device.c | 1 + 3 files changed, 91 insertions(+) diff --git a/src/nouveau/vulkan/nvk_descriptor_set.c b/src/nouveau/vulkan/nvk_descriptor_set.c index 7309bba..48993bd 100644 --- a/src/nouveau/vulkan/nvk_descriptor_set.c +++ b/src/nouveau/vulkan/nvk_descriptor_set.c @@ -551,3 +551,92 @@ nvk_ResetDescriptorPool(VkDevice _device, return VK_SUCCESS; } + +static void +nvk_descriptor_set_write_template(struct nvk_descriptor_set *set, + const struct vk_descriptor_update_template *template, + const void *data) +{ + for (uint32_t i = 0; i < template->entry_count; i++) { + const struct vk_descriptor_template_entry *entry = + &template->entries[i]; + + switch (entry->type) { + case VK_DESCRIPTOR_TYPE_SAMPLER: + case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER: + case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE: + case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE: + case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT: + for (uint32_t j = 0; j < entry->array_count; j++) { + const VkDescriptorImageInfo *info = + data + entry->offset + j * entry->stride; + + write_image_view_desc(set, info, + entry->binding, + entry->array_element + j, + entry->type); + } + break; + + case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER: + case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER: + for (uint32_t j = 0; j < entry->array_count; j++) { + const VkBufferView *bview = + data + entry->offset + j * entry->stride; + + write_buffer_view_desc(set, *bview, + entry->binding, + entry->array_element + j); + } + break; + + case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER: + case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER: + for (uint32_t j = 0; j < entry->array_count; j++) { + const VkDescriptorBufferInfo *info = + data + entry->offset + j * entry->stride; + + write_buffer_desc(set, info, + entry->binding, + entry->array_element + j); + } + break; + + case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC: + case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC: + for (uint32_t j = 0; j < entry->array_count; j++) { + const VkDescriptorBufferInfo *info = + data + entry->offset + j * entry->stride; + + write_dynamic_buffer_desc(set, info, + entry->binding, + entry->array_element + j); + } + break; + + case VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK: + write_desc(set, + entry->binding, + entry->array_element, + data + entry->offset, + entry->array_count); + break; + + default: + break; + } + } +} + +VKAPI_ATTR void VKAPI_CALL +nvk_UpdateDescriptorSetWithTemplate(VkDevice device, + VkDescriptorSet descriptorSet, + VkDescriptorUpdateTemplate descriptorUpdateTemplate, + const void *pData) +{ + VK_FROM_HANDLE(nvk_descriptor_set, set, descriptorSet); + VK_FROM_HANDLE(vk_descriptor_update_template, template, + descriptorUpdateTemplate); + + nvk_descriptor_set_write_template(set, template, pData); +} diff --git a/src/nouveau/vulkan/nvk_descriptor_set.h b/src/nouveau/vulkan/nvk_descriptor_set.h index fec0e95..718f710 100644 --- a/src/nouveau/vulkan/nvk_descriptor_set.h +++ b/src/nouveau/vulkan/nvk_descriptor_set.h @@ -5,6 +5,7 @@ #include "nouveau_bo.h" #include "vulkan/runtime/vk_object.h" +#include "vulkan/runtime/vk_descriptor_update_template.h" struct nvk_descriptor_set_layout; diff --git a/src/nouveau/vulkan/nvk_physical_device.c b/src/nouveau/vulkan/nvk_physical_device.c index 32237cf..4308207 100644 --- a/src/nouveau/vulkan/nvk_physical_device.c +++ b/src/nouveau/vulkan/nvk_physical_device.c @@ -353,6 +353,7 @@ nvk_get_device_extensions(const struct nvk_physical_device *device, .KHR_copy_commands2 = true, .KHR_create_renderpass2 = true, .KHR_dedicated_allocation = true, + .KHR_descriptor_update_template = true, .KHR_get_memory_requirements2 = true, .KHR_format_feature_flags2 = true, .KHR_image_format_list = true, -- 2.7.4