pvr: sampler and sampled image descriptor support

Signed-off-by: Simon Perretta <simon.perretta@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:
Simon Perretta 2025-02-04 13:38:39 +00:00 committed by Marge Bot
parent 380bf224dc
commit c54dab154e

View file

@ -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,