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 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev