ES31: Enable some dirty bits and dirty objects for compute pipeline

BUG=angleproject:2265
TEST=dEQP-GLES31.functional.shaders.builtin_var.compute.*
     angle_end2end_test.ShaderStorageBufferTest31
                       .MultiStorageBuffersForMultiPrograms

Change-Id: Icc3df122602951a2328003c10a76696ab4c9f0d8
Reviewed-on: https://chromium-review.googlesource.com/792951
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
diff --git a/src/libANGLE/Context.cpp b/src/libANGLE/Context.cpp
index 8115230..ade792e 100644
--- a/src/libANGLE/Context.cpp
+++ b/src/libANGLE/Context.cpp
@@ -411,6 +411,13 @@
     mBlitDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
     mBlitDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
 
+    // TODO(xinghua.cao@intel.com): add other dirty bits and dirty objects.
+    mComputeDirtyBits.set(State::DIRTY_BIT_SHADER_STORAGE_BUFFER_BINDING);
+    mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_BINDING);
+    mComputeDirtyBits.set(State::DIRTY_BIT_PROGRAM_EXECUTABLE);
+    mComputeDirtyBits.set(State::DIRTY_BIT_TEXTURE_BINDINGS);
+    mComputeDirtyBits.set(State::DIRTY_BIT_SAMPLER_BINDINGS);
+
     handleError(mImplementation->initialize());
 }
 
@@ -4217,6 +4224,18 @@
     return NoError();
 }
 
+Error Context::prepareForDispatch()
+{
+    syncRendererState(mComputeDirtyBits, mComputeDirtyObjects);
+
+    if (isRobustResourceInitEnabled())
+    {
+        ANGLE_TRY(mGLState.clearUnclearedActiveTextures(this));
+    }
+
+    return NoError();
+}
+
 void Context::dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ)
 {
     if (numGroupsX == 0u || numGroupsY == 0u || numGroupsZ == 0u)
@@ -4224,12 +4243,7 @@
         return;
     }
 
-    // TODO(jmadill): Dirty bits for compute.
-    if (isRobustResourceInitEnabled())
-    {
-        ANGLE_CONTEXT_TRY(mGLState.clearUnclearedActiveTextures(this));
-    }
-
+    ANGLE_CONTEXT_TRY(prepareForDispatch());
     handleError(mImplementation->dispatchCompute(this, numGroupsX, numGroupsY, numGroupsZ));
 }