StateManagerGL: Use dirty bits for VAO bindings.

Delay binding the VAO in VertexArrayGL::syncDrawState until we actually
need to make glVertexAttrib calls.

BUG=angleproject:2188

Change-Id: Ib7d22d641c9f19c639ba8c596bff6bc7de952e7f
Reviewed-on: https://chromium-review.googlesource.com/919503
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Luc Ferron <lucferron@chromium.org>
Commit-Queue: Geoff Lang <geofflang@chromium.org>
diff --git a/src/libANGLE/renderer/gl/VertexArrayGL.cpp b/src/libANGLE/renderer/gl/VertexArrayGL.cpp
index 25f542f..651ee3e 100644
--- a/src/libANGLE/renderer/gl/VertexArrayGL.cpp
+++ b/src/libANGLE/renderer/gl/VertexArrayGL.cpp
@@ -152,8 +152,6 @@
                                        bool primitiveRestartEnabled,
                                        const void **outIndices) const
 {
-    mStateManager->bindVertexArray(mVertexArrayID, getAppliedElementArrayBufferID());
-
     // Check if any attributes need to be streamed, determines if the index range needs to be
     // computed
     bool attributesNeedStreaming = mAttributesNeedStreaming.any();
@@ -233,6 +231,8 @@
             mStreamingElementArrayBufferSize = 0;
         }
 
+        mStateManager->bindVertexArray(mVertexArrayID, getAppliedElementArrayBufferID());
+
         mStateManager->bindBuffer(gl::BufferBinding::ElementArray, mStreamingElementArrayBuffer);
         mAppliedElementArrayBuffer.set(context, nullptr);
 
@@ -329,6 +329,8 @@
         mStreamingArrayBufferSize = requiredBufferSize;
     }
 
+    mStateManager->bindVertexArray(mVertexArrayID, getAppliedElementArrayBufferID());
+
     // Unmapping a buffer can return GL_FALSE to indicate that the system has corrupted the data
     // somehow (such as by a screen change), retry writing the data a few times and return
     // OUT_OF_MEMORY if that fails.