diff options
Diffstat (limited to 'src/mesa')
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_fs.h | 2 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_fs_nir.cpp | 8 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_fs_visitor.cpp | 16 |
3 files changed, 13 insertions, 13 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_fs.h b/src/mesa/drivers/dri/i965/brw_fs.h index 1de10bb4b85..419fe48f1aa 100644 --- a/src/mesa/drivers/dri/i965/brw_fs.h +++ b/src/mesa/drivers/dri/i965/brw_fs.h @@ -535,7 +535,7 @@ public: bool try_emit_saturate(ir_expression *ir); bool try_emit_line(ir_expression *ir); bool try_emit_mad(ir_expression *ir); - void try_replace_with_sel(); + bool try_replace_with_sel(); bool opt_peephole_sel(); bool opt_peephole_predicated_break(); bool opt_saturate_propagation(); diff --git a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp index 0eb137fe2d3..de0d780e438 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp @@ -435,10 +435,6 @@ fs_visitor::nir_emit_cf_list(exec_list *list) void fs_visitor::nir_emit_if(nir_if *if_stmt) { - if (brw->gen < 6) { - no16("Can't support (non-uniform) control flow on SIMD16\n"); - } - /* first, put the condition into f0 */ fs_inst *inst = emit(MOV(reg_null_d, retype(get_nir_src(if_stmt->condition), @@ -456,7 +452,9 @@ fs_visitor::nir_emit_if(nir_if *if_stmt) emit(BRW_OPCODE_ENDIF); - try_replace_with_sel(); + if (!try_replace_with_sel() && brw->gen < 6) { + no16("Can't support (non-uniform) control flow on SIMD16\n"); + } } void diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp index 9805b552f87..f5d73838763 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp @@ -2741,7 +2741,7 @@ fs_visitor::emit_if_gen6(ir_if *ir) * * If src0 is an immediate value, we promote it to a temporary GRF. */ -void +bool fs_visitor::try_replace_with_sel() { fs_inst *endif_inst = (fs_inst *) instructions.get_tail(); @@ -2755,7 +2755,7 @@ fs_visitor::try_replace_with_sel() fs_inst *match = (fs_inst *) endif_inst->prev; for (int i = 0; i < 4; i++) { if (match->is_head_sentinel() || match->opcode != opcodes[4-i-1]) - return; + return false; match = (fs_inst *) match->prev; } @@ -2797,16 +2797,16 @@ fs_visitor::try_replace_with_sel() sel->predicate = if_inst->predicate; sel->predicate_inverse = if_inst->predicate_inverse; } + + return true; } + + return false; } void fs_visitor::visit(ir_if *ir) { - if (brw->gen < 6) { - no16("Can't support (non-uniform) control flow on SIMD16\n"); - } - /* Don't point the annotation at the if statement, because then it plus * the then and else blocks get printed. */ @@ -2836,7 +2836,9 @@ fs_visitor::visit(ir_if *ir) emit(BRW_OPCODE_ENDIF); - try_replace_with_sel(); + if (!try_replace_with_sel() && brw->gen < 6) { + no16("Can't support (non-uniform) control flow on SIMD16\n"); + } } void |