diff --git a/src/imagination/vulkan/pvr_descriptor_set.c b/src/imagination/vulkan/pvr_descriptor_set.c index 1d330a079d9..4aec3a0b5d7 100644 --- a/src/imagination/vulkan/pvr_descriptor_set.c +++ b/src/imagination/vulkan/pvr_descriptor_set.c @@ -1386,6 +1386,51 @@ static void pvr_descriptor_update_buffer_info( } } +static void pvr_descriptor_update_sampler( + const struct pvr_device *device, + const VkWriteDescriptorSet *write_set, + struct pvr_descriptor_set *set, + const struct pvr_descriptor_set_layout_binding *binding, + uint32_t *mem_ptr, + uint32_t start_stage, + uint32_t end_stage) +{ + struct pvr_descriptor_size_info size_info; + + pvr_descriptor_size_info_init(device, binding->type, &size_info); + + for (uint32_t i = 0; i < write_set->descriptorCount; i++) { + PVR_FROM_HANDLE(pvr_sampler, sampler, write_set->pImageInfo[i].sampler); + const uint32_t desc_idx = + binding->descriptor_index + write_set->dstArrayElement + i; + + set->descriptors[desc_idx].type = write_set->descriptorType; + set->descriptors[desc_idx].sampler = sampler; + + for (uint32_t j = start_stage; j < end_stage; j++) { + uint32_t primary_offset; + + if (!(binding->shader_stage_mask & BITFIELD_BIT(j))) + continue; + + /* Offset calculation functions expect descriptor_index to be binding + * relative not layout relative, so we have used + * write_set->dstArrayElement + i rather than desc_idx. + */ + primary_offset = + pvr_get_descriptor_primary_offset(device, + set->layout, + binding, + j, + write_set->dstArrayElement + i); + + memcpy(mem_ptr + primary_offset, + sampler->descriptor.words, + sizeof(sampler->descriptor.words)); + } + } +} + void pvr_UpdateDescriptorSets(VkDevice _device, uint32_t descriptorWriteCount, const VkWriteDescriptorSet *pDescriptorWrites, @@ -1417,6 +1462,15 @@ void pvr_UpdateDescriptorSets(VkDevice _device, switch (write_set->descriptorType) { case VK_DESCRIPTOR_TYPE_SAMPLER: + pvr_descriptor_update_sampler(device, + write_set, + set, + binding, + map, + 0, + PVR_STAGE_ALLOCATION_COUNT); + break; + case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER: case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE: case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE: diff --git a/src/imagination/vulkan/pvr_private.h b/src/imagination/vulkan/pvr_private.h index e0438ed81d9..4544274126c 100644 --- a/src/imagination/vulkan/pvr_private.h +++ b/src/imagination/vulkan/pvr_private.h @@ -486,12 +486,17 @@ struct pvr_descriptor_pool { struct pvr_descriptor { VkDescriptorType type; - /* TODO: Follow anv_descriptor layout when adding support for - * other descriptor types. - */ - pvr_dev_addr_t buffer_dev_addr; - VkDeviceSize buffer_desc_range; - VkDeviceSize buffer_create_info_size; + union { + struct { + pvr_dev_addr_t buffer_dev_addr; + VkDeviceSize buffer_desc_range; + VkDeviceSize buffer_create_info_size; + }; + + struct { + const struct pvr_sampler *sampler; + }; + }; }; struct pvr_descriptor_set {