[Mesa-dev] [PATCH 1/2] glsl: Create and use a has_explicit_attrib_location() helper.

Kenneth Graunke kenneth at whitecape.org
Mon Sep 23 20:22:41 PDT 2013


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 at whitecape.org>
Cc: Paul Berry <stereotype441 at gmail.com>
Cc: Ian Romanick <idr at freedesktop.org>
---
 src/glsl/ast_to_hir.cpp         | 2 +-
 src/glsl/glsl_parser.yy         | 2 +-
 src/glsl/glsl_parser_extras.cpp | 4 ----
 src/glsl/glsl_parser_extras.h   | 5 +++++
 4 files changed, 7 insertions(+), 6 deletions(-)

diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
index 2316cf8..0859d9e 100644
--- a/src/glsl/ast_to_hir.cpp
+++ b/src/glsl/ast_to_hir.cpp
@@ -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,
diff --git a/src/glsl/glsl_parser.yy b/src/glsl/glsl_parser.yy
index fa6e205..56ca4ad 100644
--- a/src/glsl/glsl_parser.yy
+++ b/src/glsl/glsl_parser.yy
@@ -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;
 
diff --git a/src/glsl/glsl_parser_extras.cpp b/src/glsl/glsl_parser_extras.cpp
index cac5a18..a2b52ef 100644
--- a/src/glsl/glsl_parser_extras.cpp
+++ b/src/glsl/glsl_parser_extras.cpp
@@ -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" {
diff --git a/src/glsl/glsl_parser_extras.h b/src/glsl/glsl_parser_extras.h
index 364a983..27ebbcf 100644
--- a/src/glsl/glsl_parser_extras.h
+++ b/src/glsl/glsl_parser_extras.h
@@ -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);
 
-- 
1.8.3.4



More information about the mesa-dev mailing list