From 77cb2fc0bd8f57b646ef5ab674c1f76d873a22ae Mon Sep 17 00:00:00 2001 From: =?utf8?q?Mathias=20Fr=C3=B6hlich?= Date: Sun, 4 Feb 2018 17:13:06 +0100 Subject: [PATCH] mesa: Only update enabled VAO gl_vertex_array entries. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Instead of updating all modified gl_vertex_array_object::_VertexArray entries just update those that are modified and enabled. Also release buffer object from the _VertexArray that belong to disabled attributes. v2: Also set Ptr and Size to zero. Signed-off-by: Mathias Fröhlich Reviewed-by: Brian Paul --- src/mesa/main/varray.c | 8 ++++---- src/mesa/main/varray.h | 29 ++++++++++++++++++----------- 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/src/mesa/main/varray.c b/src/mesa/main/varray.c index 4dfc3546a8c..d55f74e968f 100644 --- a/src/mesa/main/varray.c +++ b/src/mesa/main/varray.c @@ -178,7 +178,7 @@ vertex_attrib_binding(struct gl_context *ctx, array->BufferBindingIndex = bindingIndex; - vao->NewArrays |= array_bit; + vao->NewArrays |= vao->_Enabled & array_bit; } } @@ -213,7 +213,7 @@ _mesa_bind_vertex_buffer(struct gl_context *ctx, else vao->VertexAttribBufferMask |= binding->_BoundArrays; - vao->NewArrays |= binding->_BoundArrays; + vao->NewArrays |= vao->_Enabled & binding->_BoundArrays; } } @@ -234,7 +234,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; } } @@ -344,7 +344,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 ddabd0bc585..46f83b22008 100644 --- a/src/mesa/main/varray.h +++ b/src/mesa/main/varray.h @@ -58,17 +58,24 @@ _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 { + /* Disabled arrays shall not be consumed */ + dst->Size = 0; + dst->Ptr = NULL; + _mesa_reference_buffer_object(ctx, &dst->BufferObj, NULL); + } } -- 2.30.2