glsl: Fix variable_referenced() for vector_{extract,insert} expressions
authorIago Toral Quiroga <itoral@igalia.com>
Mon, 5 Oct 2015 09:42:43 +0000 (11:42 +0200)
committerIago Toral Quiroga <itoral@igalia.com>
Wed, 14 Oct 2015 06:08:12 +0000 (08:08 +0200)
We get these when we operate on vector variables with array accessors
(i.e. things like a[0] where 'a' is a vec4). When we call variable_referenced()
on these expressions we want to return a reference to 'a' instead of NULL.

This fixes a problem where we pass a[0] as the first argument to an atomic
SSBO function that expects a buffer variable. In order to check this, we use
variable_referenced(), but that is currently returning NULL in this case, since
the underlying rvalue is a vector_extract expression.

Tested-by: Markus Wick <markus@selfnet.de>
Reviewed-by: Kristian Høgsberg <krh@bitplanet.net>
src/glsl/ir.cpp
src/glsl/ir.h

index 2c45b9edc0f88cf5976d1baeb7a8d8d72dee2ca8..4c228437d15ef27e00c0451ccc1675b8d174ef8b 100644 (file)
@@ -662,6 +662,22 @@ ir_expression::get_operator(const char *str)
    return (ir_expression_operation) -1;
 }
 
+ir_variable *
+ir_expression::variable_referenced() const
+{
+   switch (operation) {
+      case ir_binop_vector_extract:
+      case ir_triop_vector_insert:
+         /* We get these for things like a[0] where a is a vector type. In these
+          * cases we want variable_referenced() to return the actual vector
+          * variable this is wrapping.
+          */
+         return operands[0]->variable_referenced();
+      default:
+         return ir_rvalue::variable_referenced();
+   }
+}
+
 ir_constant::ir_constant()
    : ir_rvalue(ir_type_constant)
 {
index 43a2bf0ae1cd3d2850f18dacf15318812d4d8451..9c9f22d018bcbab104ef3ab2a36dd20954e452dc 100644 (file)
@@ -1731,6 +1731,8 @@ public:
 
    virtual ir_visitor_status accept(ir_hierarchical_visitor *);
 
+   virtual ir_variable *variable_referenced() const;
+
    ir_expression_operation operation;
    ir_rvalue *operands[4];
 };