diff options
author | 2017-05-31 13:50:16 -0700 | |
---|---|---|
committer | 2017-05-31 14:07:50 -0700 | |
commit | 932f008485dbb6fb452c8616abd7586f914f72ce (patch) | |
tree | 80e34a4090291d4ddbd9e9b3411f29e5b498e1d2 | |
parent | 1e4088fc68d88726bac0349b674ea557a63e0f27 (diff) |
libgui: Add Surface::getLastDequeueStartTime
Adds the getLastDequeueStartTime method, which allows the caller to
determine whether the last dequeueBuffer call fell into a given time
window.
Bug: 62213889
Test: SurfaceTest.TestGetLastDequeueStartTime in libgui_test
Change-Id: I1684deb09273745a3adc751554624d2257fa890e
-rw-r--r-- | include/gui/Surface.h | 6 | ||||
-rw-r--r-- | libs/gui/Surface.cpp | 12 | ||||
-rw-r--r-- | libs/gui/tests/Surface_test.cpp | 18 |
3 files changed, 33 insertions, 3 deletions
diff --git a/include/gui/Surface.h b/include/gui/Surface.h index 8b1d1069b3..e8dc83e951 100644 --- a/include/gui/Surface.h +++ b/include/gui/Surface.h @@ -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(); @@ -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; diff --git a/libs/gui/Surface.cpp b/libs/gui/Surface.cpp index 6583a622f5..7b2b5c37f1 100644 --- a/libs/gui/Surface.cpp +++ b/libs/gui/Surface.cpp @@ -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" @@ -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 @@ -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__); diff --git a/libs/gui/tests/Surface_test.cpp b/libs/gui/tests/Surface_test.cpp index fcaa23a4e5..81820def1c 100644 --- a/libs/gui/tests/Surface_test.cpp +++ b/libs/gui/tests/Surface_test.cpp @@ -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 {} @@ -1568,4 +1584,4 @@ TEST_F(GetFrameTimestampsTest, PresentUnsupportedNoSync) { EXPECT_EQ(-1, outDisplayPresentTime); } -} +} // namespace android |