Optimize ValidateDrawAttribs: Part 2.
This moves much of the math into cached values in the VertexAttribute
and VertexBinding.
Bug: angleproject:1391
Change-Id: I1b6c0553bf57fef864c27c5193c7dd7ca9b56f53
Reviewed-on: https://chromium-review.googlesource.com/1008274
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
diff --git a/src/libANGLE/VertexArray.cpp b/src/libANGLE/VertexArray.cpp
index 37ad8b7..a750c86 100644
--- a/src/libANGLE/VertexArray.cpp
+++ b/src/libANGLE/VertexArray.cpp
@@ -159,6 +159,7 @@
binding->setStride(stride);
updateObserverBinding(bindingIndex);
+ updateCachedBufferBindingSize(bindingIndex);
}
void VertexArray::bindVertexBuffer(const Context *context,
@@ -213,6 +214,7 @@
attrib->pureInteger = pureInteger;
attrib->relativeOffset = relativeOffset;
mState.mVertexAttributesTypeMask.setIndex(GetVertexAttributeBaseType(*attrib), attribIndex);
+ attrib->updateCachedSizePlusRelativeOffset();
}
void VertexArray::setVertexAttribFormat(size_t attribIndex,
@@ -349,6 +351,12 @@
ASSERT(!mDirtyBitsGuard.valid() || mDirtyBitsGuard.value().test(dirtyBit));
mDirtyBits.set(dirtyBit);
context->getGLState().setVertexArrayDirty(this);
+
+ if (message == angle::SubjectMessage::STORAGE_CHANGED &&
+ index < mArrayBufferObserverBindings.size())
+ {
+ updateCachedBufferBindingSize(index);
+ }
}
void VertexArray::updateObserverBinding(size_t bindingIndex)
@@ -358,4 +366,14 @@
: nullptr);
}
+void VertexArray::updateCachedVertexAttributeSize(size_t attribIndex)
+{
+ mState.mVertexAttributes[attribIndex].updateCachedSizePlusRelativeOffset();
+}
+
+void VertexArray::updateCachedBufferBindingSize(size_t bindingIndex)
+{
+ mState.mVertexBindings[bindingIndex].updateCachedBufferSizeMinusOffset();
+}
+
} // namespace gl