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);