From a1288c979df92ab7b1a8cae7e0710cda3451c8df Mon Sep 17 00:00:00 2001 From: Baldev Sahu Date: Fri, 23 Jan 2015 14:00:34 +0530 Subject: [PATCH] libgui: Copyback all region except dirty region for newly allocated buffer Inside Surface::lock if new buffer is allocated and DirtyRegion does not cover complete buffer bounds then copyback may not cover all remaining area as it copyback only area covered by dirty regions from other buffers. This will lead to left out black area which may cause flicker. Change-Id: I4a3f7a56fc5fbaf4af926584919577d8d34bed57 --- libs/gui/Surface.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/libs/gui/Surface.cpp b/libs/gui/Surface.cpp index 444544221..1abb6c375 100644 --- a/libs/gui/Surface.cpp +++ b/libs/gui/Surface.cpp @@ -1033,9 +1033,13 @@ status_t Surface::lock( if (canCopyBack) { Mutex::Autolock lock(mMutex); Region oldDirtyRegion; - for(int i = 0 ; i < NUM_BUFFER_SLOTS; i++ ) { - if(i != backBufferSlot && !mSlots[i].dirtyRegion.isEmpty()) - oldDirtyRegion.orSelf(mSlots[i].dirtyRegion); + if(mSlots[backBufferSlot].dirtyRegion.isEmpty()) { + oldDirtyRegion.set(bounds); + } else { + for(int i = 0 ; i < NUM_BUFFER_SLOTS; i++ ) { + if(i != backBufferSlot && !mSlots[i].dirtyRegion.isEmpty()) + oldDirtyRegion.orSelf(mSlots[i].dirtyRegion); + } } const Region copyback(oldDirtyRegion.subtract(newDirtyRegion)); if (!copyback.isEmpty())