Commit c1c1cdc4 by Jamie Madill

Don't reallocate default FBO on makeCurrent.

We can use the flat FBO attachment types to update our data instead of reallocating it. This also lets us delete the DefaultFramebuffer class. BUG=angleproject:963,angleproject:840 Change-Id: Ib8f20d8212d073fb5e248756321cb2e6b4e086dc Reviewed-on: https://chromium-review.googlesource.com/263492Reviewed-by: 's avatarKenneth Russell <kbr@chromium.org> Tested-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent 804e8436
...@@ -49,7 +49,6 @@ Context::Context(const egl::Config *config, int clientVersion, const Context *sh ...@@ -49,7 +49,6 @@ Context::Context(const egl::Config *config, int clientVersion, const Context *sh
mConfigID = config->configID; mConfigID = config->configID;
mClientType = EGL_OPENGL_ES_API; mClientType = EGL_OPENGL_ES_API;
mRenderBuffer = EGL_NONE;
mFenceNVHandleAllocator.setBaseHandle(0); mFenceNVHandleAllocator.setBaseHandle(0);
...@@ -89,6 +88,9 @@ Context::Context(const egl::Config *config, int clientVersion, const Context *sh ...@@ -89,6 +88,9 @@ Context::Context(const egl::Config *config, int clientVersion, const Context *sh
mState.initializeZeroTextures(mZeroTextures); mState.initializeZeroTextures(mZeroTextures);
// Allocate default FBO
mFramebufferMap[0] = new Framebuffer(mCaps, mRenderer, 0);
bindVertexArray(0); bindVertexArray(0);
bindArrayBuffer(0); bindArrayBuffer(0);
bindElementArrayBuffer(0); bindElementArrayBuffer(0);
...@@ -184,16 +186,50 @@ void Context::makeCurrent(egl::Surface *surface) ...@@ -184,16 +186,50 @@ void Context::makeCurrent(egl::Surface *surface)
mHasBeenCurrent = true; mHasBeenCurrent = true;
} }
// TODO(jmadill): do not allocate new pointers here // Update default framebuffer
Framebuffer *framebufferZero = new DefaultFramebuffer(mCaps, mRenderer, surface); Framebuffer *defaultFBO = mFramebufferMap[0];
setFramebufferZero(framebufferZero);
mRenderBuffer = surface->getRenderBuffer(); GLenum drawBufferState = GL_BACK;
defaultFBO->setDrawBuffers(1, &drawBufferState);
defaultFBO->setReadBuffer(GL_BACK);
const FramebufferAttachment *backAttachment = defaultFBO->getAttachment(GL_BACK);
if (backAttachment && backAttachment->getSurface() == surface)
{
// 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);
}
} }
void Context::releaseSurface() void Context::releaseSurface()
{ {
setFramebufferZero(nullptr); Framebuffer *defaultFBO = mFramebufferMap[0];
mRenderBuffer = EGL_NONE; defaultFBO->resetAttachment(GL_BACK);
defaultFBO->resetAttachment(GL_DEPTH);
defaultFBO->resetAttachment(GL_STENCIL);
} }
// NOTE: this function should not assume that this context is current! // NOTE: this function should not assume that this context is current!
...@@ -664,27 +700,6 @@ Error Context::endQuery(GLenum target) ...@@ -664,27 +700,6 @@ Error Context::endQuery(GLenum target)
return error; return error;
} }
void Context::setFramebufferZero(Framebuffer *buffer)
{
// First, check to see if the old default framebuffer
// was set for draw or read framebuffer, and change
// the bindings to point to the new one before deleting it.
if (mState.getDrawFramebuffer() == nullptr ||
mState.getDrawFramebuffer()->id() == 0)
{
mState.setDrawFramebufferBinding(buffer);
}
if (mState.getReadFramebuffer() == nullptr ||
mState.getReadFramebuffer()->id() == 0)
{
mState.setReadFramebufferBinding(buffer);
}
SafeDelete(mFramebufferMap[0]);
mFramebufferMap[0] = buffer;
}
Framebuffer *Context::getFramebuffer(unsigned int handle) const Framebuffer *Context::getFramebuffer(unsigned int handle) const
{ {
FramebufferMap::const_iterator framebuffer = mFramebufferMap.find(handle); FramebufferMap::const_iterator framebuffer = mFramebufferMap.find(handle);
...@@ -1298,7 +1313,10 @@ EGLenum Context::getClientType() const ...@@ -1298,7 +1313,10 @@ EGLenum Context::getClientType() const
EGLenum Context::getRenderBuffer() const EGLenum Context::getRenderBuffer() const
{ {
return mRenderBuffer; 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;
} }
const Caps &Context::getCaps() const const Caps &Context::getCaps() const
......
...@@ -126,8 +126,6 @@ class Context final : angle::NonCopyable ...@@ -126,8 +126,6 @@ class Context final : angle::NonCopyable
Error beginQuery(GLenum target, GLuint query); Error beginQuery(GLenum target, GLuint query);
Error endQuery(GLenum target); Error endQuery(GLenum target);
void setFramebufferZero(Framebuffer *framebuffer);
void setVertexAttribDivisor(GLuint index, GLuint divisor); void setVertexAttribDivisor(GLuint index, GLuint divisor);
void samplerParameteri(GLuint sampler, GLenum pname, GLint param); void samplerParameteri(GLuint sampler, GLenum pname, GLint param);
...@@ -231,7 +229,6 @@ class Context final : angle::NonCopyable ...@@ -231,7 +229,6 @@ class Context final : angle::NonCopyable
EGLint mConfigID; EGLint mConfigID;
EGLenum mClientType; EGLenum mClientType;
EGLenum mRenderBuffer;
TextureMap mZeroTextures; TextureMap mZeroTextures;
......
...@@ -641,26 +641,4 @@ void Framebuffer::resetAttachment(GLenum binding) ...@@ -641,26 +641,4 @@ void Framebuffer::resetAttachment(GLenum binding)
setAttachment(GL_NONE, binding, ImageIndex::MakeInvalid(), nullptr); setAttachment(GL_NONE, binding, ImageIndex::MakeInvalid(), nullptr);
} }
DefaultFramebuffer::DefaultFramebuffer(const Caps &caps, rx::ImplFactory *factory, egl::Surface *surface)
: Framebuffer(caps, factory, 0)
{
const egl::Config *config = surface->getConfig();
setAttachment(GL_FRAMEBUFFER_DEFAULT, GL_BACK, ImageIndex::MakeInvalid(), surface);
if (config->depthSize > 0)
{
setAttachment(GL_FRAMEBUFFER_DEFAULT, GL_DEPTH, ImageIndex::MakeInvalid(), surface);
}
if (config->stencilSize > 0)
{
setAttachment(GL_FRAMEBUFFER_DEFAULT, GL_STENCIL, ImageIndex::MakeInvalid(), surface);
}
GLenum drawBufferState = GL_BACK;
setDrawBuffers(1, &drawBufferState);
setReadBuffer(GL_BACK);
}
} }
...@@ -142,12 +142,6 @@ class Framebuffer ...@@ -142,12 +142,6 @@ class Framebuffer
GLuint mId; GLuint mId;
}; };
class DefaultFramebuffer : public Framebuffer
{
public:
DefaultFramebuffer(const gl::Caps &caps, rx::ImplFactory *factory, egl::Surface *surface);
};
} }
#endif // LIBANGLE_FRAMEBUFFER_H_ #endif // LIBANGLE_FRAMEBUFFER_H_
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