diff options
| author | 2016-12-01 16:54:33 -0800 | |
|---|---|---|
| committer | 2017-02-15 16:41:26 -0800 | |
| commit | 5ea5e5905170f32d5cf45ad35c552d64743892c3 (patch) | |
| tree | fbb4f89afcc0f593652fe722e2e2e351a12ca921 /include | |
| parent | ed816e6cb4ca15181bf6120890c85290b5f7c02b (diff) | |
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
Diffstat (limited to 'include')
| -rw-r--r-- | include/gui/BufferQueue.h | 11 | ||||
| -rw-r--r-- | include/gui/FrameTimestamps.h | 5 | ||||
| -rw-r--r-- | include/gui/IConsumerListener.h | 3 |
3 files changed, 14 insertions, 5 deletions
diff --git a/include/gui/BufferQueue.h b/include/gui/BufferQueue.h index a523cd80bf..c95c535363 100644 --- a/include/gui/BufferQueue.h +++ b/include/gui/BufferQueue.h @@ -62,11 +62,12 @@ public: public: explicit ProxyConsumerListener(const wp<ConsumerListener>& consumerListener); virtual ~ProxyConsumerListener(); - virtual void onFrameAvailable(const BufferItem& item) override; - virtual void onFrameReplaced(const BufferItem& item) override; - virtual void onBuffersReleased() override; - virtual void onSidebandStreamChanged() override; - virtual void addAndGetFrameTimestamps( + void onDisconnect() override; + void onFrameAvailable(const BufferItem& item) override; + void onFrameReplaced(const BufferItem& item) override; + void onBuffersReleased() override; + void onSidebandStreamChanged() override; + void addAndGetFrameTimestamps( const NewFrameEventsEntry* newTimestamps, FrameEventHistoryDelta* outDelta) override; private: diff --git a/include/gui/FrameTimestamps.h b/include/gui/FrameTimestamps.h index 0c4af469c4..bda3c5cf94 100644 --- a/include/gui/FrameTimestamps.h +++ b/include/gui/FrameTimestamps.h @@ -78,6 +78,7 @@ struct FrameEvents { void dump(String8& outString) const; bool valid{false}; + int connectId{0}; uint64_t frameNumber{0}; // Whether or not certain points in the frame's life cycle have been @@ -212,6 +213,8 @@ class ConsumerFrameEventHistory : public FrameEventHistory { public: ~ConsumerFrameEventHistory() override; + void onDisconnect(); + void initializeCompositorTiming(const CompositorTiming& compositorTiming); void addQueue(const NewFrameEventsEntry& newEntry); @@ -233,11 +236,13 @@ private: const std::array<FrameEvents, MAX_FRAME_HISTORY>::iterator& frame); std::array<FrameEventDirtyFields, MAX_FRAME_HISTORY> mFramesDirty; + size_t mQueueOffset{0}; size_t mCompositionOffset{0}; size_t mRetireOffset{0}; size_t mReleaseOffset{0}; + int mCurrentConnectId{0}; bool mProducerWantsEvents{false}; }; diff --git a/include/gui/IConsumerListener.h b/include/gui/IConsumerListener.h index 93dd4acf96..a3c7d6496d 100644 --- a/include/gui/IConsumerListener.h +++ b/include/gui/IConsumerListener.h @@ -43,6 +43,9 @@ public: 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 // frame becomes available for consumption. This means that frames that // are queued while in asynchronous mode only trigger the callback if no |