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 <Mathias.Froehlich@web.de>
Reviewed-by: Eric Anholt <eric@anholt.net>
This commit is contained in:
Mathias Fröhlich 2016-06-17 08:09:04 +02:00
parent f7cb46a972
commit f8be969b1b
2 changed files with 39 additions and 0 deletions

View file

@ -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 */
/**********************************************************************/

View file

@ -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
*/