[Mesa-dev] [PATCH] glsl: fix opt_minmax redundancy checks against baserange
Iago Toral
itoral at igalia.com
Fri Jan 6 12:29:32 UTC 2017
Hi Tim,
it's been a while, so off the top of my head I don't have any
particular suggestions or the capacity to tell whether your fix is
correct or not :-/.
I'll try to spend some time re-acquainting myself with that code on
Monday and see if I can see what is going on here.
Iago
On Fri, 2017-01-06 at 22:08 +1100, Timothy Arceri wrote:
> 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