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 | |
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')
4 files changed, 49 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) { diff --git a/src/compiler/glsl/tests/warnings/026-out-function-parameter-shaderout.vert.expected b/src/compiler/glsl/tests/warnings/026-out-function-parameter-shaderout.vert.expected index e69de29bb2d..60d3a8af8fa 100644 --- a/src/compiler/glsl/tests/warnings/026-out-function-parameter-shaderout.vert.expected +++ b/src/compiler/glsl/tests/warnings/026-out-function-parameter-shaderout.vert.expected @@ -0,0 +1,2 @@ + +error: unresolved reference to function `fooFunction' diff --git a/src/compiler/glsl/tests/warnings/027-inout-function-parameter-shaderout.vert.expected b/src/compiler/glsl/tests/warnings/027-inout-function-parameter-shaderout.vert.expected index 17249752d22..651818d9195 100644 --- a/src/compiler/glsl/tests/warnings/027-inout-function-parameter-shaderout.vert.expected +++ b/src/compiler/glsl/tests/warnings/027-inout-function-parameter-shaderout.vert.expected @@ -1 +1,3 @@ 0:11(14): warning: `willBeDefined' used uninitialized + +error: unresolved reference to function `fooFunction' diff --git a/src/compiler/glsl/tests/warnings/030-array-as-function-parameter.vert.expected b/src/compiler/glsl/tests/warnings/030-array-as-function-parameter.vert.expected index 21cb2c5a2c8..b1355d3a947 100644 --- a/src/compiler/glsl/tests/warnings/030-array-as-function-parameter.vert.expected +++ b/src/compiler/glsl/tests/warnings/030-array-as-function-parameter.vert.expected @@ -5,3 +5,5 @@ 0:14(20): warning: `undefinedIndex' used uninitialized 0:14(51): warning: `undefinedIndex' used uninitialized 0:14(82): warning: `undefinedIndex' used uninitialized + +error: unresolved reference to function `foo' |