[Mesa-dev] [PATCH] glsl: Fix copy_propagation_elements bug in handling self-copies.

Kenneth Graunke kenneth at whitecape.org
Mon Jan 9 16:22:55 PST 2012


On 01/09/2012 01:36 PM, Eric Anholt wrote:
> We were doing the kill of the updated channels, then adding our copy
> to the list of available stuff to copy.  But if the copy was updating
> its own source channels, we didn't notice, breaking this code:
>
> 	R0.xyzw = arg0 + arg1;
> 	R0.xyzw = R0.wwwx;
> 	gl_FragColor.xyzw = clamp(R0.xyzw, 0.0, 1.0);
>
> Fixes piglit glsl-copy-propagation-self-2.
> ---
>   src/glsl/opt_copy_propagation_elements.cpp |   15 ++++++++++++++-
>   1 files changed, 14 insertions(+), 1 deletions(-)
>
> diff --git a/src/glsl/opt_copy_propagation_elements.cpp b/src/glsl/opt_copy_propagation_elements.cpp
> index be446bc..ebfd4fd 100644
> --- a/src/glsl/opt_copy_propagation_elements.cpp
> +++ b/src/glsl/opt_copy_propagation_elements.cpp
> @@ -461,7 +461,20 @@ ir_copy_propagation_elements_visitor::add_copy(ir_assignment *ir)
>   	 swizzle[i] = orig_swizzle[j++];
>      }
>
> -   entry = new(this->mem_ctx) acp_entry(lhs->var, rhs->var, ir->write_mask,
> +   int write_mask = ir->write_mask;
> +   if (lhs->var == rhs->var) {
> +      /* If this is a copy from the variable to itself, then we need
> +       * to be sure not to include the updated channels from this
> +       * instruction in the set of new source channels to be
> +       * copy-propagated from.
> +       */
> +      for (int i = 0; i<  4; i++) {
> +	 if (ir->write_mask&  (1<<  orig_swizzle[i]))
> +	    write_mask&= ~(1<<  i);
> +      }
> +   }
> +
> +   entry = new(this->mem_ctx) acp_entry(lhs->var, rhs->var, write_mask,
>   					swizzle);
>      this->acp->push_tail(entry);
>   }

Whoops.  Yeah, that's definitely necessary.

Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>


More information about the mesa-dev mailing list