Mesa (main): pvr: Write immutable descriptor words in vkAllocateDescriptorSets().

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Jun 8 08:43:01 UTC 2022


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

Author: Karmjit Mahil <Karmjit.Mahil at imgtec.com>
Date:   Fri Feb 25 17:06:38 2022 +0000

pvr: Write immutable descriptor words in vkAllocateDescriptorSets().

Signed-off-by: Karmjit Mahil <Karmjit.Mahil at imgtec.com>
Reviewed-by: Frank Binns <frank.binns at imgtec.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16883>

---

 src/imagination/vulkan/pvr_csb_enum_helpers.h | 10 ++++++++++
 src/imagination/vulkan/pvr_descriptor_set.c   | 18 ++++++------------
 src/imagination/vulkan/pvr_device.c           | 24 +++++++++++++++++++++++-
 src/imagination/vulkan/pvr_private.h          | 18 +++++++++++++++++-
 4 files changed, 56 insertions(+), 14 deletions(-)

diff --git a/src/imagination/vulkan/pvr_csb_enum_helpers.h b/src/imagination/vulkan/pvr_csb_enum_helpers.h
index 0cd945e2e4a..6ab7b6052c9 100644
--- a/src/imagination/vulkan/pvr_csb_enum_helpers.h
+++ b/src/imagination/vulkan/pvr_csb_enum_helpers.h
@@ -119,4 +119,14 @@ pvr_ta_objtype(VkPrimitiveTopology topology)
    }
 }
 
+/******************************************************************************
+   TEXSTATE
+ ******************************************************************************/
+
+static inline enum PVRX(TEXSTATE_CMP_MODE) pvr_texstate_cmpmode(VkCompareOp op)
+{
+   /* enum values are identical, so we can just cast the input directly. */
+   return (enum PVRX(TEXSTATE_CMP_MODE))op;
+}
+
 #endif /* PVR_CSB_ENUM_HELPERS_H */
diff --git a/src/imagination/vulkan/pvr_descriptor_set.c b/src/imagination/vulkan/pvr_descriptor_set.c
index 892dec1393a..c56035a2235 100644
--- a/src/imagination/vulkan/pvr_descriptor_set.c
+++ b/src/imagination/vulkan/pvr_descriptor_set.c
@@ -88,9 +88,9 @@ static void pvr_descriptor_size_info_init(
     */
    static const struct pvr_descriptor_size_info template_size_infos[] = {
       /* VK_DESCRIPTOR_TYPE_SAMPLER */
-      { 4, 0, 4 },
+      { PVR_SAMPLER_DESCRIPTOR_SIZE, 0, 4 },
       /* VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER */
-      { 8, UINT_MAX, 4 },
+      { PVR_SAMPLER_DESCRIPTOR_SIZE + 4, UINT_MAX, 4 },
       /* VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE */
       { 4, UINT_MAX, 4 },
       /* VK_DESCRIPTOR_TYPE_STORAGE_IMAGE */
@@ -1125,13 +1125,6 @@ static uint16_t pvr_get_descriptor_secondary_offset(
    return (uint16_t)offset;
 }
 
-static void pvr_write_sampler_descriptor(uint32_t *primary,
-                                         const struct pvr_sampler *sampler)
-{
-   /* TODO: Implement based on WriteSamplerDescriptor. */
-   pvr_finishme("Implement after vkCreateSampler API.");
-}
-
 #define PVR_MAX_DESCRIPTOR_MEM_SIZE_IN_DWORDS (4 * 1024)
 
 static VkResult
@@ -1162,6 +1155,7 @@ pvr_descriptor_set_create(struct pvr_device *device,
     * for max descriptors supported by pool as done by v3dv. Also check the
     * possibility if this can be removed from here and done on need basis.
     */
+
    if (layout->binding_count > 0) {
       const uint32_t cache_line_size =
          rogue_get_slc_cache_line_size(&device->pdevice->dev_info);
@@ -1209,9 +1203,9 @@ pvr_descriptor_set_create(struct pvr_device *device,
             if (binding->type == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)
                offset_in_dwords += 4;
 
-            pvr_write_sampler_descriptor(map +
-                                            offset_in_dwords * sizeof(uint32_t),
-                                         sampler);
+            memcpy((uint8_t *)map + offset_in_dwords * sizeof(uint32_t),
+                   sampler->descriptor.words,
+                   sizeof(sampler->descriptor.words));
          }
       }
    }
diff --git a/src/imagination/vulkan/pvr_device.c b/src/imagination/vulkan/pvr_device.c
index c7ae95a61bc..8af30156c8e 100644
--- a/src/imagination/vulkan/pvr_device.c
+++ b/src/imagination/vulkan/pvr_device.c
@@ -41,6 +41,7 @@
 #include "hwdef/rogue_hw_utils.h"
 #include "pvr_bo.h"
 #include "pvr_csb.h"
+#include "pvr_csb_enum_helpers.h"
 #include "pvr_device_info.h"
 #include "pvr_job_render.h"
 #include "pvr_limits.h"
@@ -2082,6 +2083,9 @@ VkResult pvr_CreateSampler(VkDevice _device,
    float min_lod;
    float max_lod;
 
+   STATIC_ASSERT(sizeof(((union pvr_sampler_descriptor *)NULL)->data) ==
+                 sizeof(((union pvr_sampler_descriptor *)NULL)->words));
+
    sampler = vk_object_alloc(&device->vk,
                              pAllocator,
                              sizeof(*sampler),
@@ -2115,7 +2119,18 @@ VkResult pvr_CreateSampler(VkDevice _device,
       }
    }
 
-   pvr_csb_pack (&sampler->sampler_word, TEXSTATE_SAMPLER, word) {
+   if (pCreateInfo->compareEnable) {
+      sampler->descriptor.data.compare_op =
+         (uint32_t)pvr_texstate_cmpmode(pCreateInfo->compareOp);
+   } else {
+      sampler->descriptor.data.compare_op =
+         (uint32_t)pvr_texstate_cmpmode(VK_COMPARE_OP_NEVER);
+   }
+
+   sampler->descriptor.data.word3 = 0;
+   pvr_csb_pack (&sampler->descriptor.data.sampler_word,
+                 TEXSTATE_SAMPLER,
+                 word) {
       const struct pvr_device_info *dev_info = &device->pdevice->dev_info;
       const float lod_clamp_max = (float)PVRX(TEXSTATE_CLAMP_MAX) /
                                   (1 << PVRX(TEXSTATE_CLAMP_FRACTIONAL_BITS));
@@ -2139,6 +2154,13 @@ VkResult pvr_CreateSampler(VkDevice _device,
       word.addrmode_w =
          pvr_sampler_get_hw_addr_mode_from_vk(pCreateInfo->addressModeW);
 
+      /* TODO: Figure out defines for these. */
+      if (word.addrmode_u == PVRX(TEXSTATE_ADDRMODE_FLIP))
+         sampler->descriptor.data.word3 |= 0x40000000;
+
+      if (word.addrmode_v == PVRX(TEXSTATE_ADDRMODE_FLIP))
+         sampler->descriptor.data.word3 |= 0x20000000;
+
       /* The Vulkan 1.0.205 spec says:
        *
        *    The absolute value of mipLodBias must be less than or equal to
diff --git a/src/imagination/vulkan/pvr_private.h b/src/imagination/vulkan/pvr_private.h
index f366753a8e2..4b687db05f0 100644
--- a/src/imagination/vulkan/pvr_private.h
+++ b/src/imagination/vulkan/pvr_private.h
@@ -74,6 +74,8 @@
 
 #define PVR_WORKGROUP_DIMENSIONS 3U
 
+#define PVR_SAMPLER_DESCRIPTOR_SIZE 4U
+
 #define PVR_STATE_PBE_DWORDS 2U
 
 #define PVR_PIPELINE_LAYOUT_SUPPORTED_DESCRIPTOR_TYPE_COUNT \
@@ -355,10 +357,24 @@ struct pvr_image_view {
    uint64_t texture_state[PVR_TEXTURE_STATE_MAX_ENUM][2];
 };
 
+union pvr_sampler_descriptor {
+   uint32_t words[PVR_SAMPLER_DESCRIPTOR_SIZE];
+
+   struct {
+      /* Packed PVRX(TEXSTATE_SAMPLER). */
+      uint64_t sampler_word;
+      uint32_t compare_op;
+      /* TODO: Figure out what this word is for and rename.
+       * Sampler state word 1?
+       */
+      uint32_t word3;
+   } data;
+};
+
 struct pvr_sampler {
    struct vk_object_base base;
 
-   uint64_t sampler_word;
+   union pvr_sampler_descriptor descriptor;
 };
 
 struct pvr_descriptor_size_info {



More information about the mesa-commit mailing list