diff options
author | Eric Anholt <[email protected]> | 2014-09-03 11:57:47 -0700 |
---|---|---|
committer | Eric Anholt <[email protected]> | 2014-09-04 11:39:50 -0700 |
commit | 511d2f9a133f95e0ab01de2aa05acdb23fb588d4 (patch) | |
tree | d0fc3a8187693963416a686bef2372d4eee4539e | |
parent | e69b4abc43d8b5ef72716eb6409e76e98f0df28f (diff) |
state_tracker: Fix bug in conditional discards with native ints.
A bool is 0 or ~0, and KILL_IF takes a float arg that's <0 for discard or
>= 0 for not. By negating it, we ended up doing a floating point subtract
of (0 - ~0), which ended up as an inf. To make this actually work, we
need to convert the bool to a float.
Reviewed-by: Brian Paul <[email protected]>
-rw-r--r-- | src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp index dd9c84f1abf..62e4101d164 100644 --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp @@ -3091,8 +3091,18 @@ glsl_to_tgsi_visitor::visit(ir_discard *ir) { if (ir->condition) { ir->condition->accept(this); - this->result.negate = ~this->result.negate; - emit(ir, TGSI_OPCODE_KILL_IF, undef_dst, this->result); + st_src_reg condition = this->result; + + /* Convert the bool condition to a float so we can negate. */ + if (native_integers) { + st_src_reg temp = get_temp(ir->condition->type); + emit(ir, TGSI_OPCODE_AND, st_dst_reg(temp), + condition, st_src_reg_for_float(1.0)); + condition = temp; + } + + condition.negate = ~condition.negate; + emit(ir, TGSI_OPCODE_KILL_IF, undef_dst, condition); } else { /* unconditional kil */ emit(ir, TGSI_OPCODE_KILL); |