util/driconf: add new ignore_write_to_readonly_var workaround

This forces the GLSL compiler to ignore writes to readonly vars
rather than throwing an error.

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 21:29:31 +10:00 committed by Marge Bot
parent e607205af0
commit a73e7305e9
9 changed files with 34 additions and 4 deletions

View File

@ -941,6 +941,7 @@ do_assignment(exec_list *instructions, struct _mesa_glsl_parse_state *state,
if (lhs_var)
lhs_var->data.assigned = true;
bool omit_assignment = false;
if (!error_emitted) {
if (non_lvalue_description != NULL) {
_mesa_glsl_error(&lhs_loc, state,
@ -957,10 +958,15 @@ do_assignment(exec_list *instructions, struct _mesa_glsl_parse_state *state,
* no such distinction, that is why this check here is limited to
* buffer variables alone.
*/
_mesa_glsl_error(&lhs_loc, state,
"assignment to read-only variable '%s'",
lhs_var->name);
error_emitted = true;
if (state->ignore_write_to_readonly_var)
omit_assignment = true;
else {
_mesa_glsl_error(&lhs_loc, state,
"assignment to read-only variable '%s'",
lhs_var->name);
error_emitted = true;
}
} else if (lhs->type->is_array() &&
!state->check_version(state->allow_glsl_120_subset_in_110 ? 110 : 120,
300, &lhs_loc,
@ -1018,6 +1024,11 @@ do_assignment(exec_list *instructions, struct _mesa_glsl_parse_state *state,
error_emitted = true;
}
if (omit_assignment) {
*out_rvalue = needs_rvalue ? ir_rvalue::error_value(ctx) : NULL;
return error_emitted;
}
/* Most callers of do_assignment (assign, add_assign, pre_inc/dec,
* but not post_inc) need the converted assigned value as an rvalue
* to handle things like:

View File

@ -321,6 +321,8 @@ _mesa_glsl_parse_state::_mesa_glsl_parse_state(struct gl_context *_ctx,
ctx->Const.AllowGLSL120SubsetIn110;
this->allow_builtin_variable_redeclaration =
ctx->Const.AllowGLSLBuiltinVariableRedeclaration;
this->ignore_write_to_readonly_var =
ctx->Const.GLSLIgnoreWriteToReadonlyVar;
this->cs_input_local_size_variable_specified = false;

View File

@ -945,6 +945,7 @@ struct _mesa_glsl_parse_state {
bool allow_extension_directive_midshader;
bool allow_glsl_120_subset_in_110;
bool allow_builtin_variable_redeclaration;
bool ignore_write_to_readonly_var;
/**
* Known subroutine type declarations.

View File

@ -29,6 +29,7 @@ DRI_CONF_SECTION_DEBUG
DRI_CONF_ALLOW_HIGHER_COMPAT_VERSION(false)
DRI_CONF_FORCE_GLSL_ABS_SQRT(false)
DRI_CONF_GLSL_CORRECT_DERIVATIVES_AFTER_DISCARD(false)
DRI_CONF_GLSL_IGNORE_WRITE_TO_READONLY_VAR(false)
DRI_CONF_ALLOW_DRAW_OUT_OF_ORDER(false)
DRI_CONF_ALLOW_INCORRECT_PRIMITIVE_ID(false)
DRI_CONF_FORCE_COMPAT_PROFILE(false)

View File

@ -86,6 +86,8 @@ dri_fill_st_options(struct dri_screen *screen)
driQueryOptionb(optionCache, "allow_glsl_builtin_variable_redeclaration");
options->allow_higher_compat_version =
driQueryOptionb(optionCache, "allow_higher_compat_version");
options->glsl_ignore_write_to_readonly_var =
driQueryOptionb(optionCache, "glsl_ignore_write_to_readonly_var");
options->glsl_zero_init = driQueryOptionb(optionCache, "glsl_zero_init");
options->force_integer_tex_nearest =
driQueryOptionb(optionCache, "force_integer_tex_nearest");

View File

@ -227,6 +227,7 @@ struct st_config_options
bool allow_glsl_relaxed_es;
bool allow_glsl_builtin_variable_redeclaration;
bool allow_higher_compat_version;
bool glsl_ignore_write_to_readonly_var;
bool glsl_zero_init;
bool vs_position_always_invariant;
bool force_glsl_abs_sqrt;

View File

@ -3959,6 +3959,12 @@ struct gl_constants
*/
GLboolean ForceGLSLAbsSqrt;
/**
* Forces the GLSL compiler to ignore writes to readonly vars rather than
* throwing an error.
*/
GLboolean GLSLIgnoreWriteToReadonlyVar;
/**
* Types of variable to default initialized to zero. Supported values are:
* - 0: no zero initialization

View File

@ -1194,6 +1194,8 @@ void st_init_extensions(struct pipe_screen *screen,
consts->AllowGLSLCrossStageInterpolationMismatch = options->allow_glsl_cross_stage_interpolation_mismatch;
consts->GLSLIgnoreWriteToReadonlyVar = options->glsl_ignore_write_to_readonly_var;
consts->PrimitiveRestartFixedIndex =
screen->get_param(screen, PIPE_CAP_PRIMITIVE_RESTART_FIXED_INDEX);

View File

@ -204,6 +204,10 @@
DRI_CONF_OPT_B(glsl_correct_derivatives_after_discard, def, \
"Implicit and explicit derivatives after a discard behave as if the discard didn't happen")
#define DRI_CONF_GLSL_IGNORE_WRITE_TO_READONLY_VAR(def) \
DRI_CONF_OPT_B(glsl_ignore_write_to_readonly_var, def, \
"Forces the GLSL compiler to ignore writes to readonly vars rather than throwing an error")
#define DRI_CONF_ALLOW_GLSL_CROSS_STAGE_INTERPOLATION_MISMATCH(def) \
DRI_CONF_OPT_B(allow_glsl_cross_stage_interpolation_mismatch, def, \
"Allow interpolation qualifier mismatch across shader stages")