[Mesa-dev] [PATCH] glsl: Fix variable_referenced() for vector_{extract, insert} expressions

Kristian Høgsberg krh at bitplanet.net
Tue Oct 13 13:41:52 PDT 2015


On Mon, Oct 05, 2015 at 11:42:43AM +0200, Iago Toral Quiroga wrote:
> 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.

Reviewed-by: Kristian Høgsberg <krh at bitplanet.net>

> ---
>  src/glsl/ir.cpp | 16 ++++++++++++++++
>  src/glsl/ir.h   |  2 ++
>  2 files changed, 18 insertions(+)
> 
> diff --git a/src/glsl/ir.cpp b/src/glsl/ir.cpp
> index 2c45b9e..4c22843 100644
> --- a/src/glsl/ir.cpp
> +++ b/src/glsl/ir.cpp
> @@ -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)
>  {
> diff --git a/src/glsl/ir.h b/src/glsl/ir.h
> index 43a2bf0..9c9f22d 100644
> --- a/src/glsl/ir.h
> +++ b/src/glsl/ir.h
> @@ -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];
>  };
> -- 
> 1.9.1
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list