[Mesa-stable] [Mesa-dev] [PATCH v2] glsl: Fix a bug where LHS swizzles of swizzles were too small.

Timothy Arceri t_arceri at yahoo.com.au
Tue Jul 28 17:12:47 PDT 2015


On Tue, 2015-07-28 at 16:34 -0700, Kenneth Graunke wrote:
> A simple shader such as
> 
>    vec4 color;
>    color.xy.x = 1.0;
> 
> would cause ir_assignment::set_lhs() to generate bogus IR:
> 
>    (swiz xy (swiz x (constant float (1.0))))
> 
> We were setting the number of components of each new RHS swizzle based
> on the highest channel used in the LHS swizzle.  So, .xy.y would
> generate (swiz xy (swiz xx ...)), while .xy.x would break.
> 
> Our existing Piglit test happened to use .xzy.z, which worked, since
> 'z' is the third component, resulting in an xxx swizzle.
> 
> This patch sets the number of swizzle components based on the size of
> the LHS swizzle's inner value, so we always have the correct number
> at each step.
> 
> Fixes new Piglit tests glsl-vs-swizzle-swizzle-lhs-[23].
> Fixes ir_validate assertions in in Metro 2033 Redux.
> 
> v2: Move num_components updating completely out of update_rhs_swizzle
>     (suggested by Timothy Arceri).  Simplify.
> 
> Cc: mesa-stable at lists.freedesktop.org
> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
> Reviewed-by: Timothy Arceri <t_arceri at yahoo.com.au> [v1]
> ---
>  src/glsl/ir.cpp | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> Hey Tim, does this look better?

Looks good to me Reviewed-by: Timothy Arceri <t_arceri at yahoo.com.au>

> 
> diff --git a/src/glsl/ir.cpp b/src/glsl/ir.cpp
> index 3a40926..724861b 100644
> --- a/src/glsl/ir.cpp
> +++ b/src/glsl/ir.cpp
> @@ -63,8 +63,6 @@ update_rhs_swizzle(ir_swizzle_mask &m, unsigned from, 
> unsigned to)
>     case 3: m.w = from; break;
>     default: assert(!"Should not get here.");
>     }
> -
> -   m.num_components = MAX2(m.num_components, (to + 1));
>  }
>  
>  void
> @@ -95,6 +93,7 @@ ir_assignment::set_lhs(ir_rvalue *lhs)
>  
>  	 write_mask |= (((this->write_mask >> i) & 1) << c);
>  	 update_rhs_swizzle(rhs_swiz, i, c);
> +         rhs_swiz.num_components = swiz->val->type->vector_elements;
>        }
>  
>        this->write_mask = write_mask;
> @@ -114,6 +113,7 @@ ir_assignment::set_lhs(ir_rvalue *lhs)
>  	 if (write_mask & (1 << i))
>  	    update_rhs_swizzle(rhs_swiz, i, rhs_chan++);
>        }
> +      rhs_swiz.num_components = rhs_chan;
>        this->rhs = new(mem_ctx) ir_swizzle(this->rhs, rhs_swiz);
>     }
>  


More information about the mesa-stable mailing list