glsl: parser changes for GL_ARB_explicit_uniform_location

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.

v2: change parser check to require GLSL 330 or enabling
    GL_ARB_explicit_attrib_location (Ian)
v3: fix the check and comment in AST->HIR (Petri)

Signed-off-by: Tapani Pälli <tapani.palli@intel.com>
This commit is contained in:
Tapani Pälli
2014-03-05 12:35:03 +02:00
parent 8381f0f0c3
commit e8fb8b1bb3
4 changed files with 54 additions and 0 deletions

View File

@@ -2181,6 +2181,41 @@ 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 (!state->check_explicit_uniform_location_allowed(loc, var))
return;
const struct gl_context *const ctx = state->ctx;
unsigned max_loc = qual->location + var->type->uniform_locations() - 1;
/* 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(s) consumed by 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

View File

@@ -2089,6 +2089,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);

View File

@@ -396,6 +396,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

View File

@@ -151,6 +151,21 @@ struct _mesa_glsl_parse_state {
return true;
}
bool check_explicit_uniform_location_allowed(YYLTYPE *locp,
const ir_variable *var)
{
if (!this->has_explicit_attrib_location() ||
!this->ARB_explicit_uniform_location_enable) {
_mesa_glsl_error(locp, this,
"uniform explicit location requires "
"GL_ARB_explicit_uniform_location and either "
"GL_ARB_explicit_attrib_location or GLSL 330.");
return false;
}
return true;
}
bool has_explicit_attrib_location() const
{
return ARB_explicit_attrib_location_enable || is_version(330, 300);