diff options
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' |