diff options
author | Ian Romanick <[email protected]> | 2016-09-15 11:24:12 -0700 |
---|---|---|
committer | Ian Romanick <[email protected]> | 2016-11-10 14:30:49 -0800 |
commit | d0028b2e1c43392bb476416a1af2097ab17afe7c (patch) | |
tree | 4af63744b7cc3969782386d6a39a3dc42f22e16c /src/compiler/glsl/standalone.cpp | |
parent | 4dc759c8c236e725ff7bbd439e19eada12bf390f (diff) |
glsl/standalone: Enable par-linking
If the user did not request full linking, link the shader with the
built-in functions, inline them, and eliminate them. Previous to this
you'd see all these calls to "dot" and "max" in the output. This
prevented a lot of expected optimizations and cluttered the output.
This gives it some chance of being useful.
v2: Rebase on top of Ken's "built-ins now" work.
v3: Don't do_common_optimizations if par-linking fails. Update expected
output of warnings tests to prevent 'make check' regressions.
v4: Optimize harder. Most important, do function inlining. Otherwise
it's quite impractical for one function in a file to call another
function in the same file.
v5: Add some code simplifications and an assertion suggested by Iago.
Signed-off-by: Ian Romanick <[email protected]>
Reviewed-by: Iago Toral Quiroga <[email protected]>
Diffstat (limited to 'src/compiler/glsl/standalone.cpp')
-rw-r--r-- | src/compiler/glsl/standalone.cpp | 45 |
1 files changed, 43 insertions, 2 deletions
diff --git a/src/compiler/glsl/standalone.cpp b/src/compiler/glsl/standalone.cpp index 7e633a72c6a..73c7408a96b 100644 --- a/src/compiler/glsl/standalone.cpp +++ b/src/compiler/glsl/standalone.cpp @@ -38,6 +38,8 @@ #include "standalone.h" #include "util/string_to_uint_map.h" #include "util/set.h" +#include "linker.h" +#include "glsl_parser_extras.h" #include "opt_add_neg_to_sub.h" class dead_variable_visitor : public ir_hierarchical_visitor { @@ -478,10 +480,49 @@ standalone_compile_shader(const struct standalone_options *_options, } } - if ((status == EXIT_SUCCESS) && options->do_link) { + if (status == EXIT_SUCCESS) { _mesa_clear_shader_program_data(ctx, whole_program); - link_shaders(ctx, whole_program); + if (options->do_link) { + link_shaders(ctx, whole_program); + } else { + const gl_shader_stage stage = whole_program->Shaders[0]->Stage; + + whole_program->LinkStatus = GL_TRUE; + whole_program->_LinkedShaders[stage] = + link_intrastage_shaders(whole_program /* mem_ctx */, + ctx, + whole_program, + whole_program->Shaders, + 1, + true); + + /* Par-linking can fail, for example, if there are undefined external + * references. + */ + if (whole_program->_LinkedShaders[stage] != NULL) { + assert(whole_program->LinkStatus); + + struct gl_shader_compiler_options *const compiler_options = + &ctx->Const.ShaderCompilerOptions[stage]; + + exec_list *const ir = + whole_program->_LinkedShaders[stage]->ir; + + bool progress; + do { + progress = do_function_inlining(ir); + + progress = do_common_optimization(ir, + false, + false, + compiler_options, + true) + && progress; + } while(progress); + } + } + status = (whole_program->LinkStatus) ? EXIT_SUCCESS : EXIT_FAILURE; if (strlen(whole_program->InfoLog) > 0) { |