• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2011 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include "DummyConsumer.h"
18 
19 #include <gtest/gtest.h>
20 
21 #include <android/hardware/configstore/1.0/ISurfaceFlingerConfigs.h>
22 #include <binder/ProcessState.h>
23 #include <configstore/Utils.h>
24 #include <cutils/properties.h>
25 #include <inttypes.h>
26 #include <gui/BufferItemConsumer.h>
27 #include <gui/IDisplayEventConnection.h>
28 #include <gui/IProducerListener.h>
29 #include <gui/ISurfaceComposer.h>
30 #include <gui/Surface.h>
31 #include <gui/SurfaceComposerClient.h>
32 #include <private/gui/ComposerService.h>
33 #include <ui/Rect.h>
34 #include <utils/String8.h>
35 
36 #include <limits>
37 #include <thread>
38 
39 namespace android {
40 
41 using namespace std::chrono_literals;
42 // retrieve wide-color and hdr settings from configstore
43 using namespace android::hardware::configstore;
44 using namespace android::hardware::configstore::V1_0;
45 using ui::ColorMode;
46 
47 using Transaction = SurfaceComposerClient::Transaction;
48 
49 static bool hasWideColorDisplay =
50         getBool<ISurfaceFlingerConfigs, &ISurfaceFlingerConfigs::hasWideColorDisplay>(false);
51 
52 static bool hasHdrDisplay =
53         getBool<ISurfaceFlingerConfigs, &ISurfaceFlingerConfigs::hasHDRDisplay>(false);
54 
55 class FakeSurfaceComposer;
56 class FakeProducerFrameEventHistory;
57 
58 static constexpr uint64_t NO_FRAME_INDEX = std::numeric_limits<uint64_t>::max();
59 
60 class SurfaceTest : public ::testing::Test {
61 protected:
SurfaceTest()62     SurfaceTest() {
63         ProcessState::self()->startThreadPool();
64     }
65 
SetUp()66     virtual void SetUp() {
67         mComposerClient = new SurfaceComposerClient;
68         ASSERT_EQ(NO_ERROR, mComposerClient->initCheck());
69 
70         // TODO(brianderson): The following sometimes fails and is a source of
71         //   test flakiness.
72         mSurfaceControl = mComposerClient->createSurface(
73                 String8("Test Surface"), 32, 32, PIXEL_FORMAT_RGBA_8888, 0);
74 
75         ASSERT_TRUE(mSurfaceControl != NULL);
76         ASSERT_TRUE(mSurfaceControl->isValid());
77 
78         Transaction t;
79         ASSERT_EQ(NO_ERROR, t.setLayer(mSurfaceControl, 0x7fffffff)
80                 .show(mSurfaceControl)
81                 .apply());
82 
83         mSurface = mSurfaceControl->getSurface();
84         ASSERT_TRUE(mSurface != NULL);
85     }
86 
TearDown()87     virtual void TearDown() {
88         mComposerClient->dispose();
89     }
90 
91     sp<Surface> mSurface;
92     sp<SurfaceComposerClient> mComposerClient;
93     sp<SurfaceControl> mSurfaceControl;
94 };
95 
TEST_F(SurfaceTest,CreateSurfaceReturnsErrorBadClient)96 TEST_F(SurfaceTest, CreateSurfaceReturnsErrorBadClient) {
97     mComposerClient->dispose();
98     ASSERT_EQ(NO_INIT, mComposerClient->initCheck());
99 
100     sp<SurfaceControl> sc;
101     status_t err = mComposerClient->createSurfaceChecked(
102             String8("Test Surface"), 32, 32, PIXEL_FORMAT_RGBA_8888, &sc, 0);
103     ASSERT_EQ(NO_INIT, err);
104 }
105 
TEST_F(SurfaceTest,QueuesToWindowComposerIsTrueWhenVisible)106 TEST_F(SurfaceTest, QueuesToWindowComposerIsTrueWhenVisible) {
107     sp<ANativeWindow> anw(mSurface);
108     int result = -123;
109     int err = anw->query(anw.get(), NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER,
110             &result);
111     EXPECT_EQ(NO_ERROR, err);
112     EXPECT_EQ(1, result);
113 }
114 
TEST_F(SurfaceTest,QueuesToWindowComposerIsTrueWhenPurgatorized)115 TEST_F(SurfaceTest, QueuesToWindowComposerIsTrueWhenPurgatorized) {
116     mSurfaceControl.clear();
117     // Wait for the async clean-up to complete.
118     std::this_thread::sleep_for(50ms);
119 
120     sp<ANativeWindow> anw(mSurface);
121     int result = -123;
122     int err = anw->query(anw.get(), NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER,
123             &result);
124     EXPECT_EQ(NO_ERROR, err);
125     EXPECT_EQ(1, result);
126 }
127 
128 // This test probably doesn't belong here.
TEST_F(SurfaceTest,ScreenshotsOfProtectedBuffersDontSucceed)129 TEST_F(SurfaceTest, ScreenshotsOfProtectedBuffersDontSucceed) {
130     sp<ANativeWindow> anw(mSurface);
131 
132     // Verify the screenshot works with no protected buffers.
133     sp<ISurfaceComposer> sf(ComposerService::getComposerService());
134     sp<IBinder> display(sf->getBuiltInDisplay(
135             ISurfaceComposer::eDisplayIdMain));
136     sp<GraphicBuffer> outBuffer;
137     bool ignored;
138     ASSERT_EQ(NO_ERROR, sf->captureScreen(display, &outBuffer, ignored, Rect(),
139             64, 64, 0, 0x7fffffff, false));
140 
141     ASSERT_EQ(NO_ERROR, native_window_api_connect(anw.get(),
142             NATIVE_WINDOW_API_CPU));
143     // Set the PROTECTED usage bit and verify that the screenshot fails.  Note
144     // that we need to dequeue a buffer in order for it to actually get
145     // allocated in SurfaceFlinger.
146     ASSERT_EQ(NO_ERROR, native_window_set_usage(anw.get(),
147             GRALLOC_USAGE_PROTECTED));
148     ASSERT_EQ(NO_ERROR, native_window_set_buffer_count(anw.get(), 3));
149     ANativeWindowBuffer* buf = 0;
150 
151     status_t err = native_window_dequeue_buffer_and_wait(anw.get(), &buf);
152     if (err) {
153         // we could fail if GRALLOC_USAGE_PROTECTED is not supported.
154         // that's okay as long as this is the reason for the failure.
155         // try again without the GRALLOC_USAGE_PROTECTED bit.
156         ASSERT_EQ(NO_ERROR, native_window_set_usage(anw.get(), 0));
157         ASSERT_EQ(NO_ERROR, native_window_dequeue_buffer_and_wait(anw.get(),
158                 &buf));
159         return;
160     }
161     ASSERT_EQ(NO_ERROR, anw->cancelBuffer(anw.get(), buf, -1));
162 
163     for (int i = 0; i < 4; i++) {
164         // Loop to make sure SurfaceFlinger has retired a protected buffer.
165         ASSERT_EQ(NO_ERROR, native_window_dequeue_buffer_and_wait(anw.get(),
166                 &buf));
167         ASSERT_EQ(NO_ERROR, anw->queueBuffer(anw.get(), buf, -1));
168     }
169     ASSERT_EQ(NO_ERROR, sf->captureScreen(display, &outBuffer, ignored, Rect(),
170             64, 64, 0, 0x7fffffff, false));
171 }
172 
TEST_F(SurfaceTest,ConcreteTypeIsSurface)173 TEST_F(SurfaceTest, ConcreteTypeIsSurface) {
174     sp<ANativeWindow> anw(mSurface);
175     int result = -123;
176     int err = anw->query(anw.get(), NATIVE_WINDOW_CONCRETE_TYPE, &result);
177     EXPECT_EQ(NO_ERROR, err);
178     EXPECT_EQ(NATIVE_WINDOW_SURFACE, result);
179 }
180 
TEST_F(SurfaceTest,LayerCountIsOne)181 TEST_F(SurfaceTest, LayerCountIsOne) {
182     sp<ANativeWindow> anw(mSurface);
183     int result = -123;
184     int err = anw->query(anw.get(), NATIVE_WINDOW_LAYER_COUNT, &result);
185     EXPECT_EQ(NO_ERROR, err);
186     EXPECT_EQ(1, result);
187 }
188 
TEST_F(SurfaceTest,QueryConsumerUsage)189 TEST_F(SurfaceTest, QueryConsumerUsage) {
190     const int TEST_USAGE_FLAGS =
191             GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_HW_RENDER;
192     sp<IGraphicBufferProducer> producer;
193     sp<IGraphicBufferConsumer> consumer;
194     BufferQueue::createBufferQueue(&producer, &consumer);
195     sp<BufferItemConsumer> c = new BufferItemConsumer(consumer,
196             TEST_USAGE_FLAGS);
197     sp<Surface> s = new Surface(producer);
198 
199     sp<ANativeWindow> anw(s);
200 
201     int flags = -1;
202     int err = anw->query(anw.get(), NATIVE_WINDOW_CONSUMER_USAGE_BITS, &flags);
203 
204     ASSERT_EQ(NO_ERROR, err);
205     ASSERT_EQ(TEST_USAGE_FLAGS, flags);
206 }
207 
TEST_F(SurfaceTest,QueryDefaultBuffersDataSpace)208 TEST_F(SurfaceTest, QueryDefaultBuffersDataSpace) {
209     const android_dataspace TEST_DATASPACE = HAL_DATASPACE_SRGB;
210     sp<IGraphicBufferProducer> producer;
211     sp<IGraphicBufferConsumer> consumer;
212     BufferQueue::createBufferQueue(&producer, &consumer);
213     sp<CpuConsumer> cpuConsumer = new CpuConsumer(consumer, 1);
214 
215     cpuConsumer->setDefaultBufferDataSpace(TEST_DATASPACE);
216 
217     sp<Surface> s = new Surface(producer);
218 
219     sp<ANativeWindow> anw(s);
220 
221     android_dataspace dataSpace;
222 
223     int err = anw->query(anw.get(), NATIVE_WINDOW_DEFAULT_DATASPACE,
224             reinterpret_cast<int*>(&dataSpace));
225 
226     ASSERT_EQ(NO_ERROR, err);
227     ASSERT_EQ(TEST_DATASPACE, dataSpace);
228 }
229 
TEST_F(SurfaceTest,SettingGenerationNumber)230 TEST_F(SurfaceTest, SettingGenerationNumber) {
231     sp<IGraphicBufferProducer> producer;
232     sp<IGraphicBufferConsumer> consumer;
233     BufferQueue::createBufferQueue(&producer, &consumer);
234     sp<CpuConsumer> cpuConsumer = new CpuConsumer(consumer, 1);
235     sp<Surface> surface = new Surface(producer);
236     sp<ANativeWindow> window(surface);
237 
238     // Allocate a buffer with a generation number of 0
239     ANativeWindowBuffer* buffer;
240     int fenceFd;
241     ASSERT_EQ(NO_ERROR, native_window_api_connect(window.get(),
242             NATIVE_WINDOW_API_CPU));
243     ASSERT_EQ(NO_ERROR, window->dequeueBuffer(window.get(), &buffer, &fenceFd));
244     ASSERT_EQ(NO_ERROR, window->cancelBuffer(window.get(), buffer, fenceFd));
245 
246     // Detach the buffer and check its generation number
247     sp<GraphicBuffer> graphicBuffer;
248     sp<Fence> fence;
249     ASSERT_EQ(NO_ERROR, surface->detachNextBuffer(&graphicBuffer, &fence));
250     ASSERT_EQ(0U, graphicBuffer->getGenerationNumber());
251 
252     ASSERT_EQ(NO_ERROR, surface->setGenerationNumber(1));
253     buffer = static_cast<ANativeWindowBuffer*>(graphicBuffer.get());
254 
255     // This should change the generation number of the GraphicBuffer
256     ASSERT_EQ(NO_ERROR, surface->attachBuffer(buffer));
257 
258     // Check that the new generation number sticks with the buffer
259     ASSERT_EQ(NO_ERROR, window->cancelBuffer(window.get(), buffer, -1));
260     ASSERT_EQ(NO_ERROR, window->dequeueBuffer(window.get(), &buffer, &fenceFd));
261     graphicBuffer = static_cast<GraphicBuffer*>(buffer);
262     ASSERT_EQ(1U, graphicBuffer->getGenerationNumber());
263 }
264 
TEST_F(SurfaceTest,GetConsumerName)265 TEST_F(SurfaceTest, GetConsumerName) {
266     sp<IGraphicBufferProducer> producer;
267     sp<IGraphicBufferConsumer> consumer;
268     BufferQueue::createBufferQueue(&producer, &consumer);
269 
270     sp<DummyConsumer> dummyConsumer(new DummyConsumer);
271     consumer->consumerConnect(dummyConsumer, false);
272     consumer->setConsumerName(String8("TestConsumer"));
273 
274     sp<Surface> surface = new Surface(producer);
275     sp<ANativeWindow> window(surface);
276     native_window_api_connect(window.get(), NATIVE_WINDOW_API_CPU);
277 
278     EXPECT_STREQ("TestConsumer", surface->getConsumerName().string());
279 }
280 
TEST_F(SurfaceTest,GetWideColorSupport)281 TEST_F(SurfaceTest, GetWideColorSupport) {
282     sp<IGraphicBufferProducer> producer;
283     sp<IGraphicBufferConsumer> consumer;
284     BufferQueue::createBufferQueue(&producer, &consumer);
285 
286     sp<DummyConsumer> dummyConsumer(new DummyConsumer);
287     consumer->consumerConnect(dummyConsumer, false);
288     consumer->setConsumerName(String8("TestConsumer"));
289 
290     sp<Surface> surface = new Surface(producer);
291     sp<ANativeWindow> window(surface);
292     native_window_api_connect(window.get(), NATIVE_WINDOW_API_CPU);
293 
294     bool supported;
295     surface->getWideColorSupport(&supported);
296 
297     // NOTE: This test assumes that device that supports
298     // wide-color (as indicated by BoardConfig) must also
299     // have a wide-color primary display.
300     // That assumption allows this test to cover devices
301     // that advertised a wide-color color mode without
302     // actually supporting wide-color to pass this test
303     // as well as the case of a device that does support
304     // wide-color (via BoardConfig) and has a wide-color
305     // primary display.
306     // NOT covered at this time is a device that supports
307     // wide color in the BoardConfig but does not support
308     // a wide-color color mode on the primary display.
309     ASSERT_EQ(hasWideColorDisplay, supported);
310 }
311 
TEST_F(SurfaceTest,GetHdrSupport)312 TEST_F(SurfaceTest, GetHdrSupport) {
313     sp<IGraphicBufferProducer> producer;
314     sp<IGraphicBufferConsumer> consumer;
315     BufferQueue::createBufferQueue(&producer, &consumer);
316 
317     sp<DummyConsumer> dummyConsumer(new DummyConsumer);
318     consumer->consumerConnect(dummyConsumer, false);
319     consumer->setConsumerName(String8("TestConsumer"));
320 
321     sp<Surface> surface = new Surface(producer);
322     sp<ANativeWindow> window(surface);
323     native_window_api_connect(window.get(), NATIVE_WINDOW_API_CPU);
324 
325     bool supported;
326     status_t result = surface->getHdrSupport(&supported);
327     ASSERT_EQ(NO_ERROR, result);
328 
329     // NOTE: This is not a CTS test.
330     // This test verifies that when the BoardConfig TARGET_HAS_HDR_DISPLAY
331     // is TRUE, getHdrSupport is also true.
332     // TODO: Add check for an HDR color mode on the primary display.
333     ASSERT_EQ(hasHdrDisplay, supported);
334 }
335 
TEST_F(SurfaceTest,SetHdrMetadata)336 TEST_F(SurfaceTest, SetHdrMetadata) {
337     sp<IGraphicBufferProducer> producer;
338     sp<IGraphicBufferConsumer> consumer;
339     BufferQueue::createBufferQueue(&producer, &consumer);
340 
341     sp<DummyConsumer> dummyConsumer(new DummyConsumer);
342     consumer->consumerConnect(dummyConsumer, false);
343     consumer->setConsumerName(String8("TestConsumer"));
344 
345     sp<Surface> surface = new Surface(producer);
346     sp<ANativeWindow> window(surface);
347     native_window_api_connect(window.get(), NATIVE_WINDOW_API_CPU);
348 
349     bool supported;
350     status_t result = surface->getHdrSupport(&supported);
351     ASSERT_EQ(NO_ERROR, result);
352 
353     if (!hasHdrDisplay || !supported) {
354         return;
355     }
356     const android_smpte2086_metadata smpte2086 = {
357         {0.680, 0.320},
358         {0.265, 0.690},
359         {0.150, 0.060},
360         {0.3127, 0.3290},
361         100.0,
362         0.1,
363     };
364     const android_cta861_3_metadata cta861_3 = {
365         78.0,
366         62.0,
367     };
368     int error = native_window_set_buffers_smpte2086_metadata(window.get(), &smpte2086);
369     ASSERT_EQ(error, NO_ERROR);
370     error = native_window_set_buffers_cta861_3_metadata(window.get(), &cta861_3);
371     ASSERT_EQ(error, NO_ERROR);
372 }
373 
TEST_F(SurfaceTest,DynamicSetBufferCount)374 TEST_F(SurfaceTest, DynamicSetBufferCount) {
375     sp<IGraphicBufferProducer> producer;
376     sp<IGraphicBufferConsumer> consumer;
377     BufferQueue::createBufferQueue(&producer, &consumer);
378 
379     sp<DummyConsumer> dummyConsumer(new DummyConsumer);
380     consumer->consumerConnect(dummyConsumer, false);
381     consumer->setConsumerName(String8("TestConsumer"));
382 
383     sp<Surface> surface = new Surface(producer);
384     sp<ANativeWindow> window(surface);
385 
386     ASSERT_EQ(NO_ERROR, native_window_api_connect(window.get(),
387             NATIVE_WINDOW_API_CPU));
388     native_window_set_buffer_count(window.get(), 4);
389 
390     int fence;
391     ANativeWindowBuffer* buffer;
392     ASSERT_EQ(NO_ERROR, window->dequeueBuffer(window.get(), &buffer, &fence));
393     native_window_set_buffer_count(window.get(), 3);
394     ASSERT_EQ(NO_ERROR, window->queueBuffer(window.get(), buffer, fence));
395     native_window_set_buffer_count(window.get(), 2);
396     ASSERT_EQ(NO_ERROR, window->dequeueBuffer(window.get(), &buffer, &fence));
397     ASSERT_EQ(NO_ERROR, window->queueBuffer(window.get(), buffer, fence));
398 }
399 
TEST_F(SurfaceTest,GetAndFlushRemovedBuffers)400 TEST_F(SurfaceTest, GetAndFlushRemovedBuffers) {
401     sp<IGraphicBufferProducer> producer;
402     sp<IGraphicBufferConsumer> consumer;
403     BufferQueue::createBufferQueue(&producer, &consumer);
404 
405     sp<DummyConsumer> dummyConsumer(new DummyConsumer);
406     consumer->consumerConnect(dummyConsumer, false);
407     consumer->setConsumerName(String8("TestConsumer"));
408 
409     sp<Surface> surface = new Surface(producer);
410     sp<ANativeWindow> window(surface);
411     sp<DummyProducerListener> listener = new DummyProducerListener();
412     ASSERT_EQ(OK, surface->connect(
413             NATIVE_WINDOW_API_CPU,
414             /*listener*/listener,
415             /*reportBufferRemoval*/true));
416     const int BUFFER_COUNT = 4;
417     ASSERT_EQ(NO_ERROR, native_window_set_buffer_count(window.get(), BUFFER_COUNT));
418 
419     sp<GraphicBuffer> detachedBuffer;
420     sp<Fence> outFence;
421     int fences[BUFFER_COUNT];
422     ANativeWindowBuffer* buffers[BUFFER_COUNT];
423     // Allocate buffers because detachNextBuffer requires allocated buffers
424     for (int i = 0; i < BUFFER_COUNT; i++) {
425         ASSERT_EQ(NO_ERROR, window->dequeueBuffer(window.get(), &buffers[i], &fences[i]));
426     }
427     for (int i = 0; i < BUFFER_COUNT; i++) {
428         ASSERT_EQ(NO_ERROR, window->cancelBuffer(window.get(), buffers[i], fences[i]));
429     }
430 
431     // Test detached buffer is correctly reported
432     ASSERT_EQ(NO_ERROR, surface->detachNextBuffer(&detachedBuffer, &outFence));
433     std::vector<sp<GraphicBuffer>> removedBuffers;
434     ASSERT_EQ(OK, surface->getAndFlushRemovedBuffers(&removedBuffers));
435     ASSERT_EQ(1u, removedBuffers.size());
436     ASSERT_EQ(detachedBuffer->handle, removedBuffers.at(0)->handle);
437     // Test the list is flushed one getAndFlushRemovedBuffers returns
438     ASSERT_EQ(OK, surface->getAndFlushRemovedBuffers(&removedBuffers));
439     ASSERT_EQ(0u, removedBuffers.size());
440 
441 
442     // Test removed buffer list is cleanup after next dequeueBuffer call
443     ASSERT_EQ(NO_ERROR, surface->detachNextBuffer(&detachedBuffer, &outFence));
444     ASSERT_EQ(NO_ERROR, window->dequeueBuffer(window.get(), &buffers[0], &fences[0]));
445     ASSERT_EQ(OK, surface->getAndFlushRemovedBuffers(&removedBuffers));
446     ASSERT_EQ(0u, removedBuffers.size());
447     ASSERT_EQ(NO_ERROR, window->cancelBuffer(window.get(), buffers[0], fences[0]));
448 
449     // Test removed buffer list is cleanup after next detachNextBuffer call
450     ASSERT_EQ(NO_ERROR, surface->detachNextBuffer(&detachedBuffer, &outFence));
451     ASSERT_EQ(NO_ERROR, surface->detachNextBuffer(&detachedBuffer, &outFence));
452     ASSERT_EQ(OK, surface->getAndFlushRemovedBuffers(&removedBuffers));
453     ASSERT_EQ(1u, removedBuffers.size());
454     ASSERT_EQ(detachedBuffer->handle, removedBuffers.at(0)->handle);
455 
456     // Re-allocate buffers since all buffers are detached up to now
457     for (int i = 0; i < BUFFER_COUNT; i++) {
458         ASSERT_EQ(NO_ERROR, window->dequeueBuffer(window.get(), &buffers[i], &fences[i]));
459     }
460     for (int i = 0; i < BUFFER_COUNT; i++) {
461         ASSERT_EQ(NO_ERROR, window->cancelBuffer(window.get(), buffers[i], fences[i]));
462     }
463 
464     ASSERT_EQ(NO_ERROR, surface->detachNextBuffer(&detachedBuffer, &outFence));
465     ASSERT_EQ(NO_ERROR, surface->attachBuffer(detachedBuffer.get()));
466     ASSERT_EQ(OK, surface->getAndFlushRemovedBuffers(&removedBuffers));
467     // Depends on which slot GraphicBufferProducer impl pick, the attach call might
468     // get 0 or 1 buffer removed.
469     ASSERT_LE(removedBuffers.size(), 1u);
470 }
471 
TEST_F(SurfaceTest,TestGetLastDequeueStartTime)472 TEST_F(SurfaceTest, TestGetLastDequeueStartTime) {
473     sp<ANativeWindow> anw(mSurface);
474     ASSERT_EQ(NO_ERROR, native_window_api_connect(anw.get(), NATIVE_WINDOW_API_CPU));
475 
476     ANativeWindowBuffer* buffer = nullptr;
477     int32_t fenceFd = -1;
478 
479     nsecs_t before = systemTime(CLOCK_MONOTONIC);
480     anw->dequeueBuffer(anw.get(), &buffer, &fenceFd);
481     nsecs_t after = systemTime(CLOCK_MONOTONIC);
482 
483     nsecs_t lastDequeueTime = mSurface->getLastDequeueStartTime();
484     ASSERT_LE(before, lastDequeueTime);
485     ASSERT_GE(after, lastDequeueTime);
486 }
487 
488 class FakeConsumer : public BnConsumerListener {
489 public:
onFrameAvailable(const BufferItem &)490     void onFrameAvailable(const BufferItem& /*item*/) override {}
onBuffersReleased()491     void onBuffersReleased() override {}
onSidebandStreamChanged()492     void onSidebandStreamChanged() override {}
493 
addAndGetFrameTimestamps(const NewFrameEventsEntry * newTimestamps,FrameEventHistoryDelta * outDelta)494     void addAndGetFrameTimestamps(
495             const NewFrameEventsEntry* newTimestamps,
496             FrameEventHistoryDelta* outDelta) override {
497         if (newTimestamps) {
498             if (mGetFrameTimestampsEnabled) {
499                 EXPECT_GT(mNewFrameEntryOverride.frameNumber, 0u) <<
500                         "Test should set mNewFrameEntryOverride before queuing "
501                         "a frame.";
502                 EXPECT_EQ(newTimestamps->frameNumber,
503                         mNewFrameEntryOverride.frameNumber) <<
504                         "Test attempting to add NewFrameEntryOverride with "
505                         "incorrect frame number.";
506                 mFrameEventHistory.addQueue(mNewFrameEntryOverride);
507                 mNewFrameEntryOverride.frameNumber = 0;
508             }
509             mAddFrameTimestampsCount++;
510             mLastAddedFrameNumber = newTimestamps->frameNumber;
511         }
512         if (outDelta) {
513             mFrameEventHistory.getAndResetDelta(outDelta);
514             mGetFrameTimestampsCount++;
515         }
516         mAddAndGetFrameTimestampsCallCount++;
517     }
518 
519     bool mGetFrameTimestampsEnabled = false;
520 
521     ConsumerFrameEventHistory mFrameEventHistory;
522     int mAddAndGetFrameTimestampsCallCount = 0;
523     int mAddFrameTimestampsCount = 0;
524     int mGetFrameTimestampsCount = 0;
525     uint64_t mLastAddedFrameNumber = NO_FRAME_INDEX;
526 
527     NewFrameEventsEntry mNewFrameEntryOverride = { 0, 0, 0, nullptr };
528 };
529 
530 
531 class FakeSurfaceComposer : public ISurfaceComposer{
532 public:
~FakeSurfaceComposer()533     ~FakeSurfaceComposer() override {}
534 
setSupportsPresent(bool supportsPresent)535     void setSupportsPresent(bool supportsPresent) {
536         mSupportsPresent = supportsPresent;
537     }
538 
createConnection()539     sp<ISurfaceComposerClient> createConnection() override { return nullptr; }
createScopedConnection(const sp<IGraphicBufferProducer> &)540     sp<ISurfaceComposerClient> createScopedConnection(
541             const sp<IGraphicBufferProducer>& /* parent */) override {
542         return nullptr;
543     }
createDisplayEventConnection(ISurfaceComposer::VsyncSource)544     sp<IDisplayEventConnection> createDisplayEventConnection(ISurfaceComposer::VsyncSource)
545             override {
546         return nullptr;
547     }
createDisplay(const String8 &,bool)548     sp<IBinder> createDisplay(const String8& /*displayName*/,
549             bool /*secure*/) override { return nullptr; }
destroyDisplay(const sp<IBinder> &)550     void destroyDisplay(const sp<IBinder>& /*display */) override {}
getBuiltInDisplay(int32_t)551     sp<IBinder> getBuiltInDisplay(int32_t /*id*/) override { return nullptr; }
setTransactionState(const Vector<ComposerState> &,const Vector<DisplayState> &,uint32_t)552     void setTransactionState(const Vector<ComposerState>& /*state*/,
553             const Vector<DisplayState>& /*displays*/, uint32_t /*flags*/)
554             override {}
bootFinished()555     void bootFinished() override {}
authenticateSurfaceTexture(const sp<IGraphicBufferProducer> &) const556     bool authenticateSurfaceTexture(
557             const sp<IGraphicBufferProducer>& /*surface*/) const override {
558         return false;
559     }
560 
getSupportedFrameTimestamps(std::vector<FrameEvent> * outSupported) const561     status_t getSupportedFrameTimestamps(std::vector<FrameEvent>* outSupported)
562             const override {
563         *outSupported = {
564                 FrameEvent::REQUESTED_PRESENT,
565                 FrameEvent::ACQUIRE,
566                 FrameEvent::LATCH,
567                 FrameEvent::FIRST_REFRESH_START,
568                 FrameEvent::LAST_REFRESH_START,
569                 FrameEvent::GPU_COMPOSITION_DONE,
570                 FrameEvent::DEQUEUE_READY,
571                 FrameEvent::RELEASE
572         };
573         if (mSupportsPresent) {
574             outSupported->push_back(
575                         FrameEvent::DISPLAY_PRESENT);
576         }
577         return NO_ERROR;
578     }
579 
setPowerMode(const sp<IBinder> &,int)580     void setPowerMode(const sp<IBinder>& /*display*/, int /*mode*/) override {}
getDisplayConfigs(const sp<IBinder> &,Vector<DisplayInfo> *)581     status_t getDisplayConfigs(const sp<IBinder>& /*display*/,
582             Vector<DisplayInfo>* /*configs*/) override { return NO_ERROR; }
getDisplayStats(const sp<IBinder> &,DisplayStatInfo *)583     status_t getDisplayStats(const sp<IBinder>& /*display*/,
584             DisplayStatInfo* /*stats*/) override { return NO_ERROR; }
getActiveConfig(const sp<IBinder> &)585     int getActiveConfig(const sp<IBinder>& /*display*/) override { return 0; }
setActiveConfig(const sp<IBinder> &,int)586     status_t setActiveConfig(const sp<IBinder>& /*display*/, int /*id*/)
587             override {
588         return NO_ERROR;
589     }
getDisplayColorModes(const sp<IBinder> &,Vector<ColorMode> *)590     status_t getDisplayColorModes(const sp<IBinder>& /*display*/,
591             Vector<ColorMode>* /*outColorModes*/) override {
592         return NO_ERROR;
593     }
getActiveColorMode(const sp<IBinder> &)594     ColorMode getActiveColorMode(const sp<IBinder>& /*display*/)
595             override {
596         return ColorMode::NATIVE;
597     }
setActiveColorMode(const sp<IBinder> &,ColorMode)598     status_t setActiveColorMode(const sp<IBinder>& /*display*/,
599         ColorMode /*colorMode*/) override { return NO_ERROR; }
captureScreen(const sp<IBinder> &,sp<GraphicBuffer> *,bool &,Rect,uint32_t,uint32_t,int32_t,int32_t,bool,Rotation,bool)600     status_t captureScreen(const sp<IBinder>& /*display*/,
601             sp<GraphicBuffer>* /*outBuffer*/,
602             bool& /* outCapturedSecureLayers */,
603             Rect /*sourceCrop*/, uint32_t /*reqWidth*/, uint32_t /*reqHeight*/,
604             int32_t /*minLayerZ*/, int32_t /*maxLayerZ*/,
605             bool /*useIdentityTransform*/,
606             Rotation /*rotation*/,
607             bool /*captureSecureLayers*/) override { return NO_ERROR; }
captureLayers(const sp<IBinder> &,sp<GraphicBuffer> *,const Rect &,float,bool)608     virtual status_t captureLayers(const sp<IBinder>& /*parentHandle*/,
609                                    sp<GraphicBuffer>* /*outBuffer*/, const Rect& /*sourceCrop*/,
610                                    float /*frameScale*/, bool /*childrenOnly*/) override {
611         return NO_ERROR;
612     }
clearAnimationFrameStats()613     status_t clearAnimationFrameStats() override { return NO_ERROR; }
getAnimationFrameStats(FrameStats *) const614     status_t getAnimationFrameStats(FrameStats* /*outStats*/) const override {
615         return NO_ERROR;
616     }
getHdrCapabilities(const sp<IBinder> &,HdrCapabilities *) const617     status_t getHdrCapabilities(const sp<IBinder>& /*display*/,
618             HdrCapabilities* /*outCapabilities*/) const override {
619         return NO_ERROR;
620     }
enableVSyncInjections(bool)621     status_t enableVSyncInjections(bool /*enable*/) override {
622         return NO_ERROR;
623     }
injectVSync(nsecs_t)624     status_t injectVSync(nsecs_t /*when*/) override { return NO_ERROR; }
getLayerDebugInfo(std::vector<LayerDebugInfo> *)625     status_t getLayerDebugInfo(std::vector<LayerDebugInfo>* /*layers*/) override {
626         return NO_ERROR;
627     }
628 
629 protected:
onAsBinder()630     IBinder* onAsBinder() override { return nullptr; }
631 
632 private:
633     bool mSupportsPresent{true};
634 };
635 
636 class FakeProducerFrameEventHistory : public ProducerFrameEventHistory {
637 public:
FakeProducerFrameEventHistory(FenceToFenceTimeMap * fenceMap)638     FakeProducerFrameEventHistory(FenceToFenceTimeMap* fenceMap)
639         : mFenceMap(fenceMap) {}
640 
~FakeProducerFrameEventHistory()641     ~FakeProducerFrameEventHistory() {}
642 
updateAcquireFence(uint64_t frameNumber,std::shared_ptr<FenceTime> && acquire)643     void updateAcquireFence(uint64_t frameNumber,
644             std::shared_ptr<FenceTime>&& acquire) override {
645         // Verify the acquire fence being added isn't the one from the consumer.
646         EXPECT_NE(mConsumerAcquireFence, acquire);
647         // Override the fence, so we can verify this was called by the
648         // producer after the frame is queued.
649         ProducerFrameEventHistory::updateAcquireFence(frameNumber,
650                 std::shared_ptr<FenceTime>(mAcquireFenceOverride));
651     }
652 
setAcquireFenceOverride(const std::shared_ptr<FenceTime> & acquireFenceOverride,const std::shared_ptr<FenceTime> & consumerAcquireFence)653     void setAcquireFenceOverride(
654             const std::shared_ptr<FenceTime>& acquireFenceOverride,
655             const std::shared_ptr<FenceTime>& consumerAcquireFence) {
656         mAcquireFenceOverride = acquireFenceOverride;
657         mConsumerAcquireFence = consumerAcquireFence;
658     }
659 
660 protected:
createFenceTime(const sp<Fence> & fence) const661     std::shared_ptr<FenceTime> createFenceTime(const sp<Fence>& fence)
662             const override {
663         return mFenceMap->createFenceTimeForTest(fence);
664     }
665 
666     FenceToFenceTimeMap* mFenceMap{nullptr};
667 
668     std::shared_ptr<FenceTime> mAcquireFenceOverride{FenceTime::NO_FENCE};
669     std::shared_ptr<FenceTime> mConsumerAcquireFence{FenceTime::NO_FENCE};
670 };
671 
672 
673 class TestSurface : public Surface {
674 public:
TestSurface(const sp<IGraphicBufferProducer> & bufferProducer,FenceToFenceTimeMap * fenceMap)675     TestSurface(const sp<IGraphicBufferProducer>& bufferProducer,
676             FenceToFenceTimeMap* fenceMap)
677         : Surface(bufferProducer),
678           mFakeSurfaceComposer(new FakeSurfaceComposer) {
679         mFakeFrameEventHistory = new FakeProducerFrameEventHistory(fenceMap);
680         mFrameEventHistory.reset(mFakeFrameEventHistory);
681     }
682 
~TestSurface()683     ~TestSurface() override {}
684 
composerService() const685     sp<ISurfaceComposer> composerService() const override {
686         return mFakeSurfaceComposer;
687     }
688 
now() const689     nsecs_t now() const override {
690         return mNow;
691     }
692 
setNow(nsecs_t now)693     void setNow(nsecs_t now) {
694         mNow = now;
695     }
696 
697 public:
698     sp<FakeSurfaceComposer> mFakeSurfaceComposer;
699     nsecs_t mNow = 0;
700 
701     // mFrameEventHistory owns the instance of FakeProducerFrameEventHistory,
702     // but this raw pointer gives access to test functionality.
703     FakeProducerFrameEventHistory* mFakeFrameEventHistory;
704 };
705 
706 
707 class GetFrameTimestampsTest : public ::testing::Test {
708 protected:
709     struct FenceAndFenceTime {
FenceAndFenceTimeandroid::GetFrameTimestampsTest::FenceAndFenceTime710         explicit FenceAndFenceTime(FenceToFenceTimeMap& fenceMap)
711            : mFence(new Fence),
712              mFenceTime(fenceMap.createFenceTimeForTest(mFence)) {}
713         sp<Fence> mFence { nullptr };
714         std::shared_ptr<FenceTime> mFenceTime { nullptr };
715     };
716 
717     struct RefreshEvents {
RefreshEventsandroid::GetFrameTimestampsTest::RefreshEvents718         RefreshEvents(FenceToFenceTimeMap& fenceMap, nsecs_t refreshStart)
719           : mFenceMap(fenceMap),
720             kCompositorTiming(
721                 {refreshStart, refreshStart + 1, refreshStart + 2 }),
722             kStartTime(refreshStart + 3),
723             kGpuCompositionDoneTime(refreshStart + 4),
724             kPresentTime(refreshStart + 5) {}
725 
signalPostCompositeFencesandroid::GetFrameTimestampsTest::RefreshEvents726         void signalPostCompositeFences() {
727             mFenceMap.signalAllForTest(
728                         mGpuCompositionDone.mFence, kGpuCompositionDoneTime);
729             mFenceMap.signalAllForTest(mPresent.mFence, kPresentTime);
730         }
731 
732         FenceToFenceTimeMap& mFenceMap;
733 
734         FenceAndFenceTime mGpuCompositionDone { mFenceMap };
735         FenceAndFenceTime mPresent { mFenceMap };
736 
737         const CompositorTiming kCompositorTiming;
738 
739         const nsecs_t kStartTime;
740         const nsecs_t kGpuCompositionDoneTime;
741         const nsecs_t kPresentTime;
742     };
743 
744     struct FrameEvents {
FrameEventsandroid::GetFrameTimestampsTest::FrameEvents745         FrameEvents(FenceToFenceTimeMap& fenceMap, nsecs_t frameStartTime)
746             : mFenceMap(fenceMap),
747               kPostedTime(frameStartTime + 100),
748               kRequestedPresentTime(frameStartTime + 200),
749               kProducerAcquireTime(frameStartTime + 300),
750               kConsumerAcquireTime(frameStartTime + 301),
751               kLatchTime(frameStartTime + 500),
752               kDequeueReadyTime(frameStartTime + 600),
753               kReleaseTime(frameStartTime + 700),
754               mRefreshes {
755                     { mFenceMap, frameStartTime + 410 },
756                     { mFenceMap, frameStartTime + 420 },
757                     { mFenceMap, frameStartTime + 430 } } {}
758 
signalQueueFencesandroid::GetFrameTimestampsTest::FrameEvents759         void signalQueueFences() {
760             mFenceMap.signalAllForTest(
761                         mAcquireConsumer.mFence, kConsumerAcquireTime);
762             mFenceMap.signalAllForTest(
763                         mAcquireProducer.mFence, kProducerAcquireTime);
764         }
765 
signalRefreshFencesandroid::GetFrameTimestampsTest::FrameEvents766         void signalRefreshFences() {
767             for (auto& re : mRefreshes) {
768                 re.signalPostCompositeFences();
769             }
770         }
771 
signalReleaseFencesandroid::GetFrameTimestampsTest::FrameEvents772         void signalReleaseFences() {
773             mFenceMap.signalAllForTest(mRelease.mFence, kReleaseTime);
774         }
775 
776         FenceToFenceTimeMap& mFenceMap;
777 
778         FenceAndFenceTime mAcquireConsumer { mFenceMap };
779         FenceAndFenceTime mAcquireProducer { mFenceMap };
780         FenceAndFenceTime mRelease { mFenceMap };
781 
782         const nsecs_t kPostedTime;
783         const nsecs_t kRequestedPresentTime;
784         const nsecs_t kProducerAcquireTime;
785         const nsecs_t kConsumerAcquireTime;
786         const nsecs_t kLatchTime;
787         const nsecs_t kDequeueReadyTime;
788         const nsecs_t kReleaseTime;
789 
790         RefreshEvents mRefreshes[3];
791     };
792 
GetFrameTimestampsTest()793     GetFrameTimestampsTest() {}
794 
SetUp()795     virtual void SetUp() {
796         BufferQueue::createBufferQueue(&mProducer, &mConsumer);
797         mFakeConsumer = new FakeConsumer;
798         mCfeh = &mFakeConsumer->mFrameEventHistory;
799         mConsumer->consumerConnect(mFakeConsumer, false);
800         mConsumer->setConsumerName(String8("TestConsumer"));
801         mSurface = new TestSurface(mProducer, &mFenceMap);
802         mWindow = mSurface;
803 
804         ASSERT_EQ(NO_ERROR, native_window_api_connect(mWindow.get(),
805                 NATIVE_WINDOW_API_CPU));
806         native_window_set_buffer_count(mWindow.get(), 4);
807     }
808 
disableFrameTimestamps()809     void disableFrameTimestamps() {
810         mFakeConsumer->mGetFrameTimestampsEnabled = false;
811         native_window_enable_frame_timestamps(mWindow.get(), 0);
812         mFrameTimestampsEnabled = false;
813     }
814 
enableFrameTimestamps()815     void enableFrameTimestamps() {
816         mFakeConsumer->mGetFrameTimestampsEnabled = true;
817         native_window_enable_frame_timestamps(mWindow.get(), 1);
818         mFrameTimestampsEnabled = true;
819     }
820 
getAllFrameTimestamps(uint64_t frameId)821     int getAllFrameTimestamps(uint64_t frameId) {
822         return native_window_get_frame_timestamps(mWindow.get(), frameId,
823                 &outRequestedPresentTime, &outAcquireTime, &outLatchTime,
824                 &outFirstRefreshStartTime, &outLastRefreshStartTime,
825                 &outGpuCompositionDoneTime, &outDisplayPresentTime,
826                 &outDequeueReadyTime, &outReleaseTime);
827     }
828 
resetTimestamps()829     void resetTimestamps() {
830         outRequestedPresentTime = -1;
831         outAcquireTime = -1;
832         outLatchTime = -1;
833         outFirstRefreshStartTime = -1;
834         outLastRefreshStartTime = -1;
835         outGpuCompositionDoneTime = -1;
836         outDisplayPresentTime = -1;
837         outDequeueReadyTime = -1;
838         outReleaseTime = -1;
839     }
840 
getNextFrameId()841     uint64_t getNextFrameId() {
842         uint64_t frameId = -1;
843         int status = native_window_get_next_frame_id(mWindow.get(), &frameId);
844         EXPECT_EQ(status, NO_ERROR);
845         return frameId;
846     }
847 
dequeueAndQueue(uint64_t frameIndex)848     void dequeueAndQueue(uint64_t frameIndex) {
849         int fence = -1;
850         ANativeWindowBuffer* buffer = nullptr;
851         ASSERT_EQ(NO_ERROR,
852                 mWindow->dequeueBuffer(mWindow.get(), &buffer, &fence));
853 
854         int oldAddFrameTimestampsCount =
855                 mFakeConsumer->mAddFrameTimestampsCount;
856 
857         FrameEvents* frame = &mFrames[frameIndex];
858         uint64_t frameNumber = frameIndex + 1;
859 
860         NewFrameEventsEntry fe;
861         fe.frameNumber = frameNumber;
862         fe.postedTime = frame->kPostedTime;
863         fe.requestedPresentTime = frame->kRequestedPresentTime;
864         fe.acquireFence = frame->mAcquireConsumer.mFenceTime;
865         mFakeConsumer->mNewFrameEntryOverride = fe;
866 
867         mSurface->mFakeFrameEventHistory->setAcquireFenceOverride(
868                     frame->mAcquireProducer.mFenceTime,
869                     frame->mAcquireConsumer.mFenceTime);
870 
871         ASSERT_EQ(NO_ERROR, mWindow->queueBuffer(mWindow.get(), buffer, fence));
872 
873         EXPECT_EQ(frameNumber, mFakeConsumer->mLastAddedFrameNumber);
874 
875         EXPECT_EQ(
876                 oldAddFrameTimestampsCount + (mFrameTimestampsEnabled ? 1 : 0),
877                 mFakeConsumer->mAddFrameTimestampsCount);
878     }
879 
addFrameEvents(bool gpuComposited,uint64_t iOldFrame,int64_t iNewFrame)880     void addFrameEvents(
881             bool gpuComposited, uint64_t iOldFrame, int64_t iNewFrame) {
882         FrameEvents* oldFrame =
883                 (iOldFrame == NO_FRAME_INDEX) ? nullptr : &mFrames[iOldFrame];
884         FrameEvents* newFrame = &mFrames[iNewFrame];
885 
886         uint64_t nOldFrame = (iOldFrame == NO_FRAME_INDEX) ? 0 : iOldFrame + 1;
887         uint64_t nNewFrame = iNewFrame + 1;
888 
889         // Latch, Composite, and Release the frames in a plausible order.
890         // Note: The timestamps won't necessarily match the order, but
891         // that's okay for the purposes of this test.
892         std::shared_ptr<FenceTime> gpuDoneFenceTime = FenceTime::NO_FENCE;
893 
894         // Composite the previous frame one more time, which helps verify
895         // LastRefresh is updated properly.
896         if (oldFrame != nullptr) {
897             mCfeh->addPreComposition(nOldFrame,
898                                      oldFrame->mRefreshes[2].kStartTime);
899             gpuDoneFenceTime = gpuComposited ?
900                     oldFrame->mRefreshes[2].mGpuCompositionDone.mFenceTime :
901                     FenceTime::NO_FENCE;
902             mCfeh->addPostComposition(nOldFrame, gpuDoneFenceTime,
903                     oldFrame->mRefreshes[2].mPresent.mFenceTime,
904                     oldFrame->mRefreshes[2].kCompositorTiming);
905         }
906 
907         // Latch the new frame.
908         mCfeh->addLatch(nNewFrame, newFrame->kLatchTime);
909 
910         mCfeh->addPreComposition(nNewFrame, newFrame->mRefreshes[0].kStartTime);
911         gpuDoneFenceTime = gpuComposited ?
912                 newFrame->mRefreshes[0].mGpuCompositionDone.mFenceTime :
913                 FenceTime::NO_FENCE;
914         // HWC2 releases the previous buffer after a new latch just before
915         // calling postComposition.
916         if (oldFrame != nullptr) {
917             mCfeh->addRelease(nOldFrame, oldFrame->kDequeueReadyTime,
918                     std::shared_ptr<FenceTime>(oldFrame->mRelease.mFenceTime));
919         }
920         mCfeh->addPostComposition(nNewFrame, gpuDoneFenceTime,
921                 newFrame->mRefreshes[0].mPresent.mFenceTime,
922                 newFrame->mRefreshes[0].kCompositorTiming);
923 
924         mCfeh->addPreComposition(nNewFrame, newFrame->mRefreshes[1].kStartTime);
925         gpuDoneFenceTime = gpuComposited ?
926                 newFrame->mRefreshes[1].mGpuCompositionDone.mFenceTime :
927                 FenceTime::NO_FENCE;
928         mCfeh->addPostComposition(nNewFrame, gpuDoneFenceTime,
929                 newFrame->mRefreshes[1].mPresent.mFenceTime,
930                 newFrame->mRefreshes[1].kCompositorTiming);
931     }
932 
933     sp<IGraphicBufferProducer> mProducer;
934     sp<IGraphicBufferConsumer> mConsumer;
935     sp<FakeConsumer> mFakeConsumer;
936     ConsumerFrameEventHistory* mCfeh;
937     sp<TestSurface> mSurface;
938     sp<ANativeWindow> mWindow;
939 
940     FenceToFenceTimeMap mFenceMap;
941 
942     bool mFrameTimestampsEnabled = false;
943 
944     int64_t outRequestedPresentTime = -1;
945     int64_t outAcquireTime = -1;
946     int64_t outLatchTime = -1;
947     int64_t outFirstRefreshStartTime = -1;
948     int64_t outLastRefreshStartTime = -1;
949     int64_t outGpuCompositionDoneTime = -1;
950     int64_t outDisplayPresentTime = -1;
951     int64_t outDequeueReadyTime = -1;
952     int64_t outReleaseTime = -1;
953 
954     FrameEvents mFrames[3] {
955         { mFenceMap, 1000 }, { mFenceMap, 2000 }, { mFenceMap, 3000 } };
956 };
957 
958 
959 // This test verifies that the frame timestamps are not retrieved when not
960 // explicitly enabled via native_window_enable_frame_timestamps.
961 // We want to check this to make sure there's no overhead for users
962 // that don't need the timestamp information.
TEST_F(GetFrameTimestampsTest,DefaultDisabled)963 TEST_F(GetFrameTimestampsTest, DefaultDisabled) {
964     int fence;
965     ANativeWindowBuffer* buffer;
966 
967     EXPECT_EQ(0, mFakeConsumer->mAddFrameTimestampsCount);
968     EXPECT_EQ(0, mFakeConsumer->mGetFrameTimestampsCount);
969 
970     const uint64_t fId = getNextFrameId();
971 
972     // Verify the producer doesn't get frame timestamps piggybacked on dequeue.
973     ASSERT_EQ(NO_ERROR, mWindow->dequeueBuffer(mWindow.get(), &buffer, &fence));
974     EXPECT_EQ(0, mFakeConsumer->mAddFrameTimestampsCount);
975     EXPECT_EQ(0, mFakeConsumer->mGetFrameTimestampsCount);
976 
977     // Verify the producer doesn't get frame timestamps piggybacked on queue.
978     // It is okay that frame timestamps are added in the consumer since it is
979     // still needed for SurfaceFlinger dumps.
980     ASSERT_EQ(NO_ERROR, mWindow->queueBuffer(mWindow.get(), buffer, fence));
981     EXPECT_EQ(1, mFakeConsumer->mAddFrameTimestampsCount);
982     EXPECT_EQ(0, mFakeConsumer->mGetFrameTimestampsCount);
983 
984     // Verify attempts to get frame timestamps fail.
985     int result = getAllFrameTimestamps(fId);
986     EXPECT_EQ(INVALID_OPERATION, result);
987     EXPECT_EQ(0, mFakeConsumer->mGetFrameTimestampsCount);
988 
989     // Verify compositor timing query fails.
990     nsecs_t compositeDeadline = 0;
991     nsecs_t compositeInterval = 0;
992     nsecs_t compositeToPresentLatency = 0;
993     result = native_window_get_compositor_timing(mWindow.get(),
994         &compositeDeadline, &compositeInterval, &compositeToPresentLatency);
995     EXPECT_EQ(INVALID_OPERATION, result);
996 }
997 
998 // This test verifies that the frame timestamps are retrieved if explicitly
999 // enabled via native_window_enable_frame_timestamps.
TEST_F(GetFrameTimestampsTest,EnabledSimple)1000 TEST_F(GetFrameTimestampsTest, EnabledSimple) {
1001     CompositorTiming initialCompositorTiming {
1002         1000000000, // 1s deadline
1003         16666667, // 16ms interval
1004         50000000, // 50ms present latency
1005     };
1006     mCfeh->initializeCompositorTiming(initialCompositorTiming);
1007 
1008     enableFrameTimestamps();
1009 
1010     // Verify the compositor timing query gets the initial compositor values
1011     // after timststamps are enabled; even before the first frame is queued
1012     // or dequeued.
1013     nsecs_t compositeDeadline = 0;
1014     nsecs_t compositeInterval = 0;
1015     nsecs_t compositeToPresentLatency = 0;
1016     mSurface->setNow(initialCompositorTiming.deadline - 1);
1017     int result = native_window_get_compositor_timing(mWindow.get(),
1018         &compositeDeadline, &compositeInterval, &compositeToPresentLatency);
1019     EXPECT_EQ(NO_ERROR, result);
1020     EXPECT_EQ(initialCompositorTiming.deadline, compositeDeadline);
1021     EXPECT_EQ(initialCompositorTiming.interval, compositeInterval);
1022     EXPECT_EQ(initialCompositorTiming.presentLatency,
1023               compositeToPresentLatency);
1024 
1025     int fence;
1026     ANativeWindowBuffer* buffer;
1027 
1028     EXPECT_EQ(0, mFakeConsumer->mAddFrameTimestampsCount);
1029     EXPECT_EQ(1, mFakeConsumer->mGetFrameTimestampsCount);
1030 
1031     const uint64_t fId1 = getNextFrameId();
1032 
1033     // Verify getFrameTimestamps is piggybacked on dequeue.
1034     ASSERT_EQ(NO_ERROR, mWindow->dequeueBuffer(mWindow.get(), &buffer, &fence));
1035     EXPECT_EQ(0, mFakeConsumer->mAddFrameTimestampsCount);
1036     EXPECT_EQ(2, mFakeConsumer->mGetFrameTimestampsCount);
1037 
1038     NewFrameEventsEntry f1;
1039     f1.frameNumber = 1;
1040     f1.postedTime = mFrames[0].kPostedTime;
1041     f1.requestedPresentTime = mFrames[0].kRequestedPresentTime;
1042     f1.acquireFence = mFrames[0].mAcquireConsumer.mFenceTime;
1043     mSurface->mFakeFrameEventHistory->setAcquireFenceOverride(
1044             mFrames[0].mAcquireProducer.mFenceTime,
1045             mFrames[0].mAcquireConsumer.mFenceTime);
1046     mFakeConsumer->mNewFrameEntryOverride = f1;
1047     mFrames[0].signalQueueFences();
1048 
1049     // Verify getFrameTimestamps is piggybacked on queue.
1050     ASSERT_EQ(NO_ERROR, mWindow->queueBuffer(mWindow.get(), buffer, fence));
1051     EXPECT_EQ(1, mFakeConsumer->mAddFrameTimestampsCount);
1052     EXPECT_EQ(1u, mFakeConsumer->mLastAddedFrameNumber);
1053     EXPECT_EQ(3, mFakeConsumer->mGetFrameTimestampsCount);
1054 
1055     // Verify queries for timestamps that the producer doesn't know about
1056     // triggers a call to see if the consumer has any new timestamps.
1057     result = getAllFrameTimestamps(fId1);
1058     EXPECT_EQ(NO_ERROR, result);
1059     EXPECT_EQ(4, mFakeConsumer->mGetFrameTimestampsCount);
1060 }
1061 
TEST_F(GetFrameTimestampsTest,QueryPresentSupported)1062 TEST_F(GetFrameTimestampsTest, QueryPresentSupported) {
1063     bool displayPresentSupported = true;
1064     mSurface->mFakeSurfaceComposer->setSupportsPresent(displayPresentSupported);
1065 
1066     // Verify supported bits are forwarded.
1067     int supportsPresent = -1;
1068     mWindow.get()->query(mWindow.get(),
1069             NATIVE_WINDOW_FRAME_TIMESTAMPS_SUPPORTS_PRESENT, &supportsPresent);
1070     EXPECT_EQ(displayPresentSupported, supportsPresent);
1071 }
1072 
TEST_F(GetFrameTimestampsTest,QueryPresentNotSupported)1073 TEST_F(GetFrameTimestampsTest, QueryPresentNotSupported) {
1074     bool displayPresentSupported = false;
1075     mSurface->mFakeSurfaceComposer->setSupportsPresent(displayPresentSupported);
1076 
1077     // Verify supported bits are forwarded.
1078     int supportsPresent = -1;
1079     mWindow.get()->query(mWindow.get(),
1080             NATIVE_WINDOW_FRAME_TIMESTAMPS_SUPPORTS_PRESENT, &supportsPresent);
1081     EXPECT_EQ(displayPresentSupported, supportsPresent);
1082 }
1083 
TEST_F(GetFrameTimestampsTest,SnapToNextTickBasic)1084 TEST_F(GetFrameTimestampsTest, SnapToNextTickBasic) {
1085     nsecs_t phase = 4000;
1086     nsecs_t interval = 1000;
1087 
1088     // Timestamp in previous interval.
1089     nsecs_t timestamp = 3500;
1090     EXPECT_EQ(4000, ProducerFrameEventHistory::snapToNextTick(
1091             timestamp, phase, interval));
1092 
1093     // Timestamp in next interval.
1094     timestamp = 4500;
1095     EXPECT_EQ(5000, ProducerFrameEventHistory::snapToNextTick(
1096             timestamp, phase, interval));
1097 
1098     // Timestamp multiple intervals before.
1099     timestamp = 2500;
1100     EXPECT_EQ(3000, ProducerFrameEventHistory::snapToNextTick(
1101             timestamp, phase, interval));
1102 
1103     // Timestamp multiple intervals after.
1104     timestamp = 6500;
1105     EXPECT_EQ(7000, ProducerFrameEventHistory::snapToNextTick(
1106             timestamp, phase, interval));
1107 
1108     // Timestamp on previous interval.
1109     timestamp = 3000;
1110     EXPECT_EQ(3000, ProducerFrameEventHistory::snapToNextTick(
1111             timestamp, phase, interval));
1112 
1113     // Timestamp on next interval.
1114     timestamp = 5000;
1115     EXPECT_EQ(5000, ProducerFrameEventHistory::snapToNextTick(
1116             timestamp, phase, interval));
1117 
1118     // Timestamp equal to phase.
1119     timestamp = 4000;
1120     EXPECT_EQ(4000, ProducerFrameEventHistory::snapToNextTick(
1121             timestamp, phase, interval));
1122 }
1123 
1124 // int(big_timestamp / interval) < 0, which can cause a crash or invalid result
1125 // if the number of intervals elapsed is internally stored in an int.
TEST_F(GetFrameTimestampsTest,SnapToNextTickOverflow)1126 TEST_F(GetFrameTimestampsTest, SnapToNextTickOverflow) {
1127       nsecs_t phase = 0;
1128       nsecs_t interval = 4000;
1129       nsecs_t big_timestamp = 8635916564000;
1130       int32_t intervals = big_timestamp / interval;
1131 
1132       EXPECT_LT(intervals, 0);
1133       EXPECT_EQ(8635916564000, ProducerFrameEventHistory::snapToNextTick(
1134             big_timestamp, phase, interval));
1135       EXPECT_EQ(8635916564000, ProducerFrameEventHistory::snapToNextTick(
1136             big_timestamp, big_timestamp, interval));
1137 }
1138 
1139 // This verifies the compositor timing is updated by refresh events
1140 // and piggy backed on a queue, dequeue, and enabling of timestamps..
TEST_F(GetFrameTimestampsTest,CompositorTimingUpdatesBasic)1141 TEST_F(GetFrameTimestampsTest, CompositorTimingUpdatesBasic) {
1142     CompositorTiming initialCompositorTiming {
1143         1000000000, // 1s deadline
1144         16666667, // 16ms interval
1145         50000000, // 50ms present latency
1146     };
1147     mCfeh->initializeCompositorTiming(initialCompositorTiming);
1148 
1149     enableFrameTimestamps();
1150 
1151     // We get the initial values before any frames are submitted.
1152     nsecs_t compositeDeadline = 0;
1153     nsecs_t compositeInterval = 0;
1154     nsecs_t compositeToPresentLatency = 0;
1155     mSurface->setNow(initialCompositorTiming.deadline - 1);
1156     int result = native_window_get_compositor_timing(mWindow.get(),
1157         &compositeDeadline, &compositeInterval, &compositeToPresentLatency);
1158     EXPECT_EQ(NO_ERROR, result);
1159     EXPECT_EQ(initialCompositorTiming.deadline, compositeDeadline);
1160     EXPECT_EQ(initialCompositorTiming.interval, compositeInterval);
1161     EXPECT_EQ(initialCompositorTiming.presentLatency,
1162               compositeToPresentLatency);
1163 
1164     dequeueAndQueue(0);
1165     addFrameEvents(true, NO_FRAME_INDEX, 0);
1166 
1167     // Still get the initial values because the frame events for frame 0
1168     // didn't get a chance to piggyback on a queue or dequeue yet.
1169     result = native_window_get_compositor_timing(mWindow.get(),
1170         &compositeDeadline, &compositeInterval, &compositeToPresentLatency);
1171     EXPECT_EQ(NO_ERROR, result);
1172     EXPECT_EQ(initialCompositorTiming.deadline, compositeDeadline);
1173     EXPECT_EQ(initialCompositorTiming.interval, compositeInterval);
1174     EXPECT_EQ(initialCompositorTiming.presentLatency,
1175               compositeToPresentLatency);
1176 
1177     dequeueAndQueue(1);
1178     addFrameEvents(true, 0, 1);
1179 
1180     // Now expect the composite values associated with frame 1.
1181     mSurface->setNow(mFrames[0].mRefreshes[1].kCompositorTiming.deadline);
1182     result = native_window_get_compositor_timing(mWindow.get(),
1183         &compositeDeadline, &compositeInterval, &compositeToPresentLatency);
1184     EXPECT_EQ(NO_ERROR, result);
1185     EXPECT_EQ(mFrames[0].mRefreshes[1].kCompositorTiming.deadline,
1186             compositeDeadline);
1187     EXPECT_EQ(mFrames[0].mRefreshes[1].kCompositorTiming.interval,
1188             compositeInterval);
1189     EXPECT_EQ(mFrames[0].mRefreshes[1].kCompositorTiming.presentLatency,
1190             compositeToPresentLatency);
1191 
1192     dequeueAndQueue(2);
1193     addFrameEvents(true, 1, 2);
1194 
1195     // Now expect the composite values associated with frame 2.
1196     mSurface->setNow(mFrames[1].mRefreshes[1].kCompositorTiming.deadline);
1197     result = native_window_get_compositor_timing(mWindow.get(),
1198         &compositeDeadline, &compositeInterval, &compositeToPresentLatency);
1199     EXPECT_EQ(NO_ERROR, result);
1200     EXPECT_EQ(mFrames[1].mRefreshes[1].kCompositorTiming.deadline,
1201             compositeDeadline);
1202     EXPECT_EQ(mFrames[1].mRefreshes[1].kCompositorTiming.interval,
1203             compositeInterval);
1204     EXPECT_EQ(mFrames[1].mRefreshes[1].kCompositorTiming.presentLatency,
1205             compositeToPresentLatency);
1206 
1207     // Re-enabling frame timestamps should get the latest values.
1208     disableFrameTimestamps();
1209     enableFrameTimestamps();
1210 
1211     // Now expect the composite values associated with frame 3.
1212     mSurface->setNow(mFrames[2].mRefreshes[1].kCompositorTiming.deadline);
1213     result = native_window_get_compositor_timing(mWindow.get(),
1214         &compositeDeadline, &compositeInterval, &compositeToPresentLatency);
1215     EXPECT_EQ(NO_ERROR, result);
1216     EXPECT_EQ(mFrames[2].mRefreshes[1].kCompositorTiming.deadline,
1217             compositeDeadline);
1218     EXPECT_EQ(mFrames[2].mRefreshes[1].kCompositorTiming.interval,
1219             compositeInterval);
1220     EXPECT_EQ(mFrames[2].mRefreshes[1].kCompositorTiming.presentLatency,
1221             compositeToPresentLatency);
1222 }
1223 
1224 // This verifies the compositor deadline properly snaps to the the next
1225 // deadline based on the current time.
TEST_F(GetFrameTimestampsTest,CompositorTimingDeadlineSnaps)1226 TEST_F(GetFrameTimestampsTest, CompositorTimingDeadlineSnaps) {
1227     CompositorTiming initialCompositorTiming {
1228         1000000000, // 1s deadline
1229         16666667, // 16ms interval
1230         50000000, // 50ms present latency
1231     };
1232     mCfeh->initializeCompositorTiming(initialCompositorTiming);
1233 
1234     enableFrameTimestamps();
1235 
1236     nsecs_t compositeDeadline = 0;
1237     nsecs_t compositeInterval = 0;
1238     nsecs_t compositeToPresentLatency = 0;
1239 
1240     // A "now" just before the deadline snaps to the deadline.
1241     mSurface->setNow(initialCompositorTiming.deadline - 1);
1242     int result = native_window_get_compositor_timing(mWindow.get(),
1243         &compositeDeadline, &compositeInterval, &compositeToPresentLatency);
1244     EXPECT_EQ(NO_ERROR, result);
1245     EXPECT_EQ(initialCompositorTiming.deadline, compositeDeadline);
1246     nsecs_t expectedDeadline = initialCompositorTiming.deadline;
1247     EXPECT_EQ(expectedDeadline, compositeDeadline);
1248 
1249     dequeueAndQueue(0);
1250     addFrameEvents(true, NO_FRAME_INDEX, 0);
1251 
1252     // A "now" just after the deadline snaps properly.
1253     mSurface->setNow(initialCompositorTiming.deadline + 1);
1254     result = native_window_get_compositor_timing(mWindow.get(),
1255         &compositeDeadline, &compositeInterval, &compositeToPresentLatency);
1256     EXPECT_EQ(NO_ERROR, result);
1257     expectedDeadline =
1258             initialCompositorTiming.deadline +initialCompositorTiming.interval;
1259     EXPECT_EQ(expectedDeadline, compositeDeadline);
1260 
1261     dequeueAndQueue(1);
1262     addFrameEvents(true, 0, 1);
1263 
1264     // A "now" just after the next interval snaps properly.
1265     mSurface->setNow(
1266             mFrames[0].mRefreshes[1].kCompositorTiming.deadline +
1267             mFrames[0].mRefreshes[1].kCompositorTiming.interval + 1);
1268     result = native_window_get_compositor_timing(mWindow.get(),
1269         &compositeDeadline, &compositeInterval, &compositeToPresentLatency);
1270     EXPECT_EQ(NO_ERROR, result);
1271     expectedDeadline =
1272             mFrames[0].mRefreshes[1].kCompositorTiming.deadline +
1273             mFrames[0].mRefreshes[1].kCompositorTiming.interval * 2;
1274     EXPECT_EQ(expectedDeadline, compositeDeadline);
1275 
1276     dequeueAndQueue(2);
1277     addFrameEvents(true, 1, 2);
1278 
1279     // A "now" over 1 interval before the deadline snaps properly.
1280     mSurface->setNow(
1281             mFrames[1].mRefreshes[1].kCompositorTiming.deadline -
1282             mFrames[1].mRefreshes[1].kCompositorTiming.interval - 1);
1283     result = native_window_get_compositor_timing(mWindow.get(),
1284         &compositeDeadline, &compositeInterval, &compositeToPresentLatency);
1285     EXPECT_EQ(NO_ERROR, result);
1286     expectedDeadline =
1287             mFrames[1].mRefreshes[1].kCompositorTiming.deadline -
1288             mFrames[1].mRefreshes[1].kCompositorTiming.interval;
1289     EXPECT_EQ(expectedDeadline, compositeDeadline);
1290 
1291     // Re-enabling frame timestamps should get the latest values.
1292     disableFrameTimestamps();
1293     enableFrameTimestamps();
1294 
1295     // A "now" over 2 intervals before the deadline snaps properly.
1296     mSurface->setNow(
1297             mFrames[2].mRefreshes[1].kCompositorTiming.deadline -
1298             mFrames[2].mRefreshes[1].kCompositorTiming.interval * 2 - 1);
1299     result = native_window_get_compositor_timing(mWindow.get(),
1300         &compositeDeadline, &compositeInterval, &compositeToPresentLatency);
1301     EXPECT_EQ(NO_ERROR, result);
1302     expectedDeadline =
1303             mFrames[2].mRefreshes[1].kCompositorTiming.deadline -
1304             mFrames[2].mRefreshes[1].kCompositorTiming.interval * 2;
1305     EXPECT_EQ(expectedDeadline, compositeDeadline);
1306 }
1307 
1308 // This verifies the timestamps recorded in the consumer's
1309 // FrameTimestampsHistory are properly retrieved by the producer for the
1310 // correct frames.
TEST_F(GetFrameTimestampsTest,TimestampsAssociatedWithCorrectFrame)1311 TEST_F(GetFrameTimestampsTest, TimestampsAssociatedWithCorrectFrame) {
1312     enableFrameTimestamps();
1313 
1314     const uint64_t fId1 = getNextFrameId();
1315     dequeueAndQueue(0);
1316     mFrames[0].signalQueueFences();
1317 
1318     const uint64_t fId2 = getNextFrameId();
1319     dequeueAndQueue(1);
1320     mFrames[1].signalQueueFences();
1321 
1322     addFrameEvents(true, NO_FRAME_INDEX, 0);
1323     mFrames[0].signalRefreshFences();
1324     addFrameEvents(true, 0, 1);
1325     mFrames[0].signalReleaseFences();
1326     mFrames[1].signalRefreshFences();
1327 
1328     // Verify timestamps are correct for frame 1.
1329     resetTimestamps();
1330     int result = getAllFrameTimestamps(fId1);
1331     EXPECT_EQ(NO_ERROR, result);
1332     EXPECT_EQ(mFrames[0].kRequestedPresentTime, outRequestedPresentTime);
1333     EXPECT_EQ(mFrames[0].kProducerAcquireTime, outAcquireTime);
1334     EXPECT_EQ(mFrames[0].kLatchTime, outLatchTime);
1335     EXPECT_EQ(mFrames[0].mRefreshes[0].kStartTime, outFirstRefreshStartTime);
1336     EXPECT_EQ(mFrames[0].mRefreshes[2].kStartTime, outLastRefreshStartTime);
1337     EXPECT_EQ(mFrames[0].mRefreshes[0].kGpuCompositionDoneTime,
1338             outGpuCompositionDoneTime);
1339     EXPECT_EQ(mFrames[0].mRefreshes[0].kPresentTime, outDisplayPresentTime);
1340     EXPECT_EQ(mFrames[0].kDequeueReadyTime, outDequeueReadyTime);
1341     EXPECT_EQ(mFrames[0].kReleaseTime, outReleaseTime);
1342 
1343     // Verify timestamps are correct for frame 2.
1344     resetTimestamps();
1345     result = getAllFrameTimestamps(fId2);
1346     EXPECT_EQ(NO_ERROR, result);
1347     EXPECT_EQ(mFrames[1].kRequestedPresentTime, outRequestedPresentTime);
1348     EXPECT_EQ(mFrames[1].kProducerAcquireTime, outAcquireTime);
1349     EXPECT_EQ(mFrames[1].kLatchTime, outLatchTime);
1350     EXPECT_EQ(mFrames[1].mRefreshes[0].kStartTime, outFirstRefreshStartTime);
1351     EXPECT_EQ(mFrames[1].mRefreshes[1].kStartTime, outLastRefreshStartTime);
1352     EXPECT_EQ(mFrames[1].mRefreshes[0].kGpuCompositionDoneTime,
1353             outGpuCompositionDoneTime);
1354     EXPECT_EQ(mFrames[1].mRefreshes[0].kPresentTime, outDisplayPresentTime);
1355     EXPECT_EQ(NATIVE_WINDOW_TIMESTAMP_PENDING, outDequeueReadyTime);
1356     EXPECT_EQ(NATIVE_WINDOW_TIMESTAMP_PENDING, outReleaseTime);
1357 }
1358 
1359 // This test verifies the acquire fence recorded by the consumer is not sent
1360 // back to the producer and the producer saves its own fence.
TEST_F(GetFrameTimestampsTest,QueueTimestampsNoSync)1361 TEST_F(GetFrameTimestampsTest, QueueTimestampsNoSync) {
1362     enableFrameTimestamps();
1363 
1364     // Dequeue and queue frame 1.
1365     const uint64_t fId1 = getNextFrameId();
1366     dequeueAndQueue(0);
1367 
1368     // Verify queue-related timestamps for f1 are available immediately in the
1369     // producer without asking the consumer again, even before signaling the
1370     // acquire fence.
1371     resetTimestamps();
1372     int oldCount = mFakeConsumer->mGetFrameTimestampsCount;
1373     int result = native_window_get_frame_timestamps(mWindow.get(), fId1,
1374             &outRequestedPresentTime, &outAcquireTime, nullptr, nullptr,
1375             nullptr, nullptr, nullptr, nullptr, nullptr);
1376     EXPECT_EQ(oldCount, mFakeConsumer->mGetFrameTimestampsCount);
1377     EXPECT_EQ(NO_ERROR, result);
1378     EXPECT_EQ(mFrames[0].kRequestedPresentTime, outRequestedPresentTime);
1379     EXPECT_EQ(NATIVE_WINDOW_TIMESTAMP_PENDING, outAcquireTime);
1380 
1381     // Signal acquire fences. Verify a sync call still isn't necessary.
1382     mFrames[0].signalQueueFences();
1383 
1384     oldCount = mFakeConsumer->mGetFrameTimestampsCount;
1385     result = native_window_get_frame_timestamps(mWindow.get(), fId1,
1386             &outRequestedPresentTime, &outAcquireTime, nullptr, nullptr,
1387             nullptr, nullptr, nullptr, nullptr, nullptr);
1388     EXPECT_EQ(oldCount, mFakeConsumer->mGetFrameTimestampsCount);
1389     EXPECT_EQ(NO_ERROR, result);
1390     EXPECT_EQ(mFrames[0].kRequestedPresentTime, outRequestedPresentTime);
1391     EXPECT_EQ(mFrames[0].kProducerAcquireTime, outAcquireTime);
1392 
1393     // Dequeue and queue frame 2.
1394     const uint64_t fId2 = getNextFrameId();
1395     dequeueAndQueue(1);
1396 
1397     // Verify queue-related timestamps for f2 are available immediately in the
1398     // producer without asking the consumer again, even before signaling the
1399     // acquire fence.
1400     resetTimestamps();
1401     oldCount = mFakeConsumer->mGetFrameTimestampsCount;
1402     result = native_window_get_frame_timestamps(mWindow.get(), fId2,
1403             &outRequestedPresentTime, &outAcquireTime, nullptr, nullptr,
1404             nullptr, nullptr, nullptr, nullptr, nullptr);
1405     EXPECT_EQ(oldCount, mFakeConsumer->mGetFrameTimestampsCount);
1406     EXPECT_EQ(NO_ERROR, result);
1407     EXPECT_EQ(mFrames[1].kRequestedPresentTime, outRequestedPresentTime);
1408     EXPECT_EQ(NATIVE_WINDOW_TIMESTAMP_PENDING, outAcquireTime);
1409 
1410     // Signal acquire fences. Verify a sync call still isn't necessary.
1411     mFrames[1].signalQueueFences();
1412 
1413     oldCount = mFakeConsumer->mGetFrameTimestampsCount;
1414     result = native_window_get_frame_timestamps(mWindow.get(), fId2,
1415             &outRequestedPresentTime, &outAcquireTime, nullptr, nullptr,
1416             nullptr, nullptr, nullptr, nullptr, nullptr);
1417     EXPECT_EQ(oldCount, mFakeConsumer->mGetFrameTimestampsCount);
1418     EXPECT_EQ(NO_ERROR, result);
1419     EXPECT_EQ(mFrames[1].kRequestedPresentTime, outRequestedPresentTime);
1420     EXPECT_EQ(mFrames[1].kProducerAcquireTime, outAcquireTime);
1421 }
1422 
TEST_F(GetFrameTimestampsTest,ZeroRequestedTimestampsNoSync)1423 TEST_F(GetFrameTimestampsTest, ZeroRequestedTimestampsNoSync) {
1424     enableFrameTimestamps();
1425 
1426     // Dequeue and queue frame 1.
1427     dequeueAndQueue(0);
1428     mFrames[0].signalQueueFences();
1429 
1430     // Dequeue and queue frame 2.
1431     const uint64_t fId2 = getNextFrameId();
1432     dequeueAndQueue(1);
1433     mFrames[1].signalQueueFences();
1434 
1435     addFrameEvents(true, NO_FRAME_INDEX, 0);
1436     mFrames[0].signalRefreshFences();
1437     addFrameEvents(true, 0, 1);
1438     mFrames[0].signalReleaseFences();
1439     mFrames[1].signalRefreshFences();
1440 
1441     // Verify a request for no timestamps doesn't result in a sync call.
1442     int oldCount = mFakeConsumer->mGetFrameTimestampsCount;
1443     int result = native_window_get_frame_timestamps(mWindow.get(), fId2,
1444             nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
1445             nullptr, nullptr);
1446     EXPECT_EQ(NO_ERROR, result);
1447     EXPECT_EQ(oldCount, mFakeConsumer->mGetFrameTimestampsCount);
1448 }
1449 
1450 // This test verifies that fences can signal and update timestamps producer
1451 // side without an additional sync call to the consumer.
TEST_F(GetFrameTimestampsTest,FencesInProducerNoSync)1452 TEST_F(GetFrameTimestampsTest, FencesInProducerNoSync) {
1453     enableFrameTimestamps();
1454 
1455     // Dequeue and queue frame 1.
1456     const uint64_t fId1 = getNextFrameId();
1457     dequeueAndQueue(0);
1458     mFrames[0].signalQueueFences();
1459 
1460     // Dequeue and queue frame 2.
1461     dequeueAndQueue(1);
1462     mFrames[1].signalQueueFences();
1463 
1464     addFrameEvents(true, NO_FRAME_INDEX, 0);
1465     addFrameEvents(true, 0, 1);
1466 
1467     // Verify available timestamps are correct for frame 1, before any
1468     // fence has been signaled.
1469     // Note: A sync call is necessary here since the events triggered by
1470     // addFrameEvents didn't get to piggyback on the earlier queues/dequeues.
1471     resetTimestamps();
1472     int oldCount = mFakeConsumer->mGetFrameTimestampsCount;
1473     int result = getAllFrameTimestamps(fId1);
1474     EXPECT_EQ(oldCount + 1, mFakeConsumer->mGetFrameTimestampsCount);
1475     EXPECT_EQ(NO_ERROR, result);
1476     EXPECT_EQ(mFrames[0].kRequestedPresentTime, outRequestedPresentTime);
1477     EXPECT_EQ(mFrames[0].kProducerAcquireTime, outAcquireTime);
1478     EXPECT_EQ(mFrames[0].kLatchTime, outLatchTime);
1479     EXPECT_EQ(mFrames[0].mRefreshes[0].kStartTime, outFirstRefreshStartTime);
1480     EXPECT_EQ(mFrames[0].mRefreshes[2].kStartTime, outLastRefreshStartTime);
1481     EXPECT_EQ(NATIVE_WINDOW_TIMESTAMP_PENDING, outGpuCompositionDoneTime);
1482     EXPECT_EQ(NATIVE_WINDOW_TIMESTAMP_PENDING, outDisplayPresentTime);
1483     EXPECT_EQ(mFrames[0].kDequeueReadyTime, outDequeueReadyTime);
1484     EXPECT_EQ(NATIVE_WINDOW_TIMESTAMP_PENDING, outReleaseTime);
1485 
1486     // Verify available timestamps are correct for frame 1 again, before any
1487     // fence has been signaled.
1488     // This time a sync call should not be necessary.
1489     resetTimestamps();
1490     oldCount = mFakeConsumer->mGetFrameTimestampsCount;
1491     result = getAllFrameTimestamps(fId1);
1492     EXPECT_EQ(oldCount, mFakeConsumer->mGetFrameTimestampsCount);
1493     EXPECT_EQ(NO_ERROR, result);
1494     EXPECT_EQ(mFrames[0].kRequestedPresentTime, outRequestedPresentTime);
1495     EXPECT_EQ(mFrames[0].kProducerAcquireTime, outAcquireTime);
1496     EXPECT_EQ(mFrames[0].kLatchTime, outLatchTime);
1497     EXPECT_EQ(mFrames[0].mRefreshes[0].kStartTime, outFirstRefreshStartTime);
1498     EXPECT_EQ(mFrames[0].mRefreshes[2].kStartTime, outLastRefreshStartTime);
1499     EXPECT_EQ(NATIVE_WINDOW_TIMESTAMP_PENDING, outGpuCompositionDoneTime);
1500     EXPECT_EQ(NATIVE_WINDOW_TIMESTAMP_PENDING, outDisplayPresentTime);
1501     EXPECT_EQ(mFrames[0].kDequeueReadyTime, outDequeueReadyTime);
1502     EXPECT_EQ(NATIVE_WINDOW_TIMESTAMP_PENDING, outReleaseTime);
1503 
1504     // Signal the fences for frame 1.
1505     mFrames[0].signalRefreshFences();
1506     mFrames[0].signalReleaseFences();
1507 
1508     // Verify all timestamps are available without a sync call.
1509     resetTimestamps();
1510     oldCount = mFakeConsumer->mGetFrameTimestampsCount;
1511     result = getAllFrameTimestamps(fId1);
1512     EXPECT_EQ(oldCount, mFakeConsumer->mGetFrameTimestampsCount);
1513     EXPECT_EQ(NO_ERROR, result);
1514     EXPECT_EQ(mFrames[0].kRequestedPresentTime, outRequestedPresentTime);
1515     EXPECT_EQ(mFrames[0].kProducerAcquireTime, outAcquireTime);
1516     EXPECT_EQ(mFrames[0].kLatchTime, outLatchTime);
1517     EXPECT_EQ(mFrames[0].mRefreshes[0].kStartTime, outFirstRefreshStartTime);
1518     EXPECT_EQ(mFrames[0].mRefreshes[2].kStartTime, outLastRefreshStartTime);
1519     EXPECT_EQ(mFrames[0].mRefreshes[0].kGpuCompositionDoneTime,
1520             outGpuCompositionDoneTime);
1521     EXPECT_EQ(mFrames[0].mRefreshes[0].kPresentTime, outDisplayPresentTime);
1522     EXPECT_EQ(mFrames[0].kDequeueReadyTime, outDequeueReadyTime);
1523     EXPECT_EQ(mFrames[0].kReleaseTime, outReleaseTime);
1524 }
1525 
1526 // This test verifies that if the frame wasn't GPU composited but has a refresh
1527 // event a sync call isn't made to get the GPU composite done time since it will
1528 // never exist.
TEST_F(GetFrameTimestampsTest,NoGpuNoSync)1529 TEST_F(GetFrameTimestampsTest, NoGpuNoSync) {
1530     enableFrameTimestamps();
1531 
1532     // Dequeue and queue frame 1.
1533     const uint64_t fId1 = getNextFrameId();
1534     dequeueAndQueue(0);
1535     mFrames[0].signalQueueFences();
1536 
1537     // Dequeue and queue frame 2.
1538     dequeueAndQueue(1);
1539     mFrames[1].signalQueueFences();
1540 
1541     addFrameEvents(false, NO_FRAME_INDEX, 0);
1542     addFrameEvents(false, 0, 1);
1543 
1544     // Verify available timestamps are correct for frame 1, before any
1545     // fence has been signaled.
1546     // Note: A sync call is necessary here since the events triggered by
1547     // addFrameEvents didn't get to piggyback on the earlier queues/dequeues.
1548     resetTimestamps();
1549     int oldCount = mFakeConsumer->mGetFrameTimestampsCount;
1550     int result = getAllFrameTimestamps(fId1);
1551     EXPECT_EQ(oldCount + 1, mFakeConsumer->mGetFrameTimestampsCount);
1552     EXPECT_EQ(NO_ERROR, result);
1553     EXPECT_EQ(mFrames[0].kRequestedPresentTime, outRequestedPresentTime);
1554     EXPECT_EQ(mFrames[0].kProducerAcquireTime, outAcquireTime);
1555     EXPECT_EQ(mFrames[0].kLatchTime, outLatchTime);
1556     EXPECT_EQ(mFrames[0].mRefreshes[0].kStartTime, outFirstRefreshStartTime);
1557     EXPECT_EQ(mFrames[0].mRefreshes[2].kStartTime, outLastRefreshStartTime);
1558     EXPECT_EQ(NATIVE_WINDOW_TIMESTAMP_INVALID, outGpuCompositionDoneTime);
1559     EXPECT_EQ(NATIVE_WINDOW_TIMESTAMP_PENDING, outDisplayPresentTime);
1560     EXPECT_EQ(mFrames[0].kDequeueReadyTime, outDequeueReadyTime);
1561     EXPECT_EQ(NATIVE_WINDOW_TIMESTAMP_PENDING, outReleaseTime);
1562 
1563     // Signal the fences for frame 1.
1564     mFrames[0].signalRefreshFences();
1565     mFrames[0].signalReleaseFences();
1566 
1567     // Verify all timestamps, except GPU composition, are available without a
1568     // sync call.
1569     resetTimestamps();
1570     oldCount = mFakeConsumer->mGetFrameTimestampsCount;
1571     result = getAllFrameTimestamps(fId1);
1572     EXPECT_EQ(oldCount, mFakeConsumer->mGetFrameTimestampsCount);
1573     EXPECT_EQ(NO_ERROR, result);
1574     EXPECT_EQ(mFrames[0].kRequestedPresentTime, outRequestedPresentTime);
1575     EXPECT_EQ(mFrames[0].kProducerAcquireTime, outAcquireTime);
1576     EXPECT_EQ(mFrames[0].kLatchTime, outLatchTime);
1577     EXPECT_EQ(mFrames[0].mRefreshes[0].kStartTime, outFirstRefreshStartTime);
1578     EXPECT_EQ(mFrames[0].mRefreshes[2].kStartTime, outLastRefreshStartTime);
1579     EXPECT_EQ(NATIVE_WINDOW_TIMESTAMP_INVALID, outGpuCompositionDoneTime);
1580     EXPECT_EQ(mFrames[0].mRefreshes[0].kPresentTime, outDisplayPresentTime);
1581     EXPECT_EQ(mFrames[0].kDequeueReadyTime, outDequeueReadyTime);
1582     EXPECT_EQ(mFrames[0].kReleaseTime, outReleaseTime);
1583 }
1584 
1585 // This test verifies that if the certain timestamps can't possibly exist for
1586 // the most recent frame, then a sync call is not done.
TEST_F(GetFrameTimestampsTest,NoReleaseNoSync)1587 TEST_F(GetFrameTimestampsTest, NoReleaseNoSync) {
1588     enableFrameTimestamps();
1589 
1590     // Dequeue and queue frame 1.
1591     const uint64_t fId1 = getNextFrameId();
1592     dequeueAndQueue(0);
1593     mFrames[0].signalQueueFences();
1594 
1595     // Dequeue and queue frame 2.
1596     const uint64_t fId2 = getNextFrameId();
1597     dequeueAndQueue(1);
1598     mFrames[1].signalQueueFences();
1599 
1600     addFrameEvents(false, NO_FRAME_INDEX, 0);
1601     addFrameEvents(false, 0, 1);
1602 
1603     // Verify available timestamps are correct for frame 1, before any
1604     // fence has been signaled.
1605     // Note: A sync call is necessary here since the events triggered by
1606     // addFrameEvents didn't get to piggyback on the earlier queues/dequeues.
1607     resetTimestamps();
1608     int oldCount = mFakeConsumer->mGetFrameTimestampsCount;
1609     int result = getAllFrameTimestamps(fId1);
1610     EXPECT_EQ(oldCount + 1, mFakeConsumer->mGetFrameTimestampsCount);
1611     EXPECT_EQ(NO_ERROR, result);
1612     EXPECT_EQ(mFrames[0].kRequestedPresentTime, outRequestedPresentTime);
1613     EXPECT_EQ(mFrames[0].kProducerAcquireTime, outAcquireTime);
1614     EXPECT_EQ(mFrames[0].kLatchTime, outLatchTime);
1615     EXPECT_EQ(mFrames[0].mRefreshes[0].kStartTime, outFirstRefreshStartTime);
1616     EXPECT_EQ(mFrames[0].mRefreshes[2].kStartTime, outLastRefreshStartTime);
1617     EXPECT_EQ(NATIVE_WINDOW_TIMESTAMP_INVALID, outGpuCompositionDoneTime);
1618     EXPECT_EQ(NATIVE_WINDOW_TIMESTAMP_PENDING, outDisplayPresentTime);
1619     EXPECT_EQ(mFrames[0].kDequeueReadyTime, outDequeueReadyTime);
1620     EXPECT_EQ(NATIVE_WINDOW_TIMESTAMP_PENDING, outReleaseTime);
1621 
1622     mFrames[0].signalRefreshFences();
1623     mFrames[0].signalReleaseFences();
1624     mFrames[1].signalRefreshFences();
1625 
1626     // Verify querying for all timestmaps of f2 does not do a sync call. Even
1627     // though the lastRefresh, dequeueReady, and release times aren't
1628     // available, a sync call should not occur because it's not possible for f2
1629     // to encounter the final value for those events until another frame is
1630     // queued.
1631     resetTimestamps();
1632     oldCount = mFakeConsumer->mGetFrameTimestampsCount;
1633     result = getAllFrameTimestamps(fId2);
1634     EXPECT_EQ(oldCount, mFakeConsumer->mGetFrameTimestampsCount);
1635     EXPECT_EQ(NO_ERROR, result);
1636     EXPECT_EQ(mFrames[1].kRequestedPresentTime, outRequestedPresentTime);
1637     EXPECT_EQ(mFrames[1].kProducerAcquireTime, outAcquireTime);
1638     EXPECT_EQ(mFrames[1].kLatchTime, outLatchTime);
1639     EXPECT_EQ(mFrames[1].mRefreshes[0].kStartTime, outFirstRefreshStartTime);
1640     EXPECT_EQ(mFrames[1].mRefreshes[1].kStartTime, outLastRefreshStartTime);
1641     EXPECT_EQ(NATIVE_WINDOW_TIMESTAMP_INVALID, outGpuCompositionDoneTime);
1642     EXPECT_EQ(mFrames[1].mRefreshes[0].kPresentTime, outDisplayPresentTime);
1643     EXPECT_EQ(NATIVE_WINDOW_TIMESTAMP_PENDING, outDequeueReadyTime);
1644     EXPECT_EQ(NATIVE_WINDOW_TIMESTAMP_PENDING, outReleaseTime);
1645 }
1646 
1647 // This test verifies there are no sync calls for present times
1648 // when they aren't supported and that an error is returned.
1649 
TEST_F(GetFrameTimestampsTest,PresentUnsupportedNoSync)1650 TEST_F(GetFrameTimestampsTest, PresentUnsupportedNoSync) {
1651     enableFrameTimestamps();
1652     mSurface->mFakeSurfaceComposer->setSupportsPresent(false);
1653 
1654     // Dequeue and queue frame 1.
1655     const uint64_t fId1 = getNextFrameId();
1656     dequeueAndQueue(0);
1657 
1658     // Verify a query for the Present times do not trigger a sync call if they
1659     // are not supported.
1660     resetTimestamps();
1661     int oldCount = mFakeConsumer->mGetFrameTimestampsCount;
1662     int result = native_window_get_frame_timestamps(mWindow.get(), fId1,
1663             nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
1664             &outDisplayPresentTime, nullptr, nullptr);
1665     EXPECT_EQ(oldCount, mFakeConsumer->mGetFrameTimestampsCount);
1666     EXPECT_EQ(BAD_VALUE, result);
1667     EXPECT_EQ(-1, outDisplayPresentTime);
1668 }
1669 
1670 } // namespace android
1671