ir_to_mesa: Fix EmitCondCodes for boolean vars as condition.
authorEric Anholt <eric@anholt.net>
Mon, 28 Jun 2010 19:16:03 +0000 (12:16 -0700)
committerEric Anholt <eric@anholt.net>
Mon, 28 Jun 2010 19:17:25 +0000 (12:17 -0700)
Fixes glsl-vs-if-bool.

src/mesa/shader/ir_to_mesa.cpp

index 3141a53f5d29e215d2f72a9662e3c005af6a1823..85aedd69676dfa1b570c0454fa8c68944bfb74a0 100644 (file)
@@ -1146,12 +1146,26 @@ void
 ir_to_mesa_visitor::visit(ir_if *ir)
 {
    ir_to_mesa_instruction *cond_inst, *if_inst, *else_inst = NULL;
+   ir_to_mesa_instruction *prev_inst;
+
+   prev_inst = (ir_to_mesa_instruction *)this->instructions.get_tail();
 
    ir->condition->accept(this);
    assert(this->result.file != PROGRAM_UNDEFINED);
 
    if (ctx->Shader.EmitCondCodes) {
       cond_inst = (ir_to_mesa_instruction *)this->instructions.get_tail();
+
+      /* See if we actually generated any instruction for generating
+       * the condition.  If not, then cook up a move to a temp so we
+       * have something to set cond_update on.
+       */
+      if (cond_inst == prev_inst) {
+        ir_to_mesa_src_reg temp = get_temp(glsl_type::bool_type);
+        cond_inst = ir_to_mesa_emit_op1(ir->condition, OPCODE_MOV,
+                                        ir_to_mesa_dst_reg_from_src(temp),
+                                        result);
+      }
       cond_inst->cond_update = GL_TRUE;
 
       if_inst = ir_to_mesa_emit_op1(ir->condition,