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

Commit 5ea5e590 authored by Brian Anderson's avatar Brian Anderson
Browse files

Fix unexpected FrameEvents on BufferQueue reconnect

Helps reduce the number of ALOGE's being hit
when switching between apps.

* Notify Layer when the Producer disconnects.
* Avoid sending event deltas from a previous connection.
* Avoid releasing a frame more than once.

Test: adb shell /data/nativetest/libgui_test/libgui_test
    --gtest_filter=*GetFrameTimestamps*

Change-Id: I64f314be72ddb154b584d726ac382cd468e345bf
parent ed816e6c
Loading
Loading
Loading
Loading
+6 −5
Original line number Original line Diff line number Diff line
@@ -62,11 +62,12 @@ public:
    public:
    public:
        explicit ProxyConsumerListener(const wp<ConsumerListener>& consumerListener);
        explicit ProxyConsumerListener(const wp<ConsumerListener>& consumerListener);
        virtual ~ProxyConsumerListener();
        virtual ~ProxyConsumerListener();
        virtual void onFrameAvailable(const BufferItem& item) override;
        void onDisconnect() override;
        virtual void onFrameReplaced(const BufferItem& item) override;
        void onFrameAvailable(const BufferItem& item) override;
        virtual void onBuffersReleased() override;
        void onFrameReplaced(const BufferItem& item) override;
        virtual void onSidebandStreamChanged() override;
        void onBuffersReleased() override;
        virtual void addAndGetFrameTimestamps(
        void onSidebandStreamChanged() override;
        void addAndGetFrameTimestamps(
                const NewFrameEventsEntry* newTimestamps,
                const NewFrameEventsEntry* newTimestamps,
                FrameEventHistoryDelta* outDelta) override;
                FrameEventHistoryDelta* outDelta) override;
    private:
    private:
+5 −0
Original line number Original line Diff line number Diff line
@@ -78,6 +78,7 @@ struct FrameEvents {
    void dump(String8& outString) const;
    void dump(String8& outString) const;


    bool valid{false};
    bool valid{false};
    int connectId{0};
    uint64_t frameNumber{0};
    uint64_t frameNumber{0};


    // Whether or not certain points in the frame's life cycle have been
    // Whether or not certain points in the frame's life cycle have been
@@ -212,6 +213,8 @@ class ConsumerFrameEventHistory : public FrameEventHistory {
public:
public:
    ~ConsumerFrameEventHistory() override;
    ~ConsumerFrameEventHistory() override;


    void onDisconnect();

    void initializeCompositorTiming(const CompositorTiming& compositorTiming);
    void initializeCompositorTiming(const CompositorTiming& compositorTiming);


    void addQueue(const NewFrameEventsEntry& newEntry);
    void addQueue(const NewFrameEventsEntry& newEntry);
@@ -233,11 +236,13 @@ private:
            const std::array<FrameEvents, MAX_FRAME_HISTORY>::iterator& frame);
            const std::array<FrameEvents, MAX_FRAME_HISTORY>::iterator& frame);


    std::array<FrameEventDirtyFields, MAX_FRAME_HISTORY> mFramesDirty;
    std::array<FrameEventDirtyFields, MAX_FRAME_HISTORY> mFramesDirty;

    size_t mQueueOffset{0};
    size_t mQueueOffset{0};
    size_t mCompositionOffset{0};
    size_t mCompositionOffset{0};
    size_t mRetireOffset{0};
    size_t mRetireOffset{0};
    size_t mReleaseOffset{0};
    size_t mReleaseOffset{0};


    int mCurrentConnectId{0};
    bool mProducerWantsEvents{false};
    bool mProducerWantsEvents{false};
};
};


+3 −0
Original line number Original line Diff line number Diff line
@@ -43,6 +43,9 @@ public:
    ConsumerListener() { }
    ConsumerListener() { }
    virtual ~ConsumerListener();
    virtual ~ConsumerListener();


    // onDisconnect is called when a producer disconnects from the BufferQueue.
    virtual void onDisconnect() {} /* Asynchronous */

    // onFrameAvailable is called from queueBuffer each time an additional
    // onFrameAvailable is called from queueBuffer each time an additional
    // frame becomes available for consumption. This means that frames that
    // frame becomes available for consumption. This means that frames that
    // are queued while in asynchronous mode only trigger the callback if no
    // are queued while in asynchronous mode only trigger the callback if no
+7 −0
Original line number Original line Diff line number Diff line
@@ -31,6 +31,13 @@ BufferQueue::ProxyConsumerListener::ProxyConsumerListener(


BufferQueue::ProxyConsumerListener::~ProxyConsumerListener() {}
BufferQueue::ProxyConsumerListener::~ProxyConsumerListener() {}


void BufferQueue::ProxyConsumerListener::onDisconnect() {
    sp<ConsumerListener> listener(mConsumerListener.promote());
    if (listener != NULL) {
        listener->onDisconnect();
    }
}

void BufferQueue::ProxyConsumerListener::onFrameAvailable(
void BufferQueue::ProxyConsumerListener::onFrameAvailable(
        const BufferItem& item) {
        const BufferItem& item) {
    sp<ConsumerListener> listener(mConsumerListener.promote());
    sp<ConsumerListener> listener(mConsumerListener.promote());
+1 −0
Original line number Original line Diff line number Diff line
@@ -1272,6 +1272,7 @@ status_t BufferQueueProducer::disconnect(int api, DisconnectMode mode) {
    // Call back without lock held
    // Call back without lock held
    if (listener != NULL) {
    if (listener != NULL) {
        listener->onBuffersReleased();
        listener->onBuffersReleased();
        listener->onDisconnect();
    }
    }


    return status;
    return status;
Loading