[Mesa-dev] [PATCH] radeonsi: enable denorms for 64-bit and 16-bit floats
idr at freedesktop.org
Fri Apr 29 09:42:56 UTC 2016
On 02/09/2016 12:02 AM, Ian Romanick wrote:
> I submitted a public spec bug for this issue:
> I'm investigating whether a similar bug is needed for the SPIR-V
> I think an argument can be made for either the flush-to-zero or
> non-flush-to-zero behavior in the case of unpackHalf2x16 and (possibly)
> packHalf2x16. The only place in the GLSL 4.50.5 specification that
> mentions subnormal values is section 4.7.1 (Range and Precision).
> "The precision of stored single- and double-precision floating-point
> variables is defined by the IEEE 754 standard for 32-bit and 64-bit
> floating-point numbers....Any denormalized value input into a
> shader or potentially generated by any operation in a shader can be
> flushed to 0."
> Since there is no half-precision type in desktop GLSL, there is no
> mention of 16-bit subnormal values. As Roland mentioned before, all
> 16-bit subnormal values values are 32-bit normal values.
> As I mentioned before, from the point of view of an application
> developer, the flush-to-zero behavior for unpackHalf2x16 is both
> surprising and awful. :)
> While I think an argument can be made for either behavior, I also think
> the argument for the non-flush-to-zero behavior is slightly stronger.
> The case for flush-to-zero based on the above spec quotation fails for
> two reasons. First, the "input into [the] shader" is not a subnormal
> number. It is an integer. Second, the "[value] potentially generated
> by [the] operation" is not subnormal in single-precision.
> We've already determined that NVIDIA closed-source drivers do not flush
> to zero. I'm curious to know what AMD's closed-source drivers do for
> 16-bit subnormal values supplied to unpackHalf2x16. If they do not
> flush to zero, then you had better believe that applications depend on
> that behavior... and that also means that it doesn't matter very much
> what piglit does or the spec does (or does not) say. This is the sort
> of situation where the spec changes to match application expectations
> and shipping implementations... and Mesa drivers change to follow. This
> isn't even close to the first time through that loop.
There is finally a conclusion to this issue. The GLSL ES 3.2 spec says:
"Returns a two-component floating-point vector with components
obtained by unpacking a 32-bit unsigned integer into a pair of
16-bit values, interpreting those values as 16-bit floating-point
numbers according to the OpenGL ES Specification, and converting
them to 32-bit floating-point values."
Since the OpenGL ES specification allows 16-bit floating-point denorms
to flush to zero, the "interpreting those values as 16-bit
floating-point numbers according to the OpenGL ES Specification" allows
the flush to zero.
The bug has been closed with the following comment:
> For current versions and hardware, we have decided both ways have to
> be supported: it okay to flush to zero and it is okay to not flush to
> Due to the general desire is to preserve values, we are looking at
> future versions revisiting this current state.
So... flushing is okay, but it may be okay in the future. I don't think
that helps answer the question about whether or not we should keep the
piglit test that expects non-flush-to-zero behavior.
More information about the mesa-dev