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, ...@@ -611,9 +611,17 @@ Error Framebuffer::readPixels(Context *context,
return Error(GL_NO_ERROR); return Error(GL_NO_ERROR);
} }
Error Framebuffer::blit(const gl::State &state, const gl::Rectangle &sourceArea, const gl::Rectangle &destArea, Error Framebuffer::blit(Context *context,
GLbitfield mask, GLenum filter, const gl::Framebuffer *sourceFramebuffer) 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); return mImpl->blit(state, sourceArea, destArea, mask, filter, sourceFramebuffer);
} }
......
...@@ -144,8 +144,12 @@ class Framebuffer ...@@ -144,8 +144,12 @@ class Framebuffer
GLenum type, GLenum type,
GLvoid *pixels) const; GLvoid *pixels) const;
Error blit(const gl::State &state, const gl::Rectangle &sourceArea, const gl::Rectangle &destArea, Error blit(Context *context,
GLbitfield mask, GLenum filter, const gl::Framebuffer *sourceFramebuffer); const gl::Rectangle &sourceArea,
const gl::Rectangle &destArea,
GLbitfield mask,
GLenum filter,
const gl::Framebuffer *sourceFramebuffer);
protected: protected:
void detachResourceById(GLenum resourceType, GLuint resourceId); void detachResourceById(GLenum resourceType, GLuint resourceId);
......
...@@ -28,8 +28,10 @@ State::State() ...@@ -28,8 +28,10 @@ State::State()
// TODO(jmadill): additional ES3 state // TODO(jmadill): additional ES3 state
mUnpackStateBitMask.set(DIRTY_BIT_UNPACK_ALIGNMENT); mUnpackStateBitMask.set(DIRTY_BIT_UNPACK_ALIGNMENT);
mUnpackStateBitMask.set(DIRTY_BIT_UNPACK_ROW_LENGTH); mUnpackStateBitMask.set(DIRTY_BIT_UNPACK_ROW_LENGTH);
mPackStateBitMask.set(DIRTY_BIT_PACK_ALIGNMENT); mPackStateBitMask.set(DIRTY_BIT_PACK_ALIGNMENT);
mPackStateBitMask.set(DIRTY_BIT_PACK_REVERSE_ROW_ORDER); mPackStateBitMask.set(DIRTY_BIT_PACK_REVERSE_ROW_ORDER);
mClearStateBitMask.set(DIRTY_BIT_RASTERIZER_DISCARD_ENABLED); mClearStateBitMask.set(DIRTY_BIT_RASTERIZER_DISCARD_ENABLED);
mClearStateBitMask.set(DIRTY_BIT_SCISSOR_TEST_ENABLED); mClearStateBitMask.set(DIRTY_BIT_SCISSOR_TEST_ENABLED);
mClearStateBitMask.set(DIRTY_BIT_SCISSOR); mClearStateBitMask.set(DIRTY_BIT_SCISSOR);
...@@ -41,6 +43,9 @@ State::State() ...@@ -41,6 +43,9 @@ State::State()
mClearStateBitMask.set(DIRTY_BIT_DEPTH_MASK); mClearStateBitMask.set(DIRTY_BIT_DEPTH_MASK);
mClearStateBitMask.set(DIRTY_BIT_STENCIL_WRITEMASK_FRONT); mClearStateBitMask.set(DIRTY_BIT_STENCIL_WRITEMASK_FRONT);
mClearStateBitMask.set(DIRTY_BIT_STENCIL_WRITEMASK_BACK); mClearStateBitMask.set(DIRTY_BIT_STENCIL_WRITEMASK_BACK);
mBlitStateBitMask.set(DIRTY_BIT_SCISSOR_TEST_ENABLED);
mBlitStateBitMask.set(DIRTY_BIT_SCISSOR);
} }
State::~State() State::~State()
......
...@@ -322,6 +322,7 @@ class State : angle::NonCopyable ...@@ -322,6 +322,7 @@ class State : angle::NonCopyable
const DirtyBits &unpackStateBitMask() const { return mUnpackStateBitMask; } const DirtyBits &unpackStateBitMask() const { return mUnpackStateBitMask; }
const DirtyBits &packStateBitMask() const { return mPackStateBitMask; } const DirtyBits &packStateBitMask() const { return mPackStateBitMask; }
const DirtyBits &clearStateBitMask() const { return mClearStateBitMask; } const DirtyBits &clearStateBitMask() const { return mClearStateBitMask; }
const DirtyBits &blitStateBitMask() const { return mBlitStateBitMask; }
private: private:
// Cached values from Context's caps // Cached values from Context's caps
...@@ -396,6 +397,7 @@ class State : angle::NonCopyable ...@@ -396,6 +397,7 @@ class State : angle::NonCopyable
DirtyBits mUnpackStateBitMask; DirtyBits mUnpackStateBitMask;
DirtyBits mPackStateBitMask; DirtyBits mPackStateBitMask;
DirtyBits mClearStateBitMask; DirtyBits mClearStateBitMask;
DirtyBits mBlitStateBitMask;
}; };
} }
......
...@@ -691,7 +691,8 @@ void GL_APIENTRY BlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLi ...@@ -691,7 +691,8 @@ void GL_APIENTRY BlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLi
Rectangle srcArea(srcX0, srcY0, srcX1 - srcX0, srcY1 - srcY0); Rectangle srcArea(srcX0, srcY0, srcX1 - srcX0, srcY1 - srcY0);
Rectangle dstArea(dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0); 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()) if (error.isError())
{ {
context->recordError(error); context->recordError(error);
......
...@@ -686,7 +686,8 @@ void GL_APIENTRY BlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint sr ...@@ -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 srcArea(srcX0, srcY0, srcX1 - srcX0, srcY1 - srcY0);
Rectangle dstArea(dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0); 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()) if (error.isError())
{ {
context->recordError(error); 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