[Mesa-dev] [PATCH 03/11] mesa: Implement _mesa_all_varyings_in_vbos.
Fredrik Höglund
fredrik at kde.org
Thu Jun 23 14:53:59 UTC 2016
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.
> +
> + /* 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 6a4247f..d30c85c 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
> */
>
More information about the mesa-dev
mailing list