diff options
author | Mathias Agopian <mathias@google.com> | 2012-02-23 21:23:02 -0800 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2012-02-23 21:23:02 -0800 |
commit | 2d77b5332ac4ef5b252fbd8f56a195e0fce03292 (patch) | |
tree | 9125d58822e502d1259b109a3f8d72e3f8941e2c /services | |
parent | edb948b877504d19d0e603a77d87297f2c834c4f (diff) | |
parent | 6ea851fadf16b98d76d9afbee1a9cbb015a44034 (diff) | |
download | frameworks_base-2d77b5332ac4ef5b252fbd8f56a195e0fce03292.zip frameworks_base-2d77b5332ac4ef5b252fbd8f56a195e0fce03292.tar.gz frameworks_base-2d77b5332ac4ef5b252fbd8f56a195e0fce03292.tar.bz2 |
Merge changes I97807db6,I7d350bc0
* changes:
workaround for an issue where the screen would flicker sometimes
fix an issue in SF where we could miss some updates
Diffstat (limited to 'services')
-rw-r--r-- | services/surfaceflinger/Layer.cpp | 53 | ||||
-rw-r--r-- | services/surfaceflinger/Layer.h | 2 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 10 |
3 files changed, 34 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..9d821dc 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -1000,6 +1000,12 @@ void SurfaceFlinger::composeSurfaces(const Region& dirty) drawWormhole(); } + // FIXME: workaroud for b/6020860 + glEnable(GL_SCISSOR_TEST); + glScissor(0,0,0,0); + glClear(GL_COLOR_BUFFER_BIT); + // end-workaround + /* * and then, render the layers targeted at the framebuffer */ @@ -1776,6 +1782,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; |