summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2010-09-27 22:15:36 -0700
committerEric Anholt <eric@anholt.net>2010-09-28 09:33:30 -0700
commit719f84d9aba6b016e1069e0461cbfc4211f5a3b5 (patch)
tree9949396a65650cd61e7d02fb78ea1835a867f5cb /src
parent57edd7c5c116926325e3a86cef618bfd1b5881c1 (diff)
i965: Fix up the FS backend for the variable array indexing pass.
We need to re-run channel expressions afterwards as it generates new vector expressions, and we need to successfully support conditional assignment (brw_CMP takes 2 operands, not 1).
Diffstat (limited to 'src')
-rw-r--r--src/mesa/drivers/dri/i965/brw_fs.cpp16
1 files changed, 12 insertions, 4 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp
index 27ea9121b4..78c1bc6ea6 100644
--- a/src/mesa/drivers/dri/i965/brw_fs.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
@@ -135,12 +135,12 @@ brw_link_shader(GLcontext *ctx, struct gl_shader_program *prog)
do_sub_to_add_neg(shader->ir);
do_explog_to_explog2(shader->ir);
- brw_do_channel_expressions(shader->ir);
- brw_do_vector_splitting(shader->ir);
-
do {
progress = false;
+ brw_do_channel_expressions(shader->ir);
+ brw_do_vector_splitting(shader->ir);
+
progress = do_lower_jumps(shader->ir, true, true,
true, /* main return */
false, /* continue */
@@ -520,6 +520,14 @@ fs_reg::fs_reg(class fs_visitor *v, const struct glsl_type *type)
case GLSL_TYPE_UINT:
this->type = BRW_REGISTER_TYPE_UD;
break;
+ case GLSL_TYPE_ARRAY:
+ case GLSL_TYPE_STRUCT:
+ /* These should be overridden with the type of the member when
+ * dereferenced into. BRW_REGISTER_TYPE_UD seems like a likely
+ * way to trip up if we don't.
+ */
+ this->type = BRW_REGISTER_TYPE_UD;
+ break;
default:
assert(!"not reached");
this->type = BRW_REGISTER_TYPE_F;
@@ -877,7 +885,7 @@ fs_visitor::visit(ir_assignment *ir)
if (ir->condition) {
/* Get the condition bool into the predicate. */
ir->condition->accept(this);
- inst = emit(fs_inst(BRW_OPCODE_CMP, this->result, fs_reg(0)));
+ inst = emit(fs_inst(BRW_OPCODE_CMP, reg_null, this->result, fs_reg(0)));
inst->conditional_mod = BRW_CONDITIONAL_NZ;
}