mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 20:28:04 +02:00
i965: Handle ir_triop_csel in emit_if_gen6().
ir_triop_csel can return a boolean expression, so we need to handle it
here; we simply forgot when we added ir_triop_csel, and forgot again
when adding it to emit_bool_to_cond_code.
Fixes Piglit's EXT_shader_integer_mix/{vs,fs}-mix-if-bool on Sandybridge.
Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Matt Turner <mattst88@gmail.com>
Cc: mesa-stable@lists.freedesktop.org
This commit is contained in:
parent
12fb74fe89
commit
6272e60ca3
2 changed files with 33 additions and 4 deletions
|
|
@ -2364,11 +2364,11 @@ fs_visitor::emit_if_gen6(ir_if *ir)
|
|||
ir_expression *expr = ir->condition->as_expression();
|
||||
|
||||
if (expr) {
|
||||
fs_reg op[2];
|
||||
fs_reg op[3];
|
||||
fs_inst *inst;
|
||||
fs_reg temp;
|
||||
|
||||
assert(expr->get_num_operands() <= 2);
|
||||
assert(expr->get_num_operands() <= 3);
|
||||
for (unsigned int i = 0; i < expr->get_num_operands(); i++) {
|
||||
assert(expr->operands[i]->type->is_scalar());
|
||||
|
||||
|
|
@ -2412,6 +2412,21 @@ fs_visitor::emit_if_gen6(ir_if *ir)
|
|||
emit(IF(op[0], op[1],
|
||||
brw_conditional_for_comparison(expr->operation)));
|
||||
return;
|
||||
|
||||
case ir_triop_csel: {
|
||||
/* Expand the boolean condition into the flag register. */
|
||||
fs_inst *inst = emit(MOV(reg_null_d, op[0]));
|
||||
inst->conditional_mod = BRW_CONDITIONAL_NZ;
|
||||
|
||||
/* Select which boolean to use as the result. */
|
||||
fs_reg temp(this, expr->operands[1]->type);
|
||||
inst = emit(SEL(temp, op[1], op[2]));
|
||||
inst->predicate = BRW_PREDICATE_NORMAL;
|
||||
|
||||
emit(IF(temp, fs_reg(0), BRW_CONDITIONAL_NZ));
|
||||
return;
|
||||
}
|
||||
|
||||
default:
|
||||
unreachable("not reached");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -898,10 +898,10 @@ vec4_visitor::emit_if_gen6(ir_if *ir)
|
|||
ir_expression *expr = ir->condition->as_expression();
|
||||
|
||||
if (expr) {
|
||||
src_reg op[2];
|
||||
src_reg op[3];
|
||||
dst_reg temp;
|
||||
|
||||
assert(expr->get_num_operands() <= 2);
|
||||
assert(expr->get_num_operands() <= 3);
|
||||
for (unsigned int i = 0; i < expr->get_num_operands(); i++) {
|
||||
expr->operands[i]->accept(this);
|
||||
op[i] = this->result;
|
||||
|
|
@ -961,6 +961,20 @@ vec4_visitor::emit_if_gen6(ir_if *ir)
|
|||
emit(IF(BRW_PREDICATE_ALIGN16_ANY4H));
|
||||
return;
|
||||
|
||||
case ir_triop_csel: {
|
||||
/* Expand the boolean condition into the flag register. */
|
||||
vec4_instruction *inst = emit(MOV(dst_null_d(), op[0]));
|
||||
inst->conditional_mod = BRW_CONDITIONAL_NZ;
|
||||
|
||||
/* Select which boolean to return. */
|
||||
dst_reg temp(this, expr->operands[1]->type);
|
||||
inst = emit(BRW_OPCODE_SEL, temp, op[1], op[2]);
|
||||
inst->predicate = BRW_PREDICATE_NORMAL;
|
||||
|
||||
emit(IF(src_reg(temp), src_reg(0), BRW_CONDITIONAL_NZ));
|
||||
return;
|
||||
}
|
||||
|
||||
default:
|
||||
unreachable("not reached");
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue