Refactor Framebuffer management into a FramebufferManager class.
BUG=angleproject:1639
Change-Id: I03a0950f26557983c8dc816a27cb4038c60e5755
Reviewed-on: https://chromium-review.googlesource.com/415611
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Commit-Queue: Geoff Lang <geofflang@chromium.org>
diff --git a/src/libANGLE/Context.cpp b/src/libANGLE/Context.cpp
index c44bab6..2663bb8 100644
--- a/src/libANGLE/Context.cpp
+++ b/src/libANGLE/Context.cpp
@@ -246,7 +246,6 @@
mTextureCaps,
mExtensions,
mLimitations,
- mFramebufferMap,
GetNoError(attribs)),
mImplementation(implFactory->createContext(mState)),
mCompiler(nullptr),
@@ -386,15 +385,6 @@
{
mGLState.reset();
- for (auto framebuffer : mFramebufferMap)
- {
- // Default framebuffer are owned by their respective Surface
- if (framebuffer.second != nullptr && framebuffer.second->id() != 0)
- {
- SafeDelete(framebuffer.second);
- }
- }
-
for (auto fence : mFenceNVMap)
{
SafeDelete(fence.second);
@@ -487,7 +477,7 @@
{
mGLState.setDrawFramebufferBinding(newDefault);
}
- mFramebufferMap[0] = newDefault;
+ mState.mFramebuffers->setDefaultFramebuffer(newDefault);
}
// Notify the renderer of a context switch
@@ -509,7 +499,7 @@
{
mGLState.setDrawFramebufferBinding(nullptr);
}
- mFramebufferMap.erase(0);
+ mState.mFramebuffers->setDefaultFramebuffer(nullptr);
}
mCurrentSurface->setIsCurrent(false);
@@ -581,11 +571,7 @@
// Returns an unused framebuffer name
GLuint Context::createFramebuffer()
{
- GLuint handle = mFramebufferHandleAllocator.allocate();
-
- mFramebufferMap[handle] = NULL;
-
- return handle;
+ return mState.mFramebuffers->createFramebuffer();
}
GLuint Context::createFenceNV()
@@ -793,16 +779,12 @@
void Context::deleteFramebuffer(GLuint framebuffer)
{
- auto framebufferObject = mFramebufferMap.find(framebuffer);
-
- if (framebufferObject != mFramebufferMap.end())
+ if (mState.mFramebuffers->getFramebuffer(framebuffer))
{
detachFramebuffer(framebuffer);
-
- mFramebufferHandleAllocator.release(framebufferObject->first);
- delete framebufferObject->second;
- mFramebufferMap.erase(framebufferObject);
}
+
+ mState.mFramebuffers->deleteFramebuffer(framebuffer);
}
void Context::deleteFenceNV(GLuint fence)
@@ -989,13 +971,15 @@
void Context::bindReadFramebuffer(GLuint framebufferHandle)
{
- Framebuffer *framebuffer = checkFramebufferAllocation(framebufferHandle);
+ Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
+ mImplementation.get(), mCaps, framebufferHandle);
mGLState.setReadFramebufferBinding(framebuffer);
}
void Context::bindDrawFramebuffer(GLuint framebufferHandle)
{
- Framebuffer *framebuffer = checkFramebufferAllocation(framebufferHandle);
+ Framebuffer *framebuffer = mState.mFramebuffers->checkFramebufferAllocation(
+ mImplementation.get(), mCaps, framebufferHandle);
mGLState.setDrawFramebufferBinding(framebuffer);
}
@@ -1168,10 +1152,9 @@
handleError(GetQueryObjectParameter(getQuery(id), pname, params));
}
-Framebuffer *Context::getFramebuffer(unsigned int handle) const
+Framebuffer *Context::getFramebuffer(GLuint handle) const
{
- auto framebufferIt = mFramebufferMap.find(handle);
- return ((framebufferIt == mFramebufferMap.end()) ? nullptr : framebufferIt->second);
+ return mState.mFramebuffers->getFramebuffer(handle);
}
FenceNV *Context::getFenceNV(unsigned int handle)
@@ -2049,19 +2032,15 @@
EGLenum Context::getRenderBuffer() const
{
- 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
+ const Framebuffer *framebuffer = mState.mFramebuffers->getFramebuffer(0);
+ if (framebuffer == nullptr)
{
return EGL_NONE;
}
+
+ const FramebufferAttachment *backAttachment = framebuffer->getAttachment(GL_BACK);
+ ASSERT(backAttachment != nullptr);
+ return backAttachment->getSurface()->getRenderBuffer();
}
VertexArray *Context::checkVertexArrayAllocation(GLuint vertexArrayHandle)
@@ -2093,27 +2072,6 @@
return transformFeedback;
}
-Framebuffer *Context::checkFramebufferAllocation(GLuint framebuffer)
-{
- // Can be called from Bind without a prior call to Gen.
- auto framebufferIt = mFramebufferMap.find(framebuffer);
- bool neverCreated = framebufferIt == mFramebufferMap.end();
- if (neverCreated || framebufferIt->second == nullptr)
- {
- Framebuffer *newFBO = new Framebuffer(mCaps, mImplementation.get(), framebuffer);
- if (neverCreated)
- {
- mFramebufferHandleAllocator.reserve(framebuffer);
- mFramebufferMap[framebuffer] = newFBO;
- return newFBO;
- }
-
- framebufferIt->second = newFBO;
- }
-
- return framebufferIt->second;
-}
-
bool Context::isVertexArrayGenerated(GLuint vertexArray)
{
ASSERT(mVertexArrayMap.find(0) != mVertexArrayMap.end());