Mesa (main): zink: fix ntv partial stores

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Jun 10 02:49:40 UTC 2022


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

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date:   Fri May 20 13:23:05 2022 -0400

zink: fix ntv partial stores

the previous conditional here was stupid and wrong: it should be comparing
to see whether the writemask is the full mask of the type's size

cc: mesa-stable

Reviewed-by: Adam Jackson <ajax at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16669>

---

 src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

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 a9e2bc958ad..f55cbff47af 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
@@ -2268,9 +2268,9 @@ emit_store_deref(struct ntv_context *ctx, nir_intrinsic_instr *intr)
    const struct glsl_type *gtype = nir_src_as_deref(intr->src[0])->type;
    SpvId type = get_glsl_type(ctx, gtype);
    nir_variable *var = nir_deref_instr_get_variable(nir_src_as_deref(intr->src[0]));
-   unsigned num_writes = util_bitcount(nir_intrinsic_write_mask(intr));
    unsigned wrmask = nir_intrinsic_write_mask(intr);
-   if (num_writes && num_writes != intr->num_components) {
+   if (!glsl_type_is_scalar(gtype) &&
+       wrmask != BITFIELD_MASK(glsl_get_length(gtype))) {
       /* no idea what we do if this fails */
       assert(glsl_type_is_array(gtype) || glsl_type_is_vector(gtype));
 
@@ -2279,14 +2279,14 @@ emit_store_deref(struct ntv_context *ctx, nir_intrinsic_instr *intr)
       SpvId member_type;
       if (glsl_type_is_vector(gtype)) {
          result_type = get_glsl_basetype(ctx, glsl_get_base_type(gtype));
-         member_type = get_uvec_type(ctx, 32, 1);
+         member_type = get_uvec_type(ctx, glsl_get_bit_size(gtype), 1);
       } else
          member_type = result_type = get_glsl_type(ctx, glsl_get_array_element(gtype));
       SpvId ptr_type = spirv_builder_type_pointer(&ctx->builder,
                                                   SpvStorageClassOutput,
                                                   result_type);
       for (unsigned i = 0; i < 4; i++)
-         if ((wrmask >> i) & 1) {
+         if (wrmask & BITFIELD_BIT(i)) {
             SpvId idx = emit_uint_const(ctx, 32, i);
             SpvId val = spirv_builder_emit_composite_extract(&ctx->builder, member_type, src, &i, 1);
             val = emit_bitcast(ctx, result_type, val);



More information about the mesa-commit mailing list