[Mesa-dev] [PATCH] glsl: fix optimization of discard nested multiple levels

Tapani Pälli tapani.palli at intel.com
Tue Jul 26 09:52:19 UTC 2016


Reviewed-by: Tapani Pälli <tapani.palli at intel.com>

I've also tested that combining the conditions makes Piglit test pass.

On 07/26/2016 11:14 AM, Nicolai Hähnle wrote:
> From: Nicolai Hähnle <nicolai.haehnle at amd.com>
>
> The order of optimizations can lead to the conditional discard optimization
> being applied twice to the same discard statement. In this case, we must
> ensure that both conditions are applied.
>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=96762
> Cc: mesa-stable at lists.freedesktop.org
> ---
>  src/compiler/glsl/opt_conditional_discard.cpp | 9 ++++++++-
>  1 file changed, 8 insertions(+), 1 deletion(-)
>
> diff --git a/src/compiler/glsl/opt_conditional_discard.cpp b/src/compiler/glsl/opt_conditional_discard.cpp
> index 1ca8803..a27bead 100644
> --- a/src/compiler/glsl/opt_conditional_discard.cpp
> +++ b/src/compiler/glsl/opt_conditional_discard.cpp
> @@ -72,7 +72,14 @@ opt_conditional_discard_visitor::visit_leave(ir_if *ir)
>
>     /* Move the condition and replace the ir_if with the ir_discard. */
>     ir_discard *discard = (ir_discard *) ir->then_instructions.head;
> -   discard->condition = ir->condition;
> +   if (!discard->condition)
> +      discard->condition = ir->condition;
> +   else {
> +      void *ctx = ralloc_parent(ir);
> +      discard->condition = new(ctx) ir_expression(ir_binop_logic_and,
> +                                                  ir->condition,
> +                                                  discard->condition);
> +   }
>     ir->replace_with(discard);
>
>     progress = true;
>


More information about the mesa-dev mailing list