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