Cache common DrawElements states.

Similar to how we cache the base common draw states. This will improve
DrawElements performance. Several state checks are optimized into a
single 'if' check of a cached value.

Also includes a regression test for mapping the element array buffer.

Bug: angleproject:2966
Change-Id: Ia6e524a58ad6b7df2e455d67733e15d324b1b893
Reviewed-on: https://chromium-review.googlesource.com/c/1357150
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libANGLE/Context.cpp b/src/libANGLE/Context.cpp
index b24823f..ec13562 100644
--- a/src/libANGLE/Context.cpp
+++ b/src/libANGLE/Context.cpp
@@ -8191,7 +8191,8 @@
     : mCachedHasAnyEnabledClientAttrib(false),
       mCachedNonInstancedVertexElementLimit(0),
       mCachedInstancedVertexElementLimit(0),
-      mCachedBasicDrawStatesError(kInvalidPointer)
+      mCachedBasicDrawStatesError(kInvalidPointer),
+      mCachedBasicDrawElementsError(kInvalidPointer)
 {}
 
 StateCache::~StateCache() = default;
@@ -8201,6 +8202,8 @@
     updateValidDrawModes(context);
     updateValidBindTextureTypes(context);
     updateValidDrawElementsTypes(context);
+    updateBasicDrawStatesError();
+    updateBasicDrawElementsError();
 }
 
 void StateCache::updateActiveAttribsMask(Context *context)
@@ -8277,6 +8280,11 @@
     mCachedBasicDrawStatesError = kInvalidPointer;
 }
 
+void StateCache::updateBasicDrawElementsError()
+{
+    mCachedBasicDrawElementsError = kInvalidPointer;
+}
+
 intptr_t StateCache::getBasicDrawStatesErrorImpl(Context *context) const
 {
     ASSERT(mCachedBasicDrawStatesError == kInvalidPointer);
@@ -8284,6 +8292,13 @@
     return mCachedBasicDrawStatesError;
 }
 
+intptr_t StateCache::getBasicDrawElementsErrorImpl(Context *context) const
+{
+    ASSERT(mCachedBasicDrawElementsError == kInvalidPointer);
+    mCachedBasicDrawElementsError = reinterpret_cast<intptr_t>(ValidateDrawElementsStates(context));
+    return mCachedBasicDrawElementsError;
+}
+
 void StateCache::onVertexArrayBindingChange(Context *context)
 {
     updateActiveAttribsMask(context);
@@ -8320,6 +8335,7 @@
 void StateCache::onVertexArrayBufferStateChange(Context *context)
 {
     updateBasicDrawStatesError();
+    updateBasicDrawElementsError();
 }
 
 void StateCache::onGLES1ClientStateChange(Context *context)
@@ -8360,6 +8376,7 @@
 void StateCache::onActiveTransformFeedbackChange(Context *context)
 {
     updateBasicDrawStatesError();
+    updateBasicDrawElementsError();
     updateValidDrawModes(context);
 }
 
@@ -8371,6 +8388,7 @@
 void StateCache::onBufferBindingChange(Context *context)
 {
     updateBasicDrawStatesError();
+    updateBasicDrawElementsError();
 }
 
 void StateCache::setValidDrawModes(bool pointsOK,