Sync scissor state before calling BlitFramebuffer.

Now passes:
 * dEQP-GLES3.functional.fragment_ops.scissor.framebuffer_blit_center
 * dEQP-GLES3.functional.fragment_ops.scissor.framebuffer_blit_corner
 * dEQP-GLES3.functional.fragment_ops.scissor.framebuffer_blit_none

BUG=angleproject:885

Change-Id: Ifec2995562c684b3a4b287619c9bf7a25512b1fd
Reviewed-on: https://chromium-review.googlesource.com/302384
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Tested-by: Geoff Lang <geofflang@chromium.org>
diff --git a/src/libANGLE/Framebuffer.cpp b/src/libANGLE/Framebuffer.cpp
index afc1630..731689c 100644
--- a/src/libANGLE/Framebuffer.cpp
+++ b/src/libANGLE/Framebuffer.cpp
@@ -611,9 +611,17 @@
     return Error(GL_NO_ERROR);
 }
 
-Error Framebuffer::blit(const gl::State &state, const gl::Rectangle &sourceArea, const gl::Rectangle &destArea,
-                        GLbitfield mask, GLenum filter, const gl::Framebuffer *sourceFramebuffer)
+Error Framebuffer::blit(Context *context,
+                        const gl::Rectangle &sourceArea,
+                        const gl::Rectangle &destArea,
+                        GLbitfield mask,
+                        GLenum filter,
+                        const gl::Framebuffer *sourceFramebuffer)
 {
+    // Sync blit state
+    const State &state = context->getState();
+    context->syncRendererState(state.blitStateBitMask());
+
     return mImpl->blit(state, sourceArea, destArea, mask, filter, sourceFramebuffer);
 }
 
diff --git a/src/libANGLE/Framebuffer.h b/src/libANGLE/Framebuffer.h
index a22f317..84e57b2 100644
--- a/src/libANGLE/Framebuffer.h
+++ b/src/libANGLE/Framebuffer.h
@@ -144,8 +144,12 @@
                      GLenum type,
                      GLvoid *pixels) const;
 
-    Error blit(const gl::State &state, const gl::Rectangle &sourceArea, const gl::Rectangle &destArea,
-               GLbitfield mask, GLenum filter, const gl::Framebuffer *sourceFramebuffer);
+    Error blit(Context *context,
+               const gl::Rectangle &sourceArea,
+               const gl::Rectangle &destArea,
+               GLbitfield mask,
+               GLenum filter,
+               const gl::Framebuffer *sourceFramebuffer);
 
   protected:
     void detachResourceById(GLenum resourceType, GLuint resourceId);
diff --git a/src/libANGLE/State.cpp b/src/libANGLE/State.cpp
index d51015a..1e26f2b 100644
--- a/src/libANGLE/State.cpp
+++ b/src/libANGLE/State.cpp
@@ -28,8 +28,10 @@
     // TODO(jmadill): additional ES3 state
     mUnpackStateBitMask.set(DIRTY_BIT_UNPACK_ALIGNMENT);
     mUnpackStateBitMask.set(DIRTY_BIT_UNPACK_ROW_LENGTH);
+
     mPackStateBitMask.set(DIRTY_BIT_PACK_ALIGNMENT);
     mPackStateBitMask.set(DIRTY_BIT_PACK_REVERSE_ROW_ORDER);
+
     mClearStateBitMask.set(DIRTY_BIT_RASTERIZER_DISCARD_ENABLED);
     mClearStateBitMask.set(DIRTY_BIT_SCISSOR_TEST_ENABLED);
     mClearStateBitMask.set(DIRTY_BIT_SCISSOR);
@@ -41,6 +43,9 @@
     mClearStateBitMask.set(DIRTY_BIT_DEPTH_MASK);
     mClearStateBitMask.set(DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
     mClearStateBitMask.set(DIRTY_BIT_STENCIL_WRITEMASK_BACK);
+
+    mBlitStateBitMask.set(DIRTY_BIT_SCISSOR_TEST_ENABLED);
+    mBlitStateBitMask.set(DIRTY_BIT_SCISSOR);
 }
 
 State::~State()
diff --git a/src/libANGLE/State.h b/src/libANGLE/State.h
index 42ab8de..1102056 100644
--- a/src/libANGLE/State.h
+++ b/src/libANGLE/State.h
@@ -322,6 +322,7 @@
     const DirtyBits &unpackStateBitMask() const { return mUnpackStateBitMask; }
     const DirtyBits &packStateBitMask() const { return mPackStateBitMask; }
     const DirtyBits &clearStateBitMask() const { return mClearStateBitMask; }
+    const DirtyBits &blitStateBitMask() const { return mBlitStateBitMask; }
 
   private:
     // Cached values from Context's caps
@@ -396,6 +397,7 @@
     DirtyBits mUnpackStateBitMask;
     DirtyBits mPackStateBitMask;
     DirtyBits mClearStateBitMask;
+    DirtyBits mBlitStateBitMask;
 };
 
 }
diff --git a/src/libGLESv2/entry_points_gles_2_0_ext.cpp b/src/libGLESv2/entry_points_gles_2_0_ext.cpp
index 227acd0..bdd8b67 100644
--- a/src/libGLESv2/entry_points_gles_2_0_ext.cpp
+++ b/src/libGLESv2/entry_points_gles_2_0_ext.cpp
@@ -691,7 +691,8 @@
         Rectangle srcArea(srcX0, srcY0, srcX1 - srcX0, srcY1 - srcY0);
         Rectangle dstArea(dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0);
 
-        Error error = drawFramebuffer->blit(context->getState(), srcArea, dstArea, mask, filter, readFramebuffer);
+        Error error =
+            drawFramebuffer->blit(context, srcArea, dstArea, mask, filter, readFramebuffer);
         if (error.isError())
         {
             context->recordError(error);
diff --git a/src/libGLESv2/entry_points_gles_3_0.cpp b/src/libGLESv2/entry_points_gles_3_0.cpp
index ff24e50..b850109 100644
--- a/src/libGLESv2/entry_points_gles_3_0.cpp
+++ b/src/libGLESv2/entry_points_gles_3_0.cpp
@@ -686,7 +686,8 @@
         Rectangle srcArea(srcX0, srcY0, srcX1 - srcX0, srcY1 - srcY0);
         Rectangle dstArea(dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0);
 
-        Error error = drawFramebuffer->blit(context->getState(), srcArea, dstArea, mask, filter, readFramebuffer);
+        Error error =
+            drawFramebuffer->blit(context, srcArea, dstArea, mask, filter, readFramebuffer);
         if (error.isError())
         {
             context->recordError(error);