diff options
-rw-r--r-- | services/surfaceflinger/Layer.cpp | 12 | ||||
-rw-r--r-- | services/surfaceflinger/Layer.h | 2 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 6 |
3 files changed, 19 insertions, 1 deletions
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index a18f473..3a8690e 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -466,6 +466,18 @@ bool Layer::setBypass(bool enable) return true; } +void Layer::updateBuffersOrientation() +{ + sp<GraphicBuffer> buffer(getBypassBuffer()); + if (buffer != NULL && mOrientation != buffer->transform) { + ClientRef::Access sharedClient(mUserClientRef); + SharedBufferServer* lcblk(sharedClient.get()); + if (lcblk) { // all buffers need reallocation + lcblk->reallocateAll(); + } + } +} + uint32_t Layer::doTransaction(uint32_t flags) { const Layer::State& front(drawingState()); diff --git a/services/surfaceflinger/Layer.h b/services/surfaceflinger/Layer.h index 9ff5716..cb62558 100644 --- a/services/surfaceflinger/Layer.h +++ b/services/surfaceflinger/Layer.h @@ -83,6 +83,8 @@ public: virtual void onRemoved(); virtual bool setBypass(bool enable); + void updateBuffersOrientation(); + inline sp<GraphicBuffer> getBypassBuffer() const { return mBufferManager.getActiveBuffer(); } diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 5e9e06c..af0f95a 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -725,8 +725,12 @@ void SurfaceFlinger::setBypassLayer(const sp<LayerBase>& layer) { // if this layer is already the bypass layer, do nothing sp<Layer> cur(mBypassLayer.promote()); - if (mBypassLayer == layer) + if (mBypassLayer == layer) { + if (cur != NULL) { + cur->updateBuffersOrientation(); + } return; + } // clear the current bypass layer mBypassLayer.clear(); |