Optimize angle::BitSetIterator.
Adds a new custom bitset template to handle packing as many bits as
possible into a single variable. Intelligently select the right class
depending on platform features and bit sizes.
For now, always use a packed 64-bit set on 64-bit, instead of using
a 32-bit set for smaller bitsets.
BUG=angleproject:1814
Change-Id: I3ffef815c15515555833f6fc9302d8a4eee5423b
Reviewed-on: https://chromium-review.googlesource.com/471827
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@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 183baa4..be4bb84 100644
--- a/src/libANGLE/renderer/gl/VertexArrayGL.cpp
+++ b/src/libANGLE/renderer/gl/VertexArrayGL.cpp
@@ -257,7 +257,10 @@
const auto &attribs = mData.getVertexAttributes();
const auto &bindings = mData.getVertexBindings();
- for (auto idx : angle::IterateBitSet(mAttributesNeedStreaming & activeAttributesMask))
+
+ gl::AttributesMask attribsToStream = (mAttributesNeedStreaming & activeAttributesMask);
+
+ for (auto idx : attribsToStream)
{
const auto &attrib = attribs[idx];
const auto &binding = bindings[attrib.bindingIndex];
@@ -320,7 +323,10 @@
const auto &attribs = mData.getVertexAttributes();
const auto &bindings = mData.getVertexBindings();
- for (auto idx : angle::IterateBitSet(mAttributesNeedStreaming & activeAttributesMask))
+
+ gl::AttributesMask attribsToStream = (mAttributesNeedStreaming & activeAttributesMask);
+
+ for (auto idx : attribsToStream)
{
const auto &attrib = attribs[idx];
const auto &binding = bindings[attrib.bindingIndex];
@@ -526,7 +532,7 @@
void VertexArrayGL::syncState(ContextImpl *contextImpl, const VertexArray::DirtyBits &dirtyBits)
{
- for (unsigned long dirtyBit : angle::IterateBitSet(dirtyBits))
+ for (size_t dirtyBit : dirtyBits)
{
if (dirtyBit == VertexArray::DIRTY_BIT_ELEMENT_ARRAY_BUFFER)
{