Revert "Revert "Make the default framebuffer owned by Surface""
Reland the commit after fixing a bug in FramebufferAttachment.
This reverts commit 18fdcbcf1d02d3b3b4b5c712f05058f2e8d629c6.
BUG=angleproject:891
Change-Id: I07e08de52bfce8d84d070fc7bc15883009298a4d
Reviewed-on: https://chromium-review.googlesource.com/294831
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Tested-by: Corentin Wallez <cwallez@chromium.org>
diff --git a/src/libANGLE/Context.cpp b/src/libANGLE/Context.cpp
index 0752970..3325a5c 100644
--- a/src/libANGLE/Context.cpp
+++ b/src/libANGLE/Context.cpp
@@ -94,15 +94,10 @@
mState.initializeZeroTextures(mZeroTextures);
- // Allocate default FBO
- mFramebufferMap[0] = new Framebuffer(mCaps, mRenderer, 0);
-
bindVertexArray(0);
bindArrayBuffer(0);
bindElementArrayBuffer(0);
- bindReadFramebuffer(0);
- bindDrawFramebuffer(0);
bindRenderbuffer(0);
bindGenericUniformBuffer(0);
@@ -136,10 +131,13 @@
{
mState.reset();
- while (!mFramebufferMap.empty())
+ for (auto framebuffer : mFramebufferMap)
{
- // Delete the framebuffer in reverse order to destroy the framebuffer zero last.
- deleteFramebuffer(mFramebufferMap.rbegin()->first);
+ // Default framebuffer are owned by their respective Surface
+ if (framebuffer.second->id() != 0)
+ {
+ SafeDelete(framebuffer.second);
+ }
}
while (!mFenceNVMap.empty())
@@ -204,60 +202,43 @@
{
releaseSurface();
}
-
- ASSERT(mCurrentSurface == nullptr);
- mCurrentSurface = surface;
surface->setIsCurrent(true);
+ mCurrentSurface = surface;
- // Update default framebuffer
- Framebuffer *defaultFBO = mFramebufferMap[0];
-
- GLenum drawBufferState = GL_BACK;
- defaultFBO->setDrawBuffers(1, &drawBufferState);
- defaultFBO->setReadBuffer(GL_BACK);
-
- const FramebufferAttachment *backAttachment = defaultFBO->getAttachment(GL_BACK);
-
- if (backAttachment && backAttachment->getSurface() == surface)
+ // Update default framebuffer, the binding of the previous default
+ // framebuffer (or lack of) will have a nullptr.
{
- // FBO already initialized to the surface.
- return;
- }
-
- const egl::Config *config = surface->getConfig();
-
- defaultFBO->setAttachment(GL_FRAMEBUFFER_DEFAULT, GL_BACK, ImageIndex::MakeInvalid(), surface);
-
- if (config->depthSize > 0)
- {
- defaultFBO->setAttachment(GL_FRAMEBUFFER_DEFAULT, GL_DEPTH, ImageIndex::MakeInvalid(), surface);
- }
- else
- {
- defaultFBO->resetAttachment(GL_DEPTH);
- }
-
- if (config->stencilSize > 0)
- {
- defaultFBO->setAttachment(GL_FRAMEBUFFER_DEFAULT, GL_STENCIL, ImageIndex::MakeInvalid(), surface);
- }
- else
- {
- defaultFBO->resetAttachment(GL_STENCIL);
+ Framebuffer *newDefault = surface->getDefaultFramebuffer();
+ if (mState.getReadFramebuffer() == nullptr)
+ {
+ mState.setReadFramebufferBinding(newDefault);
+ }
+ if (mState.getDrawFramebuffer() == nullptr)
+ {
+ mState.setDrawFramebufferBinding(newDefault);
+ }
+ mFramebufferMap[0] = newDefault;
}
}
void Context::releaseSurface()
{
- Framebuffer *defaultFBO = mFramebufferMap[0];
- if (defaultFBO)
+ ASSERT(mCurrentSurface != nullptr);
+
+ // Remove the default framebuffer
{
- defaultFBO->resetAttachment(GL_BACK);
- defaultFBO->resetAttachment(GL_DEPTH);
- defaultFBO->resetAttachment(GL_STENCIL);
+ Framebuffer *currentDefault = mCurrentSurface->getDefaultFramebuffer();
+ if (mState.getReadFramebuffer() == currentDefault)
+ {
+ mState.setReadFramebufferBinding(nullptr);
+ }
+ if (mState.getDrawFramebuffer() == currentDefault)
+ {
+ mState.setDrawFramebufferBinding(nullptr);
+ }
+ mFramebufferMap.erase(0);
}
- ASSERT(mCurrentSurface != nullptr);
mCurrentSurface->setIsCurrent(false);
mCurrentSurface = nullptr;
}
@@ -1402,10 +1383,19 @@
EGLenum Context::getRenderBuffer() const
{
- ASSERT(mFramebufferMap.count(0) > 0);
- const Framebuffer *framebuffer = mFramebufferMap.find(0)->second;
- const FramebufferAttachment *backAttachment = framebuffer->getAttachment(GL_BACK);
- return backAttachment ? backAttachment->getSurface()->getRenderBuffer() : EGL_NONE;
+ auto framebufferIt = mFramebufferMap.find(0);
+ if (framebufferIt != mFramebufferMap.end())
+ {
+ const Framebuffer *framebuffer = framebufferIt->second;
+ const FramebufferAttachment *backAttachment = framebuffer->getAttachment(GL_BACK);
+
+ ASSERT(backAttachment != nullptr);
+ return backAttachment->getSurface()->getRenderBuffer();
+ }
+ else
+ {
+ return EGL_NONE;
+ }
}
const Caps &Context::getCaps() const