Commit 242468f3 by Geoff Lang

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/302384Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Tested-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent 5f0246ca
......@@ -611,9 +611,17 @@ Error Framebuffer::readPixels(Context *context,
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);
}
......
......@@ -144,8 +144,12 @@ class Framebuffer
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);
......
......@@ -28,8 +28,10 @@ State::State()
// 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 @@ State::State()
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()
......
......@@ -322,6 +322,7 @@ class State : angle::NonCopyable
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 @@ class State : angle::NonCopyable
DirtyBits mUnpackStateBitMask;
DirtyBits mPackStateBitMask;
DirtyBits mClearStateBitMask;
DirtyBits mBlitStateBitMask;
};
}
......
......@@ -691,7 +691,8 @@ void GL_APIENTRY BlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLi
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);
......
......@@ -686,7 +686,8 @@ void GL_APIENTRY BlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint sr
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);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment