diff options
author | Jamie Gennis <jgennis@google.com> | 2011-09-14 18:23:37 -0700 |
---|---|---|
committer | Jamie Gennis <jgennis@google.com> | 2011-09-14 18:23:37 -0700 |
commit | 11c44ddd9e664fef013890a727a21d63f52caf84 (patch) | |
tree | d2a9cb41c1d806df4f7d33d8adf1cac303915653 /services/surfaceflinger | |
parent | c75994947a5708f808c80a75358309f351e8e60f (diff) | |
download | frameworks_base-11c44ddd9e664fef013890a727a21d63f52caf84.zip frameworks_base-11c44ddd9e664fef013890a727a21d63f52caf84.tar.gz frameworks_base-11c44ddd9e664fef013890a727a21d63f52caf84.tar.bz2 |
SurfaceFlinger: fix isOpaque check in lockPageFlip
This change fixes an issue where Layer::isOpaque was being called in
lockPageFlip to get the opaqueness for the new buffer before
mActiveBuffer was updated.
Bug: 5321313
Change-Id: Ibb5d7d3f4e9a2b1448e117a484a0d9f9ca5fc9de
Diffstat (limited to 'services/surfaceflinger')
-rw-r--r-- | services/surfaceflinger/Layer.cpp | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index edbc7b0..f85ce7f 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -404,7 +404,9 @@ bool Layer::isCropped() const { void Layer::lockPageFlip(bool& recomputeVisibleRegions) { if (mQueuedFrames > 0) { + // Capture the old state of the layer for comparisons later const bool oldOpacity = isOpaque(); + sp<GraphicBuffer> oldActiveBuffer = mActiveBuffer; // signal another event if we have more frames pending if (android_atomic_dec(&mQueuedFrames) > 1) { @@ -417,7 +419,8 @@ void Layer::lockPageFlip(bool& recomputeVisibleRegions) return; } - sp<GraphicBuffer> newFrontBuffer(mSurfaceTexture->getCurrentBuffer()); + // update the active buffer + mActiveBuffer = mSurfaceTexture->getCurrentBuffer(); const Rect crop(mSurfaceTexture->getCurrentCrop()); const uint32_t transform(mSurfaceTexture->getCurrentTransform()); @@ -439,16 +442,16 @@ void Layer::lockPageFlip(bool& recomputeVisibleRegions) mFlinger->invalidateHwcGeometry(); } - uint32_t bufWidth = newFrontBuffer->getWidth(); - uint32_t bufHeight = newFrontBuffer->getHeight(); - if (mActiveBuffer != NULL) { - if (bufWidth != uint32_t(mActiveBuffer->width) || - bufHeight != uint32_t(mActiveBuffer->height)) { + uint32_t bufWidth = mActiveBuffer->getWidth(); + uint32_t bufHeight = mActiveBuffer->getHeight(); + if (oldActiveBuffer != NULL) { + if (bufWidth != uint32_t(oldActiveBuffer->width) || + bufHeight != uint32_t(oldActiveBuffer->height)) { mFlinger->invalidateHwcGeometry(); } } - mCurrentOpacity = getOpacityForFormat(newFrontBuffer->format); + mCurrentOpacity = getOpacityForFormat(mActiveBuffer->format); if (oldOpacity != isOpaque()) { recomputeVisibleRegions = true; } @@ -462,9 +465,6 @@ void Layer::lockPageFlip(bool& recomputeVisibleRegions) // FIXME: mPostedDirtyRegion = dirty & bounds mPostedDirtyRegion.set(front.w, front.h); - // update active buffer - mActiveBuffer = newFrontBuffer; - if ((front.w != front.requested_w) || (front.h != front.requested_h)) { |