diff options
author | Eric Anholt <[email protected]> | 2013-10-30 17:09:53 -0700 |
---|---|---|
committer | Eric Anholt <[email protected]> | 2013-11-01 10:25:33 -0700 |
commit | 3641b97bdce558d980799b00422c6aee7d472cf5 (patch) | |
tree | b9a3846da73defc24c8bf26f60d663204610aa6e | |
parent | 2197967cd4e04365fd9c2eae0351f3e39f839766 (diff) |
i965/vec4: Don't overwrite op[1] when doing a UBO load.
Prior to the GLSL CSE pass, all of our testing happened to have a freshly
computed temporary in op[1], from the multiply by 16 to get a byte offset.
As of CSE you'll get var_refs of a reused value when you've got multiple
loads from the same offset.
Make a proper temporary for computing our temporary value, to avoid
shifting the value farther and farther down. Avoids a regression in
gs-float-array-variable-index
Reviewed-by: Paul Berry <[email protected]>
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp index 16a188fd30e..7a0dfa597b1 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp +++ b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp @@ -1569,7 +1569,7 @@ vec4_visitor::visit(ir_expression *ir) ir_constant *uniform_block = ir->operands[0]->as_constant(); ir_constant *const_offset_ir = ir->operands[1]->as_constant(); unsigned const_offset = const_offset_ir ? const_offset_ir->value.u[0] : 0; - src_reg offset = op[1]; + src_reg offset; /* Now, load the vector from that offset. */ assert(ir->type->is_vector() || ir->type->is_scalar()); @@ -1581,7 +1581,8 @@ vec4_visitor::visit(ir_expression *ir) if (const_offset_ir) { offset = src_reg(const_offset / 16); } else { - emit(SHR(dst_reg(offset), offset, src_reg(4))); + offset = src_reg(this, glsl_type::uint_type); + emit(SHR(dst_reg(offset), op[1], src_reg(4))); } vec4_instruction *pull = |