Pass binding enum to Framebuffer::syncState.
Will allow us to determine if we're clearing the read or draw FBO. Then
we can stash clears for the draw FBO only and issue them immediately
for the read FBO in the Vulkan back-end.
Bug: angleproject:4517
Change-Id: Ifc043317d6156a75749b13f9d2c44a17e14ee378
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2139997
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Cody Northrop <cnorthrop@google.com>
Reviewed-by: Tim Van Patten <timvp@google.com>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libANGLE/Framebuffer.cpp b/src/libANGLE/Framebuffer.cpp
index 4aee0e7..7a9966f 100644
--- a/src/libANGLE/Framebuffer.cpp
+++ b/src/libANGLE/Framebuffer.cpp
@@ -1140,7 +1140,9 @@
// We can skip syncState on several back-ends.
if (mImpl->shouldSyncStateBeforeCheckStatus())
{
- angle::Result err = syncState(context);
+ // This binding is not totally correct. It is ok because the parameter isn't used in
+ // the GL back-end and the GL back-end is the only user of syncStateBeforeCheckStatus.
+ angle::Result err = syncState(context, GL_FRAMEBUFFER);
if (err != angle::Result::Continue)
{
return 0;
@@ -1972,12 +1974,12 @@
setAttachment(context, GL_NONE, binding, ImageIndex(), nullptr);
}
-angle::Result Framebuffer::syncState(const Context *context) const
+angle::Result Framebuffer::syncState(const Context *context, GLenum framebufferBinding) const
{
if (mDirtyBits.any())
{
mDirtyBitsGuard = mDirtyBits;
- ANGLE_TRY(mImpl->syncState(context, mDirtyBits));
+ ANGLE_TRY(mImpl->syncState(context, framebufferBinding, mDirtyBits));
mDirtyBits.reset();
mDirtyBitsGuard.reset();
}
diff --git a/src/libANGLE/Framebuffer.h b/src/libANGLE/Framebuffer.h
index 53a1c86..6e55509 100644
--- a/src/libANGLE/Framebuffer.h
+++ b/src/libANGLE/Framebuffer.h
@@ -389,7 +389,7 @@
bool hasResourceThatNeedsInit() const { return mState.mResourceNeedsInit.any(); }
- angle::Result syncState(const Context *context) const;
+ angle::Result syncState(const Context *context, GLenum framebufferBinding) const;
// Observer implementation
void onSubjectStateChange(angle::SubjectIndex index, angle::SubjectMessage message) override;
diff --git a/src/libANGLE/State.cpp b/src/libANGLE/State.cpp
index 5198caf..52c60ac 100644
--- a/src/libANGLE/State.cpp
+++ b/src/libANGLE/State.cpp
@@ -3008,13 +3008,13 @@
angle::Result State::syncReadFramebuffer(const Context *context)
{
ASSERT(mReadFramebuffer);
- return mReadFramebuffer->syncState(context);
+ return mReadFramebuffer->syncState(context, GL_READ_FRAMEBUFFER);
}
angle::Result State::syncDrawFramebuffer(const Context *context)
{
ASSERT(mDrawFramebuffer);
- return mDrawFramebuffer->syncState(context);
+ return mDrawFramebuffer->syncState(context, GL_DRAW_FRAMEBUFFER);
}
angle::Result State::syncTextures(const Context *context)
diff --git a/src/libANGLE/renderer/FramebufferImpl.h b/src/libANGLE/renderer/FramebufferImpl.h
index d763b16..e132e15 100644
--- a/src/libANGLE/renderer/FramebufferImpl.h
+++ b/src/libANGLE/renderer/FramebufferImpl.h
@@ -80,6 +80,7 @@
virtual bool checkStatus(const gl::Context *context) const = 0;
virtual angle::Result syncState(const gl::Context *context,
+ GLenum binding,
const gl::Framebuffer::DirtyBits &dirtyBits) = 0;
virtual angle::Result getSamplePosition(const gl::Context *context,
diff --git a/src/libANGLE/renderer/FramebufferImpl_mock.h b/src/libANGLE/renderer/FramebufferImpl_mock.h
index 82d0824..aef2dce 100644
--- a/src/libANGLE/renderer/FramebufferImpl_mock.h
+++ b/src/libANGLE/renderer/FramebufferImpl_mock.h
@@ -48,7 +48,8 @@
MOCK_CONST_METHOD1(checkStatus, bool(const gl::Context *));
- MOCK_METHOD2(syncState, angle::Result(const gl::Context *, const gl::Framebuffer::DirtyBits &));
+ MOCK_METHOD3(syncState,
+ angle::Result(const gl::Context *, GLenum, const gl::Framebuffer::DirtyBits &));
MOCK_METHOD0(destructor, void());
};
diff --git a/src/libANGLE/renderer/d3d/FramebufferD3D.cpp b/src/libANGLE/renderer/d3d/FramebufferD3D.cpp
index a0ee222..4575b06 100644
--- a/src/libANGLE/renderer/d3d/FramebufferD3D.cpp
+++ b/src/libANGLE/renderer/d3d/FramebufferD3D.cpp
@@ -268,6 +268,7 @@
}
angle::Result FramebufferD3D::syncState(const gl::Context *context,
+ GLenum binding,
const gl::Framebuffer::DirtyBits &dirtyBits)
{
if (!mColorAttachmentsForRender.valid())
diff --git a/src/libANGLE/renderer/d3d/FramebufferD3D.h b/src/libANGLE/renderer/d3d/FramebufferD3D.h
index ab4b4fb..1d35774 100644
--- a/src/libANGLE/renderer/d3d/FramebufferD3D.h
+++ b/src/libANGLE/renderer/d3d/FramebufferD3D.h
@@ -96,6 +96,7 @@
bool checkStatus(const gl::Context *context) const override;
angle::Result syncState(const gl::Context *context,
+ GLenum binding,
const gl::Framebuffer::DirtyBits &dirtyBits) override;
const gl::AttachmentList &getColorAttachmentsForRender(const gl::Context *context);
diff --git a/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.cpp b/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.cpp
index 829d3e5..2561eca 100644
--- a/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.cpp
+++ b/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.cpp
@@ -386,10 +386,11 @@
}
angle::Result Framebuffer11::syncState(const gl::Context *context,
+ GLenum binding,
const gl::Framebuffer::DirtyBits &dirtyBits)
{
ANGLE_TRY(mRenderTargetCache.update(context, mState, dirtyBits));
- ANGLE_TRY(FramebufferD3D::syncState(context, dirtyBits));
+ ANGLE_TRY(FramebufferD3D::syncState(context, binding, dirtyBits));
// Call this last to allow the state manager to take advantage of the cached render targets.
mRenderer->getStateManager()->invalidateRenderTarget();
diff --git a/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.h b/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.h
index 8f0421f..e90b4af 100644
--- a/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.h
+++ b/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.h
@@ -39,6 +39,7 @@
angle::Result markAttachmentsDirty(const gl::Context *context) const;
angle::Result syncState(const gl::Context *context,
+ GLenum binding,
const gl::Framebuffer::DirtyBits &dirtyBits) override;
const gl::AttachmentArray<RenderTarget11 *> &getCachedColorRenderTargets() const
diff --git a/src/libANGLE/renderer/d3d/d3d9/Framebuffer9.cpp b/src/libANGLE/renderer/d3d/d3d9/Framebuffer9.cpp
index 1d4db96..7193694 100644
--- a/src/libANGLE/renderer/d3d/d3d9/Framebuffer9.cpp
+++ b/src/libANGLE/renderer/d3d/d3d9/Framebuffer9.cpp
@@ -404,9 +404,10 @@
}
angle::Result Framebuffer9::syncState(const gl::Context *context,
+ GLenum binding,
const gl::Framebuffer::DirtyBits &dirtyBits)
{
- ANGLE_TRY(FramebufferD3D::syncState(context, dirtyBits));
+ ANGLE_TRY(FramebufferD3D::syncState(context, binding, dirtyBits));
ANGLE_TRY(mRenderTargetCache.update(context, mState, dirtyBits));
return angle::Result::Continue;
}
diff --git a/src/libANGLE/renderer/d3d/d3d9/Framebuffer9.h b/src/libANGLE/renderer/d3d/d3d9/Framebuffer9.h
index 671e98e..e68ffbc 100644
--- a/src/libANGLE/renderer/d3d/d3d9/Framebuffer9.h
+++ b/src/libANGLE/renderer/d3d/d3d9/Framebuffer9.h
@@ -39,6 +39,7 @@
GLfloat *xy) const override;
angle::Result syncState(const gl::Context *context,
+ GLenum binding,
const gl::Framebuffer::DirtyBits &dirtyBits) override;
const gl::AttachmentArray<RenderTarget9 *> &getCachedColorRenderTargets() const
diff --git a/src/libANGLE/renderer/gl/FramebufferGL.cpp b/src/libANGLE/renderer/gl/FramebufferGL.cpp
index 0279df2..1dc65d2 100644
--- a/src/libANGLE/renderer/gl/FramebufferGL.cpp
+++ b/src/libANGLE/renderer/gl/FramebufferGL.cpp
@@ -1185,6 +1185,7 @@
}
angle::Result FramebufferGL::syncState(const gl::Context *context,
+ GLenum binding,
const gl::Framebuffer::DirtyBits &dirtyBits)
{
// Don't need to sync state for the default FBO.
diff --git a/src/libANGLE/renderer/gl/FramebufferGL.h b/src/libANGLE/renderer/gl/FramebufferGL.h
index 77ac514..e361ce4 100644
--- a/src/libANGLE/renderer/gl/FramebufferGL.h
+++ b/src/libANGLE/renderer/gl/FramebufferGL.h
@@ -80,6 +80,7 @@
bool checkStatus(const gl::Context *context) const override;
angle::Result syncState(const gl::Context *context,
+ GLenum binding,
const gl::Framebuffer::DirtyBits &dirtyBits) override;
GLuint getFramebufferID() const;
diff --git a/src/libANGLE/renderer/metal/FrameBufferMtl.h b/src/libANGLE/renderer/metal/FrameBufferMtl.h
index 0540a8e..66f0c60 100644
--- a/src/libANGLE/renderer/metal/FrameBufferMtl.h
+++ b/src/libANGLE/renderer/metal/FrameBufferMtl.h
@@ -75,6 +75,7 @@
bool checkStatus(const gl::Context *context) const override;
angle::Result syncState(const gl::Context *context,
+ GLenum binding,
const gl::Framebuffer::DirtyBits &dirtyBits) override;
angle::Result getSamplePosition(const gl::Context *context,
diff --git a/src/libANGLE/renderer/metal/FrameBufferMtl.mm b/src/libANGLE/renderer/metal/FrameBufferMtl.mm
index f0e99fc..99ba927 100644
--- a/src/libANGLE/renderer/metal/FrameBufferMtl.mm
+++ b/src/libANGLE/renderer/metal/FrameBufferMtl.mm
@@ -225,6 +225,7 @@
}
angle::Result FramebufferMtl::syncState(const gl::Context *context,
+ GLenum binding,
const gl::Framebuffer::DirtyBits &dirtyBits)
{
ContextMtl *contextMtl = mtl::GetImpl(context);
diff --git a/src/libANGLE/renderer/metal/SurfaceMtl.mm b/src/libANGLE/renderer/metal/SurfaceMtl.mm
index a2bcfe5..3396e75 100644
--- a/src/libANGLE/renderer/metal/SurfaceMtl.mm
+++ b/src/libANGLE/renderer/metal/SurfaceMtl.mm
@@ -549,7 +549,7 @@
if (defaultFbo)
{
FramebufferMtl *framebufferMtl = mtl::GetImpl(defaultFbo);
- ANGLE_TRY(framebufferMtl->syncState(context, fboDirtyBits));
+ ANGLE_TRY(framebufferMtl->syncState(context, GL_FRAMEBUFFER, fboDirtyBits));
}
return angle::Result::Continue;
diff --git a/src/libANGLE/renderer/null/FramebufferNULL.cpp b/src/libANGLE/renderer/null/FramebufferNULL.cpp
index f6f1aa5..5b78fef 100644
--- a/src/libANGLE/renderer/null/FramebufferNULL.cpp
+++ b/src/libANGLE/renderer/null/FramebufferNULL.cpp
@@ -159,6 +159,7 @@
}
angle::Result FramebufferNULL::syncState(const gl::Context *context,
+ GLenum binding,
const gl::Framebuffer::DirtyBits &dirtyBits)
{
return angle::Result::Continue;
diff --git a/src/libANGLE/renderer/null/FramebufferNULL.h b/src/libANGLE/renderer/null/FramebufferNULL.h
index 248668e..92290a5 100644
--- a/src/libANGLE/renderer/null/FramebufferNULL.h
+++ b/src/libANGLE/renderer/null/FramebufferNULL.h
@@ -66,6 +66,7 @@
bool checkStatus(const gl::Context *context) const override;
angle::Result syncState(const gl::Context *context,
+ GLenum binding,
const gl::Framebuffer::DirtyBits &dirtyBits) override;
angle::Result getSamplePosition(const gl::Context *context,
diff --git a/src/libANGLE/renderer/vulkan/FramebufferVk.cpp b/src/libANGLE/renderer/vulkan/FramebufferVk.cpp
index 01edfd7..d5c2a6b 100644
--- a/src/libANGLE/renderer/vulkan/FramebufferVk.cpp
+++ b/src/libANGLE/renderer/vulkan/FramebufferVk.cpp
@@ -1042,6 +1042,7 @@
}
angle::Result FramebufferVk::syncState(const gl::Context *context,
+ GLenum binding,
const gl::Framebuffer::DirtyBits &dirtyBits)
{
ContextVk *contextVk = vk::GetImpl(context);
diff --git a/src/libANGLE/renderer/vulkan/FramebufferVk.h b/src/libANGLE/renderer/vulkan/FramebufferVk.h
index 9be2512..b0a7927 100644
--- a/src/libANGLE/renderer/vulkan/FramebufferVk.h
+++ b/src/libANGLE/renderer/vulkan/FramebufferVk.h
@@ -86,6 +86,7 @@
bool checkStatus(const gl::Context *context) const override;
angle::Result syncState(const gl::Context *context,
+ GLenum binding,
const gl::Framebuffer::DirtyBits &dirtyBits) override;
angle::Result getSamplePosition(const gl::Context *context,