util/driconf: add new ignore_write_to_readonly_var workaround
authorTimothy Arceri <tarceri@itsqueeze.com>
Fri, 25 Jun 2021 11:29:31 +0000 (21:29 +1000)
committerMarge Bot <eric+marge@anholt.net>
Tue, 29 Jun 2021 02:59:28 +0000 (02:59 +0000)
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>

src/compiler/glsl/ast_to_hir.cpp
src/compiler/glsl/glsl_parser_extras.cpp
src/compiler/glsl/glsl_parser_extras.h
src/gallium/auxiliary/pipe-loader/driinfo_gallium.h
src/gallium/frontends/dri/dri_screen.c
src/gallium/include/frontend/api.h
src/mesa/main/mtypes.h
src/mesa/state_tracker/st_extensions.c
src/util/driconf.h

index bee30a2..2ab21f2 100644 (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:
index a02e3d8..44c0416 100644 (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;
 
index 18e3f86..6a7bf17 100644 (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.
index 2fa2a37..95bd3a7 100644 (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)
index e8d95fc..b565a1f 100644 (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");
index 6141ffa..d0e13d4 100644 (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;
index 2a37f9d..2fa1635 100644 (file)
@@ -3960,6 +3960,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
     *   - 1: all shader variables and gl_FragColor are initialiazed to 0
index 075bb28..cd18ac9 100644 (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);
 
index 248ab2d..1c2515e 100644 (file)
    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")