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

Commit 13e03d21 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "C2BqPool: Expire waiters on Surface switching"

parents 026dd068 7c68c1b9
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -1722,6 +1722,8 @@ c2_status_t Codec2Client::Component::setOutputSurface(
                    static_cast<uint64_t>(blockPoolId),
                    bqId == 0 ? nullHgbp : igbp);

    mOutputBufferQueue->expireOldWaiters();

    if (!transStatus.isOk()) {
        LOG(ERROR) << "setOutputSurface -- transaction failed.";
        return C2_TRANSACTION_FAILED;
@@ -1763,6 +1765,7 @@ void Codec2Client::Component::stopUsingOutputSurface(
                       << status << ".";
        }
    }
    mOutputBufferQueue->expireOldWaiters();
}

c2_status_t Codec2Client::Component::connectToInputSurface(
+6 −0
Original line number Diff line number Diff line
@@ -50,6 +50,10 @@ struct OutputBufferQueue {
                   int maxDequeueBufferCount,
                   std::shared_ptr<V1_2::SurfaceSyncObj> *syncObj);

    // If there are waiters to allocate from the old surface, wake up and expire
    // them.
    void expireOldWaiters();

    // Stop using the current output surface. Pending buffer opeations will not
    // perform anymore.
    void stop();
@@ -86,6 +90,8 @@ private:
    std::weak_ptr<_C2BlockPoolData> mPoolDatas[BufferQueueDefs::NUM_BUFFER_SLOTS];
    std::shared_ptr<C2SurfaceSyncMemory> mSyncMem;
    bool mStopped;
    std::mutex mOldMutex;
    std::shared_ptr<C2SurfaceSyncMemory> mOldMem;

    bool registerBuffer(const C2ConstGraphicBlock& block);
};
+17 −1
Original line number Diff line number Diff line
@@ -217,6 +217,7 @@ bool OutputBufferQueue::configure(const sp<IGraphicBufferProducer>& igbp,
    sp<GraphicBuffer> buffers[BufferQueueDefs::NUM_BUFFER_SLOTS];
    std::weak_ptr<_C2BlockPoolData>
            poolDatas[BufferQueueDefs::NUM_BUFFER_SLOTS];
    std::shared_ptr<C2SurfaceSyncMemory> oldMem;
    {
        std::scoped_lock<std::mutex> l(mMutex);
        bool stopped = mStopped;
@@ -238,7 +239,7 @@ bool OutputBufferQueue::configure(const sp<IGraphicBufferProducer>& igbp,
            }
            return false;
        }
        std::shared_ptr<C2SurfaceSyncMemory> oldMem = mSyncMem;
        oldMem = mSyncMem;
        C2SyncVariables *oldSync = mSyncMem ? mSyncMem->mem() : nullptr;
        if (oldSync) {
            oldSync->lock();
@@ -314,11 +315,26 @@ bool OutputBufferQueue::configure(const sp<IGraphicBufferProducer>& igbp,
            newSync->unlock();
        }
    }
    {
        std::scoped_lock<std::mutex> l(mOldMutex);
        mOldMem = oldMem;
    }
    ALOGD("remote graphic buffer migration %zu/%zu",
          success, tryNum);
    return true;
}

void OutputBufferQueue::expireOldWaiters() {
    std::scoped_lock<std::mutex> l(mOldMutex);
    if (mOldMem) {
        C2SyncVariables *oldSync = mOldMem->mem();
        if (oldSync) {
            oldSync->notifyAll();
        }
        mOldMem.reset();
    }
}

void OutputBufferQueue::stop() {
    std::scoped_lock<std::mutex> l(mMutex);
    mStopped = true;
+5 −0
Original line number Diff line number Diff line
@@ -112,6 +112,11 @@ struct C2SyncVariables {
     */
    c2_status_t waitForChange(uint32_t waitId, c2_nsecs_t timeoutNs);

    /**
     * Wake up and expire all waitors.
     */
    void notifyAll();

    C2SyncVariables() {}

private:
+6 −0
Original line number Diff line number Diff line
@@ -244,6 +244,12 @@ c2_status_t C2SyncVariables::waitForChange(uint32_t waitId, c2_nsecs_t timeoutNs
    return C2_BAD_VALUE;
}

void C2SyncVariables::notifyAll() {
    this->lock();
    this->broadcast();
    this->unlock();
}

int C2SyncVariables::signal() {
    mCond++;