zink/spirv: inline get_uvec_constant into emit_load_const
authorErik Faye-Lund <erik.faye-lund@collabora.com>
Fri, 19 Jul 2019 14:12:57 +0000 (16:12 +0200)
committerErik Faye-Lund <erik.faye-lund@collabora.com>
Mon, 28 Oct 2019 08:51:47 +0000 (08:51 +0000)
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 <jordan.l.justen@intel.com>
src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c

index 27356f9bf13834af2d4e28a966eba4dab120dffd..c46ec895625d2d7912e38ed304580cb3bab78e31 100644 (file)
@@ -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);
 }