summaryrefslogtreecommitdiffstats
path: root/services
diff options
context:
space:
mode:
authorAndy McFadden <fadden@android.com>2012-09-14 16:10:11 -0700
committerAndy McFadden <fadden@android.com>2012-09-16 11:39:09 -0700
commit6905205c8d130b6ea3a813c1b9283492ed183367 (patch)
tree429c0855a3e4f9eb2610c730501f6c7ff5e0ba71 /services
parent6e220a6ce6971555b883f4852c6e5d4c7a617815 (diff)
downloadframeworks_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.cpp22
-rw-r--r--services/surfaceflinger/Layer.h5
-rw-r--r--services/surfaceflinger/LayerBase.h6
-rw-r--r--services/surfaceflinger/SurfaceFlinger.cpp12
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();
+ }
}
}
}