diff options
author | Android (Google) Code Review <android-gerrit@google.com> | 2009-09-30 17:27:18 -0400 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2009-09-30 17:27:18 -0400 |
commit | 68624f2aa5a3f93a81c69d3e1a4a083056e14217 (patch) | |
tree | 0309d9da870ce3dd513fd2d9c92893287b716d60 | |
parent | ee304d6925717d578ea2e2faa9d10157d566ed99 (diff) | |
parent | df3e0b934f2822ea0a334777e51e681f04a64d7c (diff) | |
download | frameworks_native-68624f2aa5a3f93a81c69d3e1a4a083056e14217.zip frameworks_native-68624f2aa5a3f93a81c69d3e1a4a083056e14217.tar.gz frameworks_native-68624f2aa5a3f93a81c69d3e1a4a083056e14217.tar.bz2 |
Merge changes I8851617a,Ie1b6f244,I70cab912,Ibd23e30d into eclair
* changes:
fix [2152247] Windows sometimes drawn scaled up.
invalidate the surface when the physical changes
introduce the notion of the requested size in the Layer state
remove unused code
-rw-r--r-- | libs/surfaceflinger/Layer.cpp | 63 | ||||
-rw-r--r-- | libs/surfaceflinger/LayerBase.cpp | 46 | ||||
-rw-r--r-- | libs/surfaceflinger/LayerBase.h | 5 | ||||
-rw-r--r-- | libs/surfaceflinger/SurfaceFlinger.cpp | 6 |
4 files changed, 75 insertions, 45 deletions
diff --git a/libs/surfaceflinger/Layer.cpp b/libs/surfaceflinger/Layer.cpp index 2894bf0..07222ec 100644 --- a/libs/surfaceflinger/Layer.cpp +++ b/libs/surfaceflinger/Layer.cpp @@ -294,8 +294,8 @@ sp<SurfaceBuffer> Layer::requestBuffer(int index, int usage) this, index, w, h, strerror(-err)); } else { LOGD_IF(DEBUG_RESIZE, - "Layer::requestBuffer(this=%p), index=%d, w=%d, h=%d", - this, index, w, h); + "Layer::requestBuffer(this=%p), index=%d, w=%d, h=%d, handle=%p", + this, index, w, h, buffer->handle); } if (err == NO_ERROR && buffer->handle != 0) { @@ -318,22 +318,18 @@ uint32_t Layer::doTransaction(uint32_t flags) const Layer::State& front(drawingState()); const Layer::State& temp(currentState()); - // Index of the back buffer - const bool backbufferChanged = (front.w != temp.w) || (front.h != temp.h); - if (backbufferChanged) { + if ((front.requested_w != temp.requested_w) || + (front.requested_h != temp.requested_h)) { // the size changed, we need to ask our client to request a new buffer LOGD_IF(DEBUG_RESIZE, "resize (layer=%p), requested (%dx%d), " "drawing (%d,%d), (%dx%d), (%dx%d)", - this, int(temp.w), int(temp.h), - int(drawingState().w), int(drawingState().h), + this, + int(temp.requested_w), int(temp.requested_h), + int(front.requested_w), int(front.requested_h), int(mBuffers[0]->getWidth()), int(mBuffers[0]->getHeight()), int(mBuffers[1]->getWidth()), int(mBuffers[1]->getHeight())); - // record the new size, form this point on, when the client request a - // buffer, it'll get the new size. - setDrawingSize(temp.w, temp.h); - // we're being resized and there is a freeze display request, // acquire a freeze lock, so that the screen stays put // until we've redrawn at the new size; this is to avoid @@ -346,9 +342,16 @@ uint32_t Layer::doTransaction(uint32_t flags) } } - // recompute the visible region - flags |= Layer::eVisibleRegion; - this->contentDirty = true; + // this will make sure LayerBase::doTransaction doesn't update + // the drawing state's size + Layer::State& editDraw(mDrawingState); + editDraw.requested_w = temp.requested_w; + editDraw.requested_h = temp.requested_h; + + // record the new size, form this point on, when the client request a + // buffer, it'll get the new size. + setDrawingSize(temp.requested_w, temp.requested_h); + // all buffers need reallocation lcblk->reallocate(); } @@ -392,11 +395,35 @@ void Layer::lockPageFlip(bool& recomputeVisibleRegions) const Region dirty(lcblk->getDirtyRegion(buf)); mPostedDirtyRegion = dirty.intersect( newFrontBuffer->getBounds() ); - const Layer::State& front(drawingState()); - if (newFrontBuffer->getWidth() == front.w && - newFrontBuffer->getHeight() ==front.h) { - mFreezeLock.clear(); + if (newFrontBuffer->getWidth() == front.requested_w && + newFrontBuffer->getHeight() == front.requested_h) + { + if ((front.w != front.requested_w) || + (front.h != front.requested_h)) + { + // Here we pretend the transaction happened by updating the + // current and drawing states. Drawing state is only accessed + // in this thread, no need to have it locked + Layer::State& editDraw(mDrawingState); + editDraw.w = editDraw.requested_w; + editDraw.h = editDraw.requested_h; + + // We also need to update the current state so that we don't + // end-up doing too much work during the next transaction. + // NOTE: We actually don't need hold the transaction lock here + // because State::w and State::h are only accessed from + // this thread + Layer::State& editTemp(currentState()); + editTemp.w = editDraw.w; + editTemp.h = editDraw.h; + + // recompute visible region + recomputeVisibleRegions = true; + + // we now have the correct size, unfreeze the screen + mFreezeLock.clear(); + } } // FIXME: signal an event if we have more buffers waiting diff --git a/libs/surfaceflinger/LayerBase.cpp b/libs/surfaceflinger/LayerBase.cpp index 7692d0f..d83c842 100644 --- a/libs/surfaceflinger/LayerBase.cpp +++ b/libs/surfaceflinger/LayerBase.cpp @@ -83,26 +83,22 @@ void LayerBase::initStates(uint32_t w, uint32_t h, uint32_t flags) if (flags & ISurfaceComposer::eNonPremultiplied) mPremultipliedAlpha = false; - mCurrentState.z = 0; - mCurrentState.w = w; - mCurrentState.h = h; - mCurrentState.alpha = 0xFF; - mCurrentState.flags = layerFlags; - mCurrentState.sequence = 0; + mCurrentState.z = 0; + mCurrentState.w = w; + mCurrentState.h = h; + mCurrentState.requested_w = w; + mCurrentState.requested_h = h; + mCurrentState.alpha = 0xFF; + mCurrentState.flags = layerFlags; + mCurrentState.sequence = 0; mCurrentState.transform.set(0, 0); // drawing state & current state are identical mDrawingState = mCurrentState; } -void LayerBase::commitTransaction(bool skipSize) { - const uint32_t w = mDrawingState.w; - const uint32_t h = mDrawingState.h; +void LayerBase::commitTransaction() { mDrawingState = mCurrentState; - if (skipSize) { - mDrawingState.w = w; - mDrawingState.h = h; - } } void LayerBase::forceVisibilityTransaction() { // this can be called without SurfaceFlinger.mStateLock, but if we @@ -138,10 +134,10 @@ bool LayerBase::setLayer(uint32_t z) { return true; } bool LayerBase::setSize(uint32_t w, uint32_t h) { - if (mCurrentState.w == w && mCurrentState.h == h) + if (mCurrentState.requested_w == w && mCurrentState.requested_h == h) return false; - mCurrentState.w = w; - mCurrentState.h = h; + mCurrentState.requested_w = w; + mCurrentState.requested_h = h; requestTransaction(); return true; } @@ -198,13 +194,25 @@ uint32_t LayerBase::doTransaction(uint32_t flags) const Layer::State& front(drawingState()); const Layer::State& temp(currentState()); - if (temp.sequence != front.sequence) { + if ((front.requested_w != temp.requested_w) || + (front.requested_h != temp.requested_h)) { + // resize the layer, set the physical size to the requested size + Layer::State& editTemp(currentState()); + editTemp.w = temp.requested_w; + editTemp.h = temp.requested_h; + } + + if ((front.w != temp.w) || (front.h != temp.h)) { // invalidate and recompute the visible regions if needed - flags |= eVisibleRegion; + flags |= Layer::eVisibleRegion; this->contentDirty = true; } if (temp.sequence != front.sequence) { + // invalidate and recompute the visible regions if needed + flags |= eVisibleRegion; + this->contentDirty = true; + const bool linearFiltering = mUseLinearFiltering; mUseLinearFiltering = false; if (!(mFlags & DisplayHardware::SLOW_CONFIG)) { @@ -217,7 +225,7 @@ uint32_t LayerBase::doTransaction(uint32_t flags) } // Commit the transaction - commitTransaction(flags & eRestartTransaction); + commitTransaction(); return flags; } diff --git a/libs/surfaceflinger/LayerBase.h b/libs/surfaceflinger/LayerBase.h index 233737d..16ee542 100644 --- a/libs/surfaceflinger/LayerBase.h +++ b/libs/surfaceflinger/LayerBase.h @@ -88,6 +88,8 @@ public: struct State { uint32_t w; uint32_t h; + uint32_t requested_w; + uint32_t requested_h; uint32_t z; uint8_t alpha; uint8_t flags; @@ -107,7 +109,7 @@ public: bool setTransparentRegionHint(const Region& opaque); bool setFlags(uint8_t flags, uint8_t mask); - void commitTransaction(bool skipSize); + void commitTransaction(); bool requestTransaction(); void forceVisibilityTransaction(); @@ -211,7 +213,6 @@ public: enum { // flags for doTransaction() eVisibleRegion = 0x00000002, - eRestartTransaction = 0x00000008 }; diff --git a/libs/surfaceflinger/SurfaceFlinger.cpp b/libs/surfaceflinger/SurfaceFlinger.cpp index 4ee176c..e468b23 100644 --- a/libs/surfaceflinger/SurfaceFlinger.cpp +++ b/libs/surfaceflinger/SurfaceFlinger.cpp @@ -594,12 +594,6 @@ void SurfaceFlinger::handleTransactionLocked( const uint32_t flags = layer->doTransaction(0); if (flags & Layer::eVisibleRegion) mVisibleRegionsDirty = true; - - if (flags & Layer::eRestartTransaction) { - // restart the transaction, but back-off a little - layer->setTransactionFlags(eTransactionNeeded); - setTransactionFlags(eTraversalNeeded, ms2ns(8)); - } } } |