am 075e4c3d: Merge "SurfaceFlinger: update orientation via transactions" into ics-mr0

* commit '075e4c3d2e6a8a9eb3506dfedc8da938fb65fb65':
  SurfaceFlinger: update orientation via transactions
This commit is contained in:
Jamie Gennis 2011-10-12 13:04:36 -07:00 committed by Android Git Automerger
commit 951491f897
6 changed files with 47 additions and 77 deletions

View File

@ -80,6 +80,7 @@ public:
eOrientation90 = 1, eOrientation90 = 1,
eOrientation180 = 2, eOrientation180 = 2,
eOrientation270 = 3, eOrientation270 = 3,
eOrientationUnchanged = 4,
eOrientationSwapMask = 0x01 eOrientationSwapMask = 0x01
}; };
@ -101,15 +102,8 @@ public:
virtual sp<IMemoryHeap> getCblk() const = 0; virtual sp<IMemoryHeap> getCblk() const = 0;
/* open/close transactions. requires ACCESS_SURFACE_FLINGER permission */ /* open/close transactions. requires ACCESS_SURFACE_FLINGER permission */
virtual void setTransactionState(const Vector<ComposerState>& state) = 0; virtual void setTransactionState(const Vector<ComposerState>& state,
int orientation) = 0;
/* [un]freeze display. requires ACCESS_SURFACE_FLINGER permission */
virtual status_t freezeDisplay(DisplayID dpy, uint32_t flags) = 0;
virtual status_t unfreezeDisplay(DisplayID dpy, uint32_t flags) = 0;
/* Set display orientation. requires ACCESS_SURFACE_FLINGER permission
* No flags are currently defined. Set flags to 0. */
virtual int setOrientation(DisplayID dpy, int orientation, uint32_t flags) = 0;
/* signal that we're done booting. /* signal that we're done booting.
* Requires ACCESS_SURFACE_FLINGER permission * Requires ACCESS_SURFACE_FLINGER permission

View File

@ -195,4 +195,3 @@ public:
}; // namespace android }; // namespace android
#endif // ANDROID_SF_SURFACE_COMPOSER_CLIENT_H #endif // ANDROID_SF_SURFACE_COMPOSER_CLIENT_H

View File

@ -78,7 +78,8 @@ public:
return interface_cast<IMemoryHeap>(reply.readStrongBinder()); return interface_cast<IMemoryHeap>(reply.readStrongBinder());
} }
virtual void setTransactionState(const Vector<ComposerState>& state) virtual void setTransactionState(const Vector<ComposerState>& state,
int orientation)
{ {
Parcel data, reply; Parcel data, reply;
data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
@ -88,38 +89,8 @@ public:
for ( ; b != e ; ++b ) { for ( ; b != e ; ++b ) {
b->write(data); b->write(data);
} }
remote()->transact(BnSurfaceComposer::SET_TRANSACTION_STATE, data, &reply);
}
virtual status_t freezeDisplay(DisplayID dpy, uint32_t flags)
{
Parcel data, reply;
data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
data.writeInt32(dpy);
data.writeInt32(flags);
remote()->transact(BnSurfaceComposer::FREEZE_DISPLAY, data, &reply);
return reply.readInt32();
}
virtual status_t unfreezeDisplay(DisplayID dpy, uint32_t flags)
{
Parcel data, reply;
data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
data.writeInt32(dpy);
data.writeInt32(flags);
remote()->transact(BnSurfaceComposer::UNFREEZE_DISPLAY, data, &reply);
return reply.readInt32();
}
virtual int setOrientation(DisplayID dpy, int orientation, uint32_t flags)
{
Parcel data, reply;
data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
data.writeInt32(dpy);
data.writeInt32(orientation); data.writeInt32(orientation);
data.writeInt32(flags); remote()->transact(BnSurfaceComposer::SET_TRANSACTION_STATE, data, &reply);
remote()->transact(BnSurfaceComposer::SET_ORIENTATION, data, &reply);
return reply.readInt32();
} }
virtual void bootFinished() virtual void bootFinished()
@ -232,26 +203,8 @@ status_t BnSurfaceComposer::onTransact(
s.read(data); s.read(data);
state.add(s); state.add(s);
} }
setTransactionState(state);
} break;
case SET_ORIENTATION: {
CHECK_INTERFACE(ISurfaceComposer, data, reply);
DisplayID dpy = data.readInt32();
int orientation = data.readInt32(); int orientation = data.readInt32();
uint32_t flags = data.readInt32(); setTransactionState(state, orientation);
reply->writeInt32( setOrientation(dpy, orientation, flags) );
} break;
case FREEZE_DISPLAY: {
CHECK_INTERFACE(ISurfaceComposer, data, reply);
DisplayID dpy = data.readInt32();
uint32_t flags = data.readInt32();
reply->writeInt32( freezeDisplay(dpy, flags) );
} break;
case UNFREEZE_DISPLAY: {
CHECK_INTERFACE(ISurfaceComposer, data, reply);
DisplayID dpy = data.readInt32();
uint32_t flags = data.readInt32();
reply->writeInt32( unfreezeDisplay(dpy, flags) );
} break; } break;
case BOOT_FINISHED: { case BOOT_FINISHED: {
CHECK_INTERFACE(ISurfaceComposer, data, reply); CHECK_INTERFACE(ISurfaceComposer, data, reply);

View File

@ -91,8 +91,10 @@ class Composer : public Singleton<Composer>
mutable Mutex mLock; mutable Mutex mLock;
SortedVector<ComposerState> mStates; SortedVector<ComposerState> mStates;
int mOrientation;
Composer() : Singleton<Composer>() { } Composer() : Singleton<Composer>(),
mOrientation(ISurfaceComposer::eOrientationUnchanged) { }
void closeGlobalTransactionImpl(); void closeGlobalTransactionImpl();
@ -119,6 +121,7 @@ public:
status_t setFreezeTint( status_t setFreezeTint(
const sp<SurfaceComposerClient>& client, SurfaceID id, const sp<SurfaceComposerClient>& client, SurfaceID id,
uint32_t tint); uint32_t tint);
status_t setOrientation(int orientation);
static void closeGlobalTransaction() { static void closeGlobalTransaction() {
Composer::getInstance().closeGlobalTransactionImpl(); Composer::getInstance().closeGlobalTransactionImpl();
@ -133,14 +136,18 @@ void Composer::closeGlobalTransactionImpl() {
sp<ISurfaceComposer> sm(getComposerService()); sp<ISurfaceComposer> sm(getComposerService());
Vector<ComposerState> transaction; Vector<ComposerState> transaction;
int orientation;
{ // scope for the lock { // scope for the lock
Mutex::Autolock _l(mLock); Mutex::Autolock _l(mLock);
transaction = mStates; transaction = mStates;
mStates.clear(); mStates.clear();
orientation = mOrientation;
mOrientation = ISurfaceComposer::eOrientationUnchanged;
} }
sm->setTransactionState(transaction); sm->setTransactionState(transaction, orientation);
} }
layer_state_t* Composer::getLayerStateLocked( layer_state_t* Composer::getLayerStateLocked(
@ -260,6 +267,12 @@ status_t Composer::setFreezeTint(const sp<SurfaceComposerClient>& client,
return NO_ERROR; return NO_ERROR;
} }
status_t Composer::setOrientation(int orientation) {
Mutex::Autolock _l(mLock);
mOrientation = orientation;
return NO_ERROR;
}
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
SurfaceComposerClient::SurfaceComposerClient() 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); 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( status_t SurfaceComposerClient::getDisplayInfo(
@ -491,21 +510,14 @@ ssize_t SurfaceComposerClient::getNumberOfDisplays()
status_t SurfaceComposerClient::freezeDisplay(DisplayID dpy, uint32_t flags) status_t SurfaceComposerClient::freezeDisplay(DisplayID dpy, uint32_t flags)
{ {
sp<ISurfaceComposer> sm(getComposerService()); // This has been made a no-op because it can cause Gralloc buffer deadlocks.
return sm->freezeDisplay(dpy, flags); return NO_ERROR;
} }
status_t SurfaceComposerClient::unfreezeDisplay(DisplayID dpy, uint32_t flags) status_t SurfaceComposerClient::unfreezeDisplay(DisplayID dpy, uint32_t flags)
{ {
sp<ISurfaceComposer> sm(getComposerService()); // This has been made a no-op because it can cause Gralloc buffer deadlocks.
return sm->unfreezeDisplay(dpy, flags); return NO_ERROR;
}
int SurfaceComposerClient::setOrientation(DisplayID dpy,
int orientation, uint32_t flags)
{
sp<ISurfaceComposer> sm(getComposerService());
return sm->setOrientation(dpy, orientation, flags);
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@ -572,4 +584,3 @@ size_t ScreenshotClient::getSize() const {
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
}; // namespace android }; // namespace android

View File

@ -1234,10 +1234,22 @@ uint32_t SurfaceFlinger::setTransactionFlags(uint32_t flags)
} }
void SurfaceFlinger::setTransactionState(const Vector<ComposerState>& state) { void SurfaceFlinger::setTransactionState(const Vector<ComposerState>& state,
int orientation) {
Mutex::Autolock _l(mStateLock); Mutex::Autolock _l(mStateLock);
uint32_t flags = 0; uint32_t flags = 0;
if (mCurrentState.orientation != orientation) {
if (uint32_t(orientation)<=eOrientation270 || orientation==42) {
mCurrentState.orientation = orientation;
flags |= eTransactionNeeded;
mResizeTransationPending = true;
} else if (orientation != eOrientationUnchanged) {
LOGW("setTransactionState: ignoring unrecognized orientation: %d",
orientation);
}
}
const size_t count = state.size(); const size_t count = state.size();
for (size_t i=0 ; i<count ; i++) { for (size_t i=0 ; i<count ; i++) {
const ComposerState& s(state[i]); const ComposerState& s(state[i]);

View File

@ -167,7 +167,8 @@ public:
virtual sp<IGraphicBufferAlloc> createGraphicBufferAlloc(); virtual sp<IGraphicBufferAlloc> createGraphicBufferAlloc();
virtual sp<IMemoryHeap> getCblk() const; virtual sp<IMemoryHeap> getCblk() const;
virtual void bootFinished(); virtual void bootFinished();
virtual void setTransactionState(const Vector<ComposerState>& state); virtual void setTransactionState(const Vector<ComposerState>& state,
int orientation);
virtual status_t freezeDisplay(DisplayID dpy, uint32_t flags); virtual status_t freezeDisplay(DisplayID dpy, uint32_t flags);
virtual status_t unfreezeDisplay(DisplayID dpy, uint32_t flags); virtual status_t unfreezeDisplay(DisplayID dpy, uint32_t flags);
virtual int setOrientation(DisplayID dpy, int orientation, uint32_t flags); virtual int setOrientation(DisplayID dpy, int orientation, uint32_t flags);