diff options
author | Ian Romanick <[email protected]> | 2010-07-16 15:51:50 -0700 |
---|---|---|
committer | Ian Romanick <[email protected]> | 2010-07-19 14:50:43 -0700 |
commit | 25f51d3b9b8c36c41cd23d2797b6a06f6e27ff86 (patch) | |
tree | b2af2b9e217ba74b212d28a8edc94c9979990a08 /src/glsl | |
parent | b64e979971e764ec1df8800d31c755298e618ba0 (diff) |
linker: Track and validate GLSL versions used in shaders
Diffstat (limited to 'src/glsl')
-rw-r--r-- | src/glsl/linker.cpp | 21 | ||||
-rw-r--r-- | src/glsl/main.cpp | 1 |
2 files changed, 22 insertions, 0 deletions
diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp index 06aa24e66f5..4933686b5e9 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 8b0bccdcb71..e27d9c1d855 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); |