diff options
author | Marek Olšák <[email protected]> | 2016-07-03 17:01:09 +0200 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2016-11-15 20:23:35 +0100 |
commit | 83d9b8a6f6365bc1569cdc847672478ac643670d (patch) | |
tree | f732d284048b456e6934bf27e9818b1ddf7f86f7 /src/compiler/glsl | |
parent | 654e9466b5304b040374e72c9e9a524bd1268362 (diff) |
glsl/lower_if: don't lower branches touching tess control outputs
Reviewed-by: Nicolai Hähnle <[email protected]>
Diffstat (limited to 'src/compiler/glsl')
-rw-r--r-- | src/compiler/glsl/ir_optimization.h | 3 | ||||
-rw-r--r-- | src/compiler/glsl/lower_if_to_cond_assign.cpp | 23 | ||||
-rw-r--r-- | src/compiler/glsl/test_optpass.cpp | 2 |
3 files changed, 23 insertions, 5 deletions
diff --git a/src/compiler/glsl/ir_optimization.h b/src/compiler/glsl/ir_optimization.h index 8cee41843dc..e6e8318a3aa 100644 --- a/src/compiler/glsl/ir_optimization.h +++ b/src/compiler/glsl/ir_optimization.h @@ -108,7 +108,8 @@ bool do_lower_texture_projection(exec_list *instructions); bool do_if_simplification(exec_list *instructions); bool opt_flatten_nested_if_blocks(exec_list *instructions); bool do_discard_simplification(exec_list *instructions); -bool lower_if_to_cond_assign(exec_list *instructions, unsigned max_depth = 0); +bool lower_if_to_cond_assign(gl_shader_stage stage, exec_list *instructions, + unsigned max_depth = 0); bool do_mat_op_to_vec(exec_list *instructions); bool do_minmax_prune(exec_list *instructions); bool do_noop_swizzle(exec_list *instructions); diff --git a/src/compiler/glsl/lower_if_to_cond_assign.cpp b/src/compiler/glsl/lower_if_to_cond_assign.cpp index 01a73357d45..e8db7aa9b7f 100644 --- a/src/compiler/glsl/lower_if_to_cond_assign.cpp +++ b/src/compiler/glsl/lower_if_to_cond_assign.cpp @@ -54,9 +54,11 @@ namespace { class ir_if_to_cond_assign_visitor : public ir_hierarchical_visitor { public: - ir_if_to_cond_assign_visitor(unsigned max_depth) + ir_if_to_cond_assign_visitor(gl_shader_stage stage, + unsigned max_depth) { this->progress = false; + this->stage = stage; this->max_depth = max_depth; this->depth = 0; @@ -75,6 +77,7 @@ public: bool found_unsupported_op; bool progress; + gl_shader_stage stage; unsigned max_depth; unsigned depth; @@ -84,12 +87,13 @@ public: } /* anonymous namespace */ bool -lower_if_to_cond_assign(exec_list *instructions, unsigned max_depth) +lower_if_to_cond_assign(gl_shader_stage stage, exec_list *instructions, + unsigned max_depth) { if (max_depth == UINT_MAX) return false; - ir_if_to_cond_assign_visitor v(max_depth); + ir_if_to_cond_assign_visitor v(stage, max_depth); visit_list_elements(&v, instructions); @@ -112,6 +116,19 @@ check_ir_node(ir_instruction *ir, void *data) case ir_type_barrier: v->found_unsupported_op = true; break; + + case ir_type_dereference_variable: { + ir_variable *var = ir->as_dereference_variable()->variable_referenced(); + + /* Lowering branches with TCS output accesses breaks many piglit tests, + * so don't touch them for now. + */ + if (v->stage == MESA_SHADER_TESS_CTRL && + var->data.mode == ir_var_shader_out) + v->found_unsupported_op = true; + break; + } + default: break; } diff --git a/src/compiler/glsl/test_optpass.cpp b/src/compiler/glsl/test_optpass.cpp index 852af1919bc..4d0bcc2f6cb 100644 --- a/src/compiler/glsl/test_optpass.cpp +++ b/src/compiler/glsl/test_optpass.cpp @@ -99,7 +99,7 @@ do_optimization(struct exec_list *ir, const char *optimization, return do_if_simplification(ir); } else if (sscanf(optimization, "lower_if_to_cond_assign ( %d ) ", &int_0) == 1) { - return lower_if_to_cond_assign(ir, int_0); + return lower_if_to_cond_assign(MESA_SHADER_VERTEX, ir, int_0); } else if (strcmp(optimization, "do_mat_op_to_vec") == 0) { return do_mat_op_to_vec(ir); } else if (strcmp(optimization, "do_noop_swizzle") == 0) { |