Yes, this is a bit hacky but we don't really have the choice. Plain GLSL doesn't accept bindless samplers/images as l-values while it's allowed when ARB_bindless_texture is enabled.
The default NULL parameter is because we can't access the _mesa_glsl_parse_state object in few places in the compiler. One is_lvalue(NULL) call is for IR validation but other checks happen elsewhere, should be safe. Signed-off-by: Samuel Pitoiset <samuel.pitoi...@gmail.com> Reviewed-by: Nicolai Hähnle <nicolai.haeh...@amd.com> --- src/compiler/glsl/ast_function.cpp | 2 +- src/compiler/glsl/ast_to_hir.cpp | 2 +- src/compiler/glsl/ir.cpp | 4 +++- src/compiler/glsl/ir.h | 8 ++++---- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/compiler/glsl/ast_function.cpp b/src/compiler/glsl/ast_function.cpp index 1b90937ec8..00b930eb2c 100644 --- a/src/compiler/glsl/ast_function.cpp +++ b/src/compiler/glsl/ast_function.cpp @@ -283,7 +283,7 @@ verify_parameter_modes(_mesa_glsl_parse_state *state, mode, formal->name, actual->variable_referenced()->name); return false; - } else if (!actual->is_lvalue()) { + } else if (!actual->is_lvalue(state)) { _mesa_glsl_error(&loc, state, "function parameter '%s %s' is not an lvalue", mode, formal->name); diff --git a/src/compiler/glsl/ast_to_hir.cpp b/src/compiler/glsl/ast_to_hir.cpp index 9f4f25de63..855db93b40 100644 --- a/src/compiler/glsl/ast_to_hir.cpp +++ b/src/compiler/glsl/ast_to_hir.cpp @@ -971,7 +971,7 @@ do_assignment(exec_list *instructions, struct _mesa_glsl_parse_state *state, * The restriction on arrays is lifted in GLSL 1.20 and GLSL ES 3.00. */ error_emitted = true; - } else if (!lhs->is_lvalue()) { + } else if (!lhs->is_lvalue(state)) { _mesa_glsl_error(& lhs_loc, state, "non-lvalue in assignment"); error_emitted = true; } diff --git a/src/compiler/glsl/ir.cpp b/src/compiler/glsl/ir.cpp index 3e81c14c62..538da8b28f 100644 --- a/src/compiler/glsl/ir.cpp +++ b/src/compiler/glsl/ir.cpp @@ -24,6 +24,8 @@ #include "main/core.h" /* for MAX2 */ #include "ir.h" #include "compiler/glsl_types.h" +#include "glsl_parser_extras.h" + ir_rvalue::ir_rvalue(enum ir_node_type t) : ir_instruction(t) @@ -1436,7 +1438,7 @@ ir_dereference_record::ir_dereference_record(ir_variable *var, } bool -ir_dereference::is_lvalue() const +ir_dereference::is_lvalue(const struct _mesa_glsl_parse_state *state) const { ir_variable *var = this->variable_referenced(); diff --git a/src/compiler/glsl/ir.h b/src/compiler/glsl/ir.h index 54438ca57f..39f54e0348 100644 --- a/src/compiler/glsl/ir.h +++ b/src/compiler/glsl/ir.h @@ -233,7 +233,7 @@ public: ir_rvalue *as_rvalue_to_saturate(); - virtual bool is_lvalue() const + virtual bool is_lvalue(const struct _mesa_glsl_parse_state *state = NULL) const { return false; } @@ -1941,9 +1941,9 @@ public: virtual bool equals(const ir_instruction *ir, enum ir_node_type ignore = ir_type_unset) const; - bool is_lvalue() const + bool is_lvalue(const struct _mesa_glsl_parse_state *state) const { - return val->is_lvalue() && !mask.has_duplicates; + return val->is_lvalue(state) && !mask.has_duplicates; } /** @@ -1968,7 +1968,7 @@ class ir_dereference : public ir_rvalue { public: virtual ir_dereference *clone(void *mem_ctx, struct hash_table *) const = 0; - bool is_lvalue() const; + bool is_lvalue(const struct _mesa_glsl_parse_state *state) const; /** * Get the variable that is ultimately referenced by an r-value -- 2.12.2 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev