i965/nir/vec4: Implement load_const intrinsic
authorEduardo Lima Mitev <elima@igalia.com>
Wed, 1 Jul 2015 14:10:49 +0000 (16:10 +0200)
committerJason Ekstrand <jason.ekstrand@intel.com>
Mon, 3 Aug 2015 16:40:47 +0000 (09:40 -0700)
Similar to fs_nir backend, a nir_local_values map will be filled with
newly allocated registers as the load_const instrinsic instructions are
processed. Later, get_nir_src() will fetch the registers from this map
for sources that are ssa.

Reviewed-by: Jason Ekstrand <jason.ekstrand@intel.com>
src/mesa/drivers/dri/i965/brw_nir.c
src/mesa/drivers/dri/i965/brw_vec4.h
src/mesa/drivers/dri/i965/brw_vec4_nir.cpp

index d81d82323bb09acca35fba2425c677d7cda66002..a4b65d24e278efa151c5e196136302cf04544722 100644 (file)
@@ -165,7 +165,7 @@ brw_create_nir(struct brw_context *brw,
       nir_print_shader(nir, stderr);
    }
 
-   nir_convert_from_ssa(nir, true);
+   nir_convert_from_ssa(nir, is_scalar);
    nir_validate_shader(nir);
 
    /* This is the last pass we run before we start emitting stuff.  It
index 01f88e641e7f4231b35a8fee7d5fbeb48845e4c8..f24d74438ad508137c072fcd729d9d5d07634af7 100644 (file)
@@ -415,6 +415,7 @@ public:
                                               const glsl_type *type) = 0;
 
    dst_reg *nir_locals;
+   dst_reg *nir_ssa_values;
    src_reg *nir_inputs;
    unsigned *nir_uniform_driver_location;
    dst_reg *nir_system_values;
index f8bcbb7cd4200eb41d581579b301e4ab1364f976..96e5e7c66e49958e8d2af8b989eec884f0e2d278 100644 (file)
@@ -250,6 +250,8 @@ vec4_visitor::nir_emit_impl(nir_function_impl *impl)
       nir_locals[reg->index] = dst_reg(GRF, alloc.allocate(array_elems));
    }
 
+   nir_ssa_values = ralloc_array(mem_ctx, dst_reg, impl->ssa_alloc);
+
    nir_emit_cf_list(&impl->body);
 }
 
@@ -332,7 +334,22 @@ vec4_visitor::nir_emit_instr(nir_instr *instr)
 void
 vec4_visitor::nir_emit_load_const(nir_load_const_instr *instr)
 {
-   /* @TODO: Not yet implemented */
+   dst_reg reg = dst_reg(GRF, alloc.allocate(1));
+   reg.type =  BRW_REGISTER_TYPE_F;
+
+   /* @FIXME: consider emitting vector operations to save some MOVs in
+    * cases where the components are representable in 8 bits.
+    * By now, we emit a MOV for each component.
+    */
+   for (unsigned i = 0; i < instr->def.num_components; ++i) {
+      reg.writemask = 1 << i;
+      emit(MOV(reg, src_reg(instr->value.f[i])));
+   }
+
+   /* Set final writemask */
+   reg.writemask = brw_writemask_for_size(instr->def.num_components);
+
+   nir_ssa_values[instr->def.index] = reg;
 }
 
 void