diff options
author | Mathias Agopian <mathias@google.com> | 2012-02-23 20:05:39 -0800 |
---|---|---|
committer | Mathias Agopian <mathias@google.com> | 2012-02-23 21:17:01 -0800 |
commit | f37d8fcf053ad77797e6e411805f223f83ce7ecc (patch) | |
tree | 66f02148298e2e7c3688a92a1546c1e145f7a9bd | |
parent | 36a5822484860d8a66639f1d01387c7b545ffad9 (diff) | |
download | frameworks_base-f37d8fcf053ad77797e6e411805f223f83ce7ecc.zip frameworks_base-f37d8fcf053ad77797e6e411805f223f83ce7ecc.tar.gz frameworks_base-f37d8fcf053ad77797e6e411805f223f83ce7ecc.tar.bz2 |
fix an issue in SF where we could miss some updates
Change-Id: I7d350bc05d1596655baddff3deaebaba58c9bcc0
-rw-r--r-- | services/surfaceflinger/Layer.cpp | 53 | ||||
-rw-r--r-- | services/surfaceflinger/Layer.h | 2 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 4 |
3 files changed, 28 insertions, 31 deletions
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index 3e6b872..4ee6953 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -42,7 +42,6 @@ #define DEBUG_RESIZE 0 - namespace android { // --------------------------------------------------------------------------- @@ -55,7 +54,7 @@ Layer::Layer(SurfaceFlinger* flinger, mCurrentTransform(0), mCurrentScalingMode(NATIVE_WINDOW_SCALING_MODE_FREEZE), mCurrentOpacity(true), - mRefreshPending(0), + mRefreshPending(false), mFrameLatencyNeeded(false), mFrameLatencyOffset(0), mFormat(PIXEL_FORMAT_NONE), @@ -408,15 +407,9 @@ bool Layer::isCropped() const { // pageflip handling... // ---------------------------------------------------------------------------- -bool Layer::onPreComposition() -{ - // if there was more than one pending update, request a refresh - if (mRefreshPending >= 2) { - mRefreshPending = 0; - return true; - } - mRefreshPending = 0; - return false; +bool Layer::onPreComposition() { + mRefreshPending = false; + return mQueuedFrames > 0; } void Layer::lockPageFlip(bool& recomputeVisibleRegions) @@ -428,9 +421,11 @@ void Layer::lockPageFlip(bool& recomputeVisibleRegions) // because we cannot call updateTeximage() without a corresponding // compositionComplete() call. // we'll trigger an update in onPreComposition(). - if (mRefreshPending++) { + if (mRefreshPending) { + mPostedDirtyRegion.clear(); return; } + mRefreshPending = true; // Capture the old state of the layer for comparisons later const bool oldOpacity = isOpaque(); @@ -541,25 +536,23 @@ void Layer::lockPageFlip(bool& recomputeVisibleRegions) void Layer::unlockPageFlip( const Transform& planeTransform, Region& outDirtyRegion) { - if (mRefreshPending >= 2) { - return; - } - - Region dirtyRegion(mPostedDirtyRegion); - if (!dirtyRegion.isEmpty()) { + Region postedRegion(mPostedDirtyRegion); + if (!postedRegion.isEmpty()) { mPostedDirtyRegion.clear(); - // The dirty region is given in the layer's coordinate space - // transform the dirty region by the surface's transformation - // and the global transformation. - const Layer::State& s(drawingState()); - const Transform tr(planeTransform * s.transform); - dirtyRegion = tr.transform(dirtyRegion); - - // At this point, the dirty region is in screen space. - // Make sure it's constrained by the visible region (which - // is in screen space as well). - dirtyRegion.andSelf(visibleRegionScreen); - outDirtyRegion.orSelf(dirtyRegion); + if (!visibleRegionScreen.isEmpty()) { + // The dirty region is given in the layer's coordinate space + // transform the dirty region by the surface's transformation + // and the global transformation. + const Layer::State& s(drawingState()); + const Transform tr(planeTransform * s.transform); + postedRegion = tr.transform(postedRegion); + + // At this point, the dirty region is in screen space. + // Make sure it's constrained by the visible region (which + // is in screen space as well). + postedRegion.andSelf(visibleRegionScreen); + outDirtyRegion.orSelf(postedRegion); + } } } diff --git a/services/surfaceflinger/Layer.h b/services/surfaceflinger/Layer.h index bf30608..39bbb2b 100644 --- a/services/surfaceflinger/Layer.h +++ b/services/surfaceflinger/Layer.h @@ -116,7 +116,7 @@ private: uint32_t mCurrentTransform; uint32_t mCurrentScalingMode; bool mCurrentOpacity; - size_t mRefreshPending; + bool mRefreshPending; bool mFrameLatencyNeeded; int mFrameLatencyOffset; diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 9e3f548..6852113 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -1776,6 +1776,10 @@ status_t SurfaceFlinger::onTransact( setTransactionFlags(eTransactionNeeded|eTraversalNeeded); return NO_ERROR; } + case 1006:{ // send empty update + signalRefresh(); + return NO_ERROR; + } case 1008: // toggle use of hw composer n = data.readInt32(); mDebugDisableHWC = n ? 1 : 0; |