glsl: Allow compatibility shaders with MESA_GL_VERSION_OVERRIDE=...

Previously if you used MESA_GL_VERSION_OVERRIDE=3.3COMPAT, Mesa exposed
an OpenGL 3.3 compatibility profile context (with various unimplemented
features and bugs), but still refused to compile shaders with

   #version 330 compatibility

This patch simply adds a small bit of plumbing to let that through.

Of course the same caveats apply: compatibility profile is still not
supported (and will not be supported), so there are no guarantees that
anything will work.

Tested-by: Dylan Baker <dylan@pnwbakers.com>
Reviewed-by: Anuj Phogat <anuj.phogat@gmail.com>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
This commit is contained in:
Matt Turner
2017-01-31 15:41:52 -08:00
parent 89b4176eb1
commit d7a0486a9e
4 changed files with 14 additions and 4 deletions

View File

@@ -288,7 +288,7 @@ _mesa_glsl_initialize_types(struct _mesa_glsl_parse_state *state)
/* Add deprecated structure types. While these were deprecated in 1.30, /* Add deprecated structure types. While these were deprecated in 1.30,
* they're still present. We've removed them in 1.40+ (OpenGL 3.1+). * they're still present. We've removed them in 1.40+ (OpenGL 3.1+).
*/ */
if (!state->es_shader && state->language_version < 140) { if (state->compat_shader) {
for (unsigned i = 0; i < ARRAY_SIZE(deprecated_types); i++) { for (unsigned i = 0; i < ARRAY_SIZE(deprecated_types); i++) {
add_type(symbols, deprecated_types[i]); add_type(symbols, deprecated_types[i]);
} }

View File

@@ -444,7 +444,7 @@ private:
builtin_variable_generator::builtin_variable_generator( builtin_variable_generator::builtin_variable_generator(
exec_list *instructions, struct _mesa_glsl_parse_state *state) exec_list *instructions, struct _mesa_glsl_parse_state *state)
: instructions(instructions), state(state), symtab(state->symbols), : instructions(instructions), state(state), symtab(state->symbols),
compatibility(!state->is_version(140, 100)), compatibility(state->compat_shader || !state->is_version(140, 100)),
bool_t(glsl_type::bool_type), int_t(glsl_type::int_type), bool_t(glsl_type::bool_type), int_t(glsl_type::int_type),
uint_t(glsl_type::uint_type), uint_t(glsl_type::uint_type),
float_t(glsl_type::float_type), vec2_t(glsl_type::vec2_type), float_t(glsl_type::float_type), vec2_t(glsl_type::vec2_type),

View File

@@ -83,6 +83,7 @@ _mesa_glsl_parse_state::_mesa_glsl_parse_state(struct gl_context *_ctx,
this->forced_language_version = ctx->Const.ForceGLSLVersion; this->forced_language_version = ctx->Const.ForceGLSLVersion;
this->zero_init = ctx->Const.GLSLZeroInit; this->zero_init = ctx->Const.GLSLZeroInit;
this->gl_version = 20; this->gl_version = 20;
this->compat_shader = true;
this->es_shader = false; this->es_shader = false;
this->ARB_texture_rectangle_enable = true; this->ARB_texture_rectangle_enable = true;
@@ -370,6 +371,7 @@ _mesa_glsl_parse_state::process_version_directive(YYLTYPE *locp, int version,
const char *ident) const char *ident)
{ {
bool es_token_present = false; bool es_token_present = false;
bool compat_token_present = false;
if (ident) { if (ident) {
if (strcmp(ident, "es") == 0) { if (strcmp(ident, "es") == 0) {
es_token_present = true; es_token_present = true;
@@ -379,8 +381,12 @@ _mesa_glsl_parse_state::process_version_directive(YYLTYPE *locp, int version,
* a core profile shader since that's the only profile we support. * a core profile shader since that's the only profile we support.
*/ */
} else if (strcmp(ident, "compatibility") == 0) { } else if (strcmp(ident, "compatibility") == 0) {
_mesa_glsl_error(locp, this, compat_token_present = true;
"the compatibility profile is not supported");
if (this->ctx->API != API_OPENGL_COMPAT) {
_mesa_glsl_error(locp, this,
"the compatibility profile is not supported");
}
} else { } else {
_mesa_glsl_error(locp, this, _mesa_glsl_error(locp, this,
"\"%s\" is not a valid shading language profile; " "\"%s\" is not a valid shading language profile; "
@@ -412,6 +418,9 @@ _mesa_glsl_parse_state::process_version_directive(YYLTYPE *locp, int version,
else else
this->language_version = version; this->language_version = version;
this->compat_shader = compat_token_present ||
(!this->es_shader && this->language_version < 140);
bool supported = false; bool supported = false;
for (unsigned i = 0; i < this->num_supported_versions; i++) { for (unsigned i = 0; i < this->num_supported_versions; i++) {
if (this->supported_versions[i].ver == this->language_version if (this->supported_versions[i].ver == this->language_version

View File

@@ -348,6 +348,7 @@ struct _mesa_glsl_parse_state {
} supported_versions[16]; } supported_versions[16];
bool es_shader; bool es_shader;
bool compat_shader;
unsigned language_version; unsigned language_version;
unsigned forced_language_version; unsigned forced_language_version;
bool zero_init; bool zero_init;