[Mesa-dev] [PATCH v3 20/32] glsl: add _mesa_glsl_parse_state object to is_lvalue()
Samuel Pitoiset
samuel.pitoiset at gmail.com
Tue May 2 20:53:41 UTC 2017
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.pitoiset at gmail.com>
Reviewed-by: Nicolai Hähnle <nicolai.haehnle at 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
More information about the mesa-dev
mailing list