summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimothy Arceri <tarceri@itsqueeze.com>2020-10-29 14:19:01 +1100
committerMarge Bot <eric+marge@anholt.net>2020-10-29 23:35:58 +0000
commita09717c4de08b647657073e806bd1d5964212690 (patch)
treec1874741ce2180ac6f3e3714afd9ef417091416b
parentce0b72a13a2890102e1f324c54735079ca3e30f5 (diff)
glsl: add extra pp tokens workaround and enable for CoR
The CTS now tests to make sure these are not allowed. However, previously drivers (including Mesa) would allow them to exist and just issue a warning. Some old applications such as Champions of Regnum seem to depend on this. Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/422 Fixes: 43047384c331 ("glsl/glcpp: Promote "extra token at end of directive" from warning to error") Reviewed-by: Marek Olšák <marek.olsak@amd.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7361>
-rw-r--r--src/compiler/glsl/glcpp/glcpp-parse.y5
-rw-r--r--src/gallium/auxiliary/pipe-loader/driinfo_gallium.h1
-rw-r--r--src/gallium/frontends/dri/dri_screen.c2
-rw-r--r--src/gallium/include/frontend/api.h1
-rw-r--r--src/mesa/drivers/dri/i965/intel_screen.c1
-rw-r--r--src/mesa/main/mtypes.h8
-rw-r--r--src/mesa/state_tracker/st_extensions.c2
-rw-r--r--src/util/00-mesa-defaults.conf4
-rw-r--r--src/util/driconf.h4
9 files changed, 27 insertions, 1 deletions
diff --git a/src/compiler/glsl/glcpp/glcpp-parse.y b/src/compiler/glsl/glcpp/glcpp-parse.y
index 173e1a1586b..2359967e89e 100644
--- a/src/compiler/glsl/glcpp/glcpp-parse.y
+++ b/src/compiler/glsl/glcpp/glcpp-parse.y
@@ -781,7 +781,10 @@ replacement_list:
junk:
/* empty */
| pp_tokens {
- glcpp_error(&@1, parser, "extra tokens at end of directive");
+ if (parser->gl_ctx->Const.AllowExtraPPTokens)
+ glcpp_warning(&@1, parser, "extra tokens at end of directive");
+ else
+ glcpp_error(&@1, parser, "extra tokens at end of directive");
}
;
diff --git a/src/gallium/auxiliary/pipe-loader/driinfo_gallium.h b/src/gallium/auxiliary/pipe-loader/driinfo_gallium.h
index 95e27bcc42d..41051bc6447 100644
--- a/src/gallium/auxiliary/pipe-loader/driinfo_gallium.h
+++ b/src/gallium/auxiliary/pipe-loader/driinfo_gallium.h
@@ -22,6 +22,7 @@ DRI_CONF_SECTION_DEBUG
DRI_CONF_DISABLE_BLEND_FUNC_EXTENDED(false)
DRI_CONF_DISABLE_ARB_GPU_SHADER5(false)
DRI_CONF_FORCE_GLSL_VERSION(0)
+ DRI_CONF_ALLOW_EXTRA_PP_TOKENS(false)
DRI_CONF_ALLOW_GLSL_EXTENSION_DIRECTIVE_MIDSHADER(false)
DRI_CONF_ALLOW_GLSL_120_SUBSET_IN_110(false)
DRI_CONF_ALLOW_GLSL_BUILTIN_CONST_EXPRESSION(false)
diff --git a/src/gallium/frontends/dri/dri_screen.c b/src/gallium/frontends/dri/dri_screen.c
index f476333d295..0e9f39170e2 100644
--- a/src/gallium/frontends/dri/dri_screen.c
+++ b/src/gallium/frontends/dri/dri_screen.c
@@ -72,6 +72,8 @@ dri_fill_st_options(struct dri_screen *screen)
driQueryOptionb(optionCache, "force_glsl_extensions_warn");
options->force_glsl_version =
driQueryOptioni(optionCache, "force_glsl_version");
+ options->allow_extra_pp_tokens =
+ driQueryOptionb(optionCache, "allow_extra_pp_tokens");
options->allow_glsl_extension_directive_midshader =
driQueryOptionb(optionCache, "allow_glsl_extension_directive_midshader");
options->allow_glsl_120_subset_in_110 =
diff --git a/src/gallium/include/frontend/api.h b/src/gallium/include/frontend/api.h
index 9dcabe0f097..d4f47a1bfdc 100644
--- a/src/gallium/include/frontend/api.h
+++ b/src/gallium/include/frontend/api.h
@@ -220,6 +220,7 @@ struct st_config_options
bool disable_arb_gpu_shader5;
bool force_glsl_extensions_warn;
unsigned force_glsl_version;
+ bool allow_extra_pp_tokens;
bool allow_glsl_extension_directive_midshader;
bool allow_glsl_120_subset_in_110;
bool allow_glsl_builtin_const_expression;
diff --git a/src/mesa/drivers/dri/i965/intel_screen.c b/src/mesa/drivers/dri/i965/intel_screen.c
index 97efe2d37f6..4492d43c040 100644
--- a/src/mesa/drivers/dri/i965/intel_screen.c
+++ b/src/mesa/drivers/dri/i965/intel_screen.c
@@ -79,6 +79,7 @@ static const driOptionDescription brw_driconf[] = {
DRI_CONF_DISABLE_GLSL_LINE_CONTINUATIONS(false)
DRI_CONF_DISABLE_BLEND_FUNC_EXTENDED(false)
DRI_CONF_DUAL_COLOR_BLEND_BY_LOCATION(false)
+ DRI_CONF_ALLOW_EXTRA_PP_TOKENS(false)
DRI_CONF_ALLOW_GLSL_EXTENSION_DIRECTIVE_MIDSHADER(false)
DRI_CONF_ALLOW_GLSL_BUILTIN_VARIABLE_REDECLARATION(false)
DRI_CONF_ALLOW_GLSL_CROSS_STAGE_INTERPOLATION_MISMATCH(false)
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index 04b97028237..b3de4427ded 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -3876,6 +3876,14 @@ struct gl_constants
GLboolean AllowLayoutQualifiersOnFunctionParameters;
/**
+ * Allow extra tokens at end of preprocessor directives. The CTS now tests
+ * to make sure these are not allowed. However, previously drivers would
+ * allow them to exist and just issue a warning so some old applications
+ * depend on this.
+ */
+ GLboolean AllowExtraPPTokens;
+
+ /**
* Force computing the absolute value for sqrt() and inversesqrt() to follow
* D3D9 when apps rely on this behaviour.
*/
diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c
index 6258d08bb09..38370e1e6d6 100644
--- a/src/mesa/state_tracker/st_extensions.c
+++ b/src/mesa/state_tracker/st_extensions.c
@@ -1133,6 +1133,8 @@ void st_init_extensions(struct pipe_screen *screen,
consts->ForceGLSLVersion = options->force_glsl_version;
}
+ consts->AllowExtraPPTokens = options->allow_extra_pp_tokens;
+
consts->AllowHigherCompatVersion = options->allow_higher_compat_version;
consts->ForceGLSLAbsSqrt = options->force_glsl_abs_sqrt;
diff --git a/src/util/00-mesa-defaults.conf b/src/util/00-mesa-defaults.conf
index b7c37eb0b9e..816169b40c3 100644
--- a/src/util/00-mesa-defaults.conf
+++ b/src/util/00-mesa-defaults.conf
@@ -246,6 +246,10 @@ TODO: document the other workarounds.
<option name="allow_glsl_layout_qualifier_on_function_parameters" value="true" />
</application>
+ <application name="Champions of Regnum" executable="game">
+ <option name="allow_extra_pp_tokens" value="true" />
+ </application>
+
<application name="Wolfenstein The Old Blood" executable="WolfOldBlood_x64.exe">
<option name="force_compat_profile" value="true" />
</application>
diff --git a/src/util/driconf.h b/src/util/driconf.h
index c67b0b697dc..92b9a8c04c5 100644
--- a/src/util/driconf.h
+++ b/src/util/driconf.h
@@ -159,6 +159,10 @@
DRI_CONF_OPT_I(force_glsl_version, def, 0, 999, \
"Force a default GLSL version for shaders that lack an explicit #version line")
+#define DRI_CONF_ALLOW_EXTRA_PP_TOKENS(def) \
+ DRI_CONF_OPT_B(allow_extra_pp_tokens, def, \
+ "Allow extra tokens at end of preprocessor directives.")
+
#define DRI_CONF_ALLOW_GLSL_EXTENSION_DIRECTIVE_MIDSHADER(def) \
DRI_CONF_OPT_B(allow_glsl_extension_directive_midshader, def, \
"Allow GLSL #extension directives in the middle of shaders")