From df5152bda39ac527af2dda6c3111bb816d577b68 Mon Sep 17 00:00:00 2001 From: Frank Binns Date: Thu, 13 Mar 2025 12:04:53 +0000 Subject: [PATCH] pvr: Implement VK_KHR_descriptor_update_template Signed-off-by: Frank Binns Acked-by: Erik Faye-Lund Part-of: --- docs/features.txt | 2 +- src/imagination/vulkan/pvr_descriptor_set.c | 129 ++++++++++++++++++++ src/imagination/vulkan/pvr_device.c | 1 + 3 files changed, 131 insertions(+), 1 deletion(-) diff --git a/docs/features.txt b/docs/features.txt index 6fcbc717998..597a97bc655 100644 --- a/docs/features.txt +++ b/docs/features.txt @@ -438,7 +438,7 @@ Vulkan 1.1 -- all DONE: anv, hk, lvp, nvk, panvk/v10+, radv, tu, vn VK_KHR_16bit_storage DONE (anv, dzn, hasvk, lvp, nvk, panvk, radv, tu/a650+, v3dv, vn) VK_KHR_bind_memory2 DONE (anv, dzn, hasvk, lvp, nvk, panvk, pvr, radv, tu, v3dv, vn) VK_KHR_dedicated_allocation DONE (anv, dzn, hasvk, lvp, nvk, panvk, radv, tu, v3dv, vn) - VK_KHR_descriptor_update_template DONE (anv, dzn, hasvk, lvp, nvk, panvk, radv, tu, v3dv, vn) + VK_KHR_descriptor_update_template DONE (anv, dzn, hasvk, lvp, nvk, panvk, pvr, radv, tu, v3dv, vn) VK_KHR_device_group DONE (anv, dzn, hasvk, lvp, nvk, panvk, tu, v3dv, vn) VK_KHR_device_group_creation DONE (anv, dzn, hasvk, lvp, nvk, panvk, tu, v3dv, vn) VK_KHR_external_fence DONE (anv, hasvk, lvp, nvk, panvk, pvr, radv, tu, v3dv, vn) diff --git a/src/imagination/vulkan/pvr_descriptor_set.c b/src/imagination/vulkan/pvr_descriptor_set.c index 639bde926e1..4aed7e4b433 100644 --- a/src/imagination/vulkan/pvr_descriptor_set.c +++ b/src/imagination/vulkan/pvr_descriptor_set.c @@ -39,6 +39,7 @@ #include "util/macros.h" #include "util/vma.h" #include "vk_alloc.h" +#include "vk_descriptor_update_template.h" #include "vk_descriptors.h" #include "vk_descriptor_set_layout.h" #include "vk_format.h" @@ -868,3 +869,131 @@ void pvr_UpdateDescriptorSets(VkDevice _device, } } } + +void pvr_UpdateDescriptorSetWithTemplate( + VkDevice _device, + VkDescriptorSet descriptorSet, + VkDescriptorUpdateTemplate descriptorUpdateTemplate, + const void *pData) +{ + PVR_FROM_HANDLE(pvr_device, device, _device); + VK_FROM_HANDLE(vk_descriptor_update_template, + template, + descriptorUpdateTemplate); + PVR_FROM_HANDLE(pvr_descriptor_set, set, descriptorSet); + + const struct pvr_device_info *dev_info = &device->pdevice->dev_info; + + assert(template->type != + VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS); + + for (uint32_t i = 0; i < template->entry_count; i++) { + const struct vk_descriptor_template_entry *entry = &template->entries[i]; + const struct pvr_descriptor_set_layout_binding *layout_binding = + &set->layout->bindings[entry->binding]; + uint8_t *data = (uint8_t *)pData + entry->offset; + + switch (entry->type) { + 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 = + (const VkDescriptorBufferInfo *)(data + j * entry->stride); + + write_buffer(set, info, layout_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 = + (const VkDescriptorBufferInfo *)(data + j * entry->stride); + + write_dynamic_buffer(set, + info, + layout_binding, + entry->array_element + j); + } + break; + + case VK_DESCRIPTOR_TYPE_SAMPLER: + for (uint32_t j = 0; j < entry->array_count; j++) { + const VkDescriptorImageInfo *info = + (const VkDescriptorImageInfo *)(data + j * entry->stride); + + write_sampler(set, info, layout_binding, entry->array_element + j); + } + break; + + case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER: + for (uint32_t j = 0; j < entry->array_count; j++) { + const VkDescriptorImageInfo *info = + (const VkDescriptorImageInfo *)(data + j * entry->stride); + + write_image_sampler(set, + info, + layout_binding, + entry->array_element + j); + } + break; + + case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE: + for (uint32_t j = 0; j < entry->array_count; j++) { + const VkDescriptorImageInfo *info = + (const VkDescriptorImageInfo *)(data + j * entry->stride); + + write_sampled_image(set, + info, + layout_binding, + entry->array_element + j, + dev_info); + } + break; + + case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE: + for (uint32_t j = 0; j < entry->array_count; j++) { + const VkDescriptorImageInfo *info = + (const VkDescriptorImageInfo *)(data + j * entry->stride); + + write_storage_image(set, + info, + layout_binding, + entry->array_element + j, + dev_info); + } + 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 = + (const VkBufferView *)(data + j * entry->stride); + + write_buffer_view(set, + *bview, + layout_binding, + entry->array_element + j, + entry->type == + VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, + dev_info); + } + break; + + case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT: + for (uint32_t j = 0; j < entry->array_count; j++) { + const VkDescriptorImageInfo *info = + (const VkDescriptorImageInfo *)(data + j * entry->stride); + + write_input_attachment(set, + info, + layout_binding, + entry->array_element + j); + } + break; + + default: + UNREACHABLE("Unknown descriptor type"); + } + } +} diff --git a/src/imagination/vulkan/pvr_device.c b/src/imagination/vulkan/pvr_device.c index e5211bea295..12caa395769 100644 --- a/src/imagination/vulkan/pvr_device.c +++ b/src/imagination/vulkan/pvr_device.c @@ -171,6 +171,7 @@ static void pvr_physical_device_get_supported_extensions( *extensions = (struct vk_device_extension_table){ .KHR_bind_memory2 = true, .KHR_copy_commands2 = true, + .KHR_descriptor_update_template = true, .KHR_driver_properties = true, .KHR_external_fence = true, .KHR_external_fence_fd = true,