Skip to content

Commit

Permalink
util/driconf: add new ignore_write_to_readonly_var workaround
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
tarceri authored and Marge Bot committed Jun 29, 2021
1 parent e607205 commit a73e730
Show file tree
Hide file tree
Showing 9 changed files with 34 additions and 4 deletions.
19 changes: 15 additions & 4 deletions src/compiler/glsl/ast_to_hir.cpp
Expand Up @@ -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,
Expand All @@ -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,
Expand Down Expand Up @@ -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:
Expand Down
2 changes: 2 additions & 0 deletions src/compiler/glsl/glsl_parser_extras.cpp
Expand Up @@ -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;

Expand Down
1 change: 1 addition & 0 deletions src/compiler/glsl/glsl_parser_extras.h
Expand Up @@ -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.
Expand Down
1 change: 1 addition & 0 deletions src/gallium/auxiliary/pipe-loader/driinfo_gallium.h
Expand Up @@ -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)
Expand Down
2 changes: 2 additions & 0 deletions src/gallium/frontends/dri/dri_screen.c
Expand Up @@ -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");
Expand Down
1 change: 1 addition & 0 deletions src/gallium/include/frontend/api.h
Expand Up @@ -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;
Expand Down
6 changes: 6 additions & 0 deletions src/mesa/main/mtypes.h
Expand Up @@ -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
Expand Down
2 changes: 2 additions & 0 deletions src/mesa/state_tracker/st_extensions.c
Expand Up @@ -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);

Expand Down
4 changes: 4 additions & 0 deletions src/util/driconf.h
Expand Up @@ -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")
Expand Down

0 comments on commit a73e730

Please sign in to comment.