nir/spirv: Make vtn_ssa_value handle constants as well as ssa values
authorJason Ekstrand <jason.ekstrand@intel.com>
Wed, 6 May 2015 19:35:30 +0000 (12:35 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Mon, 31 Aug 2015 23:58:20 +0000 (16:58 -0700)
src/glsl/nir/spirv_to_nir.c

index 0177be045372a175eecb8d5883db816e9cc2497c..03ef4c45dd1e13708ca253e47f065657f293c6b0 100644 (file)
 nir_ssa_def *
 vtn_ssa_value(struct vtn_builder *b, uint32_t value_id)
 {
-   return vtn_value(b, value_id, vtn_value_type_ssa)->ssa;
+   struct vtn_value *val = vtn_untyped_value(b, value_id);
+   switch (val->value_type) {
+   case vtn_value_type_constant: {
+      assert(glsl_type_is_vector_or_scalar(val->type));
+      unsigned num_components = glsl_get_vector_elements(val->type);
+      nir_load_const_instr *load =
+         nir_load_const_instr_create(b->shader, num_components);
+
+      for (unsigned i = 0; i < num_components; i++)
+         load->value.u[0] = val->constant->value.u[0];
+
+      nir_builder_instr_insert(&b->nb, &load->instr);
+      return &load->def;
+   }
+
+   case vtn_value_type_ssa:
+      return val->ssa;
+   default:
+      unreachable("Invalid type for an SSA value");
+   }
 }
 
 static char *