Commit bbffb779 by Shahbaz Youssefi Committed by Commit Bot

Fix read framebuffer binding sync before copy image

The READ_FRAMEBUFFER_BINDING dirty bit sync was missing from copy image functions. In the Vulkan backend, a cached value for the current read framebuffer was used to determine if the copy should flip in Y, and that cached value was out of date. Bug: angleproject:3723 Change-Id: I10e8a276a42c28fbedc9939f653a5a1f4a14e87b Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1715483Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarMohan Maiya <m.maiya@samsung.com> Reviewed-by: 's avatarShahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
parent 08b97da8
......@@ -523,6 +523,7 @@ void Context::initialize()
mComputeDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM);
mComputeDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS);
mCopyImageDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
mCopyImageDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
ANGLE_CONTEXT_TRY(mImplementation->initialize());
......@@ -3546,6 +3547,7 @@ void Context::updateCaps()
mComputeDirtyObjects.set(State::DIRTY_OBJECT_TEXTURES_INIT);
mComputeDirtyObjects.set(State::DIRTY_OBJECT_IMAGES_INIT);
mReadPixelsDirtyObjects.set(State::DIRTY_OBJECT_READ_ATTACHMENTS);
mCopyImageDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
mCopyImageDirtyObjects.set(State::DIRTY_OBJECT_READ_ATTACHMENTS);
}
......@@ -3591,6 +3593,12 @@ angle::Result Context::prepareForClearBuffer(GLenum buffer, GLint drawbuffer)
return angle::Result::Continue;
}
ANGLE_INLINE angle::Result Context::prepareForCopyImage()
{
ANGLE_TRY(syncDirtyObjects(mCopyImageDirtyObjects));
return syncDirtyBits(mCopyImageDirtyBits);
}
ANGLE_INLINE angle::Result Context::prepareForDispatch()
{
ANGLE_TRY(syncDirtyObjects(mComputeDirtyObjects));
......@@ -3787,7 +3795,7 @@ void Context::copyTexImage2D(TextureTarget target,
GLsizei height,
GLint border)
{
ANGLE_CONTEXT_TRY(mState.syncDirtyObjects(this, mCopyImageDirtyObjects));
ANGLE_CONTEXT_TRY(prepareForCopyImage());
Rectangle sourceArea(x, y, width, height);
......@@ -3811,7 +3819,7 @@ void Context::copyTexSubImage2D(TextureTarget target,
return;
}
ANGLE_CONTEXT_TRY(mState.syncDirtyObjects(this, mCopyImageDirtyObjects));
ANGLE_CONTEXT_TRY(prepareForCopyImage());
Offset destOffset(xoffset, yoffset, 0);
Rectangle sourceArea(x, y, width, height);
......@@ -3838,7 +3846,7 @@ void Context::copyTexSubImage3D(TextureTarget target,
return;
}
ANGLE_CONTEXT_TRY(mState.syncDirtyObjects(this, mCopyImageDirtyObjects));
ANGLE_CONTEXT_TRY(prepareForCopyImage());
Offset destOffset(xoffset, yoffset, zoffset);
Rectangle sourceArea(x, y, width, height);
......
......@@ -461,6 +461,7 @@ class Context final : public egl::LabeledObject, angle::NonCopyable, public angl
angle::MemoryBuffer **zeroBufferOut) const;
angle::ScratchBuffer *getScratchBuffer() const { return &mScratchBuffer; }
angle::Result prepareForCopyImage();
angle::Result prepareForDispatch();
MemoryProgramCache *getMemoryProgramCache() const { return mMemoryProgramCache; }
......@@ -682,6 +683,7 @@ class Context final : public egl::LabeledObject, angle::NonCopyable, public angl
State::DirtyObjects mBlitDirtyObjects;
State::DirtyBits mComputeDirtyBits;
State::DirtyObjects mComputeDirtyObjects;
State::DirtyBits mCopyImageDirtyBits;
State::DirtyObjects mCopyImageDirtyObjects;
// Binding to container objects that use dependent state updates.
......
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