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() ...@@ -523,6 +523,7 @@ void Context::initialize()
mComputeDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM); mComputeDirtyObjects.set(State::DIRTY_OBJECT_PROGRAM);
mComputeDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS); mComputeDirtyObjects.set(State::DIRTY_OBJECT_SAMPLERS);
mCopyImageDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
mCopyImageDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER); mCopyImageDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
ANGLE_CONTEXT_TRY(mImplementation->initialize()); ANGLE_CONTEXT_TRY(mImplementation->initialize());
...@@ -3546,6 +3547,7 @@ void Context::updateCaps() ...@@ -3546,6 +3547,7 @@ void Context::updateCaps()
mComputeDirtyObjects.set(State::DIRTY_OBJECT_TEXTURES_INIT); mComputeDirtyObjects.set(State::DIRTY_OBJECT_TEXTURES_INIT);
mComputeDirtyObjects.set(State::DIRTY_OBJECT_IMAGES_INIT); mComputeDirtyObjects.set(State::DIRTY_OBJECT_IMAGES_INIT);
mReadPixelsDirtyObjects.set(State::DIRTY_OBJECT_READ_ATTACHMENTS); mReadPixelsDirtyObjects.set(State::DIRTY_OBJECT_READ_ATTACHMENTS);
mCopyImageDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING);
mCopyImageDirtyObjects.set(State::DIRTY_OBJECT_READ_ATTACHMENTS); mCopyImageDirtyObjects.set(State::DIRTY_OBJECT_READ_ATTACHMENTS);
} }
...@@ -3591,6 +3593,12 @@ angle::Result Context::prepareForClearBuffer(GLenum buffer, GLint drawbuffer) ...@@ -3591,6 +3593,12 @@ angle::Result Context::prepareForClearBuffer(GLenum buffer, GLint drawbuffer)
return angle::Result::Continue; return angle::Result::Continue;
} }
ANGLE_INLINE angle::Result Context::prepareForCopyImage()
{
ANGLE_TRY(syncDirtyObjects(mCopyImageDirtyObjects));
return syncDirtyBits(mCopyImageDirtyBits);
}
ANGLE_INLINE angle::Result Context::prepareForDispatch() ANGLE_INLINE angle::Result Context::prepareForDispatch()
{ {
ANGLE_TRY(syncDirtyObjects(mComputeDirtyObjects)); ANGLE_TRY(syncDirtyObjects(mComputeDirtyObjects));
...@@ -3787,7 +3795,7 @@ void Context::copyTexImage2D(TextureTarget target, ...@@ -3787,7 +3795,7 @@ void Context::copyTexImage2D(TextureTarget target,
GLsizei height, GLsizei height,
GLint border) GLint border)
{ {
ANGLE_CONTEXT_TRY(mState.syncDirtyObjects(this, mCopyImageDirtyObjects)); ANGLE_CONTEXT_TRY(prepareForCopyImage());
Rectangle sourceArea(x, y, width, height); Rectangle sourceArea(x, y, width, height);
...@@ -3811,7 +3819,7 @@ void Context::copyTexSubImage2D(TextureTarget target, ...@@ -3811,7 +3819,7 @@ void Context::copyTexSubImage2D(TextureTarget target,
return; return;
} }
ANGLE_CONTEXT_TRY(mState.syncDirtyObjects(this, mCopyImageDirtyObjects)); ANGLE_CONTEXT_TRY(prepareForCopyImage());
Offset destOffset(xoffset, yoffset, 0); Offset destOffset(xoffset, yoffset, 0);
Rectangle sourceArea(x, y, width, height); Rectangle sourceArea(x, y, width, height);
...@@ -3838,7 +3846,7 @@ void Context::copyTexSubImage3D(TextureTarget target, ...@@ -3838,7 +3846,7 @@ void Context::copyTexSubImage3D(TextureTarget target,
return; return;
} }
ANGLE_CONTEXT_TRY(mState.syncDirtyObjects(this, mCopyImageDirtyObjects)); ANGLE_CONTEXT_TRY(prepareForCopyImage());
Offset destOffset(xoffset, yoffset, zoffset); Offset destOffset(xoffset, yoffset, zoffset);
Rectangle sourceArea(x, y, width, height); Rectangle sourceArea(x, y, width, height);
......
...@@ -461,6 +461,7 @@ class Context final : public egl::LabeledObject, angle::NonCopyable, public angl ...@@ -461,6 +461,7 @@ class Context final : public egl::LabeledObject, angle::NonCopyable, public angl
angle::MemoryBuffer **zeroBufferOut) const; angle::MemoryBuffer **zeroBufferOut) const;
angle::ScratchBuffer *getScratchBuffer() const { return &mScratchBuffer; } angle::ScratchBuffer *getScratchBuffer() const { return &mScratchBuffer; }
angle::Result prepareForCopyImage();
angle::Result prepareForDispatch(); angle::Result prepareForDispatch();
MemoryProgramCache *getMemoryProgramCache() const { return mMemoryProgramCache; } MemoryProgramCache *getMemoryProgramCache() const { return mMemoryProgramCache; }
...@@ -682,6 +683,7 @@ class Context final : public egl::LabeledObject, angle::NonCopyable, public angl ...@@ -682,6 +683,7 @@ class Context final : public egl::LabeledObject, angle::NonCopyable, public angl
State::DirtyObjects mBlitDirtyObjects; State::DirtyObjects mBlitDirtyObjects;
State::DirtyBits mComputeDirtyBits; State::DirtyBits mComputeDirtyBits;
State::DirtyObjects mComputeDirtyObjects; State::DirtyObjects mComputeDirtyObjects;
State::DirtyBits mCopyImageDirtyBits;
State::DirtyObjects mCopyImageDirtyObjects; State::DirtyObjects mCopyImageDirtyObjects;
// Binding to container objects that use dependent state updates. // 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