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 <ian.d.romanick@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11602>
This commit is contained in:
Timothy Arceri 2021-06-25 20:30:32 +10:00 committed by Marge Bot
parent 02dd03ff3c
commit e607205af0
2 changed files with 52 additions and 35 deletions

View 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);
}
/**
@ -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);
}

View 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);