glsl/parser: Extract version directive processing into a function.
authorPaul Berry <stereotype441@gmail.com>
Thu, 2 Aug 2012 18:02:55 +0000 (11:02 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Thu, 6 Dec 2012 20:13:21 +0000 (12:13 -0800)
Version directive handling is going to have to be used within two
parser rules, one for desktop-style version directives (e.g. "#version
130") and one for the new ES-style version directive (e.g. "#version
300 es"), so this patch moves it to a function that can be called from
both rules.

No functional change.

Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Acked-by: Carl Worth <cworth@cworth.org>
src/glsl/glsl_parser.yy
src/glsl/glsl_parser_extras.cpp
src/glsl/glsl_parser_extras.h

index 6cc1a513bd5827b95d6689876fc82e0834041073..b15e1d1f5482a1f6f20f8ccab7eaa666dba5f7c7 100644 (file)
@@ -261,48 +261,7 @@ version_statement:
        /* blank - no #version specified: defaults are already set */
        | VERSION_TOK INTCONSTANT EOL
        {
-          bool supported = false;
-
-          switch ($2) {
-          case 100:
-             state->es_shader = true;
-             supported = state->ctx->API == API_OPENGLES2 ||
-                         state->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(state->ctx) &&
-                         ((unsigned) $2) <= state->ctx->Const.GLSLVersion;
-             break;
-          default:
-             supported = false;
-             break;
-          }
-
-          state->language_version = $2;
-
-          if (!supported) {
-             _mesa_glsl_error(& @2, state, "%s is not supported. "
-                              "Supported versions are: %s\n",
-                              state->get_version_string(),
-                              state->supported_version_string);
-          }
-
-          if (state->language_version >= 140) {
-             state->ARB_uniform_buffer_object_enable = true;
-          }
+           state->process_version_directive(&@2, $2);
        }
        ;
 
index 14589b020058a0995df2efe5aadab2a8df6e2c16..cc33a0724e158c2619005dabdd31af40cd01ee29 100644 (file)
@@ -174,6 +174,58 @@ _mesa_glsl_parse_state::check_version(unsigned required_glsl_version,
    return false;
 }
 
+/**
+ * Process a GLSL #version directive.
+ *
+ * \param version is the integer that follows the #version token.
+ */
+void
+_mesa_glsl_parse_state::process_version_directive(YYLTYPE *locp, int version)
+{
+   bool supported = false;
+
+   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;
+
+   if (!supported) {
+      _mesa_glsl_error(locp, this, "%s is not supported. "
+                       "Supported versions are: %s\n",
+                       this->get_version_string(),
+                       this->supported_version_string);
+   }
+
+   if (this->language_version >= 140) {
+      this->ARB_uniform_buffer_object_enable = true;
+   }
+}
+
 const char *
 _mesa_glsl_shader_target_name(enum _mesa_glsl_parser_targets target)
 {
index f05406abf0a091c359d5d7dc39f57c489f0c1f9e..59c4b24dcd3648972aadaa460149c12314c7b7f1 100644 (file)
@@ -136,6 +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);
+
    struct gl_context *const ctx;
    void *scanner;
    exec_list translation_unit;