mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-30 16:30:10 +01:00
glsl: Fix variable_referenced() for vector_{extract,insert} expressions
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>
This commit is contained in:
parent
baee16bf02
commit
9de651b261
2 changed files with 18 additions and 0 deletions
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
};
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue