glsl: force_glsl_version to shaders with no defined version
authorTimothy Arceri <tarceri@itsqueeze.com>
Fri, 25 Jun 2021 10:30:32 +0000 (20:30 +1000)
committerMarge Bot <eric+marge@anholt.net>
Tue, 29 Jun 2021 02:59:28 +0000 (02:59 +0000)
If a shader has no defined version force_glsl_version was
previous ignored and the shader would default to 110. This updates
the code so that those shaders are forced to a new level also.

We reused the existing code to make sure a sensible value is set
for the version.

Cc: mesa-stable
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11602>

src/compiler/glsl/glsl_parser_extras.cpp
src/compiler/glsl/glsl_parser_extras.h

index 4e21221..a02e3d8 100644 (file)
@@ -329,6 +329,10 @@ _mesa_glsl_parse_state::_mesa_glsl_parse_state(struct gl_context *_ctx,
    this->bindless_image_specified = false;
    this->bound_sampler_specified = false;
    this->bound_image_specified = false;
+
+   this->language_version = this->forced_language_version ?
+      this->forced_language_version : this->language_version;
+   set_valid_gl_and_glsl_versions(NULL);
 }
 
 /**
@@ -383,6 +387,51 @@ _mesa_glsl_parse_state::check_version(unsigned required_glsl_version,
 }
 
 /**
+ * This makes sure any GLSL versions defined or overridden are valid. If not it
+ * sets a valid value.
+ */
+void
+_mesa_glsl_parse_state::set_valid_gl_and_glsl_versions(YYLTYPE *locp)
+{
+   bool supported = false;
+   for (unsigned i = 0; i < this->num_supported_versions; i++) {
+      if (this->supported_versions[i].ver == this->language_version
+          && this->supported_versions[i].es == this->es_shader) {
+         this->gl_version = this->supported_versions[i].gl_ver;
+         supported = true;
+         break;
+      }
+   }
+
+   if (!supported) {
+      if (locp) {
+         _mesa_glsl_error(locp, this, "%s is not supported. "
+                          "Supported versions are: %s",
+                          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_COMPAT:
+      case API_OPENGL_CORE:
+        this->language_version = this->ctx->Const.GLSLVersion;
+        break;
+
+      case API_OPENGLES:
+        FALLTHROUGH;
+
+      case API_OPENGLES2:
+        this->language_version = 100;
+        break;
+      }
+   }
+}
+
+/**
  * Process a GLSL #version directive.
  *
  * \param version is the integer that follows the #version token.
@@ -447,41 +496,7 @@ _mesa_glsl_parse_state::process_version_directive(YYLTYPE *locp, int version,
                           this->language_version == 140) ||
                          (!this->es_shader && this->language_version < 140);
 
-   bool supported = false;
-   for (unsigned i = 0; i < this->num_supported_versions; i++) {
-      if (this->supported_versions[i].ver == this->language_version
-          && this->supported_versions[i].es == this->es_shader) {
-         this->gl_version = this->supported_versions[i].gl_ver;
-         supported = true;
-         break;
-      }
-   }
-
-   if (!supported) {
-      _mesa_glsl_error(locp, this, "%s is not supported. "
-                       "Supported versions are: %s",
-                       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_COMPAT:
-      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;
-      }
-   }
+   set_valid_gl_and_glsl_versions(locp);
 }
 
 
index efd9e05..18e3f86 100644 (file)
@@ -368,6 +368,8 @@ struct _mesa_glsl_parse_state {
              is_version(400, 0);
    }
 
+   void set_valid_gl_and_glsl_versions(YYLTYPE *locp);
+
    void process_version_directive(YYLTYPE *locp, int version,
                                   const char *ident);