[Mesa-dev] About the usage of the "flat" interpolation qualifier with input (unsigned) integers and doubles in fragment shaders

Andres Gomez agomez at igalia.com
Mon Apr 4 16:54:50 UTC 2016


Hi,

Thanks, Jason and Ian, for the feedback. See the patch sent at:
https://lists.freedesktop.org/archives/mesa-dev/2016-April/111842.html

Br.

On Wed, 2016-03-23 at 14:51 -0700, Ian Romanick wrote:
> On 03/18/2016 09:52 PM, Jason Ekstrand wrote:
> > 
> > 
> > 
> > On Fri, Mar 4, 2016 at 5:43 AM, Andres Gomez <agomez at igalia.com
> > <mailto:agomez at igalia.com>> wrote:
> > 
> >     Hi,
> > 
> >     as complementary work to the one done to "Add FP64 support to
> > the i965
> >     shader backends" at:
> >     https://bugs.freedesktop.org/show_bug.cgi?id=92760
> > 
> >     I've been working to add piglit tests that would check the new
> > features
> >     added by this addition.
> > 
> >     Checking the specification of the extension, when talking about
> > inputs,
> >     the extension instructs that any fragment input being a double
> > or
> >     derived type must be qualified with the interpolation qualifier
> > "flat".
> > 
> >     This extends the restriction that already existed for signed
> > and
> >     unsigned integers to doubles too.
> > 
> >     In following versions of the spec, when doubles are already
> > part of it
> >     we can read:
> > 
> >     "
> >     Fragment shader inputs that are signed or unsigned integers,
> > integer
> >     vectors, or any double-precision floating-point type must be
> > qualified
> >     with the interpolation qualifier flat.
> >     "
> > 
> >     The specification doesn't explicitly say it, but as far as I
> > understand,
> >     it is reasonable to think that the restriction applies to input
> >     variables in the form of arrays or members of structures of
> > these types.
> > 
> > 
> > Yes, I think that's a reasonable assumption.  The reason it's
> > required
> > for integers is because you can't interpolate them at all.  Some
> > hardware may also not support interpolating doubles so they are
> > included
> > in the statement.  Incidentally, we could implement it in i965
> > because
> > Intel hardware does its interpolation in the shader.  That does
> > not,
> > however, mean that we should :-)
> That might be an interesting extension, should anyone ever care.
> *shrug*
> 
> > 
> >     In fact, current implementation already fails on compilation if
> > a
> >     non-flat integer is in a fragment input as an array or a struct
> > member.
> >     The same happens with doubles (llvmpipe).
> > 
> >     It is also reasonable to think that the restriction would also
> > apply to
> >     input interface blocks holding variables of these types.
> > 
> >     However, the compilation doesn't fail when using a non-flat
> > integer or a
> >     double. On execution, the integer version just gives bogus
> > values while,
> >     with doubles, it crashes.
> > 
> >     --
> > 
> >     The situation with the glslangValidator is (it doesn't support
> > doubles):
> >           * When using a non-flat integer as a fragment input in
> > the form of
> >             an array or as a member of a struct it fails with an
> > error of
> >             the type:
> > 
> >     int' : must be qualified as flat in
> > 
> >           * When using a non-flat integer as a fragment input in
> > the form of
> >             a member of an interface block it succeeds on
> > compilation.
> > 
> > 
> > Glslang is an ok compiler, but I wouldn't give it too much
> > weight.  Just
> > because it's billed as a "reference compiler" doesn't mean you
> > should
> > trust it to get all the edge cases right.  I've personally fixed
> > enough
> > bugs in it to now better ;-)
> I would suggest submitting a bug against glslang as well.
> 
> > 
> >     The situation with nvidia proprietary driver is:
> >           * When using a non-flat integer as a fragment input in
> > the form of
> >             a scalar, an array, a member of a struct or a member of
> > an
> >             interface block it doesn't fail on compilation but on
> > linkage
> >             with an error of the type:
> > 
> >     error C5215: Integer varying <variable> must be flat
> > 
> >           * When using a double as a fragment input in the form of
> > a scalar
> >             or an array it fails on compilation with an error of
> > the type:
> > 
> >     error C7570: 64 bit input '<variable>' should be flat
> > 
> >           * When using a double as a fragment input in the form of
> > a a
> >             member of a struct or a member of an interface block it
> > doesn't
> >             fail. Actually, it seems to do some kind of
> > interpolation.
> > 
> >     --
> > 
> >     Hence, based on this, my proposal would be:
> >           * To enforce the usage of the "flat" qualifier when in a
> > member of
> >             an input block interface in a fragment shader for
> > (unsigned)
> >             integers and doubles.
> > 
> > 
> > Agreed.  That seems like the right thing to do.
> >  
> > 
> >           * Open a bug in Khronos specs bugzilla about the
> > ambiguity of
> >             this.
> > 
> > 
> > Done.  Khronos bug #15671.
> > 
> >     Opinions?
> > 
> >     --
> >     Br,
> > 
> >     Andres
> > 
> > _______________________________________________
> > mesa-dev mailing list
> > mesa-dev at lists.freedesktop.org
> > https://lists.freedesktop.org/mailman/listinfo/mesa-dev
> 
-- 
Br,

Andres

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: This is a digitally signed message part
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20160404/bb64c8f8/attachment.sig>


More information about the mesa-dev mailing list