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.pa...@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); > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev