From: Ian Romanick <ian.d.roman...@intel.com> This will be used in the stand-alone compiler.
Signed-off-by: Ian Romanick <ian.d.roman...@intel.com> --- src/compiler/glsl/glsl_parser_extras.cpp | 2 +- src/compiler/glsl/ir_optimization.h | 2 +- src/compiler/glsl/opt_function_inlining.cpp | 12 +++++++----- src/compiler/glsl/test_optpass.cpp | 2 +- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/compiler/glsl/glsl_parser_extras.cpp b/src/compiler/glsl/glsl_parser_extras.cpp index c1e958a..29eba13 100644 --- a/src/compiler/glsl/glsl_parser_extras.cpp +++ b/src/compiler/glsl/glsl_parser_extras.cpp @@ -2042,7 +2042,7 @@ do_common_optimization(exec_list *ir, bool linked, OPT(lower_instructions, ir, SUB_TO_ADD_NEG); if (linked) { - OPT(do_function_inlining, ir); + OPT(do_function_inlining, ir, false); OPT(do_dead_functions, ir); OPT(do_structure_splitting, ir); } diff --git a/src/compiler/glsl/ir_optimization.h b/src/compiler/glsl/ir_optimization.h index 3bd6928..26f13f1 100644 --- a/src/compiler/glsl/ir_optimization.h +++ b/src/compiler/glsl/ir_optimization.h @@ -102,7 +102,7 @@ bool do_dead_code_local(exec_list *instructions); bool do_dead_code_unlinked(exec_list *instructions); bool do_dead_functions(exec_list *instructions); bool opt_flip_matrices(exec_list *instructions); -bool do_function_inlining(exec_list *instructions); +bool do_function_inlining(exec_list *instructions, bool only_builtins); bool do_lower_jumps(exec_list *instructions, bool pull_out_jumps = true, bool lower_sub_return = true, bool lower_main_return = false, bool lower_continue = false, bool lower_break = false); bool do_lower_texture_projection(exec_list *instructions); bool do_if_simplification(exec_list *instructions); diff --git a/src/compiler/glsl/opt_function_inlining.cpp b/src/compiler/glsl/opt_function_inlining.cpp index 83534bf..f216696 100644 --- a/src/compiler/glsl/opt_function_inlining.cpp +++ b/src/compiler/glsl/opt_function_inlining.cpp @@ -43,9 +43,10 @@ namespace { class ir_function_inlining_visitor : public ir_hierarchical_visitor { public: - ir_function_inlining_visitor() + ir_function_inlining_visitor(bool only_builtins) + : progress(false), only_builtins(only_builtins) { - progress = false; + /* empty */ } virtual ~ir_function_inlining_visitor() @@ -60,14 +61,15 @@ public: virtual ir_visitor_status visit_enter(ir_swizzle *); bool progress; + bool only_builtins; }; } /* unnamed namespace */ bool -do_function_inlining(exec_list *instructions) +do_function_inlining(exec_list *instructions, bool only_builtins) { - ir_function_inlining_visitor v; + ir_function_inlining_visitor v(only_builtins); v.run(instructions); @@ -246,7 +248,7 @@ ir_function_inlining_visitor::visit_enter(ir_swizzle *ir) ir_visitor_status ir_function_inlining_visitor::visit_enter(ir_call *ir) { - if (can_inline(ir)) { + if ((!only_builtins || ir->callee->is_builtin()) && can_inline(ir)) { ir->generate_inline(ir); ir->remove(); this->progress = true; diff --git a/src/compiler/glsl/test_optpass.cpp b/src/compiler/glsl/test_optpass.cpp index 852af19..3771a89 100644 --- a/src/compiler/glsl/test_optpass.cpp +++ b/src/compiler/glsl/test_optpass.cpp @@ -87,7 +87,7 @@ do_optimization(struct exec_list *ir, const char *optimization, } else if (strcmp(optimization, "do_dead_functions") == 0) { return do_dead_functions(ir); } else if (strcmp(optimization, "do_function_inlining") == 0) { - return do_function_inlining(ir); + return do_function_inlining(ir, false); } else if (sscanf(optimization, "do_lower_jumps ( %d , %d , %d , %d , %d ) ", &int_0, &int_1, &int_2, &int_3, &int_4) == 5) { -- 2.5.5 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev