Add ISurfaceComposer::destroyDisplay

Bug: 10191053
Change-Id: Ia89286f95421344a60ffedaaca5825c4e3cd7f9e
This commit is contained in:
Jesse Hall 2013-08-08 12:15:49 -07:00
parent 74020ca133
commit 6c913be9ca
6 changed files with 80 additions and 17 deletions

View File

@ -70,12 +70,17 @@ public:
/* return an IDisplayEventConnection */ /* return an IDisplayEventConnection */
virtual sp<IDisplayEventConnection> createDisplayEventConnection() = 0; virtual sp<IDisplayEventConnection> createDisplayEventConnection() = 0;
/* create a display /* create a virtual display
* requires ACCESS_SURFACE_FLINGER permission. * requires ACCESS_SURFACE_FLINGER permission.
*/ */
virtual sp<IBinder> createDisplay(const String8& displayName, virtual sp<IBinder> createDisplay(const String8& displayName,
bool secure) = 0; bool secure) = 0;
/* destroy a virtual display
* requires ACCESS_SURFACE_FLINGER permission.
*/
virtual void destroyDisplay(const sp<IBinder>& display) = 0;
/* get the token for the existing default displays. possible values /* get the token for the existing default displays. possible values
* for id are eDisplayIdMain and eDisplayIdHdmi. * for id are eDisplayIdMain and eDisplayIdHdmi.
*/ */
@ -130,6 +135,7 @@ public:
CREATE_GRAPHIC_BUFFER_ALLOC, CREATE_GRAPHIC_BUFFER_ALLOC,
CREATE_DISPLAY_EVENT_CONNECTION, CREATE_DISPLAY_EVENT_CONNECTION,
CREATE_DISPLAY, CREATE_DISPLAY,
DESTROY_DISPLAY,
GET_BUILT_IN_DISPLAY, GET_BUILT_IN_DISPLAY,
SET_TRANSACTION_STATE, SET_TRANSACTION_STATE,
AUTHENTICATE_SURFACE, AUTHENTICATE_SURFACE,

View File

@ -48,7 +48,7 @@ class Region;
class SurfaceComposerClient : public RefBase class SurfaceComposerClient : public RefBase
{ {
friend class Composer; friend class Composer;
public: public:
SurfaceComposerClient(); SurfaceComposerClient();
virtual ~SurfaceComposerClient(); virtual ~SurfaceComposerClient();
@ -57,7 +57,7 @@ public:
// Return the connection of this client // Return the connection of this client
sp<IBinder> connection() const; sp<IBinder> connection() const;
// Forcibly remove connection before all references have gone away. // Forcibly remove connection before all references have gone away.
void dispose(); void dispose();
@ -86,9 +86,12 @@ public:
uint32_t flags = 0 // usage flags uint32_t flags = 0 // usage flags
); );
//! Create a display //! Create a virtual display
static sp<IBinder> createDisplay(const String8& displayName, bool secure); static sp<IBinder> createDisplay(const String8& displayName, bool secure);
//! Destroy a virtual display
static void destroyDisplay(const sp<IBinder>& display);
//! Get the token for the existing default displays. //! Get the token for the existing default displays.
//! Possible values for id are eDisplayIdMain and eDisplayIdHdmi. //! Possible values for id are eDisplayIdMain and eDisplayIdHdmi.
static sp<IBinder> getBuiltInDisplay(int32_t id); static sp<IBinder> getBuiltInDisplay(int32_t id);

View File

@ -185,6 +185,14 @@ public:
return reply.readStrongBinder(); return reply.readStrongBinder();
} }
virtual void destroyDisplay(const sp<IBinder>& display)
{
Parcel data, reply;
data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
data.writeStrongBinder(display);
remote()->transact(BnSurfaceComposer::DESTROY_DISPLAY, data, &reply);
}
virtual sp<IBinder> getBuiltInDisplay(int32_t id) virtual sp<IBinder> getBuiltInDisplay(int32_t id)
{ {
Parcel data, reply; Parcel data, reply;
@ -233,12 +241,14 @@ status_t BnSurfaceComposer::onTransact(
CHECK_INTERFACE(ISurfaceComposer, data, reply); CHECK_INTERFACE(ISurfaceComposer, data, reply);
sp<IBinder> b = createConnection()->asBinder(); sp<IBinder> b = createConnection()->asBinder();
reply->writeStrongBinder(b); reply->writeStrongBinder(b);
} break; return NO_ERROR;
}
case CREATE_GRAPHIC_BUFFER_ALLOC: { case CREATE_GRAPHIC_BUFFER_ALLOC: {
CHECK_INTERFACE(ISurfaceComposer, data, reply); CHECK_INTERFACE(ISurfaceComposer, data, reply);
sp<IBinder> b = createGraphicBufferAlloc()->asBinder(); sp<IBinder> b = createGraphicBufferAlloc()->asBinder();
reply->writeStrongBinder(b); reply->writeStrongBinder(b);
} break; return NO_ERROR;
}
case SET_TRANSACTION_STATE: { case SET_TRANSACTION_STATE: {
CHECK_INTERFACE(ISurfaceComposer, data, reply); CHECK_INTERFACE(ISurfaceComposer, data, reply);
size_t count = data.readInt32(); size_t count = data.readInt32();
@ -259,11 +269,13 @@ status_t BnSurfaceComposer::onTransact(
} }
uint32_t flags = data.readInt32(); uint32_t flags = data.readInt32();
setTransactionState(state, displays, flags); setTransactionState(state, displays, flags);
} break; return NO_ERROR;
}
case BOOT_FINISHED: { case BOOT_FINISHED: {
CHECK_INTERFACE(ISurfaceComposer, data, reply); CHECK_INTERFACE(ISurfaceComposer, data, reply);
bootFinished(); bootFinished();
} break; return NO_ERROR;
}
case CAPTURE_SCREEN: { case CAPTURE_SCREEN: {
CHECK_INTERFACE(ISurfaceComposer, data, reply); CHECK_INTERFACE(ISurfaceComposer, data, reply);
sp<IBinder> display = data.readStrongBinder(); sp<IBinder> display = data.readStrongBinder();
@ -276,20 +288,22 @@ status_t BnSurfaceComposer::onTransact(
status_t res = captureScreen(display, producer, status_t res = captureScreen(display, producer,
reqWidth, reqHeight, minLayerZ, maxLayerZ); reqWidth, reqHeight, minLayerZ, maxLayerZ);
reply->writeInt32(res); reply->writeInt32(res);
} break; return NO_ERROR;
}
case AUTHENTICATE_SURFACE: { case AUTHENTICATE_SURFACE: {
CHECK_INTERFACE(ISurfaceComposer, data, reply); CHECK_INTERFACE(ISurfaceComposer, data, reply);
sp<IGraphicBufferProducer> bufferProducer = sp<IGraphicBufferProducer> bufferProducer =
interface_cast<IGraphicBufferProducer>(data.readStrongBinder()); interface_cast<IGraphicBufferProducer>(data.readStrongBinder());
int32_t result = authenticateSurfaceTexture(bufferProducer) ? 1 : 0; int32_t result = authenticateSurfaceTexture(bufferProducer) ? 1 : 0;
reply->writeInt32(result); reply->writeInt32(result);
} break; return NO_ERROR;
}
case CREATE_DISPLAY_EVENT_CONNECTION: { case CREATE_DISPLAY_EVENT_CONNECTION: {
CHECK_INTERFACE(ISurfaceComposer, data, reply); CHECK_INTERFACE(ISurfaceComposer, data, reply);
sp<IDisplayEventConnection> connection(createDisplayEventConnection()); sp<IDisplayEventConnection> connection(createDisplayEventConnection());
reply->writeStrongBinder(connection->asBinder()); reply->writeStrongBinder(connection->asBinder());
return NO_ERROR; return NO_ERROR;
} break; }
case CREATE_DISPLAY: { case CREATE_DISPLAY: {
CHECK_INTERFACE(ISurfaceComposer, data, reply); CHECK_INTERFACE(ISurfaceComposer, data, reply);
String8 displayName = data.readString8(); String8 displayName = data.readString8();
@ -297,24 +311,32 @@ status_t BnSurfaceComposer::onTransact(
sp<IBinder> display(createDisplay(displayName, secure)); sp<IBinder> display(createDisplay(displayName, secure));
reply->writeStrongBinder(display); reply->writeStrongBinder(display);
return NO_ERROR; return NO_ERROR;
} break; }
case DESTROY_DISPLAY: {
CHECK_INTERFACE(ISurfaceComposer, data, reply);
sp<IBinder> display = data.readStrongBinder();
destroyDisplay(display);
return NO_ERROR;
}
case GET_BUILT_IN_DISPLAY: { case GET_BUILT_IN_DISPLAY: {
CHECK_INTERFACE(ISurfaceComposer, data, reply); CHECK_INTERFACE(ISurfaceComposer, data, reply);
int32_t id = data.readInt32(); int32_t id = data.readInt32();
sp<IBinder> display(getBuiltInDisplay(id)); sp<IBinder> display(getBuiltInDisplay(id));
reply->writeStrongBinder(display); reply->writeStrongBinder(display);
return NO_ERROR; return NO_ERROR;
} break; }
case BLANK: { case BLANK: {
CHECK_INTERFACE(ISurfaceComposer, data, reply); CHECK_INTERFACE(ISurfaceComposer, data, reply);
sp<IBinder> display = data.readStrongBinder(); sp<IBinder> display = data.readStrongBinder();
blank(display); blank(display);
} break; return NO_ERROR;
}
case UNBLANK: { case UNBLANK: {
CHECK_INTERFACE(ISurfaceComposer, data, reply); CHECK_INTERFACE(ISurfaceComposer, data, reply);
sp<IBinder> display = data.readStrongBinder(); sp<IBinder> display = data.readStrongBinder();
unblank(display); unblank(display);
} break; return NO_ERROR;
}
case GET_DISPLAY_INFO: { case GET_DISPLAY_INFO: {
CHECK_INTERFACE(ISurfaceComposer, data, reply); CHECK_INTERFACE(ISurfaceComposer, data, reply);
DisplayInfo info; DisplayInfo info;
@ -322,10 +344,13 @@ status_t BnSurfaceComposer::onTransact(
status_t result = getDisplayInfo(display, &info); status_t result = getDisplayInfo(display, &info);
memcpy(reply->writeInplace(sizeof(DisplayInfo)), &info, sizeof(DisplayInfo)); memcpy(reply->writeInplace(sizeof(DisplayInfo)), &info, sizeof(DisplayInfo));
reply->writeInt32(result); reply->writeInt32(result);
} break; return NO_ERROR;
default: }
default: {
return BBinder::onTransact(code, data, reply, flags); return BBinder::onTransact(code, data, reply, flags);
}
} }
// should be unreachable
return NO_ERROR; return NO_ERROR;
} }

View File

@ -135,6 +135,7 @@ class Composer : public Singleton<Composer>
public: public:
sp<IBinder> createDisplay(const String8& displayName, bool secure); sp<IBinder> createDisplay(const String8& displayName, bool secure);
void destroyDisplay(const sp<IBinder>& display);
sp<IBinder> getBuiltInDisplay(int32_t id); sp<IBinder> getBuiltInDisplay(int32_t id);
status_t setPosition(const sp<SurfaceComposerClient>& client, const sp<IBinder>& id, status_t setPosition(const sp<SurfaceComposerClient>& client, const sp<IBinder>& id,
@ -188,6 +189,10 @@ sp<IBinder> Composer::createDisplay(const String8& displayName, bool secure) {
secure); secure);
} }
void Composer::destroyDisplay(const sp<IBinder>& display) {
return ComposerService::getComposerService()->destroyDisplay(display);
}
sp<IBinder> Composer::getBuiltInDisplay(int32_t id) { sp<IBinder> Composer::getBuiltInDisplay(int32_t id) {
return ComposerService::getComposerService()->getBuiltInDisplay(id); return ComposerService::getComposerService()->getBuiltInDisplay(id);
} }
@ -490,6 +495,10 @@ sp<IBinder> SurfaceComposerClient::createDisplay(const String8& displayName,
return Composer::getInstance().createDisplay(displayName, secure); return Composer::getInstance().createDisplay(displayName, secure);
} }
void SurfaceComposerClient::destroyDisplay(const sp<IBinder>& display) {
Composer::getInstance().destroyDisplay(display);
}
sp<IBinder> SurfaceComposerClient::getBuiltInDisplay(int32_t id) { sp<IBinder> SurfaceComposerClient::getBuiltInDisplay(int32_t id) {
return Composer::getInstance().getBuiltInDisplay(id); return Composer::getInstance().getBuiltInDisplay(id);
} }

View File

@ -205,6 +205,25 @@ sp<IBinder> SurfaceFlinger::createDisplay(const String8& displayName,
return token; return token;
} }
void SurfaceFlinger::destroyDisplay(const sp<IBinder>& display) {
Mutex::Autolock _l(mStateLock);
ssize_t idx = mCurrentState.displays.indexOfKey(display);
if (idx < 0) {
ALOGW("destroyDisplay: invalid display token");
return;
}
const DisplayDeviceState& info(mCurrentState.displays.valueAt(idx));
if (!info.isVirtualDisplay()) {
ALOGE("destroyDisplay called for non-virtual display");
return;
}
mCurrentState.displays.removeItemsAt(idx);
setTransactionFlags(eDisplayTransactionNeeded);
}
void SurfaceFlinger::createBuiltinDisplayLocked(DisplayDevice::DisplayType type) { void SurfaceFlinger::createBuiltinDisplayLocked(DisplayDevice::DisplayType type) {
ALOGW_IF(mBuiltinDisplays[type], ALOGW_IF(mBuiltinDisplays[type],
"Overwriting display token for display type %d", type); "Overwriting display token for display type %d", type);

View File

@ -184,6 +184,7 @@ private:
virtual sp<ISurfaceComposerClient> createConnection(); virtual sp<ISurfaceComposerClient> createConnection();
virtual sp<IGraphicBufferAlloc> createGraphicBufferAlloc(); virtual sp<IGraphicBufferAlloc> createGraphicBufferAlloc();
virtual sp<IBinder> createDisplay(const String8& displayName, bool secure); virtual sp<IBinder> createDisplay(const String8& displayName, bool secure);
virtual void destroyDisplay(const sp<IBinder>& display);
virtual sp<IBinder> getBuiltInDisplay(int32_t id); virtual sp<IBinder> getBuiltInDisplay(int32_t id);
virtual void setTransactionState(const Vector<ComposerState>& state, virtual void setTransactionState(const Vector<ComposerState>& state,
const Vector<DisplayState>& displays, uint32_t flags); const Vector<DisplayState>& displays, uint32_t flags);