Mesa (7.10): linker: Allow built-in arrays to have different sizes between shader stages

Ian Romanick idr at kemper.freedesktop.org
Tue Jan 4 00:48:30 UTC 2011


Module: Mesa
Branch: 7.10
Commit: 4febfee3b77faa8abbcc152896d76de30043c823
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=4febfee3b77faa8abbcc152896d76de30043c823

Author: Ian Romanick <ian.d.romanick at intel.com>
Date:   Mon Dec 13 15:16:39 2010 -0800

linker: Allow built-in arrays to have different sizes between shader stages

Fixes pitlit test glsl-link-varying-TexCoord (bugzilla #31650).
(cherry picked from commit cb2b547a4771ddf56975ede566dbf3a8f5389689)

---

 src/glsl/linker.cpp |   37 +++++++++++++++++++++++++++++--------
 1 files changed, 29 insertions(+), 8 deletions(-)

diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp
index e62fe6d..d8c42ac 100644
--- a/src/glsl/linker.cpp
+++ b/src/glsl/linker.cpp
@@ -487,14 +487,35 @@ cross_validate_outputs_to_inputs(struct gl_shader_program *prog,
 	 /* Check that the types match between stages.
 	  */
 	 if (input->type != output->type) {
-	    linker_error_printf(prog,
-				"%s shader output `%s' declared as "
-				"type `%s', but %s shader input declared "
-				"as type `%s'\n",
-				producer_stage, output->name,
-				output->type->name,
-				consumer_stage, input->type->name);
-	    return false;
+	    /* There is a bit of a special case for gl_TexCoord.  This
+	     * built-in is unsized by default.  Appliations that variable
+	     * access it must redeclare it with a size.  There is some
+	     * language in the GLSL spec that implies the fragment shader
+	     * and vertex shader do not have to agree on this size.  Other
+	     * driver behave this way, and one or two applications seem to
+	     * rely on it.
+	     *
+	     * Neither declaration needs to be modified here because the array
+	     * sizes are fixed later when update_array_sizes is called.
+	     *
+	     * From page 48 (page 54 of the PDF) of the GLSL 1.10 spec:
+	     *
+	     *     "Unlike user-defined varying variables, the built-in
+	     *     varying variables don't have a strict one-to-one
+	     *     correspondence between the vertex language and the
+	     *     fragment language."
+	     */
+	    if (!output->type->is_array()
+		|| (strncmp("gl_", output->name, 3) != 0)) {
+	       linker_error_printf(prog,
+				   "%s shader output `%s' declared as "
+				   "type `%s', but %s shader input declared "
+				   "as type `%s'\n",
+				   producer_stage, output->name,
+				   output->type->name,
+				   consumer_stage, input->type->name);
+	       return false;
+	    }
 	 }
 
 	 /* Check that all of the qualifiers match between stages.




More information about the mesa-commit mailing list