fix a bug that caused artifacts when SWAP_RECTANGLE was enabled

This commit is contained in:
Mathias Agopian
2009-06-29 18:49:56 -07:00
parent 276826bae2
commit ecfa7ccd4f
2 changed files with 21 additions and 7 deletions

View File

@@ -326,7 +326,7 @@ void DisplayHardware::flip(const Region& dirty) const
#endif
if (mFlags & UPDATE_ON_DEMAND) {
mNativeWindow->setUpdateRectangle(dirty.bounds());
mNativeWindow->setUpdateRectangle(dirty.getBounds());
}
mPageFlipCount++;

View File

@@ -827,14 +827,28 @@ void SurfaceFlinger::handleRepaint()
if ((flags & DisplayHardware::SWAP_RECTANGLE) ||
(flags & DisplayHardware::BUFFER_PRESERVED))
{
// we can redraw only what's dirty
} else {
if (flags & DisplayHardware::UPDATE_ON_DEMAND) {
// we need to redraw the rectangle that will be updated
// (pushed to the framebuffer).
// we can redraw only what's dirty, but since SWAP_RECTANGLE only
// takes a rectangle, we must make sure to update that whole
// rectangle in that case
if (flags & DisplayHardware::SWAP_RECTANGLE) {
// FIXME: we really should be able to pass a region to
// SWAP_RECTANGLE so that we don't have to redraw all this.
mDirtyRegion.set(mInvalidRegion.bounds());
} else {
// we need to redraw everything
// in the BUFFER_PRESERVED case, obviously, we can update only
// what's needed and nothing more.
// NOTE: this is NOT a common case, as preserving the backbuffer
// is costly and usually involves copying the whole update back.
}
} else {
if (flags & DisplayHardware::UPDATE_ON_DEMAND) {
// We need to redraw the rectangle that will be updated
// (pushed to the framebuffer).
// This is needed because UPDATE_ON_DEMAND only takes one
// rectangle instead of a region (see DisplayHardware::flip())
mDirtyRegion.set(mInvalidRegion.bounds());
} else {
// we need to redraw everything (the whole screen)
mDirtyRegion.set(hw.bounds());
mInvalidRegion = mDirtyRegion;
}