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

Ian Romanick idr at freedesktop.org
Wed Mar 23 21:51:43 UTC 2016


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



More information about the mesa-dev mailing list