mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-02-02 11:00:27 +01:00
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@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16669>
(cherry picked from commit 31ba19ff68)
This commit is contained in:
parent
9ff1f30d45
commit
274fcc2783
2 changed files with 5 additions and 5 deletions
|
|
@ -913,7 +913,7 @@
|
|||
"description": "zink: fix ntv partial stores",
|
||||
"nominated": true,
|
||||
"nomination_type": 0,
|
||||
"resolution": 0,
|
||||
"resolution": 1,
|
||||
"main_sha": null,
|
||||
"because_sha": null
|
||||
},
|
||||
|
|
|
|||
|
|
@ -2191,9 +2191,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));
|
||||
|
||||
|
|
@ -2202,14 +2202,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);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue