diff options
author | Andy McFadden <fadden@android.com> | 2012-09-14 16:10:11 -0700 |
---|---|---|
committer | Andy McFadden <fadden@android.com> | 2012-09-16 11:39:09 -0700 |
commit | 6905205c8d130b6ea3a813c1b9283492ed183367 (patch) | |
tree | 429c0855a3e4f9eb2610c730501f6c7ff5e0ba71 /services | |
parent | 6e220a6ce6971555b883f4852c6e5d4c7a617815 (diff) | |
download | frameworks_native-6905205c8d130b6ea3a813c1b9283492ed183367.zip frameworks_native-6905205c8d130b6ea3a813c1b9283492ed183367.tar.gz frameworks_native-6905205c8d130b6ea3a813c1b9283492ed183367.tar.bz2 |
Fix transform hints
The hints were being set a little too late, so the pre-rotation stuff
wasn't quite working.
Bug 7054997
Change-Id: Id8d5c626db7a76f768ba762a145b315878ee08e6
Diffstat (limited to 'services')
-rw-r--r-- | services/surfaceflinger/Layer.cpp | 22 | ||||
-rw-r--r-- | services/surfaceflinger/Layer.h | 5 | ||||
-rw-r--r-- | services/surfaceflinger/LayerBase.h | 6 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 12 |
4 files changed, 32 insertions, 13 deletions
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index 75eff9f..6785ba8 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -109,6 +109,8 @@ void Layer::onFirstRef() #else mSurfaceTexture->setDefaultMaxBufferCount(3); #endif + + updateTransformHint(); } Layer::~Layer() @@ -429,12 +431,12 @@ uint32_t Layer::doTransaction(uint32_t flags) if (sizeChanged) { // the size changed, we need to ask our client to request a new buffer ALOGD_IF(DEBUG_RESIZE, - "doTransaction: geometry (layer=%p), scalingMode=%d\n" + "doTransaction: geometry (layer=%p '%s'), tr=%02x, scalingMode=%d\n" " current={ active ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n" " requested={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }}\n" " drawing={ active ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n" " requested={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }}\n", - this, mCurrentScalingMode, + this, (const char*) getName(), mCurrentTransform, mCurrentScalingMode, temp.active.w, temp.active.h, temp.active.crop.left, temp.active.crop.top, @@ -597,10 +599,10 @@ Region Layer::latchBuffer(bool& recomputeVisibleRegions) } ALOGD_IF(DEBUG_RESIZE, - "lockPageFlip: (layer=%p), buffer (%ux%u, tr=%02x), scalingMode=%d\n" + "latchBuffer/reject: buffer (%ux%u, tr=%02x), scalingMode=%d\n" " drawing={ active ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n" " requested={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }}\n", - this, bufWidth, bufHeight, item.mTransform, item.mScalingMode, + bufWidth, bufHeight, item.mTransform, item.mScalingMode, front.active.w, front.active.h, front.active.crop.left, front.active.crop.top, @@ -631,10 +633,6 @@ Region Layer::latchBuffer(bool& recomputeVisibleRegions) Reject r(mDrawingState, currentState(), recomputeVisibleRegions); - // XXX: not sure if setTransformHint belongs here - // it should only be needed when the main screen orientation changes - mSurfaceTexture->setTransformHint(getTransformHint()); - if (mSurfaceTexture->updateTexImage(&r) < NO_ERROR) { // something happened! recomputeVisibleRegions = true; @@ -711,9 +709,9 @@ void Layer::dump(String8& result, char* buffer, size_t SIZE) const snprintf(buffer, SIZE, " " "format=%2d, activeBuffer=[%4ux%4u:%4u,%3X]," - " transform-hint=0x%02x, queued-frames=%d, mRefreshPending=%d\n", + " queued-frames=%d, mRefreshPending=%d\n", mFormat, w0, h0, s0,f0, - getTransformHint(), mQueuedFrames, mRefreshPending); + mQueuedFrames, mRefreshPending); result.append(buffer); @@ -759,7 +757,7 @@ uint32_t Layer::getEffectiveUsage(uint32_t usage) const return usage; } -uint32_t Layer::getTransformHint() const { +void Layer::updateTransformHint() const { uint32_t orientation = 0; if (!mFlinger->mDebugDisableTransformHint) { // The transform hint is used to improve performance on the main @@ -774,7 +772,7 @@ uint32_t Layer::getTransformHint() const { orientation = 0; } } - return orientation; + mSurfaceTexture->setTransformHint(orientation); } // --------------------------------------------------------------------------- diff --git a/services/surfaceflinger/Layer.h b/services/surfaceflinger/Layer.h index 78fe321..b839f8c 100644 --- a/services/surfaceflinger/Layer.h +++ b/services/surfaceflinger/Layer.h @@ -89,6 +89,10 @@ public: // only for debugging inline const sp<GraphicBuffer>& getActiveBuffer() const { return mActiveBuffer; } + // Updates the transform hint in our SurfaceTexture to match + // the current orientation of the default display device. + virtual void updateTransformHint() const; + protected: virtual void onFirstRef(); virtual void dump(String8& result, char* scratch, size_t size) const; @@ -100,7 +104,6 @@ private: void onFrameQueued(); virtual sp<ISurface> createSurface(); uint32_t getEffectiveUsage(uint32_t usage) const; - uint32_t getTransformHint() const; bool isCropped() const; Rect computeBufferCrop() const; static bool getOpacityForFormat(uint32_t format); diff --git a/services/surfaceflinger/LayerBase.h b/services/surfaceflinger/LayerBase.h index 4651517..7326f53 100644 --- a/services/surfaceflinger/LayerBase.h +++ b/services/surfaceflinger/LayerBase.h @@ -229,6 +229,12 @@ public: */ virtual void onPostComposition() { } + /** + * Updates the SurfaceTexture's transform hint, for layers that have + * a SurfaceTexture. + */ + virtual void updateTransformHint() const { } + /** always call base class first */ virtual void dump(String8& result, char* scratch, size_t size) const; virtual void shortDump(String8& result, char* scratch, size_t size) const; diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index da15248..f1d790d 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -988,6 +988,18 @@ void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags) disp->setProjection(state.orientation, state.viewport, state.frame); } + + // Walk through all the layers in currentLayers, + // and update their transform hint. + // + // TODO: we could be much more clever about which + // layers we touch and how often we do these updates + // (e.g. only touch the layers associated with this + // display, and only on a rotation). + for (size_t i = 0; i < count; i++) { + const sp<LayerBase>& layerBase = currentLayers[i]; + layerBase->updateTransformHint(); + } } } } |