[Mesa-dev] [PATCH 03/11] mesa: Implement _mesa_all_varyings_in_vbos.

Mathias Fröhlich Mathias.Froehlich at gmx.net
Wed Jul 27 05:41:54 UTC 2016


Hi,

On Thursday, June 23, 2016 16:53:59 Fredrik Höglund wrote:
> On Friday 17 June 2016, Mathias.Froehlich at gmx.net wrote:
> > From: Mathias Fröhlich <mathias.froehlich at web.de>
> > 
> > Implement the equivalent of vbo_all_varyings_in_vbos for
> > vertex array objects.
> > 
> > Signed-off-by: Mathias Fröhlich <Mathias.Froehlich at web.de>
> > ---
> >  src/mesa/main/arrayobj.c | 35 +++++++++++++++++++++++++++++++++++
> >  src/mesa/main/arrayobj.h |  4 ++++
> >  2 files changed, 39 insertions(+)
> > 
> > diff --git a/src/mesa/main/arrayobj.c b/src/mesa/main/arrayobj.c
> > index 9c3451e..041ee63 100644
> > --- a/src/mesa/main/arrayobj.c
> > +++ b/src/mesa/main/arrayobj.c
> > @@ -359,6 +359,41 @@ _mesa_update_vao_client_arrays(struct gl_context *ctx,
> >  }
> >  
> >  
> > +bool
> > +_mesa_all_varyings_in_vbos(const struct gl_vertex_array_object *vao)
> > +{
> > +   /* Walk those enabled arrays that have the default vbo attached */
> > +   GLbitfield64 mask = vao->_Enabled & ~vao->VertexAttribBufferMask;
> > +
> > +   while (mask) {
> > +      /** We do not use u_bit_scan64 as we can here walk
> > +       *  multiple attrib arrays at once
> > +       */
> > +      const int i = ffsll(mask) - 1;
> > +      const struct gl_vertex_attrib_array *attrib_array =
> > +         &vao->VertexAttrib[i];
> > +      const struct gl_vertex_buffer_binding *buffer_binding =
> > +         &vao->VertexBinding[attrib_array->VertexBinding];
> > +
> > +      /* Only enabled arrays shall appear in the _Enabled bitmask */
> > +      assert(attrib_array->Enabled);
> > +      /* We have already masked out vao->VertexAttribBufferMask  */
> > +      assert(!_mesa_is_bufferobj(buffer_binding->BufferObj));
> > +
> > +      /* Bail out once we find the first non vbo with a non zero stride */
> > +      if (buffer_binding->Stride != 0)
> > +         return false;
> 
> I'm not sure if this is correct.  The default value for Stride is 16,
> not 0.  The only way Stride can be zero in a binding point that doesn't
> have a buffer object bound is if the user has explicitly called
> glBindVertexBuffer() with both the buffer and stride parameters set
> to zero.
> 
> StrideB in gl_client_array on the other hand is always zero when the array
> is one of the currval arrays managed by the VBO context.  It is never zero
> when the array is a user array that has been specified with gl*Pointer().
> 
> I think the point of vbo_all_varyings_in_vbos() is to return false if any
> enabled array doesn't have a VBO bound, and is not one of the currval
> arrays.

Additionally vbo_all_varyings_in_vbos() treats zero stride user
arrays like a current vertex attribute values. Already because
vbo_all_varyings_in_vbos() does not distinguish between a user
zero stride array and a current attribute value which is presented likewise.
Also I believe it's legal to call glBindVertexBuffer() with zero buffer
and stride - or am I wrong here?
So IMO what you write would result in a change of behavior.

Mathias


More information about the mesa-dev mailing list