summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Dan Stoza <stoza@google.com> 2017-05-31 13:50:16 -0700
committer Dan Stoza <stoza@google.com> 2017-05-31 14:07:50 -0700
commit932f008485dbb6fb452c8616abd7586f914f72ce (patch)
tree80e34a4090291d4ddbd9e9b3411f29e5b498e1d2
parent1e4088fc68d88726bac0349b674ea557a63e0f27 (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.h6
-rw-r--r--libs/gui/Surface.cpp12
-rw-r--r--libs/gui/tests/Surface_test.cpp18
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