diff options
Diffstat (limited to 'libs/hwui/Layer.cpp')
-rw-r--r-- | libs/hwui/Layer.cpp | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/libs/hwui/Layer.cpp b/libs/hwui/Layer.cpp index ee1d391..1d85b70 100644 --- a/libs/hwui/Layer.cpp +++ b/libs/hwui/Layer.cpp @@ -41,6 +41,7 @@ Layer::Layer(const uint32_t layerWidth, const uint32_t layerHeight) { renderer = NULL; displayList = NULL; fbo = 0; + stencil = 0; debugDrawUpdate = false; Caches::getInstance().resourceCache.incrementRefcount(this); } @@ -53,9 +54,22 @@ Layer::~Layer() { deleteTexture(); } -void Layer::removeFbo() { +void Layer::removeFbo(bool flush) { + if (stencil) { + // TODO: recycle & cache instead of simply deleting + GLuint previousFbo; + glGetIntegerv(GL_FRAMEBUFFER_BINDING, (GLint*) &previousFbo); + if (fbo != previousFbo) glBindFramebuffer(GL_FRAMEBUFFER, fbo); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, 0); + if (fbo != previousFbo) glBindFramebuffer(GL_FRAMEBUFFER, previousFbo); + + glDeleteRenderbuffers(1, &stencil); + stencil = 0; + } + if (fbo) { - LayerRenderer::flushLayer(this); + if (flush) LayerRenderer::flushLayer(this); + // If put fails the cache will delete the FBO Caches::getInstance().fboCache.put(fbo); fbo = 0; } @@ -75,7 +89,5 @@ void Layer::setColorFilter(SkiaColorFilter* filter) { } } - - }; // namespace uirenderer }; // namespace android |