glsl: Create and use a has_explicit_attrib_location() helper.

Explicit attribute locations are supported with GLSL 3.30, GLSL ES 3.00,
or "#extension GL_ARB_explicit_attrib_location: enable".  Using a helper
function makes it easy to check for this.

This enables support in GLSL 3.30, which was previously missing.

Previously, we overrode the extension enable flag for ES 3.00.  This is
not robust against a shader such as:

   #version 330
   #extension GL_ARB_explicit_attrib_location : disable

Disabling extensions should not remove core language functionality.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
This commit is contained in:
Kenneth Graunke
2013-09-23 18:13:52 -07:00
parent e9b410b54d
commit e4af55c78f
4 changed files with 7 additions and 6 deletions
+1 -1
View File
@@ -2842,7 +2842,7 @@ ast_declarator_list::hir(exec_list *instructions,
* any extension that adds the 'layout' keyword.
*/
if (!state->is_version(130, 300)
&& !state->ARB_explicit_attrib_location_enable
&& !state->has_explicit_attrib_location()
&& !state->ARB_fragment_coord_conventions_enable) {
if (this->type->qualifier.flags.q.out) {
_mesa_glsl_error(& loc, state,
+1 -1
View File
@@ -1262,7 +1262,7 @@ layout_qualifier_id:
{
memset(& $$, 0, sizeof($$));
if (state->ARB_explicit_attrib_location_enable) {
if (state->has_explicit_attrib_location()) {
if (strcmp("location", $1) == 0) {
$$.flags.q.explicit_location = 1;
-4
View File
@@ -303,10 +303,6 @@ _mesa_glsl_parse_state::process_version_directive(YYLTYPE *locp, int version,
if (this->language_version >= 140) {
this->ARB_uniform_buffer_object_enable = true;
}
if (this->language_version == 300 && this->es_shader) {
this->ARB_explicit_attrib_location_enable = true;
}
}
extern "C" {
+5
View File
@@ -121,6 +121,11 @@ struct _mesa_glsl_parse_state {
return check_version(130, 300, locp, "bit-wise operations are forbidden");
}
bool has_explicit_attrib_location() const
{
return ARB_explicit_attrib_location_enable || is_version(330, 300);
}
void process_version_directive(YYLTYPE *locp, int version,
const char *ident);