Vulkan: More micro-optimizations to setupDraw.

Still a hotspot but much improved.

Bug: angleproject:2786
Change-Id: Ie68ff314e6c952f281b48f6d9af37b5dcd194d6a
Reviewed-on: https://chromium-review.googlesource.com/1194882
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Frank Henigman <fjhenigman@chromium.org>
diff --git a/src/libANGLE/renderer/vulkan/ProgramVk.cpp b/src/libANGLE/renderer/vulkan/ProgramVk.cpp
index 64efdd9..44eaaf95 100644
--- a/src/libANGLE/renderer/vulkan/ProgramVk.cpp
+++ b/src/libANGLE/renderer/vulkan/ProgramVk.cpp
@@ -176,8 +176,7 @@
 // ProgramVk implementation.
 ProgramVk::DefaultUniformBlock::DefaultUniformBlock()
     : storage(VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT,
-              kUniformBlockDynamicBufferMinSize),
-      uniformsDirty(false)
+              kUniformBlockDynamicBufferMinSize)
 {
 }
 
@@ -397,9 +396,6 @@
         }
     }
 
-    bool anyDirty = false;
-    bool allDirty = true;
-
     for (vk::ShaderType shaderType : vk::AllShaderTypes())
     {
         if (requiredBufferSize[shaderType] > 0)
@@ -416,20 +412,14 @@
 
             // Initialize uniform buffer memory to zero by default.
             mDefaultUniformBlocks[shaderType].uniformData.fill(0);
-            mDefaultUniformBlocks[shaderType].uniformsDirty = true;
-
-            anyDirty = true;
-        }
-        else
-        {
-            allDirty = false;
+            mDefaultUniformBlocksDirty.set(shaderType);
         }
     }
 
-    if (anyDirty)
+    if (mDefaultUniformBlocksDirty.any())
     {
         // Initialize the "empty" uniform block if necessary.
-        if (!allDirty)
+        if (!mDefaultUniformBlocksDirty.all())
         {
             VkBufferCreateInfo uniformBufferInfo;
             uniformBufferInfo.sType                 = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
@@ -475,8 +465,9 @@
 
     if (linkedUniform.typeInfo->type == entryPointType)
     {
-        for (auto &uniformBlock : mDefaultUniformBlocks)
+        for (vk::ShaderType shaderType : vk::AllShaderTypes())
         {
+            DefaultUniformBlock &uniformBlock     = mDefaultUniformBlocks[shaderType];
             const sh::BlockMemberInfo &layoutInfo = uniformBlock.uniformLayout[location];
 
             // Assume an offset of -1 means the block is unused.
@@ -488,13 +479,14 @@
             const GLint componentCount = linkedUniform.typeInfo->componentCount;
             UpdateDefaultUniformBlock(count, locationInfo.arrayIndex, componentCount, v, layoutInfo,
                                       &uniformBlock.uniformData);
-            uniformBlock.uniformsDirty = true;
+            mDefaultUniformBlocksDirty.set(shaderType);
         }
     }
     else
     {
-        for (auto &uniformBlock : mDefaultUniformBlocks)
+        for (vk::ShaderType shaderType : vk::AllShaderTypes())
         {
+            DefaultUniformBlock &uniformBlock     = mDefaultUniformBlocks[shaderType];
             const sh::BlockMemberInfo &layoutInfo = uniformBlock.uniformLayout[location];
 
             // Assume an offset of -1 means the block is unused.
@@ -521,7 +513,8 @@
                     dest[c] = (source[c] == static_cast<T>(0)) ? GL_FALSE : GL_TRUE;
                 }
             }
-            uniformBlock.uniformsDirty = true;
+
+            mDefaultUniformBlocksDirty.set(shaderType);
         }
     }
 }
@@ -626,8 +619,9 @@
     const gl::VariableLocation &locationInfo = mState.getUniformLocations()[location];
     const gl::LinkedUniform &linkedUniform   = mState.getUniforms()[locationInfo.index];
 
-    for (auto &uniformBlock : mDefaultUniformBlocks)
+    for (vk::ShaderType shaderType : vk::AllShaderTypes())
     {
+        DefaultUniformBlock &uniformBlock     = mDefaultUniformBlocks[shaderType];
         const sh::BlockMemberInfo &layoutInfo = uniformBlock.uniformLayout[location];
 
         // Assume an offset of -1 means the block is unused.
@@ -643,7 +637,10 @@
         // If the uniformsDirty flag was true, we don't want to flip it to false here if the
         // setter did not update any data. We still want the uniform to be included when we'll
         // update the descriptor sets.
-        uniformBlock.uniformsDirty = uniformBlock.uniformsDirty || updated;
+        if (updated)
+        {
+            mDefaultUniformBlocksDirty.set(shaderType);
+        }
     }
 }
 
@@ -787,13 +784,13 @@
     {
         DefaultUniformBlock &uniformBlock = mDefaultUniformBlocks[shaderType];
 
-        if (uniformBlock.uniformsDirty)
+        if (mDefaultUniformBlocksDirty[shaderType])
         {
             bool bufferModified = false;
             ANGLE_TRY(SyncDefaultUniformBlock(contextVk, &uniformBlock.storage,
                                               uniformBlock.uniformData,
                                               &mUniformBlocksOffsets[shaderType], &bufferModified));
-            uniformBlock.uniformsDirty = false;
+            mDefaultUniformBlocksDirty.reset(shaderType);
 
             if (bufferModified)
             {