[Mesa-dev] [PATCH 3/3] mesa: Only update enabled VAO gl_vertex_array entries.
Mathias.Froehlich at gmx.net
Mathias.Froehlich at gmx.net
Mon Feb 5 22:19:29 UTC 2018
From: Mathias Fröhlich <mathias.froehlich at web.de>
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 <Mathias.Froehlich at web.de>
Reviewed-by: Brian Paul <brianp at vmware.com>
---
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 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..ede7a004e4 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.14.3
More information about the mesa-dev
mailing list