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

Paul Berry stereotype441 at gmail.com
Fri Nov 30 13:54:24 PST 2012


On 30 November 2012 11:52, Ian Romanick <idr at freedesktop.org> wrote:

> 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'
>
> v3: Make sure a correct language_version is set in
> _mesa_glsl_parse_state::process_version_directive.
>
> Signed-off-by: Paul Berry <stereotype441 at gmail.com>
> Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
> ---
> This fixes the invalid-version.vert recently posted to the piglit
> mailing list.  A later patch adds (valid) assertions in
> _mesa_glsl_parse_state::process_version_directive that fail if
> language_version is bogus.  I plan to post some unit tests for
> _mesa_glsl_parse_state::process_version_directive shortly.
>

This fix looks good to me.


>
>  src/glsl/glsl_parser.yy         |   6 ++-
>  src/glsl/glsl_parser_extras.cpp | 105
> ++++++++++++++++++++++++++++++----------
>  src/glsl/glsl_parser_extras.h   |   3 +-
>  3 files changed, 86 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..9efeb12 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;
> @@ -219,6 +253,25 @@
> _mesa_glsl_parse_state::process_version_directive(YYLTYPE *locp, int
> version)
>                         "Supported versions are: %s\n",
>                         this->get_version_string(),
>                         this->supported_version_string);
> +
> +      /* On exit, the language_version must be set to a valid value.
> +       * Later calls to _mesa_glsl_initialize_types will misbehave if
> +       * the version is invalid.
> +       */
> +      switch (this->ctx->API) {
> +      case API_OPENGL:
> +      case API_OPENGL_CORE:
> +        this->language_version = this->ctx->Const.GLSLVersion;
> +        break;
> +
> +      case API_OPENGLES:
> +        assert(!"Should not get here.");
> +        /* FALLTHROUGH */
> +
> +      case API_OPENGLES2:
> +        this->language_version = 100;
> +        break;
> +      }
>     }
>
>     if (this->language_version >= 140) {
> 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
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20121130/74142e43/attachment-0001.html>


More information about the mesa-dev mailing list