i965/fs_nir: Handle SSA constants

Reviewed-by: Connor Abbott <cwabbott0@gmail.com>
This commit is contained in:
Jason Ekstrand 2014-11-12 16:24:21 -08:00
parent e0aa4c6272
commit c2abfc0b86
1 changed files with 33 additions and 17 deletions

View File

@ -981,6 +981,17 @@ fs_visitor::nir_emit_alu(nir_alu_instr *instr)
fs_reg
fs_visitor::get_nir_src(nir_src src)
{
if (src.is_ssa) {
assert(src.ssa->parent_instr->type == nir_instr_type_load_const);
nir_load_const_instr *load = nir_instr_as_load_const(src.ssa->parent_instr);
fs_reg reg(GRF, virtual_grf_alloc(src.ssa->num_components),
BRW_REGISTER_TYPE_D);
for (unsigned i = 0; i < src.ssa->num_components; ++i)
emit(MOV(offset(reg, i), fs_reg(load->value.i[i])));
return reg;
} else {
fs_reg reg;
if (src.reg.reg->is_global)
reg = nir_globals[src.reg.reg->index];
@ -1001,6 +1012,7 @@ fs_visitor::get_nir_src(nir_src src)
return reg;
}
}
fs_reg
fs_visitor::get_nir_alu_src(nir_alu_instr *instr, unsigned src)
@ -1652,6 +1664,10 @@ fs_visitor::nir_emit_texture(nir_tex_instr *instr)
void
fs_visitor::nir_emit_load_const(nir_load_const_instr *instr)
{
/* Bail on SSA constant loads. These are used for immediates. */
if (instr->dest.is_ssa)
return;
fs_reg dest = get_nir_dest(instr->dest);
dest.type = BRW_REGISTER_TYPE_UD;
if (instr->array_elems == 0) {