Mesa (glsl2): linker: Track and validate GLSL versions used in shaders

Ian Romanick idr at kemper.freedesktop.org
Tue Jul 20 02:22:24 UTC 2010


Module: Mesa
Branch: glsl2
Commit: 25f51d3b9b8c36c41cd23d2797b6a06f6e27ff86
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=25f51d3b9b8c36c41cd23d2797b6a06f6e27ff86

Author: Ian Romanick <ian.d.romanick at intel.com>
Date:   Fri Jul 16 15:51:50 2010 -0700

linker: Track and validate GLSL versions used in shaders

---

 src/glsl/linker.cpp            |   21 +++++++++++++++++++++
 src/glsl/main.cpp              |    1 +
 src/mesa/main/mtypes.h         |    4 ++++
 src/mesa/shader/ir_to_mesa.cpp |    1 +
 4 files changed, 27 insertions(+), 0 deletions(-)

diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp
index 06aa24e..4933686 100644
--- a/src/glsl/linker.cpp
+++ b/src/glsl/linker.cpp
@@ -66,12 +66,14 @@
 #include <cstdlib>
 #include <cstdio>
 #include <cstdarg>
+#include <climits>
 
 extern "C" {
 #include <talloc.h>
 }
 
 #include "main/mtypes.h"
+#include "main/macros.h"
 #include "glsl_symbol_table.h"
 #include "ir.h"
 #include "program.h"
@@ -1107,7 +1109,12 @@ link_shaders(struct gl_shader_program *prog)
       calloc(2 * prog->NumShaders, sizeof(struct gl_shader *));
    frag_shader_list =  &vert_shader_list[prog->NumShaders];
 
+   unsigned min_version = UINT_MAX;
+   unsigned max_version = 0;
    for (unsigned i = 0; i < prog->NumShaders; i++) {
+      min_version = MIN2(min_version, prog->Shaders[i]->Version);
+      max_version = MAX2(max_version, prog->Shaders[i]->Version);
+
       switch (prog->Shaders[i]->Type) {
       case GL_VERTEX_SHADER:
 	 vert_shader_list[num_vert_shaders] = prog->Shaders[i];
@@ -1124,6 +1131,20 @@ link_shaders(struct gl_shader_program *prog)
       }
    }
 
+   /* Previous to GLSL version 1.30, different compilation units could mix and
+    * match shading language versions.  With GLSL 1.30 and later, the versions
+    * of all shaders must match.
+    */
+   assert(min_version >= 110);
+   assert(max_version <= 130);
+   if ((max_version >= 130) && (min_version != max_version)) {
+      linker_error_printf(prog, "all shaders must use same shading "
+			  "language version\n");
+      goto done;
+   }
+
+   prog->Version = max_version;
+
    /* FINISHME: Implement intra-stage linking. */
    prog->_NumLinkedShaders = 0;
    if (num_vert_shaders > 0) {
diff --git a/src/glsl/main.cpp b/src/glsl/main.cpp
index 8b0bccd..e27d9c1 100644
--- a/src/glsl/main.cpp
+++ b/src/glsl/main.cpp
@@ -207,6 +207,7 @@ compile_shader(struct gl_shader *shader)
 
    shader->symbols = state->symbols;
    shader->CompileStatus = !state->error;
+   shader->Version = state->language_version;
 
    if (shader->InfoLog)
       talloc_free(shader->InfoLog);
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index be9eaaa..729c2ea 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -1967,6 +1967,8 @@ struct gl_shader
    GLchar *InfoLog;
    struct gl_sl_pragmas Pragmas;
 
+   unsigned Version;       /**< GLSL version used for linking */
+
    struct exec_list *ir;
    struct glsl_symbol_table *symbols;
 };
@@ -2006,6 +2008,8 @@ struct gl_shader_program
    GLboolean _Used;        /**< Ever used for drawing? */
    GLchar *InfoLog;
 
+   unsigned Version;       /**< GLSL version used for linking */
+
    /**
     * Per-stage shaders resulting from the first stage of linking.
     */
diff --git a/src/mesa/shader/ir_to_mesa.cpp b/src/mesa/shader/ir_to_mesa.cpp
index 58320c9..557f5d3 100644
--- a/src/mesa/shader/ir_to_mesa.cpp
+++ b/src/mesa/shader/ir_to_mesa.cpp
@@ -2234,6 +2234,7 @@ _mesa_glsl_compile_shader(GLcontext *ctx, struct gl_shader *shader)
 
    shader->CompileStatus = !state->error;
    shader->InfoLog = state->info_log;
+   shader->Version = state->language_version;
 
    /* Retain any live IR, but trash the rest. */
    foreach_list(node, shader->ir) {




More information about the mesa-commit mailing list