[Mesa-dev] [PATCH] vbo: Set FLUSH_UPDATE_CURRENT when setting vertex attibutes

Chia-I Wu olvaffe at gmail.com
Tue Sep 14 00:41:01 PDT 2010


2010/9/14 Kristian Høgsberg <krh at bitplanet.net>:
> 2010/9/13 keith whitwell <keith.whitwell at gmail.com>:
>> Hey Kristian,
>>
>> The first question is whether this is necessary - from vague memory I
>> have an idea that current attributes need not be updated by vertex
>> buffer rendering - ie. it's optional/implementation-dependent.
>>
>> I assume you're concerned with the case where you have something like
>>
>>   // ctx->Current.Color is xyz
>>
>>   glDrawArrays();
>>
>>   // has ctx->Current.Color been updated??
>>
>> But assuming I'm wrong about that & we really do want to make
>> DrawArrays set the current values, the patch looks good...
>
> No, what I'm seeing is that the code in question sets three generic
> vertex attributes and then calls glDrawArrays().  The value of the
> last attribute is not propagates into the shader.
>
> The problem is that the vertex array code keeps the values in
> exec->vtx.vertex, but the implementation of glDrawArrays looks in
> ctx->Current (that's what I assume, I didn't track that down).  When
> the code hits a case where the size of an attribute is smaller that
> what we're trying to set, it recomputes the layout of the
> exec->vtx.vertex values and as a side effect copies the
> exec->vtx.vertex values to ctx->Current.  Since we start out with
> attrsz == 0 for all attributes, each new attribute will trigger this
> recomputation and thus effectively flushes all previous values to
> ctx->Current.  Which is why all but the last attribute make it to the
> shader.
>
> Note that the ATTR macro is defined differently, depending on
> FEATURE_beginend - the !FEATURE_beginend case sets the
> FLUSH_UPDATE_CURRENT flag too.  I don't know why we wouldn't also set
> it in the FEATURE_beginend case, not using begin/end in that case is
> still an option.
The way glColor4f is dispatched depends on whether it is GL or ES:

  GL (with FEATURE_beginend): glColor4f -> neutral_Color4f -> vbo_Color4f
  ES (w/o  FEATURE_beginend): glColor4f -> _es_Color4f -> vbo_Color4f

In the former case, FLUSH_UPDATE_CURRENT should have been set by
vbo_exec_BeginVertices which is called by neutral_Color4f.  In the latter case,
the flag must be set in vbo_Color4f.  Could it be a bug some where in vtxfmt?

One issue I noticed just last week is that the current scheme does not take
into account "ES with FEATURE_beginend".  This happens with --enable-gles2
build.  Since FEATURE_beginend is enabled in such build, vbo_Color4f does not
set FLUSH_UPDATE_CURRENT.  Yet, an ES context does not use neutral_Color4f.
>
> Kristian
>
>
>> 2010/9/13 Kristian Høgsberg <krh at bitplanet.net>:
>>> Setting constant vertex attributes with glDrawArrays() doesn't work right
>>> because the last attribute isn't copied to ctx->Current.  Typically,
>>> only the last attribute doesn't get set, since vbo_exec_wrap_upgrade_vertex()
>>> ends up getting called when setting a new attribute, and it will copy all
>>> previously set attributes to Current.
>>> ---
>>>  src/mesa/vbo/vbo_exec_api.c |    3 +++
>>>  1 files changed, 3 insertions(+), 0 deletions(-)
>>>
>>> I'm not too familiar with this code, so I'd appreciate if somebody who
>>> knows the vbo code better could take a quick look.
>>>
>>> Kristian
>>>
>>> diff --git a/src/mesa/vbo/vbo_exec_api.c b/src/mesa/vbo/vbo_exec_api.c
>>> index 9df75a8..90c3dd4 100644
>>> --- a/src/mesa/vbo/vbo_exec_api.c
>>> +++ b/src/mesa/vbo/vbo_exec_api.c
>>> @@ -359,6 +359,9 @@ static void vbo_exec_fixup_vertex( GLcontext *ctx,
>>>  do {                                                           \
>>>    struct vbo_exec_context *exec = &vbo_context(ctx)->exec;    \
>>>                                                                \
>>> +   /* FLUSH_UPDATE_CURRENT needs to be set manually */         \
>>> +   exec->ctx->Driver.NeedFlush |= FLUSH_UPDATE_CURRENT;                \
>>> +                                                               \
>>>    if (exec->vtx.active_sz[A] != N)                            \
>>>       vbo_exec_fixup_vertex(ctx, A, N);                        \
>>>                                                                \
>>> --
>>> 1.7.2.1
>>>
>>> _______________________________________________
>>> mesa-dev mailing list
>>> mesa-dev at lists.freedesktop.org
>>> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>>>
>>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>



-- 
olv at LunarG.com


More information about the mesa-dev mailing list