[Mesa-dev] [PATCH] glsl: Fix type error when lowering integer divisions
Kenneth Graunke
kenneth at whitecape.org
Sat Aug 13 09:58:06 PDT 2011
On 08/12/2011 10:38 AM, Paul Berry wrote:
> This patch fixes a bug when lowering an integer division:
>
> x/y
>
> to a multiplication by a reciprocal:
>
> int(float(x)*reciprocal(float(y)))
>
> If x was a a plain int and y was an ivecN, the lowering pass
> incorrectly assigned the type of the product to be float, when in fact
> it should be vecN. This caused mesa to abort with an IR validation
> error.
>
> Fixes piglit tests {fs,vs}-op-div-int-ivec{2,3,4}.
Good catch, Paul! Thanks again for writing all these test cases.
Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>
Come to think of it, we may want to avoid this altogether on i965. The
mathbox has an INT DIV message that computes integer quotient and
remainder...so we can support it natively.
I guess the question is "which is faster?". My intuition says that
using INT DIV will be faster on Gen6+, possibly on Gen5, and slower on
Gen4/G45. AFAICT on Gen5+ you can compute quotient & remainder
separately (3 or 4 rounds) while on Gen4 you always have to compute both
(3 + 4 = 7 rounds?). Meanwhile RCP is 2 rounds. Not only is that more
rounds, it means hogging the shared mathbox for longer.
Since Gen6 is supposed to be 2 rounds for everything and each EU has its
own mathbox, it should save a MUL (and compute the answer without float
imprecisions...which may be worth it anyway?).
I suppose measurements are in order. :) Perhaps I ought to implement a
similar float->int->float path for fmod.
Unfortunately, the HW doesn't do FDIV in ALT mode, so we still need to
lower division for floats, I guess.
More information about the mesa-dev
mailing list