Mesa (master): linker: Propagate max_array_access while linking functions

Ian Romanick idr at kemper.freedesktop.org
Tue Jan 25 13:41:32 PST 2011


Module: Mesa
Branch: master
Commit: 0f4b2a0a23650d8f773c53d84cb2ead1f6d4fc8e
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=0f4b2a0a23650d8f773c53d84cb2ead1f6d4fc8e

Author: Ian Romanick <ian.d.romanick at intel.com>
Date:   Tue Jan 25 12:06:18 2011 -0800

linker: Propagate max_array_access while linking functions

Update the max_array_access of a global as functions that use that
global are pulled into the linked shader.

Fixes piglit test glsl-fs-implicit-array-size-01 and bugzilla #33219.

NOTE: This is a candidate for the 7.9 and 7.10 branches.

---

 src/glsl/link_functions.cpp |   12 ++++++++++++
 src/glsl/linker.cpp         |    5 +----
 2 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/src/glsl/link_functions.cpp b/src/glsl/link_functions.cpp
index 6207371..861fa39 100644
--- a/src/glsl/link_functions.cpp
+++ b/src/glsl/link_functions.cpp
@@ -181,6 +181,18 @@ public:
 	    var = ir->var->clone(linked, NULL);
 	    linked->symbols->add_variable(var);
 	    linked->ir->push_head(var);
+	 } else if (var->type->is_array()) {
+	    /* It is possible to have a global array declared in multiple
+	     * shaders without a size.  The array is implicitly sized by the
+	     * maximal access to it in *any* shader.  Because of this, we
+	     * need to track the maximal access to the array as linking pulls
+	     * more functions in that access the array.
+	     */
+	    var->max_array_access =
+	       MAX2(var->max_array_access, ir->var->max_array_access);
+
+	    if (var->type->length == 0 && ir->var->type->length != 0)
+	       var->type = ir->var->type;
 	 }
 
 	 ir->var = var;
diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp
index 58b0294..bf7a563 100644
--- a/src/glsl/linker.cpp
+++ b/src/glsl/linker.cpp
@@ -356,11 +356,8 @@ cross_validate_globals(struct gl_shader_program *prog,
 		   && (var->type->fields.array == existing->type->fields.array)
 		   && ((var->type->length == 0)
 		       || (existing->type->length == 0))) {
-		  if (existing->type->length == 0) {
+		  if (var->type->length != 0) {
 		     existing->type = var->type;
-		     existing->max_array_access =
-			MAX2(existing->max_array_access,
-			     var->max_array_access);
 		  }
 	       } else {
 		  linker_error_printf(prog, "%s `%s' declared as type "



More information about the mesa-commit mailing list