Minor inlining optimization to Context draw calls.

Reduces draw call overhead by up to 3%.

Bug: angleproject:2966
Change-Id: Ie7ddb61b905fefe59a06a1528f0a3fde4accaf74
Reviewed-on: https://chromium-review.googlesource.com/c/1333608
Reviewed-by: Yuly Novikov <ynovikov@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libANGLE/Context.cpp b/src/libANGLE/Context.cpp
index 1a092e2..7af3e66 100644
--- a/src/libANGLE/Context.cpp
+++ b/src/libANGLE/Context.cpp
@@ -3523,6 +3523,27 @@
     return (instanceCount == 0) || noopDraw(mode, count);
 }
 
+ANGLE_INLINE angle::Result Context::syncDirtyBits()
+{
+    const State::DirtyBits &dirtyBits = mGLState.getDirtyBits();
+    ANGLE_TRY(mImplementation->syncState(this, dirtyBits, mAllDirtyBits));
+    mGLState.clearDirtyBits();
+    return angle::Result::Continue();
+}
+
+ANGLE_INLINE angle::Result Context::syncDirtyBits(const State::DirtyBits &bitMask)
+{
+    const State::DirtyBits &dirtyBits = (mGLState.getDirtyBits() & bitMask);
+    ANGLE_TRY(mImplementation->syncState(this, dirtyBits, bitMask));
+    mGLState.clearDirtyBits(dirtyBits);
+    return angle::Result::Continue();
+}
+
+ANGLE_INLINE angle::Result Context::syncDirtyObjects(const State::DirtyObjects &objectMask)
+{
+    return mGLState.syncDirtyObjects(this, objectMask);
+}
+
 angle::Result Context::prepareForDraw(PrimitiveMode mode)
 {
     if (mGLES1Renderer)
@@ -3538,8 +3559,7 @@
         ANGLE_TRY(mGLState.getDrawFramebuffer()->ensureDrawAttachmentsInitialized(this));
     }
 
-    ANGLE_TRY(syncDirtyBits());
-    return angle::Result::Continue();
+    return syncDirtyBits();
 }
 
 Error Context::prepareForClear(GLbitfield mask)
@@ -3566,27 +3586,6 @@
     return NoError();
 }
 
-angle::Result Context::syncDirtyBits()
-{
-    const State::DirtyBits &dirtyBits = mGLState.getDirtyBits();
-    ANGLE_TRY(mImplementation->syncState(this, dirtyBits, mAllDirtyBits));
-    mGLState.clearDirtyBits();
-    return angle::Result::Continue();
-}
-
-angle::Result Context::syncDirtyBits(const State::DirtyBits &bitMask)
-{
-    const State::DirtyBits &dirtyBits = (mGLState.getDirtyBits() & bitMask);
-    ANGLE_TRY(mImplementation->syncState(this, dirtyBits, bitMask));
-    mGLState.clearDirtyBits(dirtyBits);
-    return angle::Result::Continue();
-}
-
-angle::Result Context::syncDirtyObjects(const State::DirtyObjects &objectMask)
-{
-    return mGLState.syncDirtyObjects(this, objectMask);
-}
-
 void Context::blitFramebuffer(GLint srcX0,
                               GLint srcY0,
                               GLint srcX1,
diff --git a/src/libANGLE/State.cpp b/src/libANGLE/State.cpp
index bd94e84..ff834ad 100644
--- a/src/libANGLE/State.cpp
+++ b/src/libANGLE/State.cpp
@@ -2774,10 +2774,10 @@
     }
 }
 
-angle::Result State::syncDirtyObjects(const Context *context, const DirtyObjects &bitset)
+angle::Result State::syncDirtyObjectsImpl(const Context *context, const DirtyObjects &dirtyObjects)
 {
-    const DirtyObjects &dirtyObjects = mDirtyObjects & bitset;
-    for (auto dirtyObject : dirtyObjects)
+    ASSERT(dirtyObjects.any());
+    for (size_t dirtyObject : dirtyObjects)
     {
         switch (dirtyObject)
         {
diff --git a/src/libANGLE/State.h b/src/libANGLE/State.h
index d997a37..38da01c 100644
--- a/src/libANGLE/State.h
+++ b/src/libANGLE/State.h
@@ -486,7 +486,20 @@
     using DirtyObjects = angle::BitSet<DIRTY_OBJECT_MAX>;
     void clearDirtyObjects() { mDirtyObjects.reset(); }
     void setAllDirtyObjects() { mDirtyObjects.set(); }
-    angle::Result syncDirtyObjects(const Context *context, const DirtyObjects &bitset);
+
+    ANGLE_INLINE angle::Result syncDirtyObjects(const Context *context, const DirtyObjects &bitset)
+    {
+        const DirtyObjects &dirtyObjects = mDirtyObjects & bitset;
+        if (dirtyObjects.any())
+        {
+            return syncDirtyObjectsImpl(context, dirtyObjects);
+        }
+        else
+        {
+            return angle::Result::Continue();
+        }
+    }
+
     angle::Result syncDirtyObject(const Context *context, GLenum target);
     void setObjectDirty(GLenum target);
     void setSamplerDirty(size_t samplerIndex);
@@ -537,6 +550,7 @@
     angle::Result updateActiveTexture(const Context *context,
                                       size_t textureIndex,
                                       Texture *texture);
+    angle::Result syncDirtyObjectsImpl(const Context *context, const DirtyObjects &dirtyObjects);
 
     // Dispatch table for buffer update functions.
     static const angle::PackedEnumMap<BufferBinding, BufferBindingSetter> kBufferSetters;