[Mesa-dev] [PATCH 2/2] mesa: Only update enabled VAO gl_vertex_array entries.

Brian Paul brianp at vmware.com
Mon Feb 5 16:28:56 UTC 2018


On 02/04/2018 02:12 PM, Mathias.Froehlich at gmx.net wrote:
> From: Mathias Fröhlich <mathias.froehlich at web.de>
> 
> Instead of updating all modified gl_vertex_array_object::_VertexArray
> entried just update those ones that are modified and enabled.

"entries"

"those ones that" -> "those that"


> Also release buffer object from the _VertexArray that belong
> to disabled attributes.
> 
> Signed-off-by: Mathias Fröhlich <Mathias.Froehlich at web.de>
> ---
>   src/mesa/main/varray.c |  8 ++++----
>   src/mesa/main/varray.h | 26 +++++++++++++++-----------
>   2 files changed, 19 insertions(+), 15 deletions(-)
> 
> diff --git a/src/mesa/main/varray.c b/src/mesa/main/varray.c
> index 2fd9de630f..a2d1d74798 100644
> --- a/src/mesa/main/varray.c
> +++ b/src/mesa/main/varray.c
> @@ -152,7 +152,7 @@ vertex_attrib_binding(struct gl_context *ctx,
>   
>         array->BufferBindingIndex = bindingIndex;
>   
> -      vao->NewArrays |= array_bit;
> +      vao->NewArrays |= vao->_Enabled & array_bit;
>      }
>   }
>   
> @@ -187,7 +187,7 @@ _mesa_bind_vertex_buffer(struct gl_context *ctx,
>         else
>            vao->VertexAttribBufferMask |= binding->_BoundArrays;
>   
> -      vao->NewArrays |= binding->_BoundArrays;
> +      vao->NewArrays |= vao->_Enabled & binding->_BoundArrays;
>      }
>   }
>   
> @@ -208,7 +208,7 @@ vertex_binding_divisor(struct gl_context *ctx,
>      if (binding->InstanceDivisor != divisor) {
>         FLUSH_VERTICES(ctx, _NEW_ARRAY);
>         binding->InstanceDivisor = divisor;
> -      vao->NewArrays |= binding->_BoundArrays;
> +      vao->NewArrays |= vao->_Enabled & binding->_BoundArrays;
>      }
>   }
>   
> @@ -318,7 +318,7 @@ _mesa_update_array_format(struct gl_context *ctx,
>      array->RelativeOffset = relativeOffset;
>      array->_ElementSize = elementSize;
>   
> -   vao->NewArrays |= VERT_BIT(attrib);
> +   vao->NewArrays |= vao->_Enabled & VERT_BIT(attrib);
>      ctx->NewState |= _NEW_ARRAY;
>   }
>   
> diff --git a/src/mesa/main/varray.h b/src/mesa/main/varray.h
> index fe7eb81631..6e2649830f 100644
> --- a/src/mesa/main/varray.h
> +++ b/src/mesa/main/varray.h
> @@ -58,17 +58,21 @@ _mesa_update_vertex_array(struct gl_context *ctx,
>                             const struct gl_array_attributes *attribs,
>                             const struct gl_vertex_buffer_binding *binding)
>   {
> -   dst->Size = attribs->Size;
> -   dst->Type = attribs->Type;
> -   dst->Format = attribs->Format;
> -   dst->StrideB = binding->Stride;
> -   dst->Ptr = _mesa_vertex_attrib_address(attribs, binding);
> -   dst->Normalized = attribs->Normalized;
> -   dst->Integer = attribs->Integer;
> -   dst->Doubles = attribs->Doubles;
> -   dst->InstanceDivisor = binding->InstanceDivisor;
> -   dst->_ElementSize = attribs->_ElementSize;
> -   _mesa_reference_buffer_object(ctx, &dst->BufferObj, binding->BufferObj);
> +   if (attribs->Enabled) {
> +      dst->Size = attribs->Size;
> +      dst->Type = attribs->Type;
> +      dst->Format = attribs->Format;
> +      dst->StrideB = binding->Stride;
> +      dst->Ptr = _mesa_vertex_attrib_address(attribs, binding);
> +      dst->Normalized = attribs->Normalized;
> +      dst->Integer = attribs->Integer;
> +      dst->Doubles = attribs->Doubles;
> +      dst->InstanceDivisor = binding->InstanceDivisor;
> +      dst->_ElementSize = attribs->_ElementSize;
> +      _mesa_reference_buffer_object(ctx, &dst->BufferObj, binding->BufferObj);
> +   } else {
> +      _mesa_reference_buffer_object(ctx, &dst->BufferObj, NULL);

Maybe also set dst->Ptr = NULL here so that we're more likely to catch 
any bugs where we might reference stale array state.  Maybe set 
dst->Size=0 too.  I'd also put a comment to the effect that the dst 
values should not be consumed by anything when !attribs->Enabled.

Otherwise, for both: Reviewed-by: Brian Paul <brianp at vmware.com>



> +   }
>   }




More information about the mesa-dev mailing list