Optimize element array binding.
This inlines some methods and code that was regressing binding
performance. Improves the score of a bindings benchmark by 15%.
Based on contributions by matavenrath@nvidia.com.
Test: bindings_gl_100_objects_allocated_at_initialization
Bug: angleproject:2777
Change-Id: Ied5fdbc67ced862a36c5145fff5ac94f93b40c21
Reviewed-on: https://chromium-review.googlesource.com/1181865
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libANGLE/VertexArray.cpp b/src/libANGLE/VertexArray.cpp
index 272debc..88eff70 100644
--- a/src/libANGLE/VertexArray.cpp
+++ b/src/libANGLE/VertexArray.cpp
@@ -107,8 +107,7 @@
binding.setBuffer(context, nullptr, isBound);
}
if (isBound && mState.mElementArrayBuffer.get())
- mState.mElementArrayBuffer->onBindingChanged(context, false, BufferBinding::ElementArray,
- false);
+ mState.mElementArrayBuffer->onNonTFBindingChanged(context, -1);
mState.mElementArrayBuffer.set(context, nullptr);
mVertexArray->destroy(context);
SafeDelete(mVertexArray);
@@ -149,8 +148,7 @@
if (mState.mElementArrayBuffer.id() == bufferName)
{
if (isBound && mState.mElementArrayBuffer.get())
- mState.mElementArrayBuffer->onBindingChanged(context, false, BufferBinding::Array,
- false);
+ mState.mElementArrayBuffer->onNonTFBindingChanged(context, -1);
mState.mElementArrayBuffer.set(context, nullptr);
}
}
@@ -357,14 +355,18 @@
void VertexArray::setElementArrayBuffer(const Context *context, Buffer *buffer)
{
- bool isBound = context->isCurrentVertexArray(this);
- if (isBound && mState.mElementArrayBuffer.get())
- mState.mElementArrayBuffer->onBindingChanged(context, false, BufferBinding::ElementArray,
- false);
+ if (context->isCurrentVertexArray(this))
+ {
+ if (mState.mElementArrayBuffer.get())
+ {
+ mState.mElementArrayBuffer->onNonTFBindingChanged(context, -1);
+ }
+ if (buffer)
+ {
+ buffer->onNonTFBindingChanged(context, 1);
+ }
+ }
mState.mElementArrayBuffer.set(context, buffer);
- if (isBound && mState.mElementArrayBuffer.get())
- mState.mElementArrayBuffer->onBindingChanged(context, true, BufferBinding::ElementArray,
- false);
mElementArrayBufferObserverBinding.bind(buffer ? buffer->getImplementation() : nullptr);
mDirtyBits.set(DIRTY_BIT_ELEMENT_ARRAY_BUFFER);
}
@@ -389,14 +391,13 @@
return gl::NoError();
}
-void VertexArray::onBindingChanged(const Context *context, bool bound)
+void VertexArray::onBindingChanged(const Context *context, int incr)
{
if (mState.mElementArrayBuffer.get())
- mState.mElementArrayBuffer->onBindingChanged(context, bound, BufferBinding::ElementArray,
- false);
+ mState.mElementArrayBuffer->onNonTFBindingChanged(context, incr);
for (auto &binding : mState.mVertexBindings)
{
- binding.onContainerBindingChanged(context, bound);
+ binding.onContainerBindingChanged(context, incr);
}
}