diff options
author | Mathias Fröhlich <[email protected]> | 2016-06-17 08:09:04 +0200 |
---|---|---|
committer | Mathias Fröhlich <[email protected]> | 2016-07-31 10:05:45 +0200 |
commit | f8be969b1bfafc0e7ec6c066b56e53ec382464d0 (patch) | |
tree | 15a17dcc7a7f3945aa3d9d6563e1fd085c0fc1ac | |
parent | f7cb46a9721ace5ec6d1e51cdc4ce70348605701 (diff) |
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 <[email protected]>
Reviewed-by: Eric Anholt <[email protected]>
-rw-r--r-- | src/mesa/main/arrayobj.c | 35 | ||||
-rw-r--r-- | src/mesa/main/arrayobj.h | 4 |
2 files changed, 39 insertions, 0 deletions
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 */ |