[Mesa-dev] [WIP 11/13] glsl: parser changes for GL_ARB_explicit_uniform_location

Ian Romanick idr at freedesktop.org
Fri Apr 4 14:42:16 PDT 2014


On 03/27/2014 11:45 PM, Tapani Pälli wrote:
> Patch adds a preprocessor define for the extension and stores
> explicit location data for uniforms during AST->HIR conversion.
> It also sets layout token to be available when having the
> extension in place.
> 
> Signed-off-by: Tapani Pälli <tapani.palli at intel.com>
> ---
>  src/glsl/ast_to_hir.cpp      | 13 +++++++++++++
>  src/glsl/glcpp/glcpp-parse.y |  3 +++
>  src/glsl/glsl_lexer.ll       |  1 +
>  3 files changed, 17 insertions(+)
> 
> diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
> index 8f6e901..3bfad02 100644
> --- a/src/glsl/ast_to_hir.cpp
> +++ b/src/glsl/ast_to_hir.cpp
> @@ -2123,6 +2123,19 @@ validate_explicit_location(const struct ast_type_qualifier *qual,
>  {
>     bool fail = false;
>  
> +   /* Checks for GL_ARB_explicit_uniform_location. */
> +   if (qual->flags.q.uniform) {
> +
> +      if (qual->index < 0) {
> +         _mesa_glsl_error(loc, state,
> +                          "explicit location < 0 for uniform %s", var->name);

We also need to check that the explicit location isn't too large.  I
don't think that check can happen here because (I think) it will depend
on the size of the uniform.  The spec isn't completely clear, but I think

// assume GL_MAX_UNIFORM_LOCATIONS is 65536
layout(location=65535) float foo[1];

should fail because foo[1] would have location 65536 (larger than
GL_MAX_UNIFORM_LOCATIONS-1).

Given the other rules in the spec about counting and use of locations, I
think ast_to_hir is the right time to do the upper bound check.  I
believe we can figure out how many locations a structure or array
uniform will maximally use at that point.

> +      } else {
> +         var->data.explicit_location = true;
> +         var->data.location = qual->location;
> +      }
> +      return;
> +   }
> +
>     /* Between GL_ARB_explicit_attrib_location an
>      * GL_ARB_separate_shader_objects, the inputs and outputs of any shader
>      * stage can be assigned explicit locations.  The checking here associates
> diff --git a/src/glsl/glcpp/glcpp-parse.y b/src/glsl/glcpp/glcpp-parse.y
> index f28d853..6d42138 100644
> --- a/src/glsl/glcpp/glcpp-parse.y
> +++ b/src/glsl/glcpp/glcpp-parse.y
> @@ -2087,6 +2087,9 @@ _glcpp_parser_handle_version_declaration(glcpp_parser_t *parser, intmax_t versio
>  	      if (extensions->ARB_explicit_attrib_location)
>  	         add_builtin_define(parser, "GL_ARB_explicit_attrib_location", 1);
>  
> +	      if (extensions->ARB_explicit_uniform_location)
> +	         add_builtin_define(parser, "GL_ARB_explicit_uniform_location", 1);
> +
>  	      if (extensions->ARB_shader_texture_lod)
>  	         add_builtin_define(parser, "GL_ARB_shader_texture_lod", 1);
>  
> diff --git a/src/glsl/glsl_lexer.ll b/src/glsl/glsl_lexer.ll
> index 7602351..83f0b6d 100644
> --- a/src/glsl/glsl_lexer.ll
> +++ b/src/glsl/glsl_lexer.ll
> @@ -393,6 +393,7 @@ layout		{
>  		      || yyextra->AMD_conservative_depth_enable
>  		      || yyextra->ARB_conservative_depth_enable
>  		      || yyextra->ARB_explicit_attrib_location_enable
> +		      || yyextra->ARB_explicit_uniform_location_enable
>                        || yyextra->has_separate_shader_objects()
>  		      || yyextra->ARB_uniform_buffer_object_enable
>  		      || yyextra->ARB_fragment_coord_conventions_enable
> 



More information about the mesa-dev mailing list