From b04c6f03a2334b03ae0105ec005aeecfa61f4a90 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Fri, 21 Oct 2016 12:57:46 -0700 Subject: Change GL references to GPU for getFrameTimestamps. Test: Rename only. Change-Id: Idaf7ab38f78f58aa8387823f47dac084e21eb1f0 --- include/gui/FrameTimestamps.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'include') diff --git a/include/gui/FrameTimestamps.h b/include/gui/FrameTimestamps.h index 9e1ae9409e..174c5ea525 100644 --- a/include/gui/FrameTimestamps.h +++ b/include/gui/FrameTimestamps.h @@ -41,7 +41,7 @@ enum class FrameEvent { ACQUIRE, FIRST_REFRESH_START, LAST_REFRESH_START, - GL_COMPOSITION_DONE, + GPU_COMPOSITION_DONE, DISPLAY_PRESENT, DISPLAY_RETIRE, DEQUEUE_READY, -- cgit v1.2.3-59-g8ed1b From ed816e6cb4ca15181bf6120890c85290b5f7c02b Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Wed, 26 Oct 2016 16:12:21 -0700 Subject: Add FrameEvents::isValidTimestamp Refactor only. Test: adb shell /data/nativetest/libgui_test/libgui_test --gtest_filter=*GetFrameTimestamps* Change-Id: I86653ac14186ca509f58a94047f25a7b74231b30 --- include/gui/FrameTimestamps.h | 38 ++++++++++++++++++++++---------------- libs/gui/FrameTimestamps.cpp | 20 ++++++++++---------- libs/gui/Surface.cpp | 2 +- 3 files changed, 33 insertions(+), 27 deletions(-) (limited to 'include') diff --git a/include/gui/FrameTimestamps.h b/include/gui/FrameTimestamps.h index 174c5ea525..0c4af469c4 100644 --- a/include/gui/FrameTimestamps.h +++ b/include/gui/FrameTimestamps.h @@ -52,6 +52,16 @@ enum class FrameEvent { // A collection of timestamps corresponding to a single frame. struct FrameEvents { + static constexpr auto EVENT_COUNT = + static_cast(FrameEvent::EVENT_COUNT); + static_assert(EVENT_COUNT <= 32, "Event count sanity check failed."); + static constexpr nsecs_t TIMESTAMP_PENDING = + std::numeric_limits::max(); + + static inline bool isValidTimestamp(nsecs_t time) { + return time != TIMESTAMP_PENDING; + } + bool hasPostedInfo() const; bool hasRequestedPresentInfo() const; bool hasLatchInfo() const; @@ -67,10 +77,6 @@ struct FrameEvents { void checkFencesForCompletion(); void dump(String8& outString) const; - static constexpr size_t EVENT_COUNT = - static_cast(FrameEvent::EVENT_COUNT); - static_assert(EVENT_COUNT <= 32, "Event count sanity check failed."); - bool valid{false}; uint64_t frameNumber{0}; @@ -81,12 +87,12 @@ struct FrameEvents { bool addRetireCalled{false}; bool addReleaseCalled{false}; - nsecs_t postedTime{-1}; - nsecs_t requestedPresentTime{-1}; - nsecs_t latchTime{-1}; - nsecs_t firstRefreshStartTime{-1}; - nsecs_t lastRefreshStartTime{-1}; - nsecs_t dequeueReadyTime{-1}; + nsecs_t postedTime{TIMESTAMP_PENDING}; + nsecs_t requestedPresentTime{TIMESTAMP_PENDING}; + nsecs_t latchTime{TIMESTAMP_PENDING}; + nsecs_t firstRefreshStartTime{TIMESTAMP_PENDING}; + nsecs_t lastRefreshStartTime{TIMESTAMP_PENDING}; + nsecs_t dequeueReadyTime{TIMESTAMP_PENDING}; std::shared_ptr acquireFence{FenceTime::NO_FENCE}; std::shared_ptr gpuCompositionDoneFence{FenceTime::NO_FENCE}; @@ -273,12 +279,12 @@ private: bool mAddRetireCalled{0}; bool mAddReleaseCalled{0}; - nsecs_t mPostedTime{0}; - nsecs_t mRequestedPresentTime{0}; - nsecs_t mLatchTime{0}; - nsecs_t mFirstRefreshStartTime{0}; - nsecs_t mLastRefreshStartTime{0}; - nsecs_t mDequeueReadyTime{0}; + nsecs_t mPostedTime{FrameEvents::TIMESTAMP_PENDING}; + nsecs_t mRequestedPresentTime{FrameEvents::TIMESTAMP_PENDING}; + nsecs_t mLatchTime{FrameEvents::TIMESTAMP_PENDING}; + nsecs_t mFirstRefreshStartTime{FrameEvents::TIMESTAMP_PENDING}; + nsecs_t mLastRefreshStartTime{FrameEvents::TIMESTAMP_PENDING}; + nsecs_t mDequeueReadyTime{FrameEvents::TIMESTAMP_PENDING}; FenceTime::Snapshot mGpuCompositionDoneFence; FenceTime::Snapshot mDisplayPresentFence; diff --git a/libs/gui/FrameTimestamps.cpp b/libs/gui/FrameTimestamps.cpp index f11ffdd546..f427e6899f 100644 --- a/libs/gui/FrameTimestamps.cpp +++ b/libs/gui/FrameTimestamps.cpp @@ -35,19 +35,19 @@ namespace android { // ============================================================================ bool FrameEvents::hasPostedInfo() const { - return Fence::isValidTimestamp(postedTime); + return FrameEvents::isValidTimestamp(postedTime); } bool FrameEvents::hasRequestedPresentInfo() const { - return Fence::isValidTimestamp(requestedPresentTime); + return FrameEvents::isValidTimestamp(requestedPresentTime); } bool FrameEvents::hasLatchInfo() const { - return Fence::isValidTimestamp(latchTime); + return FrameEvents::isValidTimestamp(latchTime); } bool FrameEvents::hasFirstRefreshStartInfo() const { - return Fence::isValidTimestamp(firstRefreshStartTime); + return FrameEvents::isValidTimestamp(firstRefreshStartTime); } bool FrameEvents::hasLastRefreshStartInfo() const { @@ -58,7 +58,7 @@ bool FrameEvents::hasLastRefreshStartInfo() const { } bool FrameEvents::hasDequeueReadyInfo() const { - return Fence::isValidTimestamp(dequeueReadyTime); + return FrameEvents::isValidTimestamp(dequeueReadyTime); } bool FrameEvents::hasAcquireInfo() const { @@ -119,21 +119,21 @@ void FrameEvents::dump(String8& outString) const outString.appendFormat("--- Req. Present\t%" PRId64 "\n", requestedPresentTime); outString.appendFormat("--- Latched \t"); - if (Fence::isValidTimestamp(latchTime)) { + if (FrameEvents::isValidTimestamp(latchTime)) { outString.appendFormat("%" PRId64 "\n", latchTime); } else { outString.appendFormat("Pending\n"); } outString.appendFormat("--- Refresh (First)\t"); - if (Fence::isValidTimestamp(firstRefreshStartTime)) { + if (FrameEvents::isValidTimestamp(firstRefreshStartTime)) { outString.appendFormat("%" PRId64 "\n", firstRefreshStartTime); } else { outString.appendFormat("Pending\n"); } outString.appendFormat("--- Refresh (Last)\t"); - if (Fence::isValidTimestamp(lastRefreshStartTime)) { + if (FrameEvents::isValidTimestamp(lastRefreshStartTime)) { outString.appendFormat("%" PRId64 "\n", lastRefreshStartTime); } else { outString.appendFormat("Pending\n"); @@ -149,7 +149,7 @@ void FrameEvents::dump(String8& outString) const !addRetireCalled, *displayRetireFence); outString.appendFormat("--- DequeueReady \t"); - if (Fence::isValidTimestamp(dequeueReadyTime)) { + if (FrameEvents::isValidTimestamp(dequeueReadyTime)) { outString.appendFormat("%" PRId64 "\n", dequeueReadyTime); } else { outString.appendFormat("Pending\n"); @@ -408,7 +408,7 @@ void ConsumerFrameEventHistory::addPreComposition( } frame->lastRefreshStartTime = refreshStartTime; mFramesDirty[mCompositionOffset].setDirty(); - if (!Fence::isValidTimestamp(frame->firstRefreshStartTime)) { + if (!FrameEvents::isValidTimestamp(frame->firstRefreshStartTime)) { frame->firstRefreshStartTime = refreshStartTime; mFramesDirty[mCompositionOffset].setDirty(); } diff --git a/libs/gui/Surface.cpp b/libs/gui/Surface.cpp index 45bf8c8a6b..efb15245a6 100644 --- a/libs/gui/Surface.cpp +++ b/libs/gui/Surface.cpp @@ -230,7 +230,7 @@ static bool checkConsumerForUpdates( static void getFrameTimestamp(nsecs_t *dst, const nsecs_t& src) { if (dst != nullptr) { - *dst = Fence::isValidTimestamp(src) ? src : 0; + *dst = FrameEvents::isValidTimestamp(src) ? src : 0; } } -- cgit v1.2.3-59-g8ed1b From 5ea5e5905170f32d5cf45ad35c552d64743892c3 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Thu, 1 Dec 2016 16:54:33 -0800 Subject: 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 --- include/gui/BufferQueue.h | 11 ++++++----- include/gui/FrameTimestamps.h | 5 +++++ include/gui/IConsumerListener.h | 3 +++ libs/gui/BufferQueue.cpp | 7 +++++++ libs/gui/BufferQueueProducer.cpp | 1 + libs/gui/FrameTimestamps.cpp | 20 ++++++++++++++++---- libs/gui/IConsumerListener.cpp | 13 ++++++++++++- libs/gui/tests/DummyConsumer.h | 6 +++--- libs/gui/tests/IGraphicBufferProducer_test.cpp | 8 ++------ opengl/tests/EGLTest/EGL_test.cpp | 6 +++--- services/surfaceflinger/Layer.cpp | 10 +++++++++- services/surfaceflinger/Layer.h | 1 + services/surfaceflinger/SurfaceFlingerConsumer.cpp | 12 ++++++++++-- services/surfaceflinger/SurfaceFlingerConsumer.h | 5 +++-- 14 files changed, 81 insertions(+), 27 deletions(-) (limited to 'include') 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); 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::iterator& frame); std::array 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 diff --git a/libs/gui/BufferQueue.cpp b/libs/gui/BufferQueue.cpp index f76a282af6..13692eb982 100644 --- a/libs/gui/BufferQueue.cpp +++ b/libs/gui/BufferQueue.cpp @@ -31,6 +31,13 @@ BufferQueue::ProxyConsumerListener::ProxyConsumerListener( BufferQueue::ProxyConsumerListener::~ProxyConsumerListener() {} +void BufferQueue::ProxyConsumerListener::onDisconnect() { + sp listener(mConsumerListener.promote()); + if (listener != NULL) { + listener->onDisconnect(); + } +} + void BufferQueue::ProxyConsumerListener::onFrameAvailable( const BufferItem& item) { sp listener(mConsumerListener.promote()); diff --git a/libs/gui/BufferQueueProducer.cpp b/libs/gui/BufferQueueProducer.cpp index 3f69b1f602..be0dc20bab 100644 --- a/libs/gui/BufferQueueProducer.cpp +++ b/libs/gui/BufferQueueProducer.cpp @@ -1272,6 +1272,7 @@ status_t BufferQueueProducer::disconnect(int api, DisconnectMode mode) { // Call back without lock held if (listener != NULL) { listener->onBuffersReleased(); + listener->onDisconnect(); } return status; diff --git a/libs/gui/FrameTimestamps.cpp b/libs/gui/FrameTimestamps.cpp index f427e6899f..019a11e2b3 100644 --- a/libs/gui/FrameTimestamps.cpp +++ b/libs/gui/FrameTimestamps.cpp @@ -329,7 +329,7 @@ void ProducerFrameEventHistory::updateSignalTimes() { void ProducerFrameEventHistory::applyFenceDelta(FenceTimeline* timeline, std::shared_ptr* dst, const FenceTime::Snapshot& src) const { - if (CC_UNLIKELY(dst == nullptr)) { + if (CC_UNLIKELY(dst == nullptr || dst->get() == nullptr)) { ALOGE("applyFenceDelta: dst is null."); return; } @@ -364,6 +364,11 @@ std::shared_ptr ProducerFrameEventHistory::createFenceTime( ConsumerFrameEventHistory::~ConsumerFrameEventHistory() = default; +void ConsumerFrameEventHistory::onDisconnect() { + mCurrentConnectId++; + mProducerWantsEvents = false; +} + void ConsumerFrameEventHistory::initializeCompositorTiming( const CompositorTiming& compositorTiming) { mCompositorTiming = compositorTiming; @@ -372,6 +377,7 @@ void ConsumerFrameEventHistory::initializeCompositorTiming( void ConsumerFrameEventHistory::addQueue(const NewFrameEventsEntry& newEntry) { // Overwrite all fields of the frame with default values unless set here. FrameEvents newTimestamps; + newTimestamps.connectId = mCurrentConnectId; newTimestamps.frameNumber = newEntry.frameNumber; newTimestamps.postedTime = newEntry.postedTime; newTimestamps.requestedPresentTime = newEntry.requestedPresentTime; @@ -453,8 +459,8 @@ void ConsumerFrameEventHistory::addRetire( void ConsumerFrameEventHistory::addRelease(uint64_t frameNumber, nsecs_t dequeueReadyTime, std::shared_ptr&& release) { FrameEvents* frame = getFrame(frameNumber, &mReleaseOffset); - if (CC_UNLIKELY(frame == nullptr)) { - ALOGE("addRelease: Did not find frame (%" PRIu64 ").", frameNumber); + if (frame == nullptr) { + ALOGE_IF(mProducerWantsEvents, "addRelease: Did not find frame."); return; } frame->addReleaseCalled = true; @@ -469,13 +475,19 @@ void ConsumerFrameEventHistory::getFrameDelta( mProducerWantsEvents = true; size_t i = static_cast(std::distance(mFrames.begin(), frame)); if (mFramesDirty[i].anyDirty()) { - delta->mDeltas.emplace_back(i, *frame, mFramesDirty[i]); + // Make sure only to send back deltas for the current connection + // since the producer won't have the correct state to apply a delta + // from a previous connection. + if (mFrames[i].connectId == mCurrentConnectId) { + delta->mDeltas.emplace_back(i, *frame, mFramesDirty[i]); + } mFramesDirty[i].reset(); } } void ConsumerFrameEventHistory::getAndResetDelta( FrameEventHistoryDelta* delta) { + mProducerWantsEvents = true; delta->mCompositorTiming = mCompositorTiming; // Write these in order of frame number so that it is easy to diff --git a/libs/gui/IConsumerListener.cpp b/libs/gui/IConsumerListener.cpp index 3d893b15d5..8cadc4de1b 100644 --- a/libs/gui/IConsumerListener.cpp +++ b/libs/gui/IConsumerListener.cpp @@ -28,7 +28,8 @@ namespace android { // --------------------------------------------------------------------------- enum { - ON_FRAME_AVAILABLE = IBinder::FIRST_CALL_TRANSACTION, + ON_DISCONNECT = IBinder::FIRST_CALL_TRANSACTION, + ON_FRAME_AVAILABLE, ON_BUFFER_RELEASED, ON_SIDEBAND_STREAM_CHANGED, GET_FRAME_TIMESTAMPS @@ -43,6 +44,12 @@ public: virtual ~BpConsumerListener(); + virtual void onDisconnect() { + Parcel data, reply; + data.writeInterfaceToken(IConsumerListener::getInterfaceDescriptor()); + remote()->transact(ON_DISCONNECT, data, &reply, IBinder::FLAG_ONEWAY); + } + virtual void onFrameAvailable(const BufferItem& item) { Parcel data, reply; data.writeInterfaceToken(IConsumerListener::getInterfaceDescriptor()); @@ -75,6 +82,10 @@ status_t BnConsumerListener::onTransact( uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) { switch(code) { + case ON_DISCONNECT: { + CHECK_INTERFACE(IConsumerListener, data, reply); + onDisconnect(); + return NO_ERROR; } case ON_FRAME_AVAILABLE: { CHECK_INTERFACE(IConsumerListener, data, reply); BufferItem item; diff --git a/libs/gui/tests/DummyConsumer.h b/libs/gui/tests/DummyConsumer.h index 0511e165c2..502bdf981b 100644 --- a/libs/gui/tests/DummyConsumer.h +++ b/libs/gui/tests/DummyConsumer.h @@ -19,9 +19,9 @@ namespace android { struct DummyConsumer : public BnConsumerListener { - virtual void onFrameAvailable(const BufferItem& /* item */) {} - virtual void onBuffersReleased() {} - virtual void onSidebandStreamChanged() {} + void onFrameAvailable(const BufferItem& /* item */) override {} + void onBuffersReleased() override {} + void onSidebandStreamChanged() override {} }; } // namespace android diff --git a/libs/gui/tests/IGraphicBufferProducer_test.cpp b/libs/gui/tests/IGraphicBufferProducer_test.cpp index 0329a6d61f..aa071f68b0 100644 --- a/libs/gui/tests/IGraphicBufferProducer_test.cpp +++ b/libs/gui/tests/IGraphicBufferProducer_test.cpp @@ -17,6 +17,8 @@ #define LOG_TAG "IGraphicBufferProducer_test" //#define LOG_NDEBUG 0 +#include "DummyConsumer.h" + #include #include @@ -64,12 +66,6 @@ namespace { const sp QUEUE_BUFFER_INPUT_FENCE = Fence::NO_FENCE; }; // namespace anonymous -struct DummyConsumer : public BnConsumerListener { - virtual void onFrameAvailable(const BufferItem& /* item */) {} - virtual void onBuffersReleased() {} - virtual void onSidebandStreamChanged() {} -}; - class IGraphicBufferProducerTest : public ::testing::Test { protected: diff --git a/opengl/tests/EGLTest/EGL_test.cpp b/opengl/tests/EGLTest/EGL_test.cpp index 1cd40b3957..1b3086be69 100644 --- a/opengl/tests/EGLTest/EGL_test.cpp +++ b/opengl/tests/EGLTest/EGL_test.cpp @@ -106,9 +106,9 @@ TEST_F(EGLTest, EGLTerminateSucceedsWithRemainingObjects) { EXPECT_TRUE(eglChooseConfig(mEglDisplay, attrs, &config, 1, &numConfigs)); struct DummyConsumer : public BnConsumerListener { - virtual void onFrameAvailable(const BufferItem& /* item */) {} - virtual void onBuffersReleased() {} - virtual void onSidebandStreamChanged() {} + void onFrameAvailable(const BufferItem& /* item */) override {} + void onBuffersReleased() override {} + void onSidebandStreamChanged() override {} }; // Create a EGLSurface diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index 8a6ec3c355..49f7480ffb 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -1944,7 +1944,10 @@ bool Layer::onPostComposition(const std::shared_ptr& glDoneFence, #ifdef USE_HWC2 void Layer::releasePendingBuffer(nsecs_t dequeueReadyTime) { - mSurfaceFlingerConsumer->releasePendingBuffer(); + if (!mSurfaceFlingerConsumer->releasePendingBuffer()) { + return; + } + auto releaseFenceTime = std::make_shared( mSurfaceFlingerConsumer->getPrevFinalReleaseFence()); mReleaseTimeline.push(releaseFenceTime); @@ -2377,6 +2380,11 @@ void Layer::dumpFrameEvents(String8& result) { mFrameEventHistory.dump(result); } +void Layer::onDisconnect() { + Mutex::Autolock lock(mFrameEventHistoryMutex); + mFrameEventHistory.onDisconnect(); +} + void Layer::addAndGetFrameTimestamps(const NewFrameEventsEntry* newTimestamps, FrameEventHistoryDelta *outDelta) { Mutex::Autolock lock(mFrameEventHistoryMutex); diff --git a/services/surfaceflinger/Layer.h b/services/surfaceflinger/Layer.h index 8227daec8d..d979a41527 100644 --- a/services/surfaceflinger/Layer.h +++ b/services/surfaceflinger/Layer.h @@ -446,6 +446,7 @@ public: std::vector getOccupancyHistory(bool forceFlush); + void onDisconnect(); void addAndGetFrameTimestamps(const NewFrameEventsEntry* newEntry, FrameEventHistoryDelta* outDelta); diff --git a/services/surfaceflinger/SurfaceFlingerConsumer.cpp b/services/surfaceflinger/SurfaceFlingerConsumer.cpp index 942af139ec..bb1ff06065 100644 --- a/services/surfaceflinger/SurfaceFlingerConsumer.cpp +++ b/services/surfaceflinger/SurfaceFlingerConsumer.cpp @@ -211,11 +211,11 @@ void SurfaceFlingerConsumer::setReleaseFence(const sp& fence) } } -void SurfaceFlingerConsumer::releasePendingBuffer() +bool SurfaceFlingerConsumer::releasePendingBuffer() { if (!mPendingRelease.isPending) { ALOGV("Pending buffer already released"); - return; + return false; } ALOGV("Releasing pending buffer"); Mutex::Autolock lock(mMutex); @@ -225,6 +225,7 @@ void SurfaceFlingerConsumer::releasePendingBuffer() ALOGE_IF(result != NO_ERROR, "releasePendingBuffer failed: %s (%d)", strerror(-result), result); mPendingRelease = PendingRelease(); + return true; } #endif @@ -261,6 +262,13 @@ void SurfaceFlingerConsumer::onSidebandStreamChanged() { } } +void SurfaceFlingerConsumer::onDisconnect() { + sp l = mLayer.promote(); + if (l.get()) { + l->onDisconnect(); + } +} + void SurfaceFlingerConsumer::addAndGetFrameTimestamps( const NewFrameEventsEntry* newTimestamps, FrameEventHistoryDelta *outDelta) { diff --git a/services/surfaceflinger/SurfaceFlingerConsumer.h b/services/surfaceflinger/SurfaceFlingerConsumer.h index 7713ed2408..1531e2c5ca 100644 --- a/services/surfaceflinger/SurfaceFlingerConsumer.h +++ b/services/surfaceflinger/SurfaceFlingerConsumer.h @@ -82,10 +82,11 @@ public: sp getPrevFinalReleaseFence() const; #ifdef USE_HWC2 virtual void setReleaseFence(const sp& fence) override; - void releasePendingBuffer(); + bool releasePendingBuffer(); #endif - virtual void addAndGetFrameTimestamps( + void onDisconnect() override; + void addAndGetFrameTimestamps( const NewFrameEventsEntry* newTimestamps, FrameEventHistoryDelta* outDelta) override; -- cgit v1.2.3-59-g8ed1b