[Mesa-dev] [PATCH 14/26] glsl/parser: Handle "#version 300 es" directive.

Ian Romanick idr at freedesktop.org
Fri Nov 30 10:07:29 PST 2012


From: Paul Berry <stereotype441 at gmail.com>

Note that GLSL 1.00 is selected using "#version 100", so "#version 100
es" is prohibited.

v2: Check for GLES3 before allowing '#version 300 es'

Signed-off-by: Paul Berry <stereotype441 at gmail.com>
Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
---
 src/glsl/glsl_parser.yy         |  6 ++-
 src/glsl/glsl_parser_extras.cpp | 86 ++++++++++++++++++++++++++++-------------
 src/glsl/glsl_parser_extras.h   |  3 +-
 3 files changed, 67 insertions(+), 28 deletions(-)

diff --git a/src/glsl/glsl_parser.yy b/src/glsl/glsl_parser.yy
index b15e1d1..d938765 100644
--- a/src/glsl/glsl_parser.yy
+++ b/src/glsl/glsl_parser.yy
@@ -261,8 +261,12 @@ version_statement:
 	/* blank - no #version specified: defaults are already set */
 	| VERSION_TOK INTCONSTANT EOL
 	{
-           state->process_version_directive(&@2, $2);
+           state->process_version_directive(&@2, $2, NULL);
 	}
+        | VERSION_TOK INTCONSTANT any_identifier EOL
+        {
+           state->process_version_directive(&@2, $2, $3);
+        }
 	;
 
 pragma_statement:
diff --git a/src/glsl/glsl_parser_extras.cpp b/src/glsl/glsl_parser_extras.cpp
index cc33a07..2d356cf 100644
--- a/src/glsl/glsl_parser_extras.cpp
+++ b/src/glsl/glsl_parser_extras.cpp
@@ -178,38 +178,72 @@ _mesa_glsl_parse_state::check_version(unsigned required_glsl_version,
  * Process a GLSL #version directive.
  *
  * \param version is the integer that follows the #version token.
+ *
+ * \param ident is a string identifier that follows the integer, if any is
+ * present.  Otherwise NULL.
  */
 void
-_mesa_glsl_parse_state::process_version_directive(YYLTYPE *locp, int version)
+_mesa_glsl_parse_state::process_version_directive(YYLTYPE *locp, int version,
+                                                  const char *ident)
 {
+   bool es_token_present = false;
+   if (ident) {
+      if (strcmp(ident, "es") == 0) {
+         es_token_present = true;
+      } else {
+         _mesa_glsl_error(locp, this,
+                          "Illegal text following version number\n");
+      }
+   }
+
    bool supported = false;
 
-   switch (version) {
-   case 100:
+   if (es_token_present) {
       this->es_shader = true;
-      supported = this->ctx->API == API_OPENGLES2 ||
-         this->ctx->Extensions.ARB_ES2_compatibility;
-      break;
-   case 110:
-   case 120:
-      /* FINISHME: Once the OpenGL 3.0 'forward compatible' context or
-       * the OpenGL 3.2 Core context is supported, this logic will need
-       * change.  Older versions of GLSL are no longer supported
-       * outside the compatibility contexts of 3.x.
-       */
-   case 130:
-   case 140:
-   case 150:
-   case 330:
-   case 400:
-   case 410:
-   case 420:
-      supported = _mesa_is_desktop_gl(this->ctx) &&
-         ((unsigned) version) <= this->ctx->Const.GLSLVersion;
-      break;
-   default:
-      supported = false;
-      break;
+      switch (version) {
+      case 100:
+         _mesa_glsl_error(locp, this,
+                          "GLSL 1.00 ES should be selected using "
+                          "`#version 100'\n");
+         supported = this->ctx->API == API_OPENGLES2 ||
+            this->ctx->Extensions.ARB_ES2_compatibility;
+         break;
+      case 300:
+         supported = _mesa_is_gles3(this->ctx) ||
+	    this->ctx->Extensions.ARB_ES3_compatibility;
+         break;
+      default:
+         supported = false;
+         break;
+      }
+   } else {
+      switch (version) {
+      case 100:
+         this->es_shader = true;
+         supported = this->ctx->API == API_OPENGLES2 ||
+            this->ctx->Extensions.ARB_ES2_compatibility;
+         break;
+      case 110:
+      case 120:
+         /* FINISHME: Once the OpenGL 3.0 'forward compatible' context or
+          * the OpenGL 3.2 Core context is supported, this logic will need
+          * change.  Older versions of GLSL are no longer supported
+          * outside the compatibility contexts of 3.x.
+          */
+      case 130:
+      case 140:
+      case 150:
+      case 330:
+      case 400:
+      case 410:
+      case 420:
+         supported = _mesa_is_desktop_gl(this->ctx) &&
+            ((unsigned) version) <= this->ctx->Const.GLSLVersion;
+         break;
+      default:
+         supported = false;
+         break;
+      }
    }
 
    this->language_version = version;
diff --git a/src/glsl/glsl_parser_extras.h b/src/glsl/glsl_parser_extras.h
index 5ee7bc1..210f262 100644
--- a/src/glsl/glsl_parser_extras.h
+++ b/src/glsl/glsl_parser_extras.h
@@ -136,7 +136,8 @@ struct _mesa_glsl_parse_state {
       return check_version(130, 300, locp, "bit-wise operations are forbidden");
    }
 
-   void process_version_directive(YYLTYPE *locp, int version);
+   void process_version_directive(YYLTYPE *locp, int version,
+                                  const char *ident);
 
    struct gl_context *const ctx;
    void *scanner;
-- 
1.7.11.7



More information about the mesa-dev mailing list