mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2024-11-30 21:54:16 +08:00
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:
parent
e607205af0
commit
a73e7305e9
@ -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:
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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.
|
||||
|
@ -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)
|
||||
|
@ -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");
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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")
|
||||
|
Loading…
Reference in New Issue
Block a user