[Mesa-dev] [PATCH] glsl: fix opt_minmax redundancy checks against baserange
Timothy Arceri
timothy.arceri at collabora.com
Fri Jan 6 11:08:35 UTC 2017
Hi Iago/Petri,
Just Ccing you guys in case you have a better solution (I know its been
a while since this was written).
This is causing incorrect shaders in at least Serious Sam 3 possibly
others. I've sent some piglit tests to reproduce it to the piglit list.
Thanks,
Tim
On Fri, 2017-01-06 at 10:26 +1100, Timothy Arceri wrote:
> Marking operations as redundant if they are equal to the base
> range is fine when the tree structure is something like this:
>
> max
> / \
> max b
> / \
> 3 max
> / \
> 3 a
>
> But the opt falls apart with a tree like this:
>
> max
> / \
> max max
> / \ / \
> 3 a b 3
>
> I'm not 100% sure what is going wrong as a tree like:
>
> max
> / \
> max max
> / \ / \
> 3 a b 4
>
> Will remove the right hand side max just fine. But not marking
> limits that equal the base range seems to fix the problem.
>
> NIR algebraic opt will clean up the first tree for anyway, hopefully
> other backends are smart enough to do this also.
>
> Cc: "13.0" <mesa-stable at lists.freedesktop.org>
> ---
> src/compiler/glsl/opt_minmax.cpp | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/src/compiler/glsl/opt_minmax.cpp
> b/src/compiler/glsl/opt_minmax.cpp
> index 29482ee..9f64db9 100644
> --- a/src/compiler/glsl/opt_minmax.cpp
> +++ b/src/compiler/glsl/opt_minmax.cpp
> @@ -355,7 +355,7 @@ ir_minmax_visitor::prune_expression(ir_expression
> *expr, minmax_range baserange)
> */
> if (!is_redundant && limits[i].low && baserange.high) {
> cr = compare_components(limits[i].low, baserange.high);
> - if (cr >= EQUAL && cr != MIXED)
> + if (cr > EQUAL && cr != MIXED)
> is_redundant = true;
> }
> } else {
> @@ -373,7 +373,7 @@ ir_minmax_visitor::prune_expression(ir_expression
> *expr, minmax_range baserange)
> */
> if (!is_redundant && limits[i].high && baserange.low) {
> cr = compare_components(limits[i].high, baserange.low);
> - if (cr <= EQUAL)
> + if (cr < EQUAL)
> is_redundant = true;
> }
> }
More information about the mesa-dev
mailing list