pvr: Implement VK_KHR_descriptor_update_template

Signed-off-by: Frank Binns <frank.binns@imgtec.com>
Acked-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/36412>
This commit is contained in:
Frank Binns
2025-03-13 12:04:53 +00:00
committed by Marge Bot
parent 6b00301c04
commit df5152bda3
3 changed files with 131 additions and 1 deletions
+1 -1
View File
@@ -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)
+129
View File
@@ -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");
}
}
}
+1
View File
@@ -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,