Fix various flickering / artifacts

these were due to the "preserve backbuffer" optimization
interfering with hw composer. basically the screen needed
to be redrawn in the areas that move from GL to
overlay.

Bug: 5245513
Change-Id: I9bf75c4fe905f3ef62005e52108b94edae692304
This commit is contained in:
Mathias Agopian 2011-09-01 18:52:12 -07:00
parent a34c2a41f8
commit f914e7ffad
1 changed files with 14 additions and 0 deletions

View File

@ -817,6 +817,20 @@ void SurfaceFlinger::handleWorkList()
mHwWorkListDirty = false;
HWComposer& hwc(graphicPlane(0).displayHardware().getHwComposer());
if (hwc.initCheck() == NO_ERROR) {
const DisplayHardware& hw(graphicPlane(0).displayHardware());
uint32_t flags = hw.getFlags();
if ((flags & DisplayHardware::SWAP_RECTANGLE) ||
(flags & DisplayHardware::BUFFER_PRESERVED))
{
// we need to redraw everything (the whole screen)
// NOTE: we could be more subtle here and redraw only
// the area which will end-up in an overlay. But since this
// shouldn't happen often, we invalidate everything.
mDirtyRegion.set(hw.bounds());
mInvalidRegion = mDirtyRegion;
}
const Vector< sp<LayerBase> >& currentLayers(mVisibleLayersSortedByZ);
const size_t count = currentLayers.size();
hwc.createWorkList(count);