diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index 19c7ddd4f..44df9849d 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -541,9 +541,9 @@ void Layer::dump(String8& result, char* buffer, size_t SIZE) const snprintf(buffer, SIZE, " " "format=%2d, activeBuffer=[%4ux%4u:%4u,%3X]," - " freezeLock=%p, queued-frames=%d\n", + " freezeLock=%p, transform-hint=0x%02x, queued-frames=%d\n", mFormat, w0, h0, s0,f0, - getFreezeLock().get(), mQueuedFrames); + getFreezeLock().get(), getTransformHint(), mQueuedFrames); result.append(buffer); @@ -562,6 +562,17 @@ uint32_t Layer::getEffectiveUsage(uint32_t usage) const return usage; } +uint32_t Layer::getTransformHint() const { + uint32_t orientation = 0; + if (!mFlinger->mDebugDisableTransformHint) { + orientation = getOrientation(); + if (orientation & Transform::ROT_INVALID) { + orientation = 0; + } + } + return orientation; +} + // --------------------------------------------------------------------------- diff --git a/services/surfaceflinger/Layer.h b/services/surfaceflinger/Layer.h index 5f0be8074..d06a35f01 100644 --- a/services/surfaceflinger/Layer.h +++ b/services/surfaceflinger/Layer.h @@ -89,6 +89,7 @@ private: void onFrameQueued(); virtual sp createSurface(); uint32_t getEffectiveUsage(uint32_t usage) const; + uint32_t getTransformHint() const; bool isCropped() const; static bool getOpacityForFormat(uint32_t format); diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 1f27a70f6..008020262 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -93,6 +93,7 @@ SurfaceFlinger::SurfaceFlinger() mDebugBackground(0), mDebugDDMS(0), mDebugDisableHWC(0), + mDebugDisableTransformHint(0), mDebugInSwapBuffers(0), mLastSwapBufferTime(0), mDebugInTransaction(0), @@ -1689,6 +1690,12 @@ status_t SurfaceFlinger::onTransact( invalidateHwcGeometry(); repaintEverything(); return NO_ERROR; + case 1009: // toggle use of transform hint + n = data.readInt32(); + mDebugDisableTransformHint = n ? 1 : 0; + invalidateHwcGeometry(); + repaintEverything(); + return NO_ERROR; case 1010: // interrogate. reply->writeInt32(0); reply->writeInt32(0); diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h index d68e48401..5f8eb0868 100644 --- a/services/surfaceflinger/SurfaceFlinger.h +++ b/services/surfaceflinger/SurfaceFlinger.h @@ -374,6 +374,7 @@ private: int mDebugBackground; int mDebugDDMS; int mDebugDisableHWC; + int mDebugDisableTransformHint; volatile nsecs_t mDebugInSwapBuffers; nsecs_t mLastSwapBufferTime; volatile nsecs_t mDebugInTransaction; diff --git a/services/surfaceflinger/SurfaceTextureLayer.cpp b/services/surfaceflinger/SurfaceTextureLayer.cpp index 79cd0c314..4390ca19f 100644 --- a/services/surfaceflinger/SurfaceTextureLayer.cpp +++ b/services/surfaceflinger/SurfaceTextureLayer.cpp @@ -57,16 +57,10 @@ status_t SurfaceTextureLayer::queueBuffer(int buf, int64_t timestamp, status_t res = SurfaceTexture::queueBuffer(buf, timestamp, outWidth, outHeight, outTransform); - sp layer(mLayer.promote()); if (layer != NULL) { - uint32_t orientation = layer->getOrientation(); - if (orientation & Transform::ROT_INVALID) { - orientation = 0; - } - *outTransform = orientation; + *outTransform = layer->getTransformHint(); } - return res; }