Loading include/gui/Surface.h +6 −0 Original line number Diff line number Diff line Loading @@ -160,6 +160,9 @@ public: status_t getUniqueId(uint64_t* outId) const; // Returns the CLOCK_MONOTONIC start time of the last dequeueBuffer call nsecs_t getLastDequeueStartTime() const; protected: virtual ~Surface(); Loading Loading @@ -421,6 +424,9 @@ protected: nsecs_t mLastDequeueDuration = 0; nsecs_t mLastQueueDuration = 0; // Stores the time right before we call IGBP::dequeueBuffer nsecs_t mLastDequeueStartTime = 0; Condition mQueueBufferCondition; uint64_t mNextFrameNumber = 1; Loading libs/gui/Surface.cpp +10 −2 Original line number Diff line number Diff line Loading @@ -501,13 +501,13 @@ int Surface::dequeueBuffer(android_native_buffer_t** buffer, int* fenceFd) { int buf = -1; sp<Fence> fence; nsecs_t now = systemTime(); nsecs_t startTime = systemTime(); FrameEventHistoryDelta frameTimestamps; status_t result = mGraphicBufferProducer->dequeueBuffer(&buf, &fence, reqWidth, reqHeight, reqFormat, reqUsage, enableFrameTimestamps ? &frameTimestamps : nullptr); mLastDequeueDuration = systemTime() - now; mLastDequeueDuration = systemTime() - startTime; if (result < 0) { ALOGV("dequeueBuffer: IGraphicBufferProducer::dequeueBuffer" Loading @@ -524,6 +524,9 @@ int Surface::dequeueBuffer(android_native_buffer_t** buffer, int* fenceFd) { Mutex::Autolock lock(mMutex); // Write this while holding the mutex mLastDequeueStartTime = startTime; sp<GraphicBuffer>& gbuf(mSlots[buf].buffer); // this should never happen Loading Loading @@ -1699,6 +1702,11 @@ status_t Surface::getUniqueId(uint64_t* outId) const { return mGraphicBufferProducer->getUniqueId(outId); } nsecs_t Surface::getLastDequeueStartTime() const { Mutex::Autolock lock(mMutex); return mLastDequeueStartTime; } status_t Surface::getAndFlushRemovedBuffers(std::vector<sp<GraphicBuffer>>* out) { if (out == nullptr) { ALOGE("%s: out must not be null!", __FUNCTION__); Loading libs/gui/tests/Surface_test.cpp +17 −1 Original line number Diff line number Diff line Loading @@ -393,6 +393,22 @@ TEST_F(SurfaceTest, GetAndFlushRemovedBuffers) { ASSERT_LE(removedBuffers.size(), 1u); } TEST_F(SurfaceTest, TestGetLastDequeueStartTime) { sp<ANativeWindow> anw(mSurface); ASSERT_EQ(NO_ERROR, native_window_api_connect(anw.get(), NATIVE_WINDOW_API_CPU)); ANativeWindowBuffer* buffer = nullptr; int32_t fenceFd = -1; nsecs_t before = systemTime(CLOCK_MONOTONIC); anw->dequeueBuffer(anw.get(), &buffer, &fenceFd); nsecs_t after = systemTime(CLOCK_MONOTONIC); nsecs_t lastDequeueTime = mSurface->getLastDequeueStartTime(); ASSERT_LE(before, lastDequeueTime); ASSERT_GE(after, lastDequeueTime); } class FakeConsumer : public BnConsumerListener { public: void onFrameAvailable(const BufferItem& /*item*/) override {} Loading Loading @@ -1568,4 +1584,4 @@ TEST_F(GetFrameTimestampsTest, PresentUnsupportedNoSync) { EXPECT_EQ(-1, outDisplayPresentTime); } } } // namespace android Loading
include/gui/Surface.h +6 −0 Original line number Diff line number Diff line Loading @@ -160,6 +160,9 @@ public: status_t getUniqueId(uint64_t* outId) const; // Returns the CLOCK_MONOTONIC start time of the last dequeueBuffer call nsecs_t getLastDequeueStartTime() const; protected: virtual ~Surface(); Loading Loading @@ -421,6 +424,9 @@ protected: nsecs_t mLastDequeueDuration = 0; nsecs_t mLastQueueDuration = 0; // Stores the time right before we call IGBP::dequeueBuffer nsecs_t mLastDequeueStartTime = 0; Condition mQueueBufferCondition; uint64_t mNextFrameNumber = 1; Loading
libs/gui/Surface.cpp +10 −2 Original line number Diff line number Diff line Loading @@ -501,13 +501,13 @@ int Surface::dequeueBuffer(android_native_buffer_t** buffer, int* fenceFd) { int buf = -1; sp<Fence> fence; nsecs_t now = systemTime(); nsecs_t startTime = systemTime(); FrameEventHistoryDelta frameTimestamps; status_t result = mGraphicBufferProducer->dequeueBuffer(&buf, &fence, reqWidth, reqHeight, reqFormat, reqUsage, enableFrameTimestamps ? &frameTimestamps : nullptr); mLastDequeueDuration = systemTime() - now; mLastDequeueDuration = systemTime() - startTime; if (result < 0) { ALOGV("dequeueBuffer: IGraphicBufferProducer::dequeueBuffer" Loading @@ -524,6 +524,9 @@ int Surface::dequeueBuffer(android_native_buffer_t** buffer, int* fenceFd) { Mutex::Autolock lock(mMutex); // Write this while holding the mutex mLastDequeueStartTime = startTime; sp<GraphicBuffer>& gbuf(mSlots[buf].buffer); // this should never happen Loading Loading @@ -1699,6 +1702,11 @@ status_t Surface::getUniqueId(uint64_t* outId) const { return mGraphicBufferProducer->getUniqueId(outId); } nsecs_t Surface::getLastDequeueStartTime() const { Mutex::Autolock lock(mMutex); return mLastDequeueStartTime; } status_t Surface::getAndFlushRemovedBuffers(std::vector<sp<GraphicBuffer>>* out) { if (out == nullptr) { ALOGE("%s: out must not be null!", __FUNCTION__); Loading
libs/gui/tests/Surface_test.cpp +17 −1 Original line number Diff line number Diff line Loading @@ -393,6 +393,22 @@ TEST_F(SurfaceTest, GetAndFlushRemovedBuffers) { ASSERT_LE(removedBuffers.size(), 1u); } TEST_F(SurfaceTest, TestGetLastDequeueStartTime) { sp<ANativeWindow> anw(mSurface); ASSERT_EQ(NO_ERROR, native_window_api_connect(anw.get(), NATIVE_WINDOW_API_CPU)); ANativeWindowBuffer* buffer = nullptr; int32_t fenceFd = -1; nsecs_t before = systemTime(CLOCK_MONOTONIC); anw->dequeueBuffer(anw.get(), &buffer, &fenceFd); nsecs_t after = systemTime(CLOCK_MONOTONIC); nsecs_t lastDequeueTime = mSurface->getLastDequeueStartTime(); ASSERT_LE(before, lastDequeueTime); ASSERT_GE(after, lastDequeueTime); } class FakeConsumer : public BnConsumerListener { public: void onFrameAvailable(const BufferItem& /*item*/) override {} Loading Loading @@ -1568,4 +1584,4 @@ TEST_F(GetFrameTimestampsTest, PresentUnsupportedNoSync) { EXPECT_EQ(-1, outDisplayPresentTime); } } } // namespace android