Mesa (master): glsl/standalone: Enable par-linking
Ian Romanick
idr at kemper.freedesktop.org
Thu Nov 10 22:31:05 UTC 2016
Module: Mesa
Branch: master
Commit: d0028b2e1c43392bb476416a1af2097ab17afe7c
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=d0028b2e1c43392bb476416a1af2097ab17afe7c
Author: Ian Romanick <ian.d.romanick at intel.com>
Date: Thu Sep 15 11:24:12 2016 -0700
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 <ian.d.romanick at intel.com>
Reviewed-by: Iago Toral Quiroga <itoral at igalia.com>
---
src/compiler/glsl/standalone.cpp | 45 +++++++++++++++++++++-
...-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, 49 insertions(+), 2 deletions(-)
diff --git a/src/compiler/glsl/standalone.cpp b/src/compiler/glsl/standalone.cpp
index 7e633a7..73c7408 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 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'
More information about the mesa-commit
mailing list