Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a0c30e92 authored by Mathias Agopian's avatar Mathias Agopian
Browse files

optimize Surface.readFromParcel()

this is called for each relayout() and used to create a full Surface (cpp)
which in turn did some heavy work (including an IPC with surfaceflinger),
most of the time to destroy it immediatelly when the returned surface
(the one in the parcel) was the same.

we now more intelligentely read from the parcel and construct the new
object only if needed.

Change-Id: Idfd40d9ac96ffc6d4ae5fd99bcc0773e131e2267
parent b7e930db
Loading
Loading
Loading
Loading
+3 −4
Original line number Diff line number Diff line
@@ -145,15 +145,13 @@ public:
        uint32_t    reserved[2];
    };

    Surface(const Parcel& data);
    static sp<Surface> readFromParcel(
            const Parcel& data, const sp<Surface>& other);

    static bool isValid(const sp<Surface>& surface) {
        return (surface != 0) && surface->isValid();
    }

    static bool isSameSurface(
            const sp<Surface>& lhs, const sp<Surface>& rhs);

    bool        isValid();
    SurfaceID   ID() const          { return mToken; }
    uint32_t    getFlags() const    { return mFlags; }
@@ -191,6 +189,7 @@ private:
    Surface(const Surface& rhs);

    Surface(const sp<SurfaceControl>& control);
    Surface(const Parcel& data, const sp<IBinder>& ref);
    ~Surface();


+13 −8
Original line number Diff line number Diff line
@@ -334,13 +334,13 @@ Surface::Surface(const sp<SurfaceControl>& surface)
    init();
}

Surface::Surface(const Parcel& parcel)
Surface::Surface(const Parcel& parcel, const sp<IBinder>& ref)
    : mBufferMapper(GraphicBufferMapper::get()),
      mClient(SurfaceClient::getInstance()),
      mSharedBufferClient(NULL),
      mInitCheck(NO_INIT)
{
    mSurface    = interface_cast<ISurface>(parcel.readStrongBinder());
    mSurface    = interface_cast<ISurface>(ref);
    mIdentity   = parcel.readInt32();
    mWidth      = parcel.readInt32();
    mHeight     = parcel.readInt32();
@@ -349,6 +349,17 @@ Surface::Surface(const Parcel& parcel)
    init();
}

sp<Surface> Surface::readFromParcel(
        const Parcel& data, const sp<Surface>& other)
{
    sp<Surface> result(other);
    sp<IBinder> binder(data.readStrongBinder());
    if (other==0 || binder != other->mSurface->asBinder()) {
        result = new Surface(data, binder);
    }
    return result;
}

void Surface::init()
{
    android_native_window_t::setSwapInterval  = setSwapInterval;
@@ -443,12 +454,6 @@ status_t Surface::validate() const
    return NO_ERROR;
}

bool Surface::isSameSurface(const sp<Surface>& lhs, const sp<Surface>& rhs) {
    if (lhs == 0 || rhs == 0)
        return false;
    return lhs->mSurface->asBinder() == rhs->mSurface->asBinder();
}

sp<ISurface> Surface::getISurface() const {
    return mSurface;
}