From 3ceba2d312d1f6f3ffcb9547fdf2b1f511a5fe6c Mon Sep 17 00:00:00 2001 From: Erik Faye-Lund Date: Fri, 19 Jul 2019 16:12:57 +0200 Subject: [PATCH] zink/spirv: inline get_uvec_constant into emit_load_const This is the only call-site that wants to specify unique values per component for any of the get_*_constant functions. So let's give this its own implementation instead, so we can ease the burden for the rest. Acked-by: Jordan Justen --- .../drivers/zink/nir_to_spirv/nir_to_spirv.c | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 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 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); } -- 2.30.2