Mesa (main): v3dv: don't use cl_packet_length for prepacked data

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Jun 22 10:35:42 UTC 2021


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

Author: Alejandro Piñeiro <apinheiro at igalia.com>
Date:   Tue Jun  1 10:39:20 2021 +0200

v3dv: don't use cl_packet_length for prepacked data

cl_packet_length depends on the specific hw generation packets, so it
is can't be included directly by main header.

The straight forward solution would be to allocate them dynamically,
based on the current generation. That ended to be complex and
messy. Also, even if that change between hw versions, it will not
change significantly.

So we just add some definition with the size of the packets we
prepack. We just need to be careful that this needs to be the maximum
value considering all the versions supported.

Note that on Opengl v3d does something similar, using hardcoded
values, but without a define, neither a runtime check.

Reviewed-by: Iago Toral Quiroga <itoral at igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11310>

---

 src/broadcom/vulkan/v3dv_descriptor_set.c |  2 +-
 src/broadcom/vulkan/v3dv_device.c         |  3 +++
 src/broadcom/vulkan/v3dv_limits.h         |  1 -
 src/broadcom/vulkan/v3dv_private.h        | 31 ++++++++++++++++++++++---------
 src/broadcom/vulkan/v3dvx_device.c        | 25 +++++++++++++++++++++++++
 src/broadcom/vulkan/v3dvx_private.h       |  5 +++++
 6 files changed, 56 insertions(+), 11 deletions(-)

diff --git a/src/broadcom/vulkan/v3dv_descriptor_set.c b/src/broadcom/vulkan/v3dv_descriptor_set.c
index 81c2ee762b8..3b9c2ffc749 100644
--- a/src/broadcom/vulkan/v3dv_descriptor_set.c
+++ b/src/broadcom/vulkan/v3dv_descriptor_set.c
@@ -803,7 +803,7 @@ descriptor_set_create(struct v3dv_device *device,
 
          memcpy(desc_map,
                 samplers[i].sampler_state,
-                cl_packet_length(SAMPLER_STATE));
+                sizeof(samplers[i].sampler_state));
       }
    }
 
diff --git a/src/broadcom/vulkan/v3dv_device.c b/src/broadcom/vulkan/v3dv_device.c
index f7496e1af6e..8dbc189099f 100644
--- a/src/broadcom/vulkan/v3dv_device.c
+++ b/src/broadcom/vulkan/v3dv_device.c
@@ -1676,6 +1676,9 @@ v3dv_CreateDevice(VkPhysicalDevice physicalDevice,
       goto fail;
    }
 
+#ifdef DEBUG
+   v3dv_X(device, device_check_prepacked_sizes)();
+#endif
    init_device_meta(device);
    v3dv_bo_cache_init(device);
    v3dv_pipeline_cache_init(&device->default_pipeline_cache, device,
diff --git a/src/broadcom/vulkan/v3dv_limits.h b/src/broadcom/vulkan/v3dv_limits.h
index 0e722a18ff0..aff7305e5ce 100644
--- a/src/broadcom/vulkan/v3dv_limits.h
+++ b/src/broadcom/vulkan/v3dv_limits.h
@@ -69,5 +69,4 @@
 #define PAGE_CACHE_UB_ROWS (V3D_PAGE_CACHE_SIZE / V3D_UIFBLOCK_ROW_SIZE)
 #define PAGE_CACHE_MINUS_1_5_UB_ROWS (PAGE_CACHE_UB_ROWS - PAGE_UB_ROWS_TIMES_1_5)
 
-
 #endif /* V3DV_LIMITS_H */
diff --git a/src/broadcom/vulkan/v3dv_private.h b/src/broadcom/vulkan/v3dv_private.h
index 12c63584c8b..17e1b8bdb48 100644
--- a/src/broadcom/vulkan/v3dv_private.h
+++ b/src/broadcom/vulkan/v3dv_private.h
@@ -500,6 +500,19 @@ struct v3dv_image {
 
 VkImageViewType v3dv_image_type_to_view_type(VkImageType type);
 
+/* Pre-generating packets needs to consider changes in packet sizes across hw
+ * versions. Keep things simple and allocate enough space for any supported
+ * version. We ensure the size is large enough through static asserts.
+ */
+#define V3DV_TEXTURE_SHADER_STATE_LENGTH 32
+#define V3DV_SAMPLER_STATE_LENGTH 24
+#define V3DV_BLEND_CFG_LENGTH 5
+#define V3DV_CFG_BITS_LENGTH 4
+#define V3DV_GL_SHADER_STATE_RECORD_LENGTH 36
+#define V3DV_VCM_CACHE_SIZE_LENGTH 2
+#define V3DV_GL_SHADER_STATE_ATTRIBUTE_RECORD_LENGTH 16
+#define V3DV_STENCIL_CFG_LENGTH 6
+
 struct v3dv_image_view {
    struct vk_object_base base;
 
@@ -536,7 +549,7 @@ struct v3dv_image_view {
     * we generate two states and select the one to use based on the descriptor
     * type.
     */
-   uint8_t texture_shader_state[2][cl_packet_length(TEXTURE_SHADER_STATE)];
+   uint8_t texture_shader_state[2][V3DV_TEXTURE_SHADER_STATE_LENGTH];
 };
 
 uint32_t v3dv_layer_offset(const struct v3dv_image *image, uint32_t level, uint32_t layer);
@@ -567,7 +580,7 @@ struct v3dv_buffer_view {
    uint32_t num_elements;
 
    /* Prepacked TEXTURE_SHADER_STATE. */
-   uint8_t texture_shader_state[cl_packet_length(TEXTURE_SHADER_STATE)];
+   uint8_t texture_shader_state[V3DV_TEXTURE_SHADER_STATE_LENGTH];
 };
 
 struct v3dv_subpass_attachment {
@@ -1577,7 +1590,7 @@ struct v3dv_sampler {
     * configuration. If needed it will be copied to the descriptor info during
     * UpdateDescriptorSets
     */
-   uint8_t sampler_state[cl_packet_length(SAMPLER_STATE)];
+   uint8_t sampler_state[V3DV_SAMPLER_STATE_LENGTH];
 };
 
 struct v3dv_descriptor_template_entry {
@@ -1765,7 +1778,7 @@ struct v3dv_pipeline {
       /* Per-RT bit mask with blend enables */
       uint8_t enables;
       /* Per-RT prepacked blend config packets */
-      uint8_t cfg[V3D_MAX_DRAW_BUFFERS][cl_packet_length(BLEND_CFG)];
+      uint8_t cfg[V3D_MAX_DRAW_BUFFERS][V3DV_BLEND_CFG_LENGTH];
       /* Flag indicating whether the blend factors in use require
        * color constants.
        */
@@ -1782,12 +1795,12 @@ struct v3dv_pipeline {
 
    /* Packets prepacked during pipeline creation
     */
-   uint8_t cfg_bits[cl_packet_length(CFG_BITS)];
-   uint8_t shader_state_record[cl_packet_length(GL_SHADER_STATE_RECORD)];
-   uint8_t vcm_cache_size[cl_packet_length(VCM_CACHE_SIZE)];
-   uint8_t vertex_attrs[cl_packet_length(GL_SHADER_STATE_ATTRIBUTE_RECORD) *
+   uint8_t cfg_bits[V3DV_CFG_BITS_LENGTH];
+   uint8_t shader_state_record[V3DV_GL_SHADER_STATE_RECORD_LENGTH];
+   uint8_t vcm_cache_size[V3DV_VCM_CACHE_SIZE_LENGTH];
+   uint8_t vertex_attrs[V3DV_GL_SHADER_STATE_ATTRIBUTE_RECORD_LENGTH *
                         MAX_VERTEX_ATTRIBS];
-   uint8_t stencil_cfg[2][cl_packet_length(STENCIL_CFG)];
+   uint8_t stencil_cfg[2][V3DV_STENCIL_CFG_LENGTH];
 };
 
 static inline VkPipelineBindPoint
diff --git a/src/broadcom/vulkan/v3dvx_device.c b/src/broadcom/vulkan/v3dvx_device.c
index c1518f53c35..026ceaa20b8 100644
--- a/src/broadcom/vulkan/v3dvx_device.c
+++ b/src/broadcom/vulkan/v3dvx_device.c
@@ -235,3 +235,28 @@ v3dX(get_hw_clear_color)(const VkClearColorValue *color,
       break;
    }
 }
+
+#ifdef DEBUG
+void
+v3dX(device_check_prepacked_sizes)(void)
+{
+   STATIC_ASSERT(V3DV_SAMPLER_STATE_LENGTH >=
+                 cl_packet_length(SAMPLER_STATE));
+   STATIC_ASSERT(V3DV_TEXTURE_SHADER_STATE_LENGTH >=
+                 cl_packet_length(TEXTURE_SHADER_STATE));
+   STATIC_ASSERT(V3DV_SAMPLER_STATE_LENGTH >=
+                 cl_packet_length(SAMPLER_STATE));
+   STATIC_ASSERT(V3DV_BLEND_CFG_LENGTH>=
+                 cl_packet_length(BLEND_CFG));
+   STATIC_ASSERT(V3DV_CFG_BITS_LENGTH>=
+                 cl_packet_length(CFG_BITS));
+   STATIC_ASSERT(V3DV_GL_SHADER_STATE_RECORD_LENGTH >=
+                 cl_packet_length(GL_SHADER_STATE_RECORD));
+   STATIC_ASSERT(V3DV_VCM_CACHE_SIZE_LENGTH>=
+                 cl_packet_length(VCM_CACHE_SIZE));
+   STATIC_ASSERT(V3DV_GL_SHADER_STATE_ATTRIBUTE_RECORD_LENGTH >=
+                 cl_packet_length(GL_SHADER_STATE_ATTRIBUTE_RECORD));
+   STATIC_ASSERT(V3DV_STENCIL_CFG_LENGTH >=
+                 cl_packet_length(STENCIL_CFG));
+}
+#endif
diff --git a/src/broadcom/vulkan/v3dvx_private.h b/src/broadcom/vulkan/v3dvx_private.h
index 438ec1f69dd..d01f0479f3f 100644
--- a/src/broadcom/vulkan/v3dvx_private.h
+++ b/src/broadcom/vulkan/v3dvx_private.h
@@ -137,6 +137,11 @@ v3dX(framebuffer_compute_internal_bpp_msaa)(const struct v3dv_framebuffer *frame
                                             const struct v3dv_subpass *subpass,
                                             uint8_t *max_bpp, bool *msaa);
 
+#ifdef DEBUG
+void
+v3dX(device_check_prepacked_sizes)(void);
+#endif
+
 /* Used at v3dv_format */
 const struct v3dv_format *
 v3dX(get_format)(VkFormat);



More information about the mesa-commit mailing list