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);
     }
 }