Commit 04ab0eb4 by Jamie Madill

Fix memory leak with default Framebuffers.

When the depth-stencil attachment had no depth or stencil bits, we would like a gl::Renderbuffer object. This was causing unbounded memory growth in Chrome, and could happen when you watched a lot of streaming video. The bug was originally reported and fixed by Austin Kinross in commit 44f4d74c. BUG=403471 Change-Id: I022f01a6d3159f766e65f65f023e6ce9baacbc8e Reviewed-on: https://chromium-review.googlesource.com/231583Tested-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarHendrik Wagenaar <hendrikw@chromium.org> Tested-by: 's avatarHendrik Wagenaar <hendrikw@chromium.org> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent 5af475ed
...@@ -637,12 +637,23 @@ DefaultFramebuffer::DefaultFramebuffer(rx::Renderer *renderer, Colorbuffer *colo ...@@ -637,12 +637,23 @@ DefaultFramebuffer::DefaultFramebuffer(rx::Renderer *renderer, Colorbuffer *colo
Renderbuffer *colorRenderbuffer = new Renderbuffer(0, colorbuffer); Renderbuffer *colorRenderbuffer = new Renderbuffer(0, colorbuffer);
mColorbuffers[0] = new RenderbufferAttachment(GL_BACK, colorRenderbuffer); mColorbuffers[0] = new RenderbufferAttachment(GL_BACK, colorRenderbuffer);
Renderbuffer *depthStencilBuffer = new Renderbuffer(0, depthStencil); GLenum depthStencilActualFormat = depthStencil->getActualFormat();
const gl::InternalFormat &depthStencilFormatInfo = GetInternalFormatInfo(depthStencilActualFormat);
// Make a new attachment objects to ensure we do not double-delete if (depthStencilFormatInfo.depthBits != 0 || depthStencilFormatInfo.stencilBits != 0)
// See angle issue 686 {
mDepthbuffer = (depthStencilBuffer->getDepthSize() != 0 ? new RenderbufferAttachment(GL_DEPTH_ATTACHMENT, depthStencilBuffer) : NULL); Renderbuffer *depthStencilBuffer = new Renderbuffer(0, depthStencil);
mStencilbuffer = (depthStencilBuffer->getStencilSize() != 0 ? new RenderbufferAttachment(GL_STENCIL_ATTACHMENT, depthStencilBuffer) : NULL);
// Make a new attachment objects to ensure we do not double-delete
// See angle issue 686
mDepthbuffer = (depthStencilFormatInfo.depthBits != 0 ? new RenderbufferAttachment(GL_DEPTH_ATTACHMENT, depthStencilBuffer) : NULL);
mStencilbuffer = (depthStencilFormatInfo.stencilBits != 0 ? new RenderbufferAttachment(GL_STENCIL_ATTACHMENT, depthStencilBuffer) : NULL);
}
else
{
// This method transfers ownership, so delete the unused storage if we don't keep it.
SafeDelete(depthStencil);
}
mDrawBufferStates[0] = GL_BACK; mDrawBufferStates[0] = GL_BACK;
mReadBufferState = GL_BACK; mReadBufferState = GL_BACK;
......
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