On 30 November 2012 11:52, Ian Romanick <span dir="ltr"><<a href="mailto:idr@freedesktop.org" target="_blank">idr@freedesktop.org</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="im">From: Paul Berry <<a href="mailto:stereotype441@gmail.com">stereotype441@gmail.com</a>><br>
<br>
Note that GLSL 1.00 is selected using "#version 100", so "#version 100<br>
es" is prohibited.<br>
<br>
v2: Check for GLES3 before allowing '#version 300 es'<br>
<br>
</div><div class="im">v3: Make sure a correct language_version is set in<br>
_mesa_glsl_parse_state::process_version_directive.<br>
<br>
</div><div class="im">Signed-off-by: Paul Berry <<a href="mailto:stereotype441@gmail.com">stereotype441@gmail.com</a>><br>
Signed-off-by: Ian Romanick <<a href="mailto:ian.d.romanick@intel.com">ian.d.romanick@intel.com</a>><br>
---<br>
</div><div class="im">This fixes the invalid-version.vert recently posted to the piglit<br>
mailing list.  A later patch adds (valid) assertions in<br>
_mesa_glsl_parse_state::process_version_directive that fail if<br>
language_version is bogus.  I plan to post some unit tests for<br>
_mesa_glsl_parse_state::process_version_directive shortly.<br></div></blockquote><div><br>This fix looks good to me.<br> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="im">
<br>
 src/glsl/glsl_parser.yy         |   6 ++-<br>
 src/glsl/glsl_parser_extras.cpp | 105 ++++++++++++++++++++++++++++++----------<br>
</div> src/glsl/glsl_parser_extras.h   |   3 +-<br>
 3 files changed, 86 insertions(+), 28 deletions(-)<br>
<div class="im"><br>
diff --git a/src/glsl/glsl_parser.yy b/src/glsl/glsl_parser.yy<br>
index b15e1d1..d938765 100644<br>
--- a/src/glsl/glsl_parser.yy<br>
+++ b/src/glsl/glsl_parser.yy<br>
@@ -261,8 +261,12 @@ version_statement:<br>
        /* blank - no #version specified: defaults are already set */<br>
        | VERSION_TOK INTCONSTANT EOL<br>
        {<br>
-           state->process_version_directive(&@2, $2);<br>
+           state->process_version_directive(&@2, $2, NULL);<br>
        }<br>
+        | VERSION_TOK INTCONSTANT any_identifier EOL<br>
+        {<br>
+           state->process_version_directive(&@2, $2, $3);<br>
+        }<br>
        ;<br>
<br>
 pragma_statement:<br>
diff --git a/src/glsl/glsl_parser_extras.cpp b/src/glsl/glsl_parser_extras.cpp<br>
</div>index cc33a07..9efeb12 100644<br>
<div><div class="h5">--- a/src/glsl/glsl_parser_extras.cpp<br>
+++ b/src/glsl/glsl_parser_extras.cpp<br>
@@ -178,38 +178,72 @@ _mesa_glsl_parse_state::check_version(unsigned required_glsl_version,<br>
  * Process a GLSL #version directive.<br>
  *<br>
  * \param version is the integer that follows the #version token.<br>
+ *<br>
+ * \param ident is a string identifier that follows the integer, if any is<br>
+ * present.  Otherwise NULL.<br>
  */<br>
 void<br>
-_mesa_glsl_parse_state::process_version_directive(YYLTYPE *locp, int version)<br>
+_mesa_glsl_parse_state::process_version_directive(YYLTYPE *locp, int version,<br>
+                                                  const char *ident)<br>
 {<br>
+   bool es_token_present = false;<br>
+   if (ident) {<br>
+      if (strcmp(ident, "es") == 0) {<br>
+         es_token_present = true;<br>
+      } else {<br>
+         _mesa_glsl_error(locp, this,<br>
+                          "Illegal text following version number\n");<br>
+      }<br>
+   }<br>
+<br>
    bool supported = false;<br>
<br>
-   switch (version) {<br>
-   case 100:<br>
+   if (es_token_present) {<br>
       this->es_shader = true;<br>
-      supported = this->ctx->API == API_OPENGLES2 ||<br>
-         this->ctx->Extensions.ARB_ES2_compatibility;<br>
-      break;<br>
-   case 110:<br>
-   case 120:<br>
-      /* FINISHME: Once the OpenGL 3.0 'forward compatible' context or<br>
-       * the OpenGL 3.2 Core context is supported, this logic will need<br>
-       * change.  Older versions of GLSL are no longer supported<br>
-       * outside the compatibility contexts of 3.x.<br>
-       */<br>
-   case 130:<br>
-   case 140:<br>
-   case 150:<br>
-   case 330:<br>
-   case 400:<br>
-   case 410:<br>
-   case 420:<br>
-      supported = _mesa_is_desktop_gl(this->ctx) &&<br>
-         ((unsigned) version) <= this->ctx->Const.GLSLVersion;<br>
-      break;<br>
-   default:<br>
-      supported = false;<br>
-      break;<br>
+      switch (version) {<br>
+      case 100:<br>
+         _mesa_glsl_error(locp, this,<br>
+                          "GLSL 1.00 ES should be selected using "<br>
+                          "`#version 100'\n");<br>
+         supported = this->ctx->API == API_OPENGLES2 ||<br>
+            this->ctx->Extensions.ARB_ES2_compatibility;<br>
+         break;<br>
+      case 300:<br>
+         supported = _mesa_is_gles3(this->ctx) ||<br>
+           this->ctx->Extensions.ARB_ES3_compatibility;<br>
+         break;<br>
+      default:<br>
+         supported = false;<br>
+         break;<br>
+      }<br>
+   } else {<br>
+      switch (version) {<br>
+      case 100:<br>
+         this->es_shader = true;<br>
+         supported = this->ctx->API == API_OPENGLES2 ||<br>
+            this->ctx->Extensions.ARB_ES2_compatibility;<br>
+         break;<br>
+      case 110:<br>
+      case 120:<br>
+         /* FINISHME: Once the OpenGL 3.0 'forward compatible' context or<br>
+          * the OpenGL 3.2 Core context is supported, this logic will need<br>
+          * change.  Older versions of GLSL are no longer supported<br>
+          * outside the compatibility contexts of 3.x.<br>
+          */<br>
+      case 130:<br>
+      case 140:<br>
+      case 150:<br>
+      case 330:<br>
+      case 400:<br>
+      case 410:<br>
+      case 420:<br>
+         supported = _mesa_is_desktop_gl(this->ctx) &&<br>
+            ((unsigned) version) <= this->ctx->Const.GLSLVersion;<br>
+         break;<br>
+      default:<br>
+         supported = false;<br>
+         break;<br>
+      }<br>
    }<br>
<br>
    this->language_version = version;<br>
</div></div><div class="im">@@ -219,6 +253,25 @@ _mesa_glsl_parse_state::process_version_directive(YYLTYPE *locp, int version)<br>
                        "Supported versions are: %s\n",<br>
                        this->get_version_string(),<br>
                        this->supported_version_string);<br>
+<br>
+      /* On exit, the language_version must be set to a valid value.<br>
+       * Later calls to _mesa_glsl_initialize_types will misbehave if<br>
+       * the version is invalid.<br>
+       */<br>
+      switch (this->ctx->API) {<br>
+      case API_OPENGL:<br>
+      case API_OPENGL_CORE:<br>
</div>+        this->language_version = this->ctx->Const.GLSLVersion;<br>
+        break;<br>
+<br>
<div class="im HOEnZb">+      case API_OPENGLES:<br>
+        assert(!"Should not get here.");<br>
+        /* FALLTHROUGH */<br>
+<br>
+      case API_OPENGLES2:<br>
+        this->language_version = 100;<br>
+        break;<br>
+      }<br>
    }<br>
<br>
    if (this->language_version >= 140) {<br>
</div><div class="HOEnZb"><div class="h5">diff --git a/src/glsl/glsl_parser_extras.h b/src/glsl/glsl_parser_extras.h<br>
index 5ee7bc1..210f262 100644<br>
--- a/src/glsl/glsl_parser_extras.h<br>
+++ b/src/glsl/glsl_parser_extras.h<br>
@@ -136,7 +136,8 @@ struct _mesa_glsl_parse_state {<br>
       return check_version(130, 300, locp, "bit-wise operations are forbidden");<br>
    }<br>
<br>
-   void process_version_directive(YYLTYPE *locp, int version);<br>
+   void process_version_directive(YYLTYPE *locp, int version,<br>
+                                  const char *ident);<br>
<br>
    struct gl_context *const ctx;<br>
    void *scanner;<br>
--<br>
1.7.11.7<br>
<br>
</div></div></blockquote></div><br></div>