summaryrefslogtreecommitdiffstats
path: root/libs/surfaceflinger/SurfaceFlinger.cpp
diff options
context:
space:
mode:
authorMathias Agopian <mathias@google.com>2009-06-29 18:49:56 -0700
committerMathias Agopian <mathias@google.com>2009-06-29 18:49:56 -0700
commitecfa7ccd4fc3066a4cfd4d84d7de286d95581c78 (patch)
tree6c71dcd11bee533b7d09e8d711bcbc491c51b2f5 /libs/surfaceflinger/SurfaceFlinger.cpp
parent276826bae2eb6d25c4abb1c5f665d2876c65e50c (diff)
downloadframeworks_base-ecfa7ccd4fc3066a4cfd4d84d7de286d95581c78.zip
frameworks_base-ecfa7ccd4fc3066a4cfd4d84d7de286d95581c78.tar.gz
frameworks_base-ecfa7ccd4fc3066a4cfd4d84d7de286d95581c78.tar.bz2
fix a bug that caused artifacts when SWAP_RECTANGLE was enabled
Diffstat (limited to 'libs/surfaceflinger/SurfaceFlinger.cpp')
-rw-r--r--libs/surfaceflinger/SurfaceFlinger.cpp20
1 files changed, 17 insertions, 3 deletions
diff --git a/libs/surfaceflinger/SurfaceFlinger.cpp b/libs/surfaceflinger/SurfaceFlinger.cpp
index 17cff55..e74e000 100644
--- a/libs/surfaceflinger/SurfaceFlinger.cpp
+++ b/libs/surfaceflinger/SurfaceFlinger.cpp
@@ -827,14 +827,28 @@ void SurfaceFlinger::handleRepaint()
if ((flags & DisplayHardware::SWAP_RECTANGLE) ||
(flags & DisplayHardware::BUFFER_PRESERVED))
{
- // we can redraw only what's dirty
+ // 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 {
+ // 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
+ // 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
+ // we need to redraw everything (the whole screen)
mDirtyRegion.set(hw.bounds());
mInvalidRegion = mDirtyRegion;
}