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

Commit 0db52704 authored by Vishnu Nair's avatar Vishnu Nair Committed by Automerger Merge Worker
Browse files

Merge "Surface: Release references to BlastBufferQueue and SurfaceControl on...

Merge "Surface: Release references to BlastBufferQueue and SurfaceControl on Surface#destroy" into sc-qpr1-dev am: 5bcc5bd9

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/native/+/15754882

Change-Id: Ie4fd98ddfbf136bac94e52391558ea385d7d2412
parents e3d9389c 5bcc5bd9
Loading
Loading
Loading
Loading
+19 −0
Original line number Diff line number Diff line
@@ -630,7 +630,10 @@ bool BLASTBufferQueue::maxBuffersAcquired(bool includeExtraAcquire) const {

class BBQSurface : public Surface {
private:
    std::mutex mMutex;
    sp<BLASTBufferQueue> mBbq;
    bool mDestroyed = false;

public:
    BBQSurface(const sp<IGraphicBufferProducer>& igbp, bool controlledByApp,
               const sp<IBinder>& scHandle, const sp<BLASTBufferQueue>& bbq)
@@ -650,6 +653,10 @@ public:

    status_t setFrameRate(float frameRate, int8_t compatibility,
                          int8_t changeFrameRateStrategy) override {
        std::unique_lock _lock{mMutex};
        if (mDestroyed) {
            return DEAD_OBJECT;
        }
        if (!ValidateFrameRate(frameRate, compatibility, changeFrameRateStrategy,
                               "BBQSurface::setFrameRate")) {
            return BAD_VALUE;
@@ -658,8 +665,20 @@ public:
    }

    status_t setFrameTimelineInfo(const FrameTimelineInfo& frameTimelineInfo) override {
        std::unique_lock _lock{mMutex};
        if (mDestroyed) {
            return DEAD_OBJECT;
        }
        return mBbq->setFrameTimelineInfo(frameTimelineInfo);
    }

    void destroy() override {
        Surface::destroy();

        std::unique_lock _lock{mMutex};
        mDestroyed = true;
        mBbq = nullptr;
    }
};

// TODO: Can we coalesce this with frame updates? Need to confirm
+10 −0
Original line number Diff line number Diff line
@@ -2622,4 +2622,14 @@ status_t Surface::setFrameTimelineInfo(const FrameTimelineInfo& frameTimelineInf
    return composerService()->setFrameTimelineInfo(mGraphicBufferProducer, frameTimelineInfo);
}

sp<IBinder> Surface::getSurfaceControlHandle() const {
    Mutex::Autolock lock(mMutex);
    return mSurfaceControlHandle;
}

void Surface::destroy() {
    Mutex::Autolock lock(mMutex);
    mSurfaceControlHandle = nullptr;
}

}; // namespace android
+2 −1
Original line number Diff line number Diff line
@@ -99,7 +99,7 @@ public:
     */
    sp<IGraphicBufferProducer> getIGraphicBufferProducer() const;

    sp<IBinder> getSurfaceControlHandle() const { return mSurfaceControlHandle; }
    sp<IBinder> getSurfaceControlHandle() const;

    /* convenience function to check that the given surface is non NULL as
     * well as its IGraphicBufferProducer */
@@ -333,6 +333,7 @@ public:
    virtual int connect(
            int api, bool reportBufferRemoval,
            const sp<SurfaceListener>& sListener);
    virtual void destroy();

    // When client connects to Surface with reportBufferRemoval set to true, any buffers removed
    // from this Surface will be collected and returned here. Once this method returns, these