Mesa (main): pvr: Add support for input attachment descriptor.

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Jul 25 11:09:44 UTC 2022


Module: Mesa
Branch: main
Commit: e13a450bf299dcd26e203698dece3e548797a491
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=e13a450bf299dcd26e203698dece3e548797a491

Author: Rajnesh Kanwal <rajnesh.kanwal at imgtec.com>
Date:   Mon Jul  4 13:47:53 2022 +0100

pvr: Add support for input attachment descriptor.

Signed-off-by: Rajnesh Kanwal <rajnesh.kanwal at imgtec.com>
Reviewed-by: Karmjit Mahil <Karmjit.Mahil at imgtec.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17719>

---

 src/imagination/vulkan/pvr_descriptor_set.c | 77 ++++++++++++++++++++++++++++-
 1 file changed, 75 insertions(+), 2 deletions(-)

diff --git a/src/imagination/vulkan/pvr_descriptor_set.c b/src/imagination/vulkan/pvr_descriptor_set.c
index 1e191208eb8..a95acb716d0 100644
--- a/src/imagination/vulkan/pvr_descriptor_set.c
+++ b/src/imagination/vulkan/pvr_descriptor_set.c
@@ -1729,6 +1729,74 @@ static void pvr_descriptor_update_buffer_view(
    }
 }
 
+static void pvr_descriptor_update_input_attachment(
+   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)
+{
+   const struct pvr_device_info *dev_info = &device->pdevice->dev_info;
+   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_image_view,
+                      iview,
+                      write_set->pImageInfo[i].imageView);
+      const uint32_t desc_idx =
+         binding->descriptor_index + write_set->dstArrayElement + i;
+
+      set->descriptors[desc_idx].type = write_set->descriptorType;
+      set->descriptors[desc_idx].iview = iview;
+      set->descriptors[desc_idx].layout = write_set->pImageInfo[i].imageLayout;
+
+      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);
+
+         pvr_write_image_descriptor_primaries(dev_info,
+                                              iview,
+                                              write_set->descriptorType,
+                                              mem_ptr + primary_offset);
+
+         *(uint64_t *)(mem_ptr + primary_offset + PVR_IMAGE_DESCRIPTOR_SIZE) =
+            device->input_attachment_sampler;
+
+         if (!PVR_HAS_FEATURE(dev_info, tpu_array_textures)) {
+            const uint32_t secondary_offset =
+               pvr_get_descriptor_secondary_offset(device,
+                                                   set->layout,
+                                                   binding,
+                                                   j,
+                                                   write_set->dstArrayElement +
+                                                      i);
+
+            pvr_write_image_descriptor_secondaries(dev_info,
+                                                   iview,
+                                                   write_set->descriptorType,
+                                                   mem_ptr + secondary_offset);
+         }
+      }
+   }
+}
+
 void pvr_UpdateDescriptorSets(VkDevice _device,
                               uint32_t descriptorWriteCount,
                               const VkWriteDescriptorSet *pDescriptorWrites,
@@ -1802,8 +1870,13 @@ void pvr_UpdateDescriptorSets(VkDevice _device,
          break;
 
       case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
-         pvr_finishme("Update support missing for %d descriptor type\n",
-                      write_set->descriptorType);
+         pvr_descriptor_update_input_attachment(device,
+                                                write_set,
+                                                set,
+                                                binding,
+                                                map,
+                                                0,
+                                                PVR_STAGE_ALLOCATION_COUNT);
          break;
 
       case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:



More information about the mesa-commit mailing list