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

Commit 2e434387 authored by Adithya Srinivasan's avatar Adithya Srinivasan
Browse files

Add tracing for dequeueBuffer, detachBuffer and cancelBuffer

The FrameTracer prototype currently doesn't have some of the events
traced. This change adds the plumbing required to emit dequeueBuffer,
detachBuffer and cancelBuffer. Only the dequeueBuffer is made to emit
the event in this CL while enabling detach and cancel to have a place if
emitting is required.

Test: Build and trace with GAPID and FrameTracer perfetto changes.
Bug: 142502670
Change-Id: I2ba90b32d7b309a7c8145f75387c8e6f8f6bd0fb
parent 10d01dba
Loading
Loading
Loading
Loading
+21 −0
Original line number Diff line number Diff line
@@ -43,6 +43,27 @@ void BufferQueue::ProxyConsumerListener::onDisconnect() {
    }
}

void BufferQueue::ProxyConsumerListener::onFrameDequeued(const uint64_t bufferId) {
    sp<ConsumerListener> listener(mConsumerListener.promote());
    if (listener != nullptr) {
        listener->onFrameDequeued(bufferId);
    }
}

void BufferQueue::ProxyConsumerListener::onFrameCancelled(const uint64_t bufferId) {
    sp<ConsumerListener> listener(mConsumerListener.promote());
    if (listener != nullptr) {
        listener->onFrameCancelled(bufferId);
    }
}

void BufferQueue::ProxyConsumerListener::onFrameDetached(const uint64_t bufferId) {
    sp<ConsumerListener> listener(mConsumerListener.promote());
    if (listener != nullptr) {
        listener->onFrameDetached(bufferId);
    }
}

void BufferQueue::ProxyConsumerListener::onFrameAvailable(
        const BufferItem& item) {
    sp<ConsumerListener> listener(mConsumerListener.promote());
+12 −1
Original line number Diff line number Diff line
@@ -580,6 +580,11 @@ status_t BufferQueueProducer::dequeueBuffer(int* outSlot, sp<android::Fence>* ou
    }
    addAndGetFrameTimestamps(nullptr, outTimestamps);

    { // Autolock scope
        std::lock_guard<std::mutex> lock(mCore->mMutex);
        mCore->mConsumerListener->onFrameDequeued(mSlots[*outSlot].mGraphicBuffer->getId());
    }

    return returnFlags;
}

@@ -621,13 +626,16 @@ status_t BufferQueueProducer::detachBuffer(int slot) {
            return BAD_VALUE;
        }

        listener = mCore->mConsumerListener;
        if (listener != nullptr) {
            listener->onFrameDetached(mSlots[slot].mGraphicBuffer->getId());
        }
        mSlots[slot].mBufferState.detachProducer();
        mCore->mActiveBuffers.erase(slot);
        mCore->mFreeSlots.insert(slot);
        mCore->clearBufferSlotLocked(slot);
        mCore->mDequeueCondition.notify_all();
        VALIDATE_CONSISTENCY();
        listener = mCore->mConsumerListener;
    }

    if (listener != nullptr) {
@@ -1083,6 +1091,9 @@ status_t BufferQueueProducer::cancelBuffer(int slot, const sp<Fence>& fence) {
        mCore->mFreeBuffers.push_back(slot);
    }

    if (mCore->mConsumerListener != nullptr) {
        mCore->mConsumerListener->onFrameCancelled(mSlots[slot].mGraphicBuffer->getId());
    }
    mSlots[slot].mFence = fence;
    mCore->mDequeueCondition.notify_all();
    VALIDATE_CONSISTENCY();
+42 −0
Original line number Diff line number Diff line
@@ -101,6 +101,48 @@ void ConsumerBase::freeBufferLocked(int slotIndex) {
    mSlots[slotIndex].mFrameNumber = 0;
}

void ConsumerBase::onFrameDequeued(const uint64_t bufferId) {
    CB_LOGV("onFrameDequeued");

    sp<FrameAvailableListener> listener;
    {
        Mutex::Autolock lock(mFrameAvailableMutex);
        listener = mFrameAvailableListener.promote();
    }

    if (listener != nullptr) {
        listener->onFrameDequeued(bufferId);
    }
}

void ConsumerBase::onFrameCancelled(const uint64_t bufferId) {
    CB_LOGV("onFrameCancelled");

    sp<FrameAvailableListener> listener;
    {
        Mutex::Autolock lock(mFrameAvailableMutex);
        listener = mFrameAvailableListener.promote();
    }

    if (listener != nullptr) {
        listener->onFrameCancelled(bufferId);
    }
}

void ConsumerBase::onFrameDetached(const uint64_t bufferId) {
    CB_LOGV("onFrameDetached");

    sp<FrameAvailableListener> listener;
    {
        Mutex::Autolock lock(mFrameAvailableMutex);
        listener = mFrameAvailableListener.promote();
    }

    if (listener != nullptr) {
        listener->onFrameDetached(bufferId);
    }
}

void ConsumerBase::onFrameAvailable(const BufferItem& item) {
    CB_LOGV("onFrameAvailable");

+25 −1
Original line number Diff line number Diff line
@@ -28,7 +28,10 @@ enum class Tag : uint32_t {
    ON_FRAME_REPLACED,
    ON_BUFFERS_RELEASED,
    ON_SIDEBAND_STREAM_CHANGED,
    LAST = ON_SIDEBAND_STREAM_CHANGED,
    ON_FRAME_DEQUEUED,
    ON_FRAME_CANCELLED,
    ON_FRAME_DETACHED,
    LAST = ON_FRAME_DETACHED,
};

} // Anonymous namespace
@@ -44,6 +47,21 @@ public:
        callRemoteAsync<decltype(&IConsumerListener::onDisconnect)>(Tag::ON_DISCONNECT);
    }

    void onFrameDequeued(const uint64_t bufferId) override {
        callRemoteAsync<decltype(&IConsumerListener::onFrameDequeued)>(Tag::ON_FRAME_DEQUEUED,
                                                                       bufferId);
    }

    void onFrameDetached(const uint64_t bufferId) override {
        callRemoteAsync<decltype(&IConsumerListener::onFrameDetached)>(Tag::ON_FRAME_DETACHED,
                                                                       bufferId);
    }

    void onFrameCancelled(const uint64_t bufferId) override {
        callRemoteAsync<decltype(&IConsumerListener::onFrameCancelled)>(Tag::ON_FRAME_CANCELLED,
                                                                        bufferId);
    }

    void onFrameAvailable(const BufferItem& item) override {
        callRemoteAsync<decltype(&IConsumerListener::onFrameAvailable)>(Tag::ON_FRAME_AVAILABLE,
                                                                        item);
@@ -93,6 +111,12 @@ status_t BnConsumerListener::onTransact(uint32_t code, const Parcel& data, Parce
            return callLocalAsync(data, reply, &IConsumerListener::onBuffersReleased);
        case Tag::ON_SIDEBAND_STREAM_CHANGED:
            return callLocalAsync(data, reply, &IConsumerListener::onSidebandStreamChanged);
        case Tag::ON_FRAME_DEQUEUED:
            return callLocalAsync(data, reply, &IConsumerListener::onFrameDequeued);
        case Tag::ON_FRAME_CANCELLED:
            return callLocalAsync(data, reply, &IConsumerListener::onFrameCancelled);
        case Tag::ON_FRAME_DETACHED:
            return callLocalAsync(data, reply, &IConsumerListener::onFrameDetached);
    }
}

+3 −0
Original line number Diff line number Diff line
@@ -63,6 +63,9 @@ public:
        void onFrameReplaced(const BufferItem& item) override;
        void onBuffersReleased() override;
        void onSidebandStreamChanged() override;
        void onFrameDequeued(const uint64_t bufferId) override;
        void onFrameCancelled(const uint64_t bufferId) override;
        void onFrameDetached(const uint64_t bufferID) override;
        void addAndGetFrameTimestamps(
                const NewFrameEventsEntry* newTimestamps,
                FrameEventHistoryDelta* outDelta) override;
Loading