blob: 03c6f70db525aafa4e65f81ab4d6c72f2bb5aedf [file] [log] [blame]
Adithya Srinivasanf279e042020-08-17 14:56:27 -07001/*
2 * Copyright 2020 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
Alec Mouri9a29e672020-09-14 12:39:14 -070017#include "gmock/gmock-spec-builders.h"
18#include "mock/MockTimeStats.h"
Adithya Srinivasanf279e042020-08-17 14:56:27 -070019#undef LOG_TAG
20#define LOG_TAG "LibSurfaceFlingerUnittests"
21
22#include <FrameTimeline/FrameTimeline.h>
23#include <gtest/gtest.h>
24#include <log/log.h>
25#include <cinttypes>
26
27using namespace std::chrono_literals;
Alec Mouri9a29e672020-09-14 12:39:14 -070028using testing::Contains;
29
30MATCHER_P(HasBit, bit, "") {
31 return (arg & bit) != 0;
32}
Adithya Srinivasanf279e042020-08-17 14:56:27 -070033
34namespace android::frametimeline {
35
36class FrameTimelineTest : public testing::Test {
37public:
38 FrameTimelineTest() {
39 const ::testing::TestInfo* const test_info =
40 ::testing::UnitTest::GetInstance()->current_test_info();
41 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
42 }
43
44 ~FrameTimelineTest() {
45 const ::testing::TestInfo* const test_info =
46 ::testing::UnitTest::GetInstance()->current_test_info();
47 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
48 }
49
50 void SetUp() override {
Alec Mouri9a29e672020-09-14 12:39:14 -070051 mTimeStats = std::make_shared<mock::TimeStats>();
52 mFrameTimeline = std::make_unique<impl::FrameTimeline>(mTimeStats);
Adithya Srinivasanf279e042020-08-17 14:56:27 -070053 mTokenManager = &mFrameTimeline->mTokenManager;
Adithya Srinivasan2d736322020-10-01 16:53:48 -070054 maxDisplayFrames = &mFrameTimeline->mMaxDisplayFrames;
Adithya Srinivasanf279e042020-08-17 14:56:27 -070055 maxTokenRetentionTime = mTokenManager->kMaxRetentionTime;
56 }
57
58 void flushTokens(nsecs_t flushTime) {
59 std::lock_guard<std::mutex> lock(mTokenManager->mMutex);
60 mTokenManager->flushTokens(flushTime);
61 }
62
63 SurfaceFrame& getSurfaceFrame(size_t displayFrameIdx, size_t surfaceFrameIdx) {
64 std::lock_guard<std::mutex> lock(mFrameTimeline->mMutex);
65 return *(mFrameTimeline->mDisplayFrames[displayFrameIdx]->surfaceFrames[surfaceFrameIdx]);
66 }
67
68 std::shared_ptr<impl::FrameTimeline::DisplayFrame> getDisplayFrame(size_t idx) {
69 std::lock_guard<std::mutex> lock(mFrameTimeline->mMutex);
70 return mFrameTimeline->mDisplayFrames[idx];
71 }
72
73 static bool compareTimelineItems(const TimelineItem& a, const TimelineItem& b) {
74 return a.startTime == b.startTime && a.endTime == b.endTime &&
75 a.presentTime == b.presentTime;
76 }
77
78 const std::unordered_map<int64_t, TimelineItem>& getPredictions() {
79 return mTokenManager->mPredictions;
80 }
81
Adithya Srinivasan2d736322020-10-01 16:53:48 -070082 uint32_t getNumberOfDisplayFrames() {
83 std::lock_guard<std::mutex> lock(mFrameTimeline->mMutex);
84 return static_cast<uint32_t>(mFrameTimeline->mDisplayFrames.size());
85 }
86
Alec Mouri9a29e672020-09-14 12:39:14 -070087 std::shared_ptr<mock::TimeStats> mTimeStats;
Adithya Srinivasanf279e042020-08-17 14:56:27 -070088 std::unique_ptr<impl::FrameTimeline> mFrameTimeline;
89 impl::TokenManager* mTokenManager;
90 FenceToFenceTimeMap fenceFactory;
Adithya Srinivasan2d736322020-10-01 16:53:48 -070091 uint32_t* maxDisplayFrames;
Adithya Srinivasanf279e042020-08-17 14:56:27 -070092 nsecs_t maxTokenRetentionTime;
93};
94
Alec Mouri9a29e672020-09-14 12:39:14 -070095static const std::string sLayerNameOne = "layer1";
96static const std::string sLayerNameTwo = "layer2";
97static constexpr const uid_t sUidOne = 0;
Adithya Srinivasan9febda82020-10-19 10:49:41 -070098static constexpr pid_t sPidOne = 10;
99static constexpr pid_t sPidTwo = 20;
Alec Mouri9a29e672020-09-14 12:39:14 -0700100
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700101TEST_F(FrameTimelineTest, tokenManagerRemovesStalePredictions) {
102 int64_t token1 = mTokenManager->generateTokenForPredictions({0, 0, 0});
103 EXPECT_EQ(getPredictions().size(), 1);
104 flushTokens(systemTime() + maxTokenRetentionTime);
105 int64_t token2 = mTokenManager->generateTokenForPredictions({10, 20, 30});
106 std::optional<TimelineItem> predictions = mTokenManager->getPredictionsForToken(token1);
107
108 // token1 should have expired
109 EXPECT_EQ(getPredictions().size(), 1);
110 EXPECT_EQ(predictions.has_value(), false);
111
112 predictions = mTokenManager->getPredictionsForToken(token2);
113 EXPECT_EQ(compareTimelineItems(*predictions, TimelineItem(10, 20, 30)), true);
114}
115
Adithya Srinivasan9febda82020-10-19 10:49:41 -0700116TEST_F(FrameTimelineTest, createSurfaceFrameForToken_getOwnerPidReturnsCorrectPid) {
117 auto surfaceFrame1 = mFrameTimeline->createSurfaceFrameForToken(sPidOne, sUidOne, sLayerNameOne,
118 sLayerNameOne, std::nullopt);
119 auto surfaceFrame2 = mFrameTimeline->createSurfaceFrameForToken(sPidTwo, sUidOne, sLayerNameOne,
120 sLayerNameOne, std::nullopt);
121 EXPECT_EQ(surfaceFrame1->getOwnerPid(), sPidOne);
122 EXPECT_EQ(surfaceFrame2->getOwnerPid(), sPidTwo);
123}
124
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700125TEST_F(FrameTimelineTest, createSurfaceFrameForToken_noToken) {
Adithya Srinivasan9febda82020-10-19 10:49:41 -0700126 auto surfaceFrame = mFrameTimeline->createSurfaceFrameForToken(sPidOne, sUidOne, sLayerNameOne,
Alec Mouri9a29e672020-09-14 12:39:14 -0700127 sLayerNameOne, std::nullopt);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700128 EXPECT_EQ(surfaceFrame->getPredictionState(), PredictionState::None);
129}
130
131TEST_F(FrameTimelineTest, createSurfaceFrameForToken_expiredToken) {
132 int64_t token1 = mTokenManager->generateTokenForPredictions({0, 0, 0});
133 flushTokens(systemTime() + maxTokenRetentionTime);
Adithya Srinivasan9febda82020-10-19 10:49:41 -0700134 auto surfaceFrame = mFrameTimeline->createSurfaceFrameForToken(sPidOne, sUidOne, sLayerNameOne,
Alec Mouri9a29e672020-09-14 12:39:14 -0700135 sLayerNameOne, token1);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700136
137 EXPECT_EQ(surfaceFrame->getPredictionState(), PredictionState::Expired);
138}
139
140TEST_F(FrameTimelineTest, createSurfaceFrameForToken_validToken) {
141 int64_t token1 = mTokenManager->generateTokenForPredictions({10, 20, 30});
Adithya Srinivasan9febda82020-10-19 10:49:41 -0700142 auto surfaceFrame = mFrameTimeline->createSurfaceFrameForToken(sPidOne, sUidOne, sLayerNameOne,
Alec Mouri9a29e672020-09-14 12:39:14 -0700143 sLayerNameOne, token1);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700144
145 EXPECT_EQ(surfaceFrame->getPredictionState(), PredictionState::Valid);
146 EXPECT_EQ(compareTimelineItems(surfaceFrame->getPredictions(), TimelineItem(10, 20, 30)), true);
147}
148
149TEST_F(FrameTimelineTest, presentFenceSignaled_droppedFramesNotUpdated) {
150 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
151 auto presentFence2 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
152
153 int64_t token1 = mTokenManager->generateTokenForPredictions({10, 20, 30});
154 int64_t token2 = mTokenManager->generateTokenForPredictions({40, 50, 60});
Adithya Srinivasan9febda82020-10-19 10:49:41 -0700155 auto surfaceFrame1 = mFrameTimeline->createSurfaceFrameForToken(sPidOne, sUidOne, sLayerNameOne,
Alec Mouri9a29e672020-09-14 12:39:14 -0700156 sLayerNameOne, token1);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700157
158 // Set up the display frame
159 mFrameTimeline->setSfWakeUp(token1, 20);
160 mFrameTimeline->addSurfaceFrame(std::move(surfaceFrame1), SurfaceFrame::PresentState::Dropped);
161 mFrameTimeline->setSfPresent(25, presentFence1);
162 presentFence1->signalForTest(30);
163
164 // Trigger a flush by calling setSfPresent for the next frame
165 mFrameTimeline->setSfWakeUp(token2, 50);
166 mFrameTimeline->setSfPresent(55, presentFence2);
167
168 auto& droppedSurfaceFrame = getSurfaceFrame(0, 0);
169 EXPECT_EQ(droppedSurfaceFrame.getPresentState(), SurfaceFrame::PresentState::Dropped);
170 EXPECT_EQ(droppedSurfaceFrame.getActuals().presentTime, 0);
171}
172
173TEST_F(FrameTimelineTest, presentFenceSignaled_presentedFramesUpdated) {
174 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
175 int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions({10, 20, 30});
176 int64_t surfaceFrameToken2 = mTokenManager->generateTokenForPredictions({40, 50, 60});
177 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({22, 26, 30});
178 int64_t sfToken2 = mTokenManager->generateTokenForPredictions({52, 56, 60});
Alec Mouri9a29e672020-09-14 12:39:14 -0700179 auto surfaceFrame1 =
Adithya Srinivasan9febda82020-10-19 10:49:41 -0700180 mFrameTimeline->createSurfaceFrameForToken(sPidOne, sUidOne, sLayerNameOne,
181 sLayerNameOne, surfaceFrameToken1);
Alec Mouri9a29e672020-09-14 12:39:14 -0700182 auto surfaceFrame2 =
Adithya Srinivasan9febda82020-10-19 10:49:41 -0700183 mFrameTimeline->createSurfaceFrameForToken(sPidOne, sUidOne, sLayerNameTwo,
184 sLayerNameTwo, surfaceFrameToken1);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700185 mFrameTimeline->setSfWakeUp(sfToken1, 22);
186 mFrameTimeline->addSurfaceFrame(std::move(surfaceFrame1),
187 SurfaceFrame::PresentState::Presented);
188 mFrameTimeline->addSurfaceFrame(std::move(surfaceFrame2),
189 SurfaceFrame::PresentState::Presented);
190 mFrameTimeline->setSfPresent(26, presentFence1);
191 auto displayFrame = getDisplayFrame(0);
192 SurfaceFrame& presentedSurfaceFrame1 = getSurfaceFrame(0, 0);
193 SurfaceFrame& presentedSurfaceFrame2 = getSurfaceFrame(0, 1);
194 presentFence1->signalForTest(42);
195
196 // Fences haven't been flushed yet, so it should be 0
197 EXPECT_EQ(displayFrame->surfaceFlingerActuals.presentTime, 0);
198 EXPECT_EQ(presentedSurfaceFrame1.getActuals().presentTime, 0);
199 EXPECT_EQ(presentedSurfaceFrame2.getActuals().presentTime, 0);
200
201 // Trigger a flush by finalizing the next DisplayFrame
202 auto presentFence2 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Alec Mouri9a29e672020-09-14 12:39:14 -0700203 auto surfaceFrame3 =
Adithya Srinivasan9febda82020-10-19 10:49:41 -0700204 mFrameTimeline->createSurfaceFrameForToken(sPidOne, sUidOne, sLayerNameOne,
205 sLayerNameOne, surfaceFrameToken2);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700206 mFrameTimeline->setSfWakeUp(sfToken2, 52);
207 mFrameTimeline->addSurfaceFrame(std::move(surfaceFrame3), SurfaceFrame::PresentState::Dropped);
208 mFrameTimeline->setSfPresent(56, presentFence2);
209 displayFrame = getDisplayFrame(0);
210
211 // Fences have flushed, so the present timestamps should be updated
212 EXPECT_EQ(displayFrame->surfaceFlingerActuals.presentTime, 42);
213 EXPECT_EQ(presentedSurfaceFrame1.getActuals().presentTime, 42);
214 EXPECT_EQ(presentedSurfaceFrame2.getActuals().presentTime, 42);
215}
216
217TEST_F(FrameTimelineTest, displayFramesSlidingWindowMovesAfterLimit) {
218 // Insert kMaxDisplayFrames' count of DisplayFrames to fill the deque
219 int frameTimeFactor = 0;
Adithya Srinivasan2d736322020-10-01 16:53:48 -0700220 for (size_t i = 0; i < *maxDisplayFrames; i++) {
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700221 auto presentFence = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
222 int64_t surfaceFrameToken = mTokenManager->generateTokenForPredictions(
223 {10 + frameTimeFactor, 20 + frameTimeFactor, 30 + frameTimeFactor});
224 int64_t sfToken = mTokenManager->generateTokenForPredictions(
225 {22 + frameTimeFactor, 26 + frameTimeFactor, 30 + frameTimeFactor});
Alec Mouri9a29e672020-09-14 12:39:14 -0700226 auto surfaceFrame =
Adithya Srinivasan9febda82020-10-19 10:49:41 -0700227 mFrameTimeline->createSurfaceFrameForToken(sPidOne, sUidOne, sLayerNameOne,
228 sLayerNameOne, surfaceFrameToken);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700229 mFrameTimeline->setSfWakeUp(sfToken, 22 + frameTimeFactor);
230 mFrameTimeline->addSurfaceFrame(std::move(surfaceFrame),
231 SurfaceFrame::PresentState::Presented);
232 mFrameTimeline->setSfPresent(27 + frameTimeFactor, presentFence);
233 presentFence->signalForTest(32 + frameTimeFactor);
234 frameTimeFactor += 30;
235 }
236 auto displayFrame0 = getDisplayFrame(0);
237
238 // The 0th Display Frame should have actuals 22, 27, 32
239 EXPECT_EQ(compareTimelineItems(displayFrame0->surfaceFlingerActuals, TimelineItem(22, 27, 32)),
240 true);
241
242 // Add one more display frame
243 auto presentFence = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
244 int64_t surfaceFrameToken = mTokenManager->generateTokenForPredictions(
245 {10 + frameTimeFactor, 20 + frameTimeFactor, 30 + frameTimeFactor});
246 int64_t sfToken = mTokenManager->generateTokenForPredictions(
247 {22 + frameTimeFactor, 26 + frameTimeFactor, 30 + frameTimeFactor});
Alec Mouri9a29e672020-09-14 12:39:14 -0700248 auto surfaceFrame =
Adithya Srinivasan9febda82020-10-19 10:49:41 -0700249 mFrameTimeline->createSurfaceFrameForToken(sPidOne, sUidOne, sLayerNameOne,
250 sLayerNameOne, surfaceFrameToken);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700251 mFrameTimeline->setSfWakeUp(sfToken, 22 + frameTimeFactor);
252 mFrameTimeline->addSurfaceFrame(std::move(surfaceFrame), SurfaceFrame::PresentState::Presented);
253 mFrameTimeline->setSfPresent(27 + frameTimeFactor, presentFence);
254 presentFence->signalForTest(32 + frameTimeFactor);
255 displayFrame0 = getDisplayFrame(0);
256
257 // The window should have slided by 1 now and the previous 0th display frame
258 // should have been removed from the deque
259 EXPECT_EQ(compareTimelineItems(displayFrame0->surfaceFlingerActuals, TimelineItem(52, 57, 62)),
260 true);
261}
262
Ady Abraham7f8a1e62020-09-28 16:09:35 -0700263TEST_F(FrameTimelineTest, surfaceFrameEndTimeAcquireFenceAfterQueue) {
264 auto surfaceFrame =
Adithya Srinivasan9febda82020-10-19 10:49:41 -0700265 mFrameTimeline->createSurfaceFrameForToken(sPidOne, 0, "acquireFenceAfterQueue",
Alec Mouri9a29e672020-09-14 12:39:14 -0700266 "acquireFenceAfterQueue", std::nullopt);
Ady Abraham7f8a1e62020-09-28 16:09:35 -0700267 surfaceFrame->setActualQueueTime(123);
268 surfaceFrame->setAcquireFenceTime(456);
269 EXPECT_EQ(surfaceFrame->getActuals().endTime, 456);
270}
271
272TEST_F(FrameTimelineTest, surfaceFrameEndTimeAcquireFenceBeforeQueue) {
273 auto surfaceFrame =
Adithya Srinivasan9febda82020-10-19 10:49:41 -0700274 mFrameTimeline->createSurfaceFrameForToken(sPidOne, 0, "acquireFenceAfterQueue",
Alec Mouri9a29e672020-09-14 12:39:14 -0700275 "acquireFenceAfterQueue", std::nullopt);
Ady Abraham7f8a1e62020-09-28 16:09:35 -0700276 surfaceFrame->setActualQueueTime(456);
277 surfaceFrame->setAcquireFenceTime(123);
278 EXPECT_EQ(surfaceFrame->getActuals().endTime, 456);
279}
280
Adithya Srinivasan2d736322020-10-01 16:53:48 -0700281TEST_F(FrameTimelineTest, setMaxDisplayFramesSetsSizeProperly) {
282 auto presentFence = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
283 presentFence->signalForTest(2);
284
285 // Size shouldn't exceed maxDisplayFrames - 64
286 for (size_t i = 0; i < *maxDisplayFrames + 10; i++) {
Adithya Srinivasan9febda82020-10-19 10:49:41 -0700287 auto surfaceFrame =
288 mFrameTimeline->createSurfaceFrameForToken(sPidOne, sUidOne, sLayerNameOne,
289 sLayerNameOne, std::nullopt);
Adithya Srinivasan2d736322020-10-01 16:53:48 -0700290 int64_t sfToken = mTokenManager->generateTokenForPredictions({22, 26, 30});
291 mFrameTimeline->setSfWakeUp(sfToken, 22);
292 mFrameTimeline->addSurfaceFrame(std::move(surfaceFrame),
293 SurfaceFrame::PresentState::Presented);
294 mFrameTimeline->setSfPresent(27, presentFence);
295 }
296 EXPECT_EQ(getNumberOfDisplayFrames(), *maxDisplayFrames);
297
298 // Increase the size to 256
299 mFrameTimeline->setMaxDisplayFrames(256);
300 EXPECT_EQ(*maxDisplayFrames, 256);
301
302 for (size_t i = 0; i < *maxDisplayFrames + 10; i++) {
Adithya Srinivasan9febda82020-10-19 10:49:41 -0700303 auto surfaceFrame =
304 mFrameTimeline->createSurfaceFrameForToken(sPidOne, sUidOne, sLayerNameOne,
305 sLayerNameOne, std::nullopt);
Adithya Srinivasan2d736322020-10-01 16:53:48 -0700306 int64_t sfToken = mTokenManager->generateTokenForPredictions({22, 26, 30});
307 mFrameTimeline->setSfWakeUp(sfToken, 22);
308 mFrameTimeline->addSurfaceFrame(std::move(surfaceFrame),
309 SurfaceFrame::PresentState::Presented);
310 mFrameTimeline->setSfPresent(27, presentFence);
311 }
312 EXPECT_EQ(getNumberOfDisplayFrames(), *maxDisplayFrames);
313
314 // Shrink the size to 128
315 mFrameTimeline->setMaxDisplayFrames(128);
316 EXPECT_EQ(*maxDisplayFrames, 128);
317
318 for (size_t i = 0; i < *maxDisplayFrames + 10; i++) {
Adithya Srinivasan9febda82020-10-19 10:49:41 -0700319 auto surfaceFrame =
320 mFrameTimeline->createSurfaceFrameForToken(sPidOne, sUidOne, sLayerNameOne,
321 sLayerNameOne, std::nullopt);
Adithya Srinivasan2d736322020-10-01 16:53:48 -0700322 int64_t sfToken = mTokenManager->generateTokenForPredictions({22, 26, 30});
323 mFrameTimeline->setSfWakeUp(sfToken, 22);
324 mFrameTimeline->addSurfaceFrame(std::move(surfaceFrame),
325 SurfaceFrame::PresentState::Presented);
326 mFrameTimeline->setSfPresent(27, presentFence);
327 }
328 EXPECT_EQ(getNumberOfDisplayFrames(), *maxDisplayFrames);
329}
Alec Mouri9a29e672020-09-14 12:39:14 -0700330
331TEST_F(FrameTimelineTest, presentFenceSignaled_reportsLongSfCpu) {
332 EXPECT_CALL(*mTimeStats,
333 incrementJankyFrames(sUidOne, sLayerNameOne,
334 HasBit(TimeStats::JankType::SurfaceFlingerDeadlineMissed)));
335 EXPECT_CALL(*mTimeStats,
336 incrementJankyFrames(HasBit(TimeStats::JankType::SurfaceFlingerDeadlineMissed)));
337 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
338 int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions(
339 {std::chrono::duration_cast<std::chrono::nanoseconds>(10ms).count(),
340 std::chrono::duration_cast<std::chrono::nanoseconds>(20ms).count(),
341 std::chrono::duration_cast<std::chrono::nanoseconds>(60ms).count()});
342 int64_t sfToken1 = mTokenManager->generateTokenForPredictions(
343 {std::chrono::duration_cast<std::chrono::nanoseconds>(52ms).count(),
344 std::chrono::duration_cast<std::chrono::nanoseconds>(56ms).count(),
345 std::chrono::duration_cast<std::chrono::nanoseconds>(60ms).count()});
346 auto surfaceFrame1 =
Adithya Srinivasan9febda82020-10-19 10:49:41 -0700347 mFrameTimeline->createSurfaceFrameForToken(sPidOne, sUidOne, sLayerNameOne,
348 sLayerNameOne, surfaceFrameToken1);
Alec Mouri9a29e672020-09-14 12:39:14 -0700349 mFrameTimeline->setSfWakeUp(sfToken1,
350 std::chrono::duration_cast<std::chrono::nanoseconds>(52ms).count());
351 mFrameTimeline->addSurfaceFrame(std::move(surfaceFrame1),
352 SurfaceFrame::PresentState::Presented);
353 presentFence1->signalForTest(
354 std::chrono::duration_cast<std::chrono::nanoseconds>(90ms).count());
355
356 mFrameTimeline->setSfPresent(std::chrono::duration_cast<std::chrono::nanoseconds>(59ms).count(),
357 presentFence1);
358}
359
360TEST_F(FrameTimelineTest, presentFenceSignaled_reportsDisplayMiss) {
361 EXPECT_CALL(*mTimeStats,
362 incrementJankyFrames(sUidOne, sLayerNameOne, HasBit(TimeStats::JankType::Display)));
363 EXPECT_CALL(*mTimeStats, incrementJankyFrames(HasBit(TimeStats::JankType::Display)));
364 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
365 int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions(
366 {std::chrono::duration_cast<std::chrono::nanoseconds>(10ms).count(),
367 std::chrono::duration_cast<std::chrono::nanoseconds>(20ms).count(),
368 std::chrono::duration_cast<std::chrono::nanoseconds>(60ms).count()});
369 int64_t sfToken1 = mTokenManager->generateTokenForPredictions(
370 {std::chrono::duration_cast<std::chrono::nanoseconds>(52ms).count(),
371 std::chrono::duration_cast<std::chrono::nanoseconds>(56ms).count(),
372 std::chrono::duration_cast<std::chrono::nanoseconds>(60ms).count()});
373 auto surfaceFrame1 =
Adithya Srinivasan9febda82020-10-19 10:49:41 -0700374 mFrameTimeline->createSurfaceFrameForToken(sPidOne, sUidOne, sLayerNameOne,
375 sLayerNameOne, surfaceFrameToken1);
Alec Mouri9a29e672020-09-14 12:39:14 -0700376 mFrameTimeline->setSfWakeUp(sfToken1,
377 std::chrono::duration_cast<std::chrono::nanoseconds>(52ms).count());
378 mFrameTimeline->addSurfaceFrame(std::move(surfaceFrame1),
379 SurfaceFrame::PresentState::Presented);
380 presentFence1->signalForTest(
381 std::chrono::duration_cast<std::chrono::nanoseconds>(90ms).count());
382 mFrameTimeline->setSfPresent(std::chrono::duration_cast<std::chrono::nanoseconds>(59ms).count(),
383 presentFence1);
384}
385
386TEST_F(FrameTimelineTest, presentFenceSignaled_reportsAppMiss) {
387 EXPECT_CALL(*mTimeStats,
388 incrementJankyFrames(sUidOne, sLayerNameOne,
389 HasBit(TimeStats::JankType::AppDeadlineMissed)));
390 EXPECT_CALL(*mTimeStats, incrementJankyFrames(HasBit(TimeStats::JankType::AppDeadlineMissed)));
391 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
392 int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions(
393 {std::chrono::duration_cast<std::chrono::nanoseconds>(10ms).count(),
394 std::chrono::duration_cast<std::chrono::nanoseconds>(20ms).count(),
395 std::chrono::duration_cast<std::chrono::nanoseconds>(60ms).count()});
396 int64_t sfToken1 = mTokenManager->generateTokenForPredictions(
397 {std::chrono::duration_cast<std::chrono::nanoseconds>(52ms).count(),
398 std::chrono::duration_cast<std::chrono::nanoseconds>(56ms).count(),
399 std::chrono::duration_cast<std::chrono::nanoseconds>(60ms).count()});
400 auto surfaceFrame1 =
Adithya Srinivasan9febda82020-10-19 10:49:41 -0700401 mFrameTimeline->createSurfaceFrameForToken(sPidOne, sUidOne, sLayerNameOne,
402 sLayerNameOne, surfaceFrameToken1);
Alec Mouri9a29e672020-09-14 12:39:14 -0700403 surfaceFrame1->setAcquireFenceTime(
404 std::chrono::duration_cast<std::chrono::nanoseconds>(45ms).count());
405 mFrameTimeline->setSfWakeUp(sfToken1,
406 std::chrono::duration_cast<std::chrono::nanoseconds>(52ms).count());
407
408 mFrameTimeline->addSurfaceFrame(std::move(surfaceFrame1),
409 SurfaceFrame::PresentState::Presented);
410 presentFence1->signalForTest(
411 std::chrono::duration_cast<std::chrono::nanoseconds>(90ms).count());
412 mFrameTimeline->setSfPresent(std::chrono::duration_cast<std::chrono::nanoseconds>(56ms).count(),
413 presentFence1);
414}
415
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700416} // namespace android::frametimeline