From e607205af06ed22a4ac8e32a9b92fe0d7197aac9 Mon Sep 17 00:00:00 2001 From: Timothy Arceri Date: Fri, 25 Jun 2021 20:30:32 +1000 Subject: [PATCH] glsl: force_glsl_version to shaders with no defined version 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 Part-of: --- src/compiler/glsl/glsl_parser_extras.cpp | 85 ++++++++++++++---------- src/compiler/glsl/glsl_parser_extras.h | 2 + 2 files changed, 52 insertions(+), 35 deletions(-) diff --git a/src/compiler/glsl/glsl_parser_extras.cpp b/src/compiler/glsl/glsl_parser_extras.cpp index 4e2122160c6..a02e3d8be92 100644 --- a/src/compiler/glsl/glsl_parser_extras.cpp +++ b/src/compiler/glsl/glsl_parser_extras.cpp @@ -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); } /** @@ -382,6 +386,51 @@ _mesa_glsl_parse_state::check_version(unsigned required_glsl_version, return false; } +/** + * 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. * @@ -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); } diff --git a/src/compiler/glsl/glsl_parser_extras.h b/src/compiler/glsl/glsl_parser_extras.h index efd9e05f4d5..18e3f86a64f 100644 --- a/src/compiler/glsl/glsl_parser_extras.h +++ b/src/compiler/glsl/glsl_parser_extras.h @@ -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);