Optimize ValidateDrawAttribs: Part 3.

This is a small optimization for the WebGL compatibility mode.
Instead of scanning the list of attributes for a Transform feedback
conflict, it can quickly check a cached mask. This should save a lot
of cycles on the fast path.

Bug: angleproject:1391
Change-Id: Icb8d095493a629dbff0e93872357e5bf7c7458ae
Reviewed-on: https://chromium-review.googlesource.com/1011236
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
diff --git a/src/libANGLE/State.cpp b/src/libANGLE/State.cpp
index 4227a3e..163f732 100644
--- a/src/libANGLE/State.cpp
+++ b/src/libANGLE/State.cpp
@@ -45,10 +45,10 @@
                          BufferBinding target)
 {
     if (binding->get())
-        (*binding)->onBindingChanged(false, target);
+        (*binding)->onBindingChanged(context, false, target);
     binding->set(context, buffer);
     if (binding->get())
-        (*binding)->onBindingChanged(true, target);
+        (*binding)->onBindingChanged(context, true, target);
 }
 
 void UpdateBufferBinding(const Context *context,
@@ -59,10 +59,10 @@
                          GLsizeiptr size)
 {
     if (binding->get())
-        (*binding)->onBindingChanged(false, target);
+        (*binding)->onBindingChanged(context, false, target);
     binding->set(context, buffer, offset, size);
     if (binding->get())
-        (*binding)->onBindingChanged(true, target);
+        (*binding)->onBindingChanged(context, true, target);
 }
 
 State::State()
@@ -291,7 +291,7 @@
     mProgramPipeline.set(context, nullptr);
 
     if (mTransformFeedback.get())
-        mTransformFeedback->onBindingChanged(false);
+        mTransformFeedback->onBindingChanged(context, false);
     mTransformFeedback.set(context, nullptr);
 
     for (State::ActiveQueryMap::iterator i = mActiveQueries.begin(); i != mActiveQueries.end(); i++)
@@ -1165,15 +1165,15 @@
     return false;
 }
 
-void State::setVertexArrayBinding(VertexArray *vertexArray)
+void State::setVertexArrayBinding(const Context *context, VertexArray *vertexArray)
 {
     if (mVertexArray == vertexArray)
         return;
     if (mVertexArray)
-        mVertexArray->onBindingChanged(false);
+        mVertexArray->onBindingChanged(context, false);
     mVertexArray = vertexArray;
     if (vertexArray)
-        vertexArray->onBindingChanged(true);
+        vertexArray->onBindingChanged(context, true);
     mDirtyBits.set(DIRTY_BIT_VERTEX_ARRAY_BINDING);
 
     if (mVertexArray && mVertexArray->hasAnyDirtyBit())
@@ -1194,11 +1194,11 @@
     return mVertexArray;
 }
 
-bool State::removeVertexArrayBinding(GLuint vertexArray)
+bool State::removeVertexArrayBinding(const Context *context, GLuint vertexArray)
 {
     if (mVertexArray && mVertexArray->id() == vertexArray)
     {
-        mVertexArray->onBindingChanged(false);
+        mVertexArray->onBindingChanged(context, false);
         mVertexArray = nullptr;
         mDirtyBits.set(DIRTY_BIT_VERTEX_ARRAY_BINDING);
         mDirtyObjects.set(DIRTY_OBJECT_VERTEX_ARRAY);
@@ -1274,10 +1274,10 @@
     if (transformFeedback == mTransformFeedback.get())
         return;
     if (mTransformFeedback.get())
-        mTransformFeedback->onBindingChanged(false);
+        mTransformFeedback->onBindingChanged(context, false);
     mTransformFeedback.set(context, transformFeedback);
     if (mTransformFeedback.get())
-        mTransformFeedback->onBindingChanged(true);
+        mTransformFeedback->onBindingChanged(context, true);
     mDirtyBits.set(DIRTY_BIT_TRANSFORM_FEEDBACK_BINDING);
 }
 
@@ -1298,7 +1298,7 @@
     if (mTransformFeedback.id() == transformFeedback)
     {
         if (mTransformFeedback.get())
-            mTransformFeedback->onBindingChanged(false);
+            mTransformFeedback->onBindingChanged(context, false);
         mTransformFeedback.set(context, nullptr);
         return true;
     }