From: Ian Romanick <ian.d.roman...@intel.com> 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. Signed-off-by: Ian Romanick <ian.d.roman...@intel.com> --- src/compiler/glsl/standalone.cpp | 43 +++++++++++++++++++++- ...-out-function-parameter-shaderout.vert.expected | 2 + ...nout-function-parameter-shaderout.vert.expected | 2 + .../030-array-as-function-parameter.vert.expected | 2 + 4 files changed, 47 insertions(+), 2 deletions(-) diff --git a/src/compiler/glsl/standalone.cpp b/src/compiler/glsl/standalone.cpp index 6a4432f..ecf162e 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" class add_neg_to_sub_visitor : public ir_hierarchical_visitor { public: @@ -508,10 +510,47 @@ standalone_compile_shader(const struct standalone_options *_options, } } - if ((status == EXIT_SUCCESS) && options->do_link) { + if (status == EXIT_SUCCESS) { _mesa_clear_shader_program_data(whole_program); - link_shaders(ctx, whole_program); + if (options->do_link) { + link_shaders(ctx, whole_program); + } else { + struct gl_shader *const shader = whole_program->Shaders[0]; + + whole_program->LinkStatus = GL_TRUE; + whole_program->_LinkedShaders[shader->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[shader->Stage] != NULL) { + struct gl_shader_compiler_options *const compiler_options = + &ctx->Const.ShaderCompilerOptions[shader->Stage]; + + exec_list *const ir = + whole_program->_LinkedShaders[shader->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 e69de29..60d3a8a 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 1724975..651818d 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 21cb2c5..b1355d3 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' -- 2.5.5 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev