From c54dab154eef76f457d57ff48f50f853d05e72eb Mon Sep 17 00:00:00 2001 From: Simon Perretta Date: Tue, 4 Feb 2025 13:38:39 +0000 Subject: [PATCH] pvr: sampler and sampled image descriptor support Signed-off-by: Simon Perretta Acked-by: Erik Faye-Lund Part-of: --- src/imagination/vulkan/pvr_descriptor_set.c | 60 +++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/src/imagination/vulkan/pvr_descriptor_set.c b/src/imagination/vulkan/pvr_descriptor_set.c index de5dccdbdfa..96f302a9322 100644 --- a/src/imagination/vulkan/pvr_descriptor_set.c +++ b/src/imagination/vulkan/pvr_descriptor_set.c @@ -79,9 +79,13 @@ static unsigned pvr_descriptor_size(VkDescriptorType type) case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER: return sizeof(struct pvr_buffer_descriptor); + case VK_DESCRIPTOR_TYPE_SAMPLER: + return sizeof(struct pvr_sampler_descriptor); + case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER: return sizeof(struct pvr_combined_image_sampler_descriptor); + case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE: case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE: case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER: case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER: @@ -491,6 +495,25 @@ write_buffer(const struct pvr_descriptor_set *set, memcpy(desc_mapping, &buffer_desc, sizeof(buffer_desc)); } +static void +write_sampler(const struct pvr_descriptor_set *set, + const VkDescriptorImageInfo *image_info, + const struct pvr_descriptor_set_layout_binding *binding, + uint32_t elem) +{ + PVR_FROM_HANDLE(pvr_sampler, info_sampler, image_info->sampler); + + const unsigned desc_offset = binding->offset + (elem * binding->stride); + void *desc_mapping = (uint8_t *)set->mapping + desc_offset; + + struct pvr_sampler *sampler = binding->immutable_sampler_count + ? binding->immutable_samplers[elem] + : info_sampler; + + struct pvr_sampler_descriptor sampler_desc = sampler->descriptor; + memcpy(desc_mapping, &sampler_desc, sizeof(sampler_desc)); +} + static void write_image_sampler(const struct pvr_descriptor_set *set, const VkDescriptorImageInfo *image_info, @@ -532,6 +555,24 @@ write_input_attachment(const struct pvr_descriptor_set *set, memcpy(desc_mapping, &image_desc, sizeof(image_desc)); } +static void +write_sampled_image(const struct pvr_descriptor_set *set, + const VkDescriptorImageInfo *image_info, + const struct pvr_descriptor_set_layout_binding *binding, + uint32_t elem, + const struct pvr_device_info *dev_info) +{ + PVR_FROM_HANDLE(pvr_image_view, image_view, image_info->imageView); + + const unsigned desc_offset = binding->offset + (elem * binding->stride); + void *desc_mapping = (uint8_t *)set->mapping + desc_offset; + + struct pvr_image_descriptor sampled_image_desc = + image_view->image_state[PVR_TEXTURE_STATE_SAMPLE]; + + memcpy(desc_mapping, &sampled_image_desc, sizeof(sampled_image_desc)); +} + static void write_storage_image(const struct pvr_descriptor_set *set, const VkDescriptorImageInfo *image_info, @@ -629,6 +670,15 @@ void pvr_UpdateDescriptorSets(VkDevice _device, } break; + case VK_DESCRIPTOR_TYPE_SAMPLER: + for (uint32_t j = 0; j < write->descriptorCount; j++) { + write_sampler(set, + &write->pImageInfo[j], + binding, + write->dstArrayElement + j); + } + break; + case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER: for (uint32_t j = 0; j < write->descriptorCount; j++) { write_image_sampler(set, @@ -638,6 +688,16 @@ void pvr_UpdateDescriptorSets(VkDevice _device, } break; + case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE: + for (uint32_t j = 0; j < write->descriptorCount; j++) { + write_sampled_image(set, + &write->pImageInfo[j], + binding, + write->dstArrayElement + j, + dev_info); + } + break; + case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE: for (uint32_t j = 0; j < write->descriptorCount; j++) { write_storage_image(set,