[Mesa-dev] [PATCH 08/10] glsl: parser changes for GL_ARB_explicit_uniform_location
Ian Romanick
idr at freedesktop.org
Mon May 19 10:18:44 PDT 2014
On 04/09/2014 02:56 AM, 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 | 37 +++++++++++++++++++++++++++++++++++++
> src/glsl/glcpp/glcpp-parse.y | 3 +++
> src/glsl/glsl_lexer.ll | 1 +
> src/glsl/glsl_parser_extras.h | 14 ++++++++++++++
> 4 files changed, 55 insertions(+)
>
> diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
> index 8d55ee3..7431ad7 100644
> --- a/src/glsl/ast_to_hir.cpp
> +++ b/src/glsl/ast_to_hir.cpp
> @@ -2170,6 +2170,43 @@ validate_explicit_location(const struct ast_type_qualifier *qual,
> {
> bool fail = false;
>
> + /* Checks for GL_ARB_explicit_uniform_location. */
> + if (qual->flags.q.uniform) {
> +
Extra blank line.
> + if (!state->check_explicit_uniform_location_allowed(loc, var))
> + return;
> +
> + const struct gl_context *const ctx = state->ctx;
> + unsigned max_loc = qual->location + var->type->component_slots() - 1;
I think that over counts for this purpose, and we can blame confusing
nomenclature. component_slots for a mat4 is 4, so a mat4 uniform counts
4*4 against the GL_MAX_VERTEX_UNIFORM_COMPONENTS limit. However, it
only has one "location" (as returned by glGetUniformLocation), so it
only counts 1 against the GL_MAX_UNIFORM_LOCATIONS limit.
> +
> + /* ARB_explicit_uniform_location specification states:
> + *
> + * "The explicitly defined locations and the generated locations
> + * must be in the range of 0 to MAX_UNIFORM_LOCATIONS minus one."
> + *
> + * "Valid locations for default-block uniform variable locations
> + * are in the range of 0 to the implementation-defined maximum
> + * number of uniform locations."
> + */
> + if (qual->location < 0) {
> + _mesa_glsl_error(loc, state,
> + "explicit location < 0 for uniform %s", var->name);
> + return;
> + }
> +
> + if (max_loc >= ctx->Const.MaxUserAssignableUniformLocations) {
> + _mesa_glsl_error(loc, state, "location qualifier for uniform %s "
> + ">= MAX_UNIFORM_LOCATIONS (%u)",
> + var->name,
> + ctx->Const.MaxUserAssignableUniformLocations);
> + return;
> + }
> +
> + 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
> diff --git a/src/glsl/glsl_parser_extras.h b/src/glsl/glsl_parser_extras.h
> index c53c583..20879a0 100644
> --- a/src/glsl/glsl_parser_extras.h
> +++ b/src/glsl/glsl_parser_extras.h
> @@ -152,6 +152,20 @@ struct _mesa_glsl_parse_state {
> return true;
> }
>
> + bool check_explicit_uniform_location_allowed(YYLTYPE *locp,
> + const ir_variable *var)
> + {
> + /* Requires OpenGL 3.3 or ARB_explicit_attrib_location. */
> + if (ctx->Version < 33 && !ctx->Extensions.ARB_explicit_attrib_location) {
> + _mesa_glsl_error(locp, this, "%s explicit location requires "
> + "GL_ARB_explicit_attrib_location extension "
> + "or OpenGL 3.3", mode_string(var));
Many copy-and-paste bugs. :) Explicit uniform locations aren't added
until 4.3.
> + return false;
> + }
> +
> + return true;
> + }
> +
> bool has_explicit_attrib_location() const
> {
> return ARB_explicit_attrib_location_enable || is_version(330, 300);
>
More information about the mesa-dev
mailing list