Mesa (staging/22.0): zink: use the calculated last struct member idx for ssbo size in ntv

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Apr 21 20:00:55 UTC 2022


Module: Mesa
Branch: staging/22.0
Commit: 3ae6fb39a3be72cf4a82297f25b188890beecb80
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=3ae6fb39a3be72cf4a82297f25b188890beecb80

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date:   Tue Apr 12 09:46:32 2022 -0400

zink: use the calculated last struct member idx for ssbo size in ntv

this may or may not be 1

cc: mesa-stable

Reviewed-by: Dave Airlie <airlied at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15894>
(cherry picked from commit ff4dcb76d91daa8dcd5389ca9552695e81687e95)

---

 .pick_status.json                                    | 2 +-
 src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/.pick_status.json b/.pick_status.json
index f6fd0e118f3..e81063ca69b 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -2228,7 +2228,7 @@
         "description": "zink: use the calculated last struct member idx for ssbo size in ntv",
         "nominated": true,
         "nomination_type": 0,
-        "resolution": 5,
+        "resolution": 1,
         "because_sha": null
     },
     {
diff --git a/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c b/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c
index c9a85b97134..da291803ba3 100644
--- a/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c
+++ b/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c
@@ -2368,15 +2368,15 @@ emit_get_ssbo_size(struct ntv_context *ctx, nir_intrinsic_instr *intr)
    nir_const_value *const_block_index = nir_src_as_const_value(intr->src[0]);
    assert(const_block_index); // no dynamic indexing for now
    nir_variable *var = ctx->ssbo_vars[const_block_index->u32];
+   unsigned last_member_idx = glsl_get_length(var->interface_type) - 1;
    SpvId result = spirv_builder_emit_binop(&ctx->builder, SpvOpArrayLength, uint_type,
-                                             ctx->ssbos[const_block_index->u32][2], 1);
+                                             ctx->ssbos[const_block_index->u32][2], last_member_idx);
    /* this is going to be converted by nir to:
 
       length = (buffer_size - offset) / stride
 
       * so we need to un-convert it to avoid having the calculation performed twice
       */
-   unsigned last_member_idx = glsl_get_length(var->interface_type) - 1;
    const struct glsl_type *last_member = glsl_get_struct_field(var->interface_type, last_member_idx);
    /* multiply by stride */
    result = emit_binop(ctx, SpvOpIMul, uint_type, result, emit_uint_const(ctx, 32, glsl_get_explicit_stride(last_member)));



More information about the mesa-commit mailing list