[Mesa-dev] [PATCH] nir: Use double-precision pow() when bit_size is 64, powf() otherwise

Ian Romanick idr at freedesktop.org
Mon Mar 28 18:31:13 UTC 2016


On 03/23/2016 08:09 PM, Jason Ekstrand wrote:
> Is there a 64-bit pow in GLSL?  If so, this is the right implementation.

There isn't.  But there also aren't double versions of sin or cos, and
9076c4e2 added those.  However, it didn't add double versions of fexp2
or flog2 (both of which are not supported in GLSL).

Ugh... it also did not add double versions of frsq or fsqrt... which are
supported in GLSL.

So, there are some extra functions and some missing functions.  My gut
tells me we should just do all of them so that people don't have to
think about which ones should / shouldn't be implemented.

Looking more closely... I think fabs, fnot, fsign, and fsat should have
explicit double support as well... it seems the existing implementations
of both of these will cause some small values to be incorrectly
"flushed" to zero.  What are the rules in C when you compare a double
variable with a single constant?

void foo(double d)
{
    /* Does d get converted to single, or does 0.0f get converted to
     * double?
     */
    if (d == 0.0f)
        printf("zero\n");
}

> Reviewed-by: Jason Ekstrand <jason at jlekstrand.net
> <mailto:jason at jlekstrand.net>>
> 
> On Mar 23, 2016 7:42 PM, "Ian Romanick" <idr at freedesktop.org
> <mailto:idr at freedesktop.org>> wrote:
> 
>     From: Ian Romanick <ian.d.romanick at intel.com
>     <mailto:ian.d.romanick at intel.com>>
> 
>     Found (randomly) by inspection.  Looking at the rest of the changes in
>     this file in commit 9076c4e2, I'm certain this is what was intended.
> 
>     Signed-off-by: Ian Romanick <ian.d.romanick at intel.com
>     <mailto:ian.d.romanick at intel.com>>
>     Cc: Connor Abbott <cwabbott0 at gmail.com <mailto:cwabbott0 at gmail.com>>
>     Cc: mesa-stable at lists.freedesktop.org
>     <mailto:mesa-stable at lists.freedesktop.org>
>     ---
>      src/compiler/nir/nir_opcodes.py | 2 +-
>      1 file changed, 1 insertion(+), 1 deletion(-)
> 
>     diff --git a/src/compiler/nir/nir_opcodes.py
>     b/src/compiler/nir/nir_opcodes.py
>     index 553f924..ac59130 100644
>     --- a/src/compiler/nir/nir_opcodes.py
>     +++ b/src/compiler/nir/nir_opcodes.py
>     @@ -520,7 +520,7 @@ for (int i = 0; i < 32; i += 8) {
>      }
>      """)
> 
>     -binop("fpow", tfloat, "", "bit_size == 64 ? powf(src0, src1) :
>     pow(src0, src1)")
>     +binop("fpow", tfloat, "", "bit_size == 64 ? pow(src0, src1) :
>     powf(src0, src1)")
> 
>      binop_horiz("pack_half_2x16_split", 1, tuint32, 1, tfloat32, 1,
>     tfloat32,
>                  "pack_half_1x16(src0.x) | (pack_half_1x16(src1.x) << 16)")
>     --
>     2.5.5
> 
>     _______________________________________________
>     mesa-dev mailing list
>     mesa-dev at lists.freedesktop.org <mailto:mesa-dev at lists.freedesktop.org>
>     https://lists.freedesktop.org/mailman/listinfo/mesa-dev



More information about the mesa-dev mailing list