From e944a98826a4afb14d10d1fe3215918cdee31235 Mon Sep 17 00:00:00 2001 From: Ian Romanick Date: Fri, 14 Jan 2022 13:39:06 -0800 Subject: [PATCH] glsl: Add flag to disable part of do_vec_index_to_cond_assign As of ca63a5ed3e9 ("glsl: fix interpolateAtXxx(some_vec[idx], ...) with dynamic idx"), this lowering pass does two things. It converts ir_binop_vector_extract to an if-ladder to select the dynamically indexed component, and it extracts a ir_binop_vector_extract from the source of an interpolateAt function and applies to the result instead. This change adds a flag to disable the former behavior. The latter is still useful, but NIR has better (and soon even better) ways of doing the former. Reviewed-by: Matt Turner Part-of: --- src/compiler/glsl/ir_optimization.h | 2 +- .../glsl/lower_vec_index_to_cond_assign.cpp | 26 ++++++++++++------- src/compiler/glsl/test_optpass.cpp | 2 +- src/mesa/state_tracker/st_glsl_to_ir.cpp | 2 +- 4 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/compiler/glsl/ir_optimization.h b/src/compiler/glsl/ir_optimization.h index 7fc8e036431..6d86ef400c3 100644 --- a/src/compiler/glsl/ir_optimization.h +++ b/src/compiler/glsl/ir_optimization.h @@ -116,7 +116,7 @@ bool do_minmax_prune(exec_list *instructions); bool do_structure_splitting(exec_list *instructions); bool optimize_swizzles(exec_list *instructions); bool do_tree_grafting(exec_list *instructions); -bool do_vec_index_to_cond_assign(exec_list *instructions); +bool do_vec_index_to_cond_assign(exec_list *instructions, bool lower_extracts); bool do_vec_index_to_swizzle(exec_list *instructions); bool lower_discard(exec_list *instructions); void lower_discard_flow(exec_list *instructions); diff --git a/src/compiler/glsl/lower_vec_index_to_cond_assign.cpp b/src/compiler/glsl/lower_vec_index_to_cond_assign.cpp index 1adf9087bd6..72658f2f1c1 100644 --- a/src/compiler/glsl/lower_vec_index_to_cond_assign.cpp +++ b/src/compiler/glsl/lower_vec_index_to_cond_assign.cpp @@ -53,8 +53,8 @@ namespace { class ir_vec_index_to_cond_assign_visitor : public ir_hierarchical_visitor { public: - ir_vec_index_to_cond_assign_visitor() - : progress(false) + ir_vec_index_to_cond_assign_visitor(bool _lower_extracts) + : lower_extracts(_lower_extracts), progress(false) { /* empty */ } @@ -73,6 +73,7 @@ public: virtual ir_visitor_status visit_enter(ir_call *); virtual ir_visitor_status visit_enter(ir_if *); + bool lower_extracts; bool progress; }; @@ -191,13 +192,20 @@ ir_vec_index_to_cond_assign_visitor::convert_vector_extract_to_cond_assign(ir_rv new(base_ir) ir_expression(expr->operation, vec_input->type, vec_input, expr->operands[1]); - return convert_vec_index_to_cond_assign(ralloc_parent(ir), - vec_interpolate, - interpolant->operands[1], - ir->type); + if (lower_extracts) { + return convert_vec_index_to_cond_assign(ralloc_parent(ir), + vec_interpolate, + interpolant->operands[1], + ir->type); + } else { + this->progress = true; + return new(base_ir) ir_expression(ir_binop_vector_extract, ir->type, + vec_interpolate, + interpolant->operands[1]); + } } - if (expr->operation != ir_binop_vector_extract) + if (!lower_extracts || expr->operation != ir_binop_vector_extract) return ir; return convert_vec_index_to_cond_assign(ralloc_parent(ir), @@ -267,9 +275,9 @@ ir_vec_index_to_cond_assign_visitor::visit_enter(ir_if *ir) } bool -do_vec_index_to_cond_assign(exec_list *instructions) +do_vec_index_to_cond_assign(exec_list *instructions, bool lower_extracts) { - ir_vec_index_to_cond_assign_visitor v; + ir_vec_index_to_cond_assign_visitor v(lower_extracts); visit_list_elements(&v, instructions); diff --git a/src/compiler/glsl/test_optpass.cpp b/src/compiler/glsl/test_optpass.cpp index 0575484c868..7b0bb8a8003 100644 --- a/src/compiler/glsl/test_optpass.cpp +++ b/src/compiler/glsl/test_optpass.cpp @@ -102,7 +102,7 @@ do_optimization(struct exec_list *ir, const char *optimization, } else if (strcmp(optimization, "do_tree_grafting") == 0) { return do_tree_grafting(ir); } else if (strcmp(optimization, "do_vec_index_to_cond_assign") == 0) { - return do_vec_index_to_cond_assign(ir); + return do_vec_index_to_cond_assign(ir, true); } else if (strcmp(optimization, "do_vec_index_to_swizzle") == 0) { return do_vec_index_to_swizzle(ir); } else if (strcmp(optimization, "lower_discard") == 0) { diff --git a/src/mesa/state_tracker/st_glsl_to_ir.cpp b/src/mesa/state_tracker/st_glsl_to_ir.cpp index 769226065dc..d2bc5e604e2 100644 --- a/src/mesa/state_tracker/st_glsl_to_ir.cpp +++ b/src/mesa/state_tracker/st_glsl_to_ir.cpp @@ -130,7 +130,7 @@ link_shader(struct gl_context *ctx, struct gl_shader_program *prog) IMUL_HIGH_TO_MUL : 0)); - do_vec_index_to_cond_assign(ir); + do_vec_index_to_cond_assign(ir, true); lower_vector_insert(ir, true); if (options->MaxIfDepth == 0) { lower_discard(ir);