diff options
author | Romain Guy <romainguy@google.com> | 2012-09-11 17:17:07 -0700 |
---|---|---|
committer | Romain Guy <romainguy@google.com> | 2012-09-11 17:30:43 -0700 |
commit | 45e4c3df6c00ac98ff6144de9af574877d4fff19 (patch) | |
tree | 206209b5faf3bb4c63366d29e8891bc53783d232 /libs | |
parent | f625436cc741932518e5f1a41586c72ac8297ece (diff) | |
download | frameworks_base-45e4c3df6c00ac98ff6144de9af574877d4fff19.zip frameworks_base-45e4c3df6c00ac98ff6144de9af574877d4fff19.tar.gz frameworks_base-45e4c3df6c00ac98ff6144de9af574877d4fff19.tar.bz2 |
Discard framebuffer commands when we redraw the entire buffer
Change-Id: I32e3014832cbd3bdbace8c3d2206eb20a2002d64
Diffstat (limited to 'libs')
-rw-r--r-- | libs/hwui/DisplayListRenderer.cpp | 4 | ||||
-rw-r--r-- | libs/hwui/LayerRenderer.cpp | 6 | ||||
-rw-r--r-- | libs/hwui/OpenGLRenderer.cpp | 9 |
3 files changed, 16 insertions, 3 deletions
diff --git a/libs/hwui/DisplayListRenderer.cpp b/libs/hwui/DisplayListRenderer.cpp index 755170f..c3444e6 100644 --- a/libs/hwui/DisplayListRenderer.cpp +++ b/libs/hwui/DisplayListRenderer.cpp @@ -1412,8 +1412,12 @@ int DisplayListRenderer::prepareDirty(float left, float top, mSnapshot = new Snapshot(mFirstSnapshot, SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag); mSaveCount = 1; + mSnapshot->setClip(0.0f, 0.0f, mWidth, mHeight); + mDirtyClip = opaque; + mRestoreSaveCount = -1; + return DrawGlInfo::kStatusDone; // No invalidate needed at record-time } diff --git a/libs/hwui/LayerRenderer.cpp b/libs/hwui/LayerRenderer.cpp index 5a8f2b7..02af5e2 100644 --- a/libs/hwui/LayerRenderer.cpp +++ b/libs/hwui/LayerRenderer.cpp @@ -332,10 +332,10 @@ void LayerRenderer::flushLayer(Layer* layer) { if (Caches::getInstance().extensions.hasDiscardFramebuffer()) { GLuint previousFbo; glGetIntegerv(GL_FRAMEBUFFER_BINDING, (GLint*) &previousFbo); - - GLenum attachments = GL_COLOR_ATTACHMENT0; if (fbo != previousFbo) glBindFramebuffer(GL_FRAMEBUFFER, fbo); - glDiscardFramebufferEXT(GL_FRAMEBUFFER, 1, &attachments); + + const GLenum attachments[] = { GL_COLOR_ATTACHMENT0 }; + glDiscardFramebufferEXT(GL_FRAMEBUFFER, 1, attachments); if (fbo != previousFbo) glBindFramebuffer(GL_FRAMEBUFFER, previousFbo); } diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp index f4c2675..02448e8 100644 --- a/libs/hwui/OpenGLRenderer.cpp +++ b/libs/hwui/OpenGLRenderer.cpp @@ -173,6 +173,15 @@ int OpenGLRenderer::prepareDirty(float left, float top, float right, float botto mSnapshot->setClip(left, top, right, bottom); mDirtyClip = opaque; + // If we know that we are going to redraw the entire framebuffer, + // perform a discard to let the driver know we don't need to preserve + // the back buffer for this frame. + if (mCaches.extensions.hasDiscardFramebuffer() && + left <= 0.0f && top <= 0.0f && right >= mWidth && bottom >= mHeight) { + const GLenum attachments[] = { getTargetFbo() == 0 ? GL_COLOR_EXT : GL_COLOR_ATTACHMENT0 }; + glDiscardFramebufferEXT(GL_FRAMEBUFFER, 1, attachments); + } + syncState(); if (!opaque) { |