Hi, On Thursday, June 23, 2016 16:53:59 Fredrik Höglund wrote: > On Friday 17 June 2016, mathias.froehl...@gmx.net wrote: > > From: Mathias Fröhlich <mathias.froehl...@web.de> > > > > Implement the equivalent of vbo_all_varyings_in_vbos for > > vertex array objects. > > > > Signed-off-by: Mathias Fröhlich <mathias.froehl...@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 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev