pvr: Add support for sampler descriptor.
Signed-off-by: Rajnesh Kanwal <rajnesh.kanwal@imgtec.com> Reviewed-by: Karmjit Mahil <Karmjit.Mahil@imgtec.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17719>
This commit is contained in:
parent
1bf883a8ae
commit
290b9a953a
|
@ -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:
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in New Issue