From: Mathias Fröhlich Date: Fri, 17 Jun 2016 06:09:04 +0000 (+0200) Subject: mesa: Implement _mesa_all_varyings_in_vbos. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=f8be969b1bfafc0e7ec6c066b56e53ec382464d0;p=mesa.git mesa: Implement _mesa_all_varyings_in_vbos. Implement the equivalent of vbo_all_varyings_in_vbos for vertex array objects. v2: Update comment. Signed-off-by: Mathias Fröhlich Reviewed-by: Eric Anholt --- diff --git a/src/mesa/main/arrayobj.c b/src/mesa/main/arrayobj.c index 9c3451ec203..becf32f5cda 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) { + /* Do not use u_bit_scan64 as we can 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; + + /* Note that we cannot use the xor variant since the _BoundArray mask + * may contain array attributes that are bound but not enabled. + */ + mask &= ~buffer_binding->_BoundArrays; + } + + return true; +} + + /**********************************************************************/ /* API Functions */ /**********************************************************************/ diff --git a/src/mesa/main/arrayobj.h b/src/mesa/main/arrayobj.h index 6a4247f4aaa..d30c85c7cc5 100644 --- a/src/mesa/main/arrayobj.h +++ b/src/mesa/main/arrayobj.h @@ -81,6 +81,10 @@ extern void _mesa_update_vao_client_arrays(struct gl_context *ctx, struct gl_vertex_array_object *vao); +/* Returns true if all varying arrays reside in vbos */ +extern bool +_mesa_all_varyings_in_vbos(const struct gl_vertex_array_object *vao); + /* * API functions */