diff --git a/.pick_status.json b/.pick_status.json index 2a63141cd48..e4084dc702e 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -103,7 +103,7 @@ "description": "zink: don't bitcast bool deref loads/stores", "nominated": true, "nomination_type": 0, - "resolution": 0, + "resolution": 1, "main_sha": null, "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 bb2d79059d0..32f0934be41 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 @@ -2486,7 +2486,8 @@ emit_load_deref(struct ntv_context *ctx, nir_intrinsic_instr *intr) result = spirv_builder_emit_load(&ctx->builder, type, ptr); unsigned num_components = nir_dest_num_components(intr->dest); unsigned bit_size = nir_dest_bit_size(intr->dest); - result = bitcast_to_uvec(ctx, result, bit_size, num_components); + if (bit_size > 1) + result = bitcast_to_uvec(ctx, result, bit_size, num_components); store_dest(ctx, &intr->dest, result, nir_type_uint); } @@ -2535,6 +2536,8 @@ emit_store_deref(struct ntv_context *ctx, nir_intrinsic_instr *intr) src = emit_bitcast(ctx, type, src); /* SampleMask is always an array in spirv, so we need to construct it into one */ result = spirv_builder_emit_composite_construct(&ctx->builder, ctx->sample_mask_type, &src, 1); + } else if (glsl_get_base_type(glsl_without_array(gtype)) == GLSL_TYPE_BOOL) { + result = src; } else result = emit_bitcast(ctx, type, src); if (nir_intrinsic_access(intr) & ACCESS_COHERENT)