diff --git a/include/gui/ISurface.h b/include/gui/ISurface.h index ce6e715b3..5a928f20b 100644 --- a/include/gui/ISurface.h +++ b/include/gui/ISurface.h @@ -29,8 +29,6 @@ namespace android { -typedef int32_t SurfaceID; - class IGraphicBufferProducer; class ISurface : public IInterface diff --git a/include/gui/ISurfaceComposerClient.h b/include/gui/ISurfaceComposerClient.h index e256e3345..23d1d4c1b 100644 --- a/include/gui/ISurfaceComposerClient.h +++ b/include/gui/ISurfaceComposerClient.h @@ -54,24 +54,17 @@ public: eFXSurfaceMask = 0x000F0000, }; - struct surface_data_t { - int32_t token; - int32_t identity; - status_t readFromParcel(const Parcel& parcel); - status_t writeToParcel(Parcel* parcel) const; - }; - /* * Requires ACCESS_SURFACE_FLINGER permission */ - virtual sp createSurface(surface_data_t* data, + virtual sp createSurface( const String8& name, uint32_t w, uint32_t h, PixelFormat format, uint32_t flags) = 0; /* * Requires ACCESS_SURFACE_FLINGER permission */ - virtual status_t destroySurface(SurfaceID sid) = 0; + virtual status_t destroySurface(const sp& handle) = 0; }; // ---------------------------------------------------------------------------- diff --git a/include/gui/Surface.h b/include/gui/Surface.h index 8654f76ab..27921df78 100644 --- a/include/gui/Surface.h +++ b/include/gui/Surface.h @@ -50,13 +50,11 @@ public: return (surface != 0) && surface->isValid(); } bool isValid() { - return mToken>=0 && mClient!=0; + return mSurface!=0 && mClient!=0; } static bool isSameSurface( const sp& lhs, const sp& rhs); - uint32_t getIdentity() const { return mIdentity; } - // release surface data from java void clear(); @@ -87,8 +85,7 @@ private: SurfaceControl( const sp& client, - const sp& surface, - const ISurfaceComposerClient::surface_data_t& data); + const sp& surface); ~SurfaceControl(); @@ -96,11 +93,8 @@ private: void destroy(); sp mClient; - sp mSurface; - SurfaceID mToken; - uint32_t mIdentity; + sp mSurface; mutable Mutex mLock; - mutable sp mSurfaceData; }; diff --git a/include/gui/SurfaceComposerClient.h b/include/gui/SurfaceComposerClient.h index 22e6b14e0..dbdd3a9cb 100644 --- a/include/gui/SurfaceComposerClient.h +++ b/include/gui/SurfaceComposerClient.h @@ -108,18 +108,18 @@ public: //! Flag the currently open transaction as an animation transaction. static void setAnimationTransaction(); - status_t hide(SurfaceID id); - status_t show(SurfaceID id); - status_t setFlags(SurfaceID id, uint32_t flags, uint32_t mask); - status_t setTransparentRegionHint(SurfaceID id, const Region& transparent); - status_t setLayer(SurfaceID id, int32_t layer); - status_t setAlpha(SurfaceID id, float alpha=1.0f); - status_t setMatrix(SurfaceID id, float dsdx, float dtdx, float dsdy, float dtdy); - status_t setPosition(SurfaceID id, float x, float y); - status_t setSize(SurfaceID id, uint32_t w, uint32_t h); - status_t setCrop(SurfaceID id, const Rect& crop); - status_t setLayerStack(SurfaceID id, uint32_t layerStack); - status_t destroySurface(SurfaceID sid); + status_t hide(const sp& id); + status_t show(const sp& id); + status_t setFlags(const sp& id, uint32_t flags, uint32_t mask); + status_t setTransparentRegionHint(const sp& id, const Region& transparent); + status_t setLayer(const sp& id, int32_t layer); + status_t setAlpha(const sp& id, float alpha=1.0f); + status_t setMatrix(const sp& id, float dsdx, float dtdx, float dsdy, float dtdy); + status_t setPosition(const sp& id, float x, float y); + status_t setSize(const sp& id, uint32_t w, uint32_t h); + status_t setCrop(const sp& id, const Rect& crop); + status_t setLayerStack(const sp& id, uint32_t layerStack); + status_t destroySurface(const sp& id); static void setDisplaySurface(const sp& token, const sp& bufferProducer); diff --git a/include/private/gui/LayerState.h b/include/private/gui/LayerState.h index 5b400ca3a..0798e170e 100644 --- a/include/private/gui/LayerState.h +++ b/include/private/gui/LayerState.h @@ -51,7 +51,7 @@ struct layer_state_t { }; layer_state_t() - : surface(0), what(0), + : what(0), x(0), y(0), z(0), w(0), h(0), layerStack(0), alpha(0), flags(0), mask(0), reserved(0) @@ -70,7 +70,7 @@ struct layer_state_t { float dsdy; float dtdy; }; - SurfaceID surface; + sp surface; uint32_t what; float x; float y; diff --git a/libs/gui/ISurfaceComposerClient.cpp b/libs/gui/ISurfaceComposerClient.cpp index 8f7bc052c..101292d94 100644 --- a/libs/gui/ISurfaceComposerClient.cpp +++ b/libs/gui/ISurfaceComposerClient.cpp @@ -50,8 +50,7 @@ public: { } - virtual sp createSurface( surface_data_t* params, - const String8& name, + virtual sp createSurface( const String8& name, uint32_t w, uint32_t h, PixelFormat format, @@ -65,15 +64,14 @@ public: data.writeInt32(format); data.writeInt32(flags); remote()->transact(CREATE_SURFACE, data, &reply); - params->readFromParcel(reply); return interface_cast(reply.readStrongBinder()); } - virtual status_t destroySurface(SurfaceID sid) + virtual status_t destroySurface(const sp& handle) { Parcel data, reply; data.writeInterfaceToken(ISurfaceComposerClient::getInterfaceDescriptor()); - data.writeInt32(sid); + data.writeStrongBinder(handle); remote()->transact(DESTROY_SURFACE, data, &reply); return reply.readInt32(); } @@ -89,21 +87,18 @@ status_t BnSurfaceComposerClient::onTransact( switch(code) { case CREATE_SURFACE: { CHECK_INTERFACE(ISurfaceComposerClient, data, reply); - surface_data_t params; String8 name = data.readString8(); uint32_t w = data.readInt32(); uint32_t h = data.readInt32(); PixelFormat format = data.readInt32(); uint32_t flags = data.readInt32(); - sp s = createSurface(¶ms, name, w, h, - format, flags); - params.writeToParcel(reply); + sp s = createSurface(name, w, h, format, flags); reply->writeStrongBinder(s->asBinder()); return NO_ERROR; } break; case DESTROY_SURFACE: { CHECK_INTERFACE(ISurfaceComposerClient, data, reply); - reply->writeInt32( destroySurface( data.readInt32() ) ); + reply->writeInt32( destroySurface( data.readStrongBinder() ) ); return NO_ERROR; } break; default: @@ -111,20 +106,4 @@ status_t BnSurfaceComposerClient::onTransact( } } -// ---------------------------------------------------------------------- - -status_t ISurfaceComposerClient::surface_data_t::readFromParcel(const Parcel& parcel) -{ - token = parcel.readInt32(); - identity = parcel.readInt32(); - return NO_ERROR; -} - -status_t ISurfaceComposerClient::surface_data_t::writeToParcel(Parcel* parcel) const -{ - parcel->writeInt32(token); - parcel->writeInt32(identity); - return NO_ERROR; -} - }; // namespace android diff --git a/libs/gui/LayerState.cpp b/libs/gui/LayerState.cpp index 5e5edcd2d..acdbd7716 100644 --- a/libs/gui/LayerState.cpp +++ b/libs/gui/LayerState.cpp @@ -24,29 +24,41 @@ namespace android { status_t layer_state_t::write(Parcel& output) const { - status_t err; - - err = output.write(transparentRegion); - if (err < NO_ERROR) return err; - - // NOTE: regions are at the end of the structure - size_t size = sizeof(layer_state_t); - size -= sizeof(transparentRegion); - err = output.write(this, size); - return err; + output.writeStrongBinder(surface); + output.writeInt32(what); + output.writeFloat(x); + output.writeFloat(y); + output.writeInt32(z); + output.writeInt32(w); + output.writeInt32(h); + output.writeInt32(layerStack); + output.writeFloat(alpha); + output.writeInt32(flags); + output.writeInt32(mask); + *reinterpret_cast( + output.writeInplace(sizeof(layer_state_t::matrix22_t))) = matrix; + output.write(crop); + output.write(transparentRegion); + return NO_ERROR; } status_t layer_state_t::read(const Parcel& input) { - status_t err; - - err = input.read(transparentRegion); - if (err < NO_ERROR) return err; - - // NOTE: regions are at the end of the structure - size_t size = sizeof(layer_state_t); - size -= sizeof(transparentRegion); - input.read(this, size); + surface = input.readStrongBinder(); + what = input.readInt32(); + x = input.readFloat(); + y = input.readFloat(); + z = input.readInt32(); + w = input.readInt32(); + h = input.readInt32(); + layerStack = input.readInt32(); + alpha = input.readFloat(); + flags = input.readInt32(); + mask = input.readInt32(); + matrix = *reinterpret_cast( + input.readInplace(sizeof(layer_state_t::matrix22_t))); + input.read(crop); + input.read(transparentRegion); return NO_ERROR; } diff --git a/libs/gui/Surface.cpp b/libs/gui/Surface.cpp index 51d37b3cf..81fc019ea 100644 --- a/libs/gui/Surface.cpp +++ b/libs/gui/Surface.cpp @@ -48,11 +48,12 @@ namespace android { SurfaceControl::SurfaceControl( const sp& client, - const sp& surface, - const ISurfaceComposerClient::surface_data_t& data) - : mClient(client), mSurface(surface), - mToken(data.token), mIdentity(data.identity) + const sp& surface) + : mClient(client) { + if (surface != 0) { + mSurface = surface->asBinder(); + } } SurfaceControl::~SurfaceControl() @@ -63,9 +64,8 @@ SurfaceControl::~SurfaceControl() void SurfaceControl::destroy() { if (isValid()) { - mClient->destroySurface(mToken); + mClient->destroySurface(mSurface); } - // clear all references and trigger an IPC now, to make sure things // happen without delay, since these resources are quite heavy. mClient.clear(); @@ -89,81 +89,81 @@ bool SurfaceControl::isSameSurface( { if (lhs == 0 || rhs == 0) return false; - return lhs->mSurface->asBinder() == rhs->mSurface->asBinder(); + return lhs->mSurface == rhs->mSurface; } status_t SurfaceControl::setLayerStack(int32_t layerStack) { status_t err = validate(); if (err < 0) return err; const sp& client(mClient); - return client->setLayerStack(mToken, layerStack); + return client->setLayerStack(mSurface, layerStack); } status_t SurfaceControl::setLayer(int32_t layer) { status_t err = validate(); if (err < 0) return err; const sp& client(mClient); - return client->setLayer(mToken, layer); + return client->setLayer(mSurface, layer); } status_t SurfaceControl::setPosition(int32_t x, int32_t y) { status_t err = validate(); if (err < 0) return err; const sp& client(mClient); - return client->setPosition(mToken, x, y); + return client->setPosition(mSurface, x, y); } status_t SurfaceControl::setSize(uint32_t w, uint32_t h) { status_t err = validate(); if (err < 0) return err; const sp& client(mClient); - return client->setSize(mToken, w, h); + return client->setSize(mSurface, w, h); } status_t SurfaceControl::hide() { status_t err = validate(); if (err < 0) return err; const sp& client(mClient); - return client->hide(mToken); + return client->hide(mSurface); } status_t SurfaceControl::show() { status_t err = validate(); if (err < 0) return err; const sp& client(mClient); - return client->show(mToken); + return client->show(mSurface); } status_t SurfaceControl::setFlags(uint32_t flags, uint32_t mask) { status_t err = validate(); if (err < 0) return err; const sp& client(mClient); - return client->setFlags(mToken, flags, mask); + return client->setFlags(mSurface, flags, mask); } status_t SurfaceControl::setTransparentRegionHint(const Region& transparent) { status_t err = validate(); if (err < 0) return err; const sp& client(mClient); - return client->setTransparentRegionHint(mToken, transparent); + return client->setTransparentRegionHint(mSurface, transparent); } status_t SurfaceControl::setAlpha(float alpha) { status_t err = validate(); if (err < 0) return err; const sp& client(mClient); - return client->setAlpha(mToken, alpha); + return client->setAlpha(mSurface, alpha); } status_t SurfaceControl::setMatrix(float dsdx, float dtdx, float dsdy, float dtdy) { status_t err = validate(); if (err < 0) return err; const sp& client(mClient); - return client->setMatrix(mToken, dsdx, dtdx, dsdy, dtdy); + return client->setMatrix(mSurface, dsdx, dtdx, dsdy, dtdy); } status_t SurfaceControl::setCrop(const Rect& crop) { status_t err = validate(); if (err < 0) return err; const sp& client(mClient); - return client->setCrop(mToken, crop); + return client->setCrop(mSurface, crop); } status_t SurfaceControl::validate() const { - if (mToken<0 || mClient==0) { - ALOGE("invalid token (%d, identity=%u) or client (%p)", - mToken, mIdentity, mClient.get()); + if (mSurface==0 || mClient==0) { + ALOGE("invalid ISurface (%p) or client (%p)", + mSurface.get(), mClient.get()); return NO_INIT; } return NO_ERROR; @@ -172,15 +172,12 @@ status_t SurfaceControl::validate() const status_t SurfaceControl::writeSurfaceToParcel( const sp& control, Parcel* parcel) { - sp sur; - uint32_t identity = 0; + sp sur; if (SurfaceControl::isValid(control)) { - sur = control->mSurface; - identity = control->mIdentity; + sur = control->mSurface; } - parcel->writeStrongBinder(sur!=0 ? sur->asBinder() : NULL); + parcel->writeStrongBinder(sur); parcel->writeStrongBinder(NULL); // NULL IGraphicBufferProducer in this case. - parcel->writeInt32(identity); return NO_ERROR; } @@ -198,13 +195,10 @@ sp SurfaceControl::getSurface() const // Surface // ============================================================================ -// --------------------------------------------------------------------------- - Surface::Surface(const sp& surface) - : SurfaceTextureClient(), - mSurface(surface->mSurface), - mIdentity(surface->mIdentity) + : SurfaceTextureClient() { + mSurface = interface_cast(surface->mSurface); sp st; if (mSurface != NULL) { st = mSurface->getSurfaceTexture(); @@ -223,15 +217,12 @@ Surface::Surface(const Parcel& parcel, const sp& ref) } else if (mSurface != NULL) { st = mSurface->getSurfaceTexture(); } - - mIdentity = parcel.readInt32(); init(st); } Surface::Surface(const sp& st) : SurfaceTextureClient(), - mSurface(NULL), - mIdentity(0) + mSurface(NULL) { init(st); } @@ -245,19 +236,16 @@ status_t Surface::writeToParcel( if (Surface::isValid(surface)) { sur = surface->mSurface; st = surface->getISurfaceTexture(); - identity = surface->mIdentity; } else if (surface != 0 && (surface->mSurface != NULL || surface->getISurfaceTexture() != NULL)) { ALOGE("Parceling invalid surface with non-NULL ISurface/IGraphicBufferProducer " - "as NULL: mSurface = %p, bufferProducer = %p, mIdentity = %d, ", - surface->mSurface.get(), surface->getISurfaceTexture().get(), - surface->mIdentity); + "as NULL: mSurface = %p, bufferProducer = %p ", + surface->mSurface.get(), surface->getISurfaceTexture().get()); } parcel->writeStrongBinder(sur != NULL ? sur->asBinder() : NULL); parcel->writeStrongBinder(st != NULL ? st->asBinder() : NULL); - parcel->writeInt32(identity); return NO_ERROR; } diff --git a/libs/gui/SurfaceComposerClient.cpp b/libs/gui/SurfaceComposerClient.cpp index 0c6881a69..0bafc925d 100644 --- a/libs/gui/SurfaceComposerClient.cpp +++ b/libs/gui/SurfaceComposerClient.cpp @@ -128,7 +128,7 @@ class Composer : public Singleton void setAnimationTransactionImpl(); layer_state_t* getLayerStateLocked( - const sp& client, SurfaceID id); + const sp& client, const sp& id); DisplayState& getDisplayStateLocked(const sp& token); @@ -136,26 +136,26 @@ public: sp createDisplay(const String8& displayName, bool secure); sp getBuiltInDisplay(int32_t id); - status_t setPosition(const sp& client, SurfaceID id, + status_t setPosition(const sp& client, const sp& id, float x, float y); - status_t setSize(const sp& client, SurfaceID id, + status_t setSize(const sp& client, const sp& id, uint32_t w, uint32_t h); - status_t setLayer(const sp& client, SurfaceID id, + status_t setLayer(const sp& client, const sp& id, int32_t z); - status_t setFlags(const sp& client, SurfaceID id, + status_t setFlags(const sp& client, const sp& id, uint32_t flags, uint32_t mask); status_t setTransparentRegionHint( - const sp& client, SurfaceID id, + const sp& client, const sp& id, const Region& transparentRegion); - status_t setAlpha(const sp& client, SurfaceID id, + status_t setAlpha(const sp& client, const sp& id, float alpha); - status_t setMatrix(const sp& client, SurfaceID id, + status_t setMatrix(const sp& client, const sp& id, float dsdx, float dtdx, float dsdy, float dtdy); status_t setOrientation(int orientation); - status_t setCrop(const sp& client, SurfaceID id, + status_t setCrop(const sp& client, const sp& id, const Rect& crop); status_t setLayerStack(const sp& client, - SurfaceID id, uint32_t layerStack); + const sp& id, uint32_t layerStack); void setDisplaySurface(const sp& token, const sp& bufferProducer); @@ -241,7 +241,7 @@ void Composer::setAnimationTransactionImpl() { } layer_state_t* Composer::getLayerStateLocked( - const sp& client, SurfaceID id) { + const sp& client, const sp& id) { ComposerState s; s.client = client->mClient; @@ -258,7 +258,7 @@ layer_state_t* Composer::getLayerStateLocked( } status_t Composer::setPosition(const sp& client, - SurfaceID id, float x, float y) { + const sp& id, float x, float y) { Mutex::Autolock _l(mLock); layer_state_t* s = getLayerStateLocked(client, id); if (!s) @@ -270,7 +270,7 @@ status_t Composer::setPosition(const sp& client, } status_t Composer::setSize(const sp& client, - SurfaceID id, uint32_t w, uint32_t h) { + const sp& id, uint32_t w, uint32_t h) { Mutex::Autolock _l(mLock); layer_state_t* s = getLayerStateLocked(client, id); if (!s) @@ -286,7 +286,7 @@ status_t Composer::setSize(const sp& client, } status_t Composer::setLayer(const sp& client, - SurfaceID id, int32_t z) { + const sp& id, int32_t z) { Mutex::Autolock _l(mLock); layer_state_t* s = getLayerStateLocked(client, id); if (!s) @@ -297,7 +297,7 @@ status_t Composer::setLayer(const sp& client, } status_t Composer::setFlags(const sp& client, - SurfaceID id, uint32_t flags, + const sp& id, uint32_t flags, uint32_t mask) { Mutex::Autolock _l(mLock); layer_state_t* s = getLayerStateLocked(client, id); @@ -311,7 +311,7 @@ status_t Composer::setFlags(const sp& client, } status_t Composer::setTransparentRegionHint( - const sp& client, SurfaceID id, + const sp& client, const sp& id, const Region& transparentRegion) { Mutex::Autolock _l(mLock); layer_state_t* s = getLayerStateLocked(client, id); @@ -323,7 +323,7 @@ status_t Composer::setTransparentRegionHint( } status_t Composer::setAlpha(const sp& client, - SurfaceID id, float alpha) { + const sp& id, float alpha) { Mutex::Autolock _l(mLock); layer_state_t* s = getLayerStateLocked(client, id); if (!s) @@ -334,7 +334,7 @@ status_t Composer::setAlpha(const sp& client, } status_t Composer::setLayerStack(const sp& client, - SurfaceID id, uint32_t layerStack) { + const sp& id, uint32_t layerStack) { Mutex::Autolock _l(mLock); layer_state_t* s = getLayerStateLocked(client, id); if (!s) @@ -345,7 +345,7 @@ status_t Composer::setLayerStack(const sp& client, } status_t Composer::setMatrix(const sp& client, - SurfaceID id, float dsdx, float dtdx, + const sp& id, float dsdx, float dtdx, float dsdy, float dtdy) { Mutex::Autolock _l(mLock); layer_state_t* s = getLayerStateLocked(client, id); @@ -362,7 +362,7 @@ status_t Composer::setMatrix(const sp& client, } status_t Composer::setCrop(const sp& client, - SurfaceID id, const Rect& crop) { + const sp& id, const Rect& crop) { Mutex::Autolock _l(mLock); layer_state_t* s = getLayerStateLocked(client, id); if (!s) @@ -472,11 +472,9 @@ sp SurfaceComposerClient::createSurface( { sp result; if (mStatus == NO_ERROR) { - ISurfaceComposerClient::surface_data_t data; - sp surface = mClient->createSurface(&data, name, - w, h, format, flags); + sp surface = mClient->createSurface(name, w, h, format, flags); if (surface != 0) { - result = new SurfaceControl(this, surface, data); + result = new SurfaceControl(this, surface); } } return result; @@ -491,7 +489,7 @@ sp SurfaceComposerClient::getBuiltInDisplay(int32_t id) { return Composer::getInstance().getBuiltInDisplay(id); } -status_t SurfaceComposerClient::destroySurface(SurfaceID sid) { +status_t SurfaceComposerClient::destroySurface(const sp& sid) { if (mStatus != NO_ERROR) return mStatus; status_t err = mClient->destroySurface(sid); @@ -518,53 +516,53 @@ void SurfaceComposerClient::setAnimationTransaction() { // ---------------------------------------------------------------------------- -status_t SurfaceComposerClient::setCrop(SurfaceID id, const Rect& crop) { +status_t SurfaceComposerClient::setCrop(const sp& id, const Rect& crop) { return getComposer().setCrop(this, id, crop); } -status_t SurfaceComposerClient::setPosition(SurfaceID id, float x, float y) { +status_t SurfaceComposerClient::setPosition(const sp& id, float x, float y) { return getComposer().setPosition(this, id, x, y); } -status_t SurfaceComposerClient::setSize(SurfaceID id, uint32_t w, uint32_t h) { +status_t SurfaceComposerClient::setSize(const sp& id, uint32_t w, uint32_t h) { return getComposer().setSize(this, id, w, h); } -status_t SurfaceComposerClient::setLayer(SurfaceID id, int32_t z) { +status_t SurfaceComposerClient::setLayer(const sp& id, int32_t z) { return getComposer().setLayer(this, id, z); } -status_t SurfaceComposerClient::hide(SurfaceID id) { +status_t SurfaceComposerClient::hide(const sp& id) { return getComposer().setFlags(this, id, layer_state_t::eLayerHidden, layer_state_t::eLayerHidden); } -status_t SurfaceComposerClient::show(SurfaceID id) { +status_t SurfaceComposerClient::show(const sp& id) { return getComposer().setFlags(this, id, 0, layer_state_t::eLayerHidden); } -status_t SurfaceComposerClient::setFlags(SurfaceID id, uint32_t flags, +status_t SurfaceComposerClient::setFlags(const sp& id, uint32_t flags, uint32_t mask) { return getComposer().setFlags(this, id, flags, mask); } -status_t SurfaceComposerClient::setTransparentRegionHint(SurfaceID id, +status_t SurfaceComposerClient::setTransparentRegionHint(const sp& id, const Region& transparentRegion) { return getComposer().setTransparentRegionHint(this, id, transparentRegion); } -status_t SurfaceComposerClient::setAlpha(SurfaceID id, float alpha) { +status_t SurfaceComposerClient::setAlpha(const sp& id, float alpha) { return getComposer().setAlpha(this, id, alpha); } -status_t SurfaceComposerClient::setLayerStack(SurfaceID id, uint32_t layerStack) { +status_t SurfaceComposerClient::setLayerStack(const sp& id, uint32_t layerStack) { return getComposer().setLayerStack(this, id, layerStack); } -status_t SurfaceComposerClient::setMatrix(SurfaceID id, float dsdx, float dtdx, +status_t SurfaceComposerClient::setMatrix(const sp& id, float dsdx, float dtdx, float dsdy, float dtdy) { return getComposer().setMatrix(this, id, dsdx, dtdx, dsdy, dtdy); } diff --git a/services/surfaceflinger/Client.cpp b/services/surfaceflinger/Client.cpp index c28254f6f..0f56f99d3 100644 --- a/services/surfaceflinger/Client.cpp +++ b/services/surfaceflinger/Client.cpp @@ -35,7 +35,7 @@ const String16 sAccessSurfaceFlinger("android.permission.ACCESS_SURFACE_FLINGER" // --------------------------------------------------------------------------- Client::Client(const sp& flinger) - : mFlinger(flinger), mNameGenerator(1) + : mFlinger(flinger) { } @@ -54,12 +54,10 @@ status_t Client::initCheck() const { return NO_ERROR; } -size_t Client::attachLayer(const sp& layer) +void Client::attachLayer(const sp& handle, const sp& layer) { Mutex::Autolock _l(mLock); - size_t name = mNameGenerator++; - mLayers.add(name, layer); - return name; + mLayers.add(handle, layer); } void Client::detachLayer(const LayerBaseClient* layer) @@ -74,14 +72,14 @@ void Client::detachLayer(const LayerBaseClient* layer) } } } -sp Client::getLayerUser(int32_t i) const +sp Client::getLayerUser(const sp& handle) const { Mutex::Autolock _l(mLock); sp lbc; - wp layer(mLayers.valueFor(i)); + wp layer(mLayers.valueFor(handle)); if (layer != 0) { lbc = layer.promote(); - ALOGE_IF(lbc==0, "getLayerUser(name=%d) is dead", int(i)); + ALOGE_IF(lbc==0, "getLayerUser(name=%p) is dead", handle.get()); } return lbc; } @@ -109,7 +107,6 @@ status_t Client::onTransact( sp Client::createSurface( - ISurfaceComposerClient::surface_data_t* params, const String8& name, uint32_t w, uint32_t h, PixelFormat format, uint32_t flags) @@ -122,7 +119,6 @@ sp Client::createSurface( class MessageCreateLayer : public MessageBase { sp result; SurfaceFlinger* flinger; - ISurfaceComposerClient::surface_data_t* params; Client* client; const String8& name; uint32_t w, h; @@ -130,29 +126,28 @@ sp Client::createSurface( uint32_t flags; public: MessageCreateLayer(SurfaceFlinger* flinger, - ISurfaceComposerClient::surface_data_t* params, const String8& name, Client* client, uint32_t w, uint32_t h, PixelFormat format, uint32_t flags) - : flinger(flinger), params(params), client(client), name(name), + : flinger(flinger), client(client), name(name), w(w), h(h), format(format), flags(flags) { } sp getResult() const { return result; } virtual bool handler() { - result = flinger->createLayer(params, name, client, - w, h, format, flags); + result = flinger->createLayer(name, client, w, h, format, flags); return true; } }; sp msg = new MessageCreateLayer(mFlinger.get(), - params, name, this, w, h, format, flags); + name, this, w, h, format, flags); mFlinger->postMessageSync(msg); return static_cast( msg.get() )->getResult(); } -status_t Client::destroySurface(SurfaceID sid) { - return mFlinger->onLayerRemoved(this, sid); + +status_t Client::destroySurface(const sp& handle) { + return mFlinger->onLayerRemoved(this, handle); } // --------------------------------------------------------------------------- diff --git a/services/surfaceflinger/Client.h b/services/surfaceflinger/Client.h index d6c69312b..e6a7165c7 100644 --- a/services/surfaceflinger/Client.h +++ b/services/surfaceflinger/Client.h @@ -44,20 +44,20 @@ public: status_t initCheck() const; // protected by SurfaceFlinger::mStateLock - size_t attachLayer(const sp& layer); + void attachLayer(const sp& handle, const sp& layer); void detachLayer(const LayerBaseClient* layer); - sp getLayerUser(int32_t i) const; + sp getLayerUser(const sp& handle) const; private: // ISurfaceComposerClient interface virtual sp createSurface( - surface_data_t* params, const String8& name, + const String8& name, uint32_t w, uint32_t h,PixelFormat format, uint32_t flags); - virtual status_t destroySurface(SurfaceID surfaceId); + virtual status_t destroySurface(const sp& handle); virtual status_t onTransact( uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags); @@ -66,8 +66,7 @@ private: sp mFlinger; // protected by mLock - DefaultKeyedVector< size_t, wp > mLayers; - size_t mNameGenerator; + DefaultKeyedVector< wp, wp > mLayers; // thread-safe mutable Mutex mLock; diff --git a/services/surfaceflinger/LayerBase.cpp b/services/surfaceflinger/LayerBase.cpp index 54c51bb5d..dfdbf300f 100644 --- a/services/surfaceflinger/LayerBase.cpp +++ b/services/surfaceflinger/LayerBase.cpp @@ -483,14 +483,11 @@ sp LayerBase::getLayer() const { // --------------------------------------------------------------------------- -int32_t LayerBaseClient::sIdentity = 1; - LayerBaseClient::LayerBaseClient(SurfaceFlinger* flinger, const sp& client) : LayerBase(flinger), mHasSurface(false), - mClientRef(client), - mIdentity(uint32_t(android_atomic_inc(&sIdentity))) + mClientRef(client) { } @@ -540,12 +537,8 @@ wp LayerBaseClient::getSurfaceTextureBinder() const { void LayerBaseClient::dump(String8& result, char* buffer, size_t SIZE) const { LayerBase::dump(result, buffer, SIZE); - sp client(mClientRef.promote()); - snprintf(buffer, SIZE, - " client=%p, identity=%u\n", - client.get(), getIdentity()); - + snprintf(buffer, SIZE, " client=%p\n", client.get()); result.append(buffer); } diff --git a/services/surfaceflinger/LayerBase.h b/services/surfaceflinger/LayerBase.h index 47473e790..c2624df5d 100644 --- a/services/surfaceflinger/LayerBase.h +++ b/services/surfaceflinger/LayerBase.h @@ -347,8 +347,6 @@ public: virtual const char* getTypeId() const { return "LayerBaseClient"; } - uint32_t getIdentity() const { return mIdentity; } - protected: virtual void dump(String8& result, char* scratch, size_t size) const; virtual void shortDump(String8& result, char* scratch, size_t size) const; @@ -379,9 +377,6 @@ private: wp mClientSurfaceBinder; const wp mClientRef; - // only read - const uint32_t mIdentity; - static int32_t sIdentity; }; // --------------------------------------------------------------------------- diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index caabf1d71..efcef92b6 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -1682,17 +1682,16 @@ void SurfaceFlinger::drawWormhole(const sp& hw, } } -ssize_t SurfaceFlinger::addClientLayer(const sp& client, +void SurfaceFlinger::addClientLayer(const sp& client, + const sp& handle, const sp& lbc) { // attach this layer to the client - size_t name = client->attachLayer(lbc); + client->attachLayer(handle, lbc); // add this layer to the current state list Mutex::Autolock _l(mStateLock); mCurrentState.layersSortedByZ.add(lbc); - - return ssize_t(name); } status_t SurfaceFlinger::removeLayer(const sp& layer) @@ -1933,10 +1932,9 @@ uint32_t SurfaceFlinger::setClientStateLocked( } sp SurfaceFlinger::createLayer( - ISurfaceComposerClient::surface_data_t* params, const String8& name, const sp& client, - uint32_t w, uint32_t h, PixelFormat format, + uint32_t w, uint32_t h, PixelFormat format, uint32_t flags) { sp layer; @@ -1965,11 +1963,9 @@ sp SurfaceFlinger::createLayer( if (layer != 0) { layer->initStates(w, h, flags); layer->setName(name); - ssize_t token = addClientLayer(client, layer); surfaceHandle = layer->getSurface(); if (surfaceHandle != 0) { - params->token = token; - params->identity = layer->getIdentity(); + addClientLayer(client, surfaceHandle->asBinder(), layer); } setTransactionFlags(eTransactionNeeded); } @@ -2027,7 +2023,7 @@ sp SurfaceFlinger::createScreenshotLayer( return layer; } -status_t SurfaceFlinger::onLayerRemoved(const sp& client, SurfaceID sid) +status_t SurfaceFlinger::onLayerRemoved(const sp& client, const sp& handle) { /* * called by the window manager, when a surface should be marked for @@ -2040,7 +2036,7 @@ status_t SurfaceFlinger::onLayerRemoved(const sp& client, SurfaceID sid) status_t err = NAME_NOT_FOUND; Mutex::Autolock _l(mStateLock); - sp layer = client->getLayerUser(sid); + sp layer = client->getLayerUser(handle); if (layer != 0) { err = purgatorizeLayer_l(layer); diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h index 72dd6524a..3cda6c08a 100644 --- a/services/surfaceflinger/SurfaceFlinger.h +++ b/services/surfaceflinger/SurfaceFlinger.h @@ -267,8 +267,7 @@ private: /* ------------------------------------------------------------------------ * Layer management */ - sp createLayer(ISurfaceComposerClient::surface_data_t* params, - const String8& name, const sp& client, + sp createLayer(const String8& name, const sp& client, uint32_t w, uint32_t h, PixelFormat format, uint32_t flags); sp createNormalLayer(const sp& client, @@ -284,7 +283,7 @@ private: // ISurfaceComposerClient::destroySurface() // The specified layer is first placed in a purgatory list // until all references from the client are released. - status_t onLayerRemoved(const sp& client, SurfaceID sid); + status_t onLayerRemoved(const sp& client, const sp& handle); // called when all clients have released all their references to // this layer meaning it is entirely safe to destroy all @@ -295,7 +294,7 @@ private: status_t removeLayer(const sp& layer); // add a layer to SurfaceFlinger - ssize_t addClientLayer(const sp& client, + void addClientLayer(const sp& client, const sp& handle, const sp& lbc); status_t removeLayer_l(const sp& layer);