[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