[Mesa-dev] [PATCH 04/59] glsl/standalone: Enable par-linking

Ian Romanick idr at freedesktop.org
Wed Oct 26 00:59:10 UTC 2016


From: Ian Romanick <ian.d.romanick at 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.romanick at 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



More information about the mesa-dev mailing list