mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-09 08:58:02 +02:00
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 <brianp@vmware.com>
This commit is contained in:
parent
e69b4abc43
commit
511d2f9a13
1 changed files with 12 additions and 2 deletions
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue