From e2909e121c45d58fe587849b1474c80745fcd2b9 Mon Sep 17 00:00:00 2001 From: Jamie Gennis Date: Mon, 10 Oct 2011 15:48:06 -0700 Subject: SurfaceFlinger: update orientation via transactions This change merges the ISurfaceComposer::setOrientation functionality into ISurfaceComposer::setTransactionState. It enables the window manager to atomically update both the display orientation and the position and size of the windows in a single transaction with SurfaceFlinger. Bug: 5439574 Change-Id: I18a8ccc564d7d760ef8afb2d015ccdb7a7963900 --- libs/gui/SurfaceComposerClient.cpp | 39 ++++++++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 14 deletions(-) (limited to 'libs/gui/SurfaceComposerClient.cpp') diff --git a/libs/gui/SurfaceComposerClient.cpp b/libs/gui/SurfaceComposerClient.cpp index 00a4bf6..5f3d608 100644 --- a/libs/gui/SurfaceComposerClient.cpp +++ b/libs/gui/SurfaceComposerClient.cpp @@ -91,8 +91,10 @@ class Composer : public Singleton mutable Mutex mLock; SortedVector mStates; + int mOrientation; - Composer() : Singleton() { } + Composer() : Singleton(), + mOrientation(ISurfaceComposer::eOrientationUnchanged) { } void closeGlobalTransactionImpl(); @@ -119,6 +121,7 @@ public: status_t setFreezeTint( const sp& client, SurfaceID id, uint32_t tint); + status_t setOrientation(int orientation); static void closeGlobalTransaction() { Composer::getInstance().closeGlobalTransactionImpl(); @@ -133,14 +136,18 @@ void Composer::closeGlobalTransactionImpl() { sp sm(getComposerService()); Vector transaction; + int orientation; { // scope for the lock Mutex::Autolock _l(mLock); transaction = mStates; mStates.clear(); + + orientation = mOrientation; + mOrientation = ISurfaceComposer::eOrientationUnchanged; } - sm->setTransactionState(transaction); + sm->setTransactionState(transaction, orientation); } layer_state_t* Composer::getLayerStateLocked( @@ -260,6 +267,12 @@ status_t Composer::setFreezeTint(const sp& client, return NO_ERROR; } +status_t Composer::setOrientation(int orientation) { + Mutex::Autolock _l(mLock); + mOrientation = orientation; + return NO_ERROR; +} + // --------------------------------------------------------------------------- SurfaceComposerClient::SurfaceComposerClient() @@ -427,6 +440,12 @@ status_t SurfaceComposerClient::setMatrix(SurfaceID id, float dsdx, float dtdx, return getComposer().setMatrix(this, id, dsdx, dtdx, dsdy, dtdy); } +status_t SurfaceComposerClient::setOrientation(DisplayID dpy, + int orientation, uint32_t flags) +{ + return Composer::getInstance().setOrientation(orientation); +} + // ---------------------------------------------------------------------------- status_t SurfaceComposerClient::getDisplayInfo( @@ -491,21 +510,14 @@ ssize_t SurfaceComposerClient::getNumberOfDisplays() status_t SurfaceComposerClient::freezeDisplay(DisplayID dpy, uint32_t flags) { - sp sm(getComposerService()); - return sm->freezeDisplay(dpy, flags); + // This has been made a no-op because it can cause Gralloc buffer deadlocks. + return NO_ERROR; } status_t SurfaceComposerClient::unfreezeDisplay(DisplayID dpy, uint32_t flags) { - sp sm(getComposerService()); - return sm->unfreezeDisplay(dpy, flags); -} - -int SurfaceComposerClient::setOrientation(DisplayID dpy, - int orientation, uint32_t flags) -{ - sp sm(getComposerService()); - return sm->setOrientation(dpy, orientation, flags); + // This has been made a no-op because it can cause Gralloc buffer deadlocks. + return NO_ERROR; } // ---------------------------------------------------------------------------- @@ -572,4 +584,3 @@ size_t ScreenshotClient::getSize() const { // ---------------------------------------------------------------------------- }; // namespace android - -- cgit v1.1