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 27356f9bf13..c46ec895625 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 @@ -1007,9 +1007,23 @@ emit_load_const(struct ntv_context *ctx, nir_load_const_instr *load_const) for (int i = 0; i < load_const->def.num_components; ++i) values[i] = load_const->value[i].u32; - SpvId constant = get_uvec_constant(ctx, load_const->def.bit_size, - load_const->def.num_components, - values); + unsigned bit_size = load_const->def.bit_size; + unsigned num_components = load_const->def.num_components; + + SpvId constant; + if (num_components > 1) { + SpvId components[num_components]; + for (int i = 0; i < num_components; i++) + components[i] = emit_uint_const(ctx, bit_size, values[i]); + + SpvId type = get_uvec_type(ctx, bit_size, num_components); + constant = spirv_builder_const_composite(&ctx->builder, type, + components, num_components); + } else { + assert(num_components == 1); + constant = emit_uint_const(ctx, bit_size, values[0]); + } + store_ssa_def_uint(ctx, &load_const->def, constant); }