[Mesa-dev] [PATCH 00/13] Fix gl_VertexID on i965

Ian Romanick idr at freedesktop.org
Mon Jun 23 15:40:10 PDT 2014


On 06/21/2014 06:59 PM, Marek Olšák wrote:
> That's right. A uniform won't work with ARB_draw_indirect unless you
> lower it to direct draws, which would be very bad if it was applied to
> all drivers.
>
> Radeonsi indeed supports BaseVertex and BaseInstance as system values
> in the vertex shader. Well, vertex fetching has to be done in the
> vertex shader on that hardware, so the system values are kinda
> required there.

You have to opt-in to the lowering pass.  The only lowering that is
currently implemented is the lowering to a uniform, but lowering to
system value should be trivial.  It would just need the enum passed in
and use it to select between creating gl_BaseVertex as a uniform or a
system value based on that.

> Marek
> 
> On Sun, Jun 22, 2014 at 12:27 AM, Chris Forbes <chrisf at ijw.co.nz> wrote:
>> This will be broken for indirect draws too, and possibly

Good point... I've just sent out an additional test for this case.  It
does glDrawArraysIndirect and glDrawElementsIndirect.  I haven't done
the Multi versions.

>> performance-crippling to fix there, since we don't have the baseVertex
>> value available to shove into a uniform.
>>
>> On Sun, Jun 22, 2014 at 3:36 AM, Roland Scheidegger <sroland at vmware.com> wrote:
>>> Am 21.06.2014 03:00, schrieb Ian Romanick:
>>>> This patch series fixes bugs in the i965 w.r.t. several uses of
>>>> gl_VertexID.  OpenGL (desktop and ES) have the following expectations of
>>>> gl_VertexID:
>>>>
>>>> 1. When used with BaseVertex drawing commands, gl_VertexID will include
>>>> the value of basevertex.  This differens from "the other API," but the
>>>> change in OpenGL was based on feedback from application developers.
>>>> This only affects OpenGL 3.2+.
>>>
>>> I don't question this, but note some binary drivers may not agree. There
>>> are unforunately lots of man pages around of
>>> glDrawElementsInstancedBaseVertexBaseInstance too which state:
>>> "The basevertex has no effect on the shader-visible value of
>>> gl_VertexID." There's a bug filed about this
>>> (https://www.khronos.org/bugzilla/show_bug.cgi?id=932) which is still
>>> open though maybe it has all been resolved...
>>> (I'll just mention that llvmpipe right now will do d3d10-style vertexID
>>> though I guess indeed at some point we need to make it either switchable
>>> or implement GL_ARB_shader_draw_parameters so it can be worked around
>>> easily in the state tracker.)
>>>
>>> Roland
>>>
>>>
>>>>
>>>> 2. When used with DrawArrays drawing commands, gl_VertexID will count
>>>> from the 'start' value instead of zero.  This affects OpenGL 3.0+ and
>>>> OpenGL ES 3.0+.
>>>>
>>>> The i965 driver botched both of these for slightly different reasons.
>>>> For #1, our hardware was designed with the "other API's" semantic in
>>>> mind, so gl_VertexID doesn't include the basevertex value.
>>>>
>>>> For #2, we implement DrawArrays with a non-zero start index by
>>>> reprogramming the array base offset.  As a result, gl_VertexID always
>>>> counts from zero.
>>>>
>>>> I suspect other hardware may suffer from one or both of these issues.  I
>>>> have sent tests to the piglit list to reproduce them.
>>>>
>>>> To fix both of these issues, the shader needs to know the basevertex
>>>> value.  A later GL extension, GL_ARB_shader_draw_parameters, adds
>>>> gl_BaseVertex and gl_BaseInstance as built-in variables.  I believe some
>>>> hardware implements these as system values much like gl_VertexID.
>>>>
>>>> I started this series with the assumption that we could have a
>>>> SYSTEM_VALUE_BASE_VERTEX that might come from a uniform.  In the end, I
>>>> couldn't make that work.  I left patch 7 in the series, but we may want
>>>> to remove it.
>>>>
>>>> I added a STATE_BASE_VERTEX uniform instead.
>>>>
>>>> There is now a lowering pass that converts gl_VertexID to
>>>> gl_VertexIDMESA + gl_BaseVertex (backed by a uniform).  Some of these
>>>> names should probably be changed.
>>>>
>>>> I have also contemplated adding an extension that exposes the other
>>>> semantic for gl_VertexID for applications that actually want that.  This
>>>> is primarily things that are porting content (or "bridging" content)
>>>> from the other API.  That, however, can happen later.
>>>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/mesa-dev



More information about the mesa-dev mailing list