[Mesa-dev] [PATCH 16/26] glsl: Clean up shading language mixing check for GLSL 3.00 ES.

Kenneth Graunke kenneth at whitecape.org
Sat Dec 1 04:52:40 PST 2012


On 11/30/2012 10:07 AM, Ian Romanick wrote:
> From: Paul Berry <stereotype441 at gmail.com>
>
> Previously, we prohibited mixing of shading language versions if
> min_version == 100 or max_version >= 130.  This was technically
> correct (since desktop GLSL 1.30 and beyond prohibit mixing of shading
> language versions, as does GLSL 1.00 ES), but it was confusing.  Also,
> we asserted that all shading language versions were between 1.00 and
> 1.40, which was unnecessary (since the parser already checks shading
> language versions) and doesn't work for GLSL 3.00 ES.
>
> This patch changes the code to explicitly check that (a) ES shaders
> aren't mixed with desktop shaders, (b) shaders aren't mixed between ES
> versions, and (c) shaders aren't mixed between desktop GLSL versions
> when at least one shader is GLSL 1.30 or greater.  Also, it removes
> the unnecessary assertion.
>
> Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>
> ---
>   src/glsl/linker.cpp | 16 +++++++++++++---
>   1 file changed, 13 insertions(+), 3 deletions(-)
>
> diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp
> index 3b2ab96..1bae043 100644
> --- a/src/glsl/linker.cpp
> +++ b/src/glsl/linker.cpp
> @@ -2421,9 +2421,19 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog)
>
>      unsigned min_version = UINT_MAX;
>      unsigned max_version = 0;
> +   bool is_es_prog = false;
>      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);
> +      if (i == 0) {
> +         is_es_prog = prog->Shaders[i]->IsEsShader;
> +      } else {

I really dislike loops that contain conditional code for particular 
indices.  It almost seems like you want:

bool is_es_prog = prog->Shaders[0]->IsEsShader;

then you can just omit this code within the loop.  Nice and clean.  The 
only trouble is that doing so assumes there is at least one shader.

I *believe* that calling glLinkProgram with no attached shaders is an 
error and should be rejected (oglconform claims it's invalid).  However, 
I can't find any spec text about it and I'm fairly sure we don't verify 
that NumShaders >= 1 when linking.

But it's not a big deal...just a pet peeve I picked up after reading 
code in another project which was essentially:
for (int i = 0; i < POUND_DEFINE_THAT_HAPPENS_TO_BE_THREE; i++) {
    if (i == 0) {...} else if (i == 1) {...} else if (i == 2) {...}
    /* seriously, why the hell did you make this a loop? */
}

Your code here is sensible and gets a R-b either way.

> +         if (prog->Shaders[i]->IsEsShader != is_es_prog) {
> +            linker_error(prog, "all shaders must use same shading "
> +                         "language version\n");
> +            goto done;
> +         }
> +      }
>
>         switch (prog->Shaders[i]->Type) {
>         case GL_VERTEX_SHADER:
> @@ -2444,10 +2454,10 @@ link_shaders(struct gl_context *ctx, 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.
> +    *
> +    * GLSL ES has never allowed mixing of shading language versions.
>       */
> -   assert(min_version >= 100);
> -   assert(max_version <= 140);
> -   if ((max_version >= 130 || min_version == 100)
> +   if ((is_es_prog || max_version >= 130)
>          && min_version != max_version) {
>         linker_error(prog, "all shaders must use same shading "
>   		   "language version\n");
>



More information about the mesa-dev mailing list