From ad456f9878ff7c176499e7b992f9ff1cb3e9cdee Mon Sep 17 00:00:00 2001 From: Mathias Agopian Date: Thu, 13 Jan 2011 17:53:01 -0800 Subject: [PATCH] fix [3312683] Camera mirroring problem after switching from back to front camera the crop as well as buffer orientation can change at every frame, when that happens we need to reset the hwc HAL (ie: set the GEOMETRY_CHANGED flag). currently we achieve this by taking the same code path than an actual geometry change which is a bit more heavy than necessary. Change-Id: I751f9ed1eeec0c27db7df2e77d5d17c6bcc17a24 --- services/surfaceflinger/LayerBase.cpp | 10 ++++++++-- services/surfaceflinger/SurfaceFlinger.cpp | 11 ++++++++--- services/surfaceflinger/SurfaceFlinger.h | 1 + 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/services/surfaceflinger/LayerBase.cpp b/services/surfaceflinger/LayerBase.cpp index 8a021cbfc..0c1fcf912 100644 --- a/services/surfaceflinger/LayerBase.cpp +++ b/services/surfaceflinger/LayerBase.cpp @@ -503,12 +503,18 @@ void LayerBase::drawWithOpenGL(const Region& clip, const Texture& texture) const void LayerBase::setBufferCrop(const Rect& crop) { if (!crop.isEmpty()) { - mBufferCrop = crop; + if (mBufferCrop != crop) { + mBufferCrop = crop; + mFlinger->invalidateHwcGeometry(); + } } } void LayerBase::setBufferTransform(uint32_t transform) { - mBufferTransform = transform; + if (mBufferTransform != transform) { + mBufferTransform = transform; + mFlinger->invalidateHwcGeometry(); + } } void LayerBase::dump(String8& result, char* buffer, size_t SIZE) const diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index c982ea589..9d3254727 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -460,7 +460,7 @@ void SurfaceFlinger::handleTransaction(uint32_t transactionFlags) handleTransactionLocked(transactionFlags, ditchedLayers); mLastTransactionTime = systemTime() - now; mDebugInTransaction = 0; - mHwWorkListDirty = true; + invalidateHwcGeometry(); // here the transaction has been committed } @@ -726,13 +726,18 @@ void SurfaceFlinger::handlePageFlip() mWormholeRegion = screenRegion.subtract(opaqueRegion); mVisibleRegionsDirty = false; - mHwWorkListDirty = true; + invalidateHwcGeometry(); } unlockPageFlip(currentLayers); mDirtyRegion.andSelf(screenRegion); } +void SurfaceFlinger::invalidateHwcGeometry() +{ + mHwWorkListDirty = true; +} + bool SurfaceFlinger::lockPageFlip(const LayerVector& currentLayers) { bool recomputeVisibleRegions = false; @@ -1586,7 +1591,7 @@ status_t SurfaceFlinger::onTransact( case 1008: // toggle use of hw composer n = data.readInt32(); mDebugDisableHWC = n ? 1 : 0; - mHwWorkListDirty = true; + invalidateHwcGeometry(); // fall-through... case 1004:{ // repaint everything Mutex::Autolock _l(mStateLock); diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h index 48642d4ed..0729879ec 100644 --- a/services/surfaceflinger/SurfaceFlinger.h +++ b/services/surfaceflinger/SurfaceFlinger.h @@ -208,6 +208,7 @@ public: status_t removeLayer(const sp& layer); status_t addLayer(const sp& layer); status_t invalidateLayerVisibility(const sp& layer); + void invalidateHwcGeometry(); sp getLayer(const sp& sur) const;