From: Ian Romanick Date: Thu, 15 Sep 2016 18:24:12 +0000 (-0700) Subject: glsl/standalone: Enable par-linking X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=d0028b2e1c43392bb476416a1af2097ab17afe7c;p=mesa.git 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 Reviewed-by: Iago Toral Quiroga --- 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'