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:
+1
-1
@@ -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)
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user