From 8b33f032327f8de0dcc0e6d0d43ed80f834b51f6 Mon Sep 17 00:00:00 2001 From: Mathias Agopian Date: Tue, 24 Jul 2012 20:43:54 -0700 Subject: [PATCH] update SF binder protocol to support setting display attributes no change of functionality -- the old behavior is implemented on top of this new protocol. this new protocol will allow, eventually, to pass informations about displays and layer stacks. Change-Id: Ic6c2295e61ec8ecbc8ce01ab7664e35d928202fc --- include/gui/ISurfaceComposer.h | 7 ++-- include/private/gui/LayerState.h | 11 +++++++ libs/gui/ISurfaceComposer.cpp | 38 ++++++++++++++++------ libs/gui/LayerState.cpp | 23 +++++++++++++ libs/gui/SurfaceComposerClient.cpp | 10 ++++-- services/surfaceflinger/SurfaceFlinger.cpp | 19 +++++++++-- services/surfaceflinger/SurfaceFlinger.h | 2 +- 7 files changed, 91 insertions(+), 19 deletions(-) diff --git a/include/gui/ISurfaceComposer.h b/include/gui/ISurfaceComposer.h index 6f4be096b..de1d65dac 100644 --- a/include/gui/ISurfaceComposer.h +++ b/include/gui/ISurfaceComposer.h @@ -34,6 +34,7 @@ namespace android { // ---------------------------------------------------------------------------- class ComposerState; +class DisplayState; class IDisplayEventConnection; class IMemoryHeap; @@ -104,8 +105,10 @@ public: virtual sp getCblk() const = 0; /* open/close transactions. requires ACCESS_SURFACE_FLINGER permission */ - virtual void setTransactionState(const Vector& state, - int orientation, uint32_t flags) = 0; + virtual void setTransactionState( + const Vector& state, + const Vector& displays, + uint32_t flags) = 0; /* signal that we're done booting. * Requires ACCESS_SURFACE_FLINGER permission diff --git a/include/private/gui/LayerState.h b/include/private/gui/LayerState.h index 239dd87e5..97891e4bb 100644 --- a/include/private/gui/LayerState.h +++ b/include/private/gui/LayerState.h @@ -77,6 +77,17 @@ struct ComposerState { status_t read(const Parcel& input); }; +struct DisplayState { + int32_t displayId; + sp surface; + uint32_t layerStack; + uint32_t orientation; + Rect viewport; + Rect frame; + status_t write(Parcel& output) const; + status_t read(const Parcel& input); +}; + }; // namespace android #endif // ANDROID_SF_LAYER_STATE_H diff --git a/libs/gui/ISurfaceComposer.cpp b/libs/gui/ISurfaceComposer.cpp index bc550bf10..60341ff26 100644 --- a/libs/gui/ISurfaceComposer.cpp +++ b/libs/gui/ISurfaceComposer.cpp @@ -76,18 +76,29 @@ public: return interface_cast(reply.readStrongBinder()); } - virtual void setTransactionState(const Vector& state, - int orientation, uint32_t flags) + virtual void setTransactionState( + const Vector& state, + const Vector& displays, + uint32_t flags) { Parcel data, reply; data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); - Vector::const_iterator b(state.begin()); - Vector::const_iterator e(state.end()); - data.writeInt32(state.size()); - for ( ; b != e ; ++b ) { - b->write(data); + { + Vector::const_iterator b(state.begin()); + Vector::const_iterator e(state.end()); + data.writeInt32(state.size()); + for ( ; b != e ; ++b ) { + b->write(data); + } + } + { + Vector::const_iterator b(displays.begin()); + Vector::const_iterator e(displays.end()); + data.writeInt32(displays.size()); + for ( ; b != e ; ++b ) { + b->write(data); + } } - data.writeInt32(orientation); data.writeInt32(flags); remote()->transact(BnSurfaceComposer::SET_TRANSACTION_STATE, data, &reply); } @@ -244,9 +255,16 @@ status_t BnSurfaceComposer::onTransact( s.read(data); state.add(s); } - int orientation = data.readInt32(); + count = data.readInt32(); + DisplayState d; + Vector displays; + displays.setCapacity(count); + for (size_t i=0 ; i #include #include +#include #include namespace android { @@ -69,4 +70,26 @@ status_t ComposerState::read(const Parcel& input) { return state.read(input); } + +status_t DisplayState::write(Parcel& output) const { + output.writeStrongBinder(surface->asBinder()); + output.writeInt32(displayId); + output.writeInt32(layerStack); + output.writeInt32(orientation); + memcpy(output.writeInplace(sizeof(Rect)), &viewport, sizeof(Rect)); + memcpy(output.writeInplace(sizeof(Rect)), &frame, sizeof(Rect)); + return NO_ERROR; +} + +status_t DisplayState::read(const Parcel& input) { + surface = interface_cast(input.readStrongBinder()); + displayId = input.readInt32(); + layerStack = input.readInt32(); + orientation = input.readInt32(); + memcpy(&viewport, input.readInplace(sizeof(Rect)), sizeof(Rect)); + memcpy(&frame, input.readInplace(sizeof(Rect)), sizeof(Rect)); + return NO_ERROR; +} + + }; // namespace android diff --git a/libs/gui/SurfaceComposerClient.cpp b/libs/gui/SurfaceComposerClient.cpp index b1bd78bc7..8aa0c5516 100644 --- a/libs/gui/SurfaceComposerClient.cpp +++ b/libs/gui/SurfaceComposerClient.cpp @@ -138,7 +138,7 @@ void Composer::closeGlobalTransactionImpl(bool synchronous) { sp sm(getComposerService()); Vector transaction; - int orientation; + Vector displayTransaction; uint32_t flags = 0; { // scope for the lock @@ -146,7 +146,11 @@ void Composer::closeGlobalTransactionImpl(bool synchronous) { transaction = mStates; mStates.clear(); - orientation = mOrientation; + // FIXME: this should be the displays transaction state here + DisplayState item; + item.orientation = mOrientation; + displayTransaction.add(item); + mOrientation = ISurfaceComposer::eOrientationUnchanged; if (synchronous || mForceSynchronous) { @@ -155,7 +159,7 @@ void Composer::closeGlobalTransactionImpl(bool synchronous) { mForceSynchronous = false; } - sm->setTransactionState(transaction, orientation, flags); + sm->setTransactionState(transaction, displayTransaction, flags); } layer_state_t* Composer::getLayerStateLocked( diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index ad3865ed0..8da2543da 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -143,7 +143,11 @@ void SurfaceFlinger::binderDied(const wp& who) // reset screen orientation Vector state; - setTransactionState(state, eOrientationDefault, 0); + Vector displays; + DisplayState d; + d.orientation = eOrientationDefault; + displays.add(d); + setTransactionState(state, displays, 0); // restart the boot-animation startBootAnim(); @@ -1325,10 +1329,19 @@ uint32_t SurfaceFlinger::setTransactionFlags(uint32_t flags) } -void SurfaceFlinger::setTransactionState(const Vector& state, - int orientation, uint32_t flags) { +void SurfaceFlinger::setTransactionState( + const Vector& state, + const Vector& displays, + uint32_t flags) +{ Mutex::Autolock _l(mStateLock); + int orientation = eOrientationUnchanged; + if (displays.size()) { + // TODO: handle all displays + orientation = displays[0].orientation; + } + uint32_t transactionFlags = 0; if (mCurrentState.orientation != orientation) { if (uint32_t(orientation)<=eOrientation270 || orientation==42) { diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h index 569fe3530..3ecaa7f95 100644 --- a/services/surfaceflinger/SurfaceFlinger.h +++ b/services/surfaceflinger/SurfaceFlinger.h @@ -165,7 +165,7 @@ private: virtual sp getCblk() const; virtual void bootFinished(); virtual void setTransactionState(const Vector& state, - int orientation, uint32_t flags); + const Vector& displays, uint32_t flags); virtual bool authenticateSurfaceTexture( const sp& surface) const; virtual sp createDisplayEventConnection();