VertexArray: Use switch macro for faster iteration.

Has a small but noticeable impact on performance on a microbenchmark.
Seems to improve a synthetic score by about 1%. Should have a very
small improvement in real-world performance.

Note that the odd formatting is an idiosyncrasy of clang-format.

Bug: angleproject:2389
Change-Id: I888bf101c6d8b80a0fbafdb9c5a84205c9c8fee6
Reviewed-on: https://chromium-review.googlesource.com/962963
Reviewed-by: Luc Ferron <lucferron@chromium.org>
Reviewed-by: Yuly Novikov <ynovikov@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libANGLE/renderer/gl/VertexArrayGL.cpp b/src/libANGLE/renderer/gl/VertexArrayGL.cpp
index 4deb42a..cac5912 100644
--- a/src/libANGLE/renderer/gl/VertexArrayGL.cpp
+++ b/src/libANGLE/renderer/gl/VertexArrayGL.cpp
@@ -701,6 +701,20 @@
     }
 }
 
+#define ANGLE_DIRTY_ATTRIB_FUNC(INDEX)                      \
+    case VertexArray::DIRTY_BIT_ATTRIB_0 + INDEX:           \
+        syncDirtyAttrib(context, INDEX, attribBits[INDEX]); \
+        break;
+
+#define ANGLE_DIRTY_BINDING_FUNC(INDEX)                       \
+    case VertexArray::DIRTY_BIT_BINDING_0 + INDEX:            \
+        syncDirtyBinding(context, INDEX, bindingBits[INDEX]); \
+        break;
+
+#define ANGLE_DIRTY_BUFFER_DATA_FUNC(INDEX)            \
+    case VertexArray::DIRTY_BIT_BUFFER_DATA_0 + INDEX: \
+        break;
+
 gl::Error VertexArrayGL::syncState(const gl::Context *context,
                                    const VertexArray::DirtyBits &dirtyBits,
                                    const gl::VertexArray::DirtyAttribBitsArray &attribBits,
@@ -719,26 +733,13 @@
             case VertexArray::DIRTY_BIT_ELEMENT_ARRAY_BUFFER_DATA:
                 break;
 
+                ANGLE_VERTEX_INDEX_CASES(ANGLE_DIRTY_ATTRIB_FUNC);
+                ANGLE_VERTEX_INDEX_CASES(ANGLE_DIRTY_BINDING_FUNC);
+                ANGLE_VERTEX_INDEX_CASES(ANGLE_DIRTY_BUFFER_DATA_FUNC);
+
             default:
-            {
-                ASSERT(dirtyBit >= VertexArray::DIRTY_BIT_ATTRIB_0);
-                size_t index = VertexArray::GetVertexIndexFromDirtyBit(dirtyBit);
-                if (dirtyBit < VertexArray::DIRTY_BIT_ATTRIB_MAX)
-                {
-                    syncDirtyAttrib(context, index, attribBits[index]);
-                }
-                else if (dirtyBit < VertexArray::DIRTY_BIT_BINDING_MAX)
-                {
-                    ASSERT(dirtyBit >= VertexArray::DIRTY_BIT_BINDING_0);
-                    syncDirtyBinding(context, index, bindingBits[index]);
-                }
-                else
-                {
-                    ASSERT(dirtyBit >= VertexArray::DIRTY_BIT_BUFFER_DATA_0 &&
-                           dirtyBit < VertexArray::DIRTY_BIT_BUFFER_DATA_MAX);
-                }
+                UNREACHABLE();
                 break;
-            }
         }
     }