From 019fa9340e580e5836a9b9dc7cede4766cd090df Mon Sep 17 00:00:00 2001 From: Jamie Madill Date: Sat, 22 Nov 2014 23:07:51 -0500 Subject: 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 44f4d74c0f07fa23. BUG=403471 Change-Id: I022f01a6d3159f766e65f65f023e6ce9baacbc8e Reviewed-on: https://chromium-review.googlesource.com/231235 Tested-by: Jamie Madill Reviewed-by: Hendrik Wagenaar Tested-by: Hendrik Wagenaar Reviewed-by: Geoff Lang --- src/libGLESv2/Framebuffer.cpp | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/libGLESv2/Framebuffer.cpp b/src/libGLESv2/Framebuffer.cpp index 9cd9e25c..74fdd68a 100644 --- a/src/libGLESv2/Framebuffer.cpp +++ b/src/libGLESv2/Framebuffer.cpp @@ -644,12 +644,23 @@ DefaultFramebuffer::DefaultFramebuffer(rx::Renderer *renderer, Colorbuffer *colo Renderbuffer *colorRenderbuffer = new Renderbuffer(0, colorbuffer); 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 - // See angle issue 686 - mDepthbuffer = (depthStencilBuffer->getDepthSize() != 0 ? new RenderbufferAttachment(GL_DEPTH_ATTACHMENT, depthStencilBuffer) : NULL); - mStencilbuffer = (depthStencilBuffer->getStencilSize() != 0 ? new RenderbufferAttachment(GL_STENCIL_ATTACHMENT, depthStencilBuffer) : NULL); + if (depthStencilFormatInfo.depthBits != 0 || depthStencilFormatInfo.stencilBits != 0) + { + Renderbuffer *depthStencilBuffer = new Renderbuffer(0, depthStencil); + + // 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; mReadBufferState = GL_BACK; -- cgit v1.2.3