ir_to_mesa: Add support for conditional discards.
authorMarek Olšák <maraeo@gmail.com>
Thu, 25 Nov 2010 11:13:36 +0000 (03:13 -0800)
committerKenneth Graunke <kenneth@whitecape.org>
Wed, 1 Dec 2010 19:52:36 +0000 (11:52 -0800)
NOTE: This is a candidate for the 7.9 branch.

Signed-off-by: Marek Olšák <maraeo@gmail.com>
Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/program/ir_to_mesa.cpp

index 8f75c82c3eb4d6c426e28fbaac2afcf44c39c4f3..5dd602fd83f45f8f6954625da362071671849285 100644 (file)
@@ -2166,9 +2166,14 @@ ir_to_mesa_visitor::visit(ir_discard *ir)
 {
    struct gl_fragment_program *fp = (struct gl_fragment_program *)this->prog;
 
-   assert(ir->condition == NULL); /* FINISHME */
+   if (ir->condition) {
+      ir->condition->accept(this);
+      this->result.negate = ~this->result.negate;
+      ir_to_mesa_emit_op1(ir, OPCODE_KIL, ir_to_mesa_undef_dst, this->result);
+   } else {
+      ir_to_mesa_emit_op0(ir, OPCODE_KIL_NV);
+   }
 
-   ir_to_mesa_emit_op0(ir, OPCODE_KIL_NV);
    fp->UsesKill = GL_TRUE;
 }