[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