[Mesa-dev] [PATCH v2 12/23] glsl: Validate vertex emission in geometry shaders.

Iago Toral itoral at igalia.com
Thu Jun 19 23:51:14 PDT 2014


On Wed, 2014-06-18 at 13:38 -0700, Ian Romanick wrote:
> On 06/18/2014 02:51 AM, Iago Toral Quiroga wrote:
(...)
> > +      /* From the ARB_gpu_shader5 spec:
> > +       *
> > +       *   "Multiple vertex streams are supported only if the output primitive
> > +       *    type is declared to be "points".  A program will fail to link if it
> > +       *    contains a geometry shader calling EmitStreamVertex() or
> > +       *    EndStreamPrimitive() if its output primitive type is not "points".
> > +       *
> > +       * However, in the same spec:
> > +       *
> > +       *   "The function EmitVertex() is equivalent to calling EmitStreamVertex()
> > +       *    with <stream> set to zero."
> > +       *
> > +       * And:
> > +       *
> > +       *   "The function EndPrimitive() is equivalent to calling
> > +       *    EndStreamPrimitive() with <stream> set to zero."
> > +       *
> > +       * Since we can call EmitVertex() and EndPrimitive() when we output
> > +       * primitives other than points, calling EmitStreamVertex(0) or
> > +       * EmitEndPrimitive(0) should not produce errors. This it also what Nvidia
> > +       * does. Currently we only set prog->Geom.UsesStreams to TRUE when
> > +       * EmitStreamVertex() or EmitEndPrimitive() are called with a non-zero
> > +       * stream.
> 
> Does AMD also behave this way?  If so, I can submit a spec bug to make
> these explicitly legal.  Otherwise, I think we should not allow it.  We
> probably ought to check Apple and the Intel Windows driver too...

I could test this on the proprietary AMD Linux driver:

A geometry shader with output triangle_strip using EmitStreamVertex(0)
and EmitEndPrimitive(0) works fine: no link errors, correct output.

A geometry shader with output triangle_strip using EmitStreamVertex(1)
does not produce a link error (which is wrong by the spec) and produces
incorrect output (blank screen).

A geometry shader with output triangle_strip using EmitStreamVertex(0)
that also calls EmitStreamPrimitive(1) does not produce a link error
(which is wrong by the spec) and produces correct output (the end stream
primitive on stream 1 is really a no-op since there are no vertices
emitted on that stream).

So I'd say that AMD is not respecting the spec too much here, but it
looks like using EmitStreamVertex(0) or EndStreamPrimitive(0) with
output types other than points works on both Nvidia and AMD proprietary
drivers in the end.

So Ian, what do you think we should do?

Iago







More information about the mesa-dev mailing list