blob: b3f47ccb6a8d338c66f3364888770707c873043e [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
Marin Shalamanovbed7fd32020-12-21 20:02:20 +010017
Alec Mouri9a29e672020-09-14 12:39:14 -070018#include "gmock/gmock-spec-builders.h"
19#include "mock/MockTimeStats.h"
Adithya Srinivasanf279e042020-08-17 14:56:27 -070020#undef LOG_TAG
21#define LOG_TAG "LibSurfaceFlingerUnittests"
22
23#include <FrameTimeline/FrameTimeline.h>
24#include <gtest/gtest.h>
25#include <log/log.h>
Adithya Srinivasan01189672020-10-20 14:23:05 -070026#include <perfetto/trace/trace.pb.h>
Adithya Srinivasanf279e042020-08-17 14:56:27 -070027#include <cinttypes>
28
29using namespace std::chrono_literals;
Alec Mouri363faf02021-01-29 16:34:55 -080030using testing::_;
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -080031using testing::AtLeast;
Alec Mouri9a29e672020-09-14 12:39:14 -070032using testing::Contains;
Adithya Srinivasan01189672020-10-20 14:23:05 -070033using FrameTimelineEvent = perfetto::protos::FrameTimelineEvent;
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +000034using ProtoExpectedDisplayFrameStart =
35 perfetto::protos::FrameTimelineEvent_ExpectedDisplayFrameStart;
36using ProtoExpectedSurfaceFrameStart =
37 perfetto::protos::FrameTimelineEvent_ExpectedSurfaceFrameStart;
38using ProtoActualDisplayFrameStart = perfetto::protos::FrameTimelineEvent_ActualDisplayFrameStart;
39using ProtoActualSurfaceFrameStart = perfetto::protos::FrameTimelineEvent_ActualSurfaceFrameStart;
40using ProtoFrameEnd = perfetto::protos::FrameTimelineEvent_FrameEnd;
Adithya Srinivasan01189672020-10-20 14:23:05 -070041using ProtoPresentType = perfetto::protos::FrameTimelineEvent_PresentType;
42using ProtoJankType = perfetto::protos::FrameTimelineEvent_JankType;
Adithya Srinivasan78e58af2021-02-25 00:08:08 +000043using ProtoPredictionType = perfetto::protos::FrameTimelineEvent_PredictionType;
Alec Mouri9a29e672020-09-14 12:39:14 -070044
Adithya Srinivasanf279e042020-08-17 14:56:27 -070045namespace android::frametimeline {
46
47class FrameTimelineTest : public testing::Test {
48public:
49 FrameTimelineTest() {
50 const ::testing::TestInfo* const test_info =
51 ::testing::UnitTest::GetInstance()->current_test_info();
52 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
53 }
54
55 ~FrameTimelineTest() {
56 const ::testing::TestInfo* const test_info =
57 ::testing::UnitTest::GetInstance()->current_test_info();
58 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
59 }
60
Adithya Srinivasan01189672020-10-20 14:23:05 -070061 static void SetUpTestSuite() {
62 // Need to initialize tracing in process for testing, and only once per test suite.
63 perfetto::TracingInitArgs args;
64 args.backends = perfetto::kInProcessBackend;
65 perfetto::Tracing::Initialize(args);
66 }
67
Adithya Srinivasanf279e042020-08-17 14:56:27 -070068 void SetUp() override {
Alec Mouri9a29e672020-09-14 12:39:14 -070069 mTimeStats = std::make_shared<mock::TimeStats>();
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +000070 mFrameTimeline = std::make_unique<impl::FrameTimeline>(mTimeStats, kSurfaceFlingerPid,
Adithya Srinivasan82eef322021-04-10 00:06:04 +000071 kTestThresholds);
Adithya Srinivasan01189672020-10-20 14:23:05 -070072 mFrameTimeline->registerDataSource();
Adithya Srinivasanf279e042020-08-17 14:56:27 -070073 mTokenManager = &mFrameTimeline->mTokenManager;
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +000074 mTraceCookieCounter = &mFrameTimeline->mTraceCookieCounter;
Adithya Srinivasan2d736322020-10-01 16:53:48 -070075 maxDisplayFrames = &mFrameTimeline->mMaxDisplayFrames;
Adithya Srinivasanf279e042020-08-17 14:56:27 -070076 maxTokenRetentionTime = mTokenManager->kMaxRetentionTime;
77 }
78
Adithya Srinivasan01189672020-10-20 14:23:05 -070079 // Each tracing session can be used for a single block of Start -> Stop.
80 static std::unique_ptr<perfetto::TracingSession> getTracingSessionForTest() {
81 perfetto::TraceConfig cfg;
82 cfg.set_duration_ms(500);
83 cfg.add_buffers()->set_size_kb(1024);
84 auto* ds_cfg = cfg.add_data_sources()->mutable_config();
85 ds_cfg->set_name(impl::FrameTimeline::kFrameTimelineDataSource);
86
87 auto tracingSession = perfetto::Tracing::NewTrace(perfetto::kInProcessBackend);
88 tracingSession->Setup(cfg);
89 return tracingSession;
90 }
91
92 std::vector<perfetto::protos::TracePacket> readFrameTimelinePacketsBlocking(
93 perfetto::TracingSession* tracingSession) {
94 std::vector<char> raw_trace = tracingSession->ReadTraceBlocking();
95 perfetto::protos::Trace trace;
96 EXPECT_TRUE(trace.ParseFromArray(raw_trace.data(), int(raw_trace.size())));
97
98 std::vector<perfetto::protos::TracePacket> packets;
99 for (const auto& packet : trace.packet()) {
100 if (!packet.has_frame_timeline_event()) {
101 continue;
102 }
103 packets.emplace_back(packet);
104 }
105 return packets;
106 }
107
108 void addEmptyDisplayFrame() {
109 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000110 // Trigger a flushPresentFence by calling setSfPresent for the next frame
Adithya Srinivasan01189672020-10-20 14:23:05 -0700111 mFrameTimeline->setSfPresent(2500, presentFence1);
112 }
113
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700114 void flushTokens(nsecs_t flushTime) {
115 std::lock_guard<std::mutex> lock(mTokenManager->mMutex);
116 mTokenManager->flushTokens(flushTime);
117 }
118
119 SurfaceFrame& getSurfaceFrame(size_t displayFrameIdx, size_t surfaceFrameIdx) {
120 std::lock_guard<std::mutex> lock(mFrameTimeline->mMutex);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800121 return *(mFrameTimeline->mDisplayFrames[displayFrameIdx]
122 ->getSurfaceFrames()[surfaceFrameIdx]);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700123 }
124
125 std::shared_ptr<impl::FrameTimeline::DisplayFrame> getDisplayFrame(size_t idx) {
126 std::lock_guard<std::mutex> lock(mFrameTimeline->mMutex);
127 return mFrameTimeline->mDisplayFrames[idx];
128 }
129
130 static bool compareTimelineItems(const TimelineItem& a, const TimelineItem& b) {
131 return a.startTime == b.startTime && a.endTime == b.endTime &&
132 a.presentTime == b.presentTime;
133 }
134
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000135 const std::map<int64_t, TokenManagerPrediction>& getPredictions() const {
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700136 return mTokenManager->mPredictions;
137 }
138
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000139 uint32_t getNumberOfDisplayFrames() const {
Adithya Srinivasan2d736322020-10-01 16:53:48 -0700140 std::lock_guard<std::mutex> lock(mFrameTimeline->mMutex);
141 return static_cast<uint32_t>(mFrameTimeline->mDisplayFrames.size());
142 }
143
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000144 int64_t snoopCurrentTraceCookie() const { return mTraceCookieCounter->mTraceCookie; }
145
146 void flushTrace() {
147 using FrameTimelineDataSource = impl::FrameTimeline::FrameTimelineDataSource;
148 FrameTimelineDataSource::Trace(
149 [&](FrameTimelineDataSource::TraceContext ctx) { ctx.Flush(); });
150 }
151
Alec Mouri9a29e672020-09-14 12:39:14 -0700152 std::shared_ptr<mock::TimeStats> mTimeStats;
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700153 std::unique_ptr<impl::FrameTimeline> mFrameTimeline;
154 impl::TokenManager* mTokenManager;
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000155 TraceCookieCounter* mTraceCookieCounter;
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700156 FenceToFenceTimeMap fenceFactory;
Adithya Srinivasan2d736322020-10-01 16:53:48 -0700157 uint32_t* maxDisplayFrames;
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700158 nsecs_t maxTokenRetentionTime;
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000159 static constexpr pid_t kSurfaceFlingerPid = 666;
Adithya Srinivasanead17162021-02-18 02:17:37 +0000160 static constexpr nsecs_t kPresentThreshold = std::chrono::nanoseconds(2ns).count();
161 static constexpr nsecs_t kDeadlineThreshold = std::chrono::nanoseconds(2ns).count();
162 static constexpr nsecs_t kStartThreshold = std::chrono::nanoseconds(2ns).count();
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800163 static constexpr JankClassificationThresholds kTestThresholds{kPresentThreshold,
164 kDeadlineThreshold,
165 kStartThreshold};
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700166};
167
Alec Mouri9a29e672020-09-14 12:39:14 -0700168static const std::string sLayerNameOne = "layer1";
169static const std::string sLayerNameTwo = "layer2";
170static constexpr const uid_t sUidOne = 0;
Adithya Srinivasan9febda82020-10-19 10:49:41 -0700171static constexpr pid_t sPidOne = 10;
172static constexpr pid_t sPidTwo = 20;
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000173static constexpr int32_t sInputEventId = 5;
Alec Mouriadebf5c2021-01-05 12:57:36 -0800174static constexpr int32_t sLayerIdOne = 1;
175static constexpr int32_t sLayerIdTwo = 2;
Alec Mouri9a29e672020-09-14 12:39:14 -0700176
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700177TEST_F(FrameTimelineTest, tokenManagerRemovesStalePredictions) {
178 int64_t token1 = mTokenManager->generateTokenForPredictions({0, 0, 0});
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000179 EXPECT_EQ(getPredictions().size(), 1u);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700180 flushTokens(systemTime() + maxTokenRetentionTime);
181 int64_t token2 = mTokenManager->generateTokenForPredictions({10, 20, 30});
182 std::optional<TimelineItem> predictions = mTokenManager->getPredictionsForToken(token1);
183
184 // token1 should have expired
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000185 EXPECT_EQ(getPredictions().size(), 1u);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700186 EXPECT_EQ(predictions.has_value(), false);
187
188 predictions = mTokenManager->getPredictionsForToken(token2);
189 EXPECT_EQ(compareTimelineItems(*predictions, TimelineItem(10, 20, 30)), true);
190}
191
Adithya Srinivasan9febda82020-10-19 10:49:41 -0700192TEST_F(FrameTimelineTest, createSurfaceFrameForToken_getOwnerPidReturnsCorrectPid) {
Alec Mouriadebf5c2021-01-05 12:57:36 -0800193 auto surfaceFrame1 =
194 mFrameTimeline->createSurfaceFrameForToken({}, sPidOne, sUidOne, sLayerIdOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000195 sLayerNameOne, sLayerNameOne,
196 /*isBuffer*/ true);
Alec Mouriadebf5c2021-01-05 12:57:36 -0800197 auto surfaceFrame2 =
198 mFrameTimeline->createSurfaceFrameForToken({}, sPidTwo, sUidOne, sLayerIdOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000199 sLayerNameOne, sLayerNameOne,
200 /*isBuffer*/ true);
Adithya Srinivasan9febda82020-10-19 10:49:41 -0700201 EXPECT_EQ(surfaceFrame1->getOwnerPid(), sPidOne);
202 EXPECT_EQ(surfaceFrame2->getOwnerPid(), sPidTwo);
203}
204
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700205TEST_F(FrameTimelineTest, createSurfaceFrameForToken_noToken) {
Alec Mouriadebf5c2021-01-05 12:57:36 -0800206 auto surfaceFrame =
207 mFrameTimeline->createSurfaceFrameForToken({}, sPidOne, sUidOne, sLayerIdOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000208 sLayerNameOne, sLayerNameOne,
209 /*isBuffer*/ true);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700210 EXPECT_EQ(surfaceFrame->getPredictionState(), PredictionState::None);
211}
212
213TEST_F(FrameTimelineTest, createSurfaceFrameForToken_expiredToken) {
214 int64_t token1 = mTokenManager->generateTokenForPredictions({0, 0, 0});
215 flushTokens(systemTime() + maxTokenRetentionTime);
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000216 auto surfaceFrame =
217 mFrameTimeline->createSurfaceFrameForToken({token1, sInputEventId}, sPidOne, sUidOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000218 sLayerIdOne, sLayerNameOne, sLayerNameOne,
219 /*isBuffer*/ true);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700220
221 EXPECT_EQ(surfaceFrame->getPredictionState(), PredictionState::Expired);
222}
223
224TEST_F(FrameTimelineTest, createSurfaceFrameForToken_validToken) {
225 int64_t token1 = mTokenManager->generateTokenForPredictions({10, 20, 30});
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000226 auto surfaceFrame =
227 mFrameTimeline->createSurfaceFrameForToken({token1, sInputEventId}, sPidOne, sUidOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000228 sLayerIdOne, sLayerNameOne, sLayerNameOne,
229 /*isBuffer*/ true);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700230
231 EXPECT_EQ(surfaceFrame->getPredictionState(), PredictionState::Valid);
232 EXPECT_EQ(compareTimelineItems(surfaceFrame->getPredictions(), TimelineItem(10, 20, 30)), true);
233}
234
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000235TEST_F(FrameTimelineTest, createSurfaceFrameForToken_validInputEventId) {
236 int64_t token1 = mTokenManager->generateTokenForPredictions({10, 20, 30});
237 constexpr int32_t inputEventId = 1;
238 auto surfaceFrame =
239 mFrameTimeline->createSurfaceFrameForToken({token1, inputEventId}, sPidOne, sUidOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000240 sLayerIdOne, sLayerNameOne, sLayerNameOne,
241 /*isBuffer*/ true);
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000242
243 EXPECT_EQ(inputEventId, surfaceFrame->getInputEventId());
244}
245
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700246TEST_F(FrameTimelineTest, presentFenceSignaled_droppedFramesNotUpdated) {
247 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700248 int64_t token1 = mTokenManager->generateTokenForPredictions({10, 20, 30});
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000249 auto surfaceFrame1 =
250 mFrameTimeline->createSurfaceFrameForToken({token1, sInputEventId}, sPidOne, sUidOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000251 sLayerIdOne, sLayerNameOne, sLayerNameOne,
252 /*isBuffer*/ true);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700253
254 // Set up the display frame
Alec Mouri7d436ec2021-01-27 20:40:50 -0800255 mFrameTimeline->setSfWakeUp(token1, 20, Fps::fromPeriodNsecs(11));
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000256 surfaceFrame1->setDropTime(12);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800257 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Dropped);
258 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700259 mFrameTimeline->setSfPresent(25, presentFence1);
260 presentFence1->signalForTest(30);
261
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000262 addEmptyDisplayFrame();
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700263
264 auto& droppedSurfaceFrame = getSurfaceFrame(0, 0);
265 EXPECT_EQ(droppedSurfaceFrame.getPresentState(), SurfaceFrame::PresentState::Dropped);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000266 EXPECT_EQ(0u, droppedSurfaceFrame.getActuals().endTime);
267 EXPECT_EQ(12u, droppedSurfaceFrame.getDropTime());
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700268 EXPECT_EQ(droppedSurfaceFrame.getActuals().presentTime, 0);
269}
270
271TEST_F(FrameTimelineTest, presentFenceSignaled_presentedFramesUpdated) {
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800272 // Layer specific increment
Alec Mouri363faf02021-01-29 16:34:55 -0800273 EXPECT_CALL(*mTimeStats, incrementJankyFrames(_)).Times(2);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700274 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
275 int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions({10, 20, 30});
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700276 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({22, 26, 30});
Alec Mouri9a29e672020-09-14 12:39:14 -0700277 auto surfaceFrame1 =
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000278 mFrameTimeline->createSurfaceFrameForToken({surfaceFrameToken1, sInputEventId}, sPidOne,
Alec Mouriadebf5c2021-01-05 12:57:36 -0800279 sUidOne, sLayerIdOne, sLayerNameOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000280 sLayerNameOne, /*isBuffer*/ true);
Alec Mouri9a29e672020-09-14 12:39:14 -0700281 auto surfaceFrame2 =
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000282 mFrameTimeline->createSurfaceFrameForToken({surfaceFrameToken1, sInputEventId}, sPidOne,
Alec Mouriadebf5c2021-01-05 12:57:36 -0800283 sUidOne, sLayerIdTwo, sLayerNameTwo,
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000284 sLayerNameTwo, /*isBuffer*/ true);
Alec Mouri7d436ec2021-01-27 20:40:50 -0800285 mFrameTimeline->setSfWakeUp(sfToken1, 22, Fps::fromPeriodNsecs(11));
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800286 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
287 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
288 surfaceFrame2->setPresentState(SurfaceFrame::PresentState::Presented);
289 mFrameTimeline->addSurfaceFrame(surfaceFrame2);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700290 mFrameTimeline->setSfPresent(26, presentFence1);
291 auto displayFrame = getDisplayFrame(0);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800292 auto& presentedSurfaceFrame1 = getSurfaceFrame(0, 0);
293 auto& presentedSurfaceFrame2 = getSurfaceFrame(0, 1);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700294 presentFence1->signalForTest(42);
295
296 // Fences haven't been flushed yet, so it should be 0
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800297 EXPECT_EQ(displayFrame->getActuals().presentTime, 0);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700298 EXPECT_EQ(presentedSurfaceFrame1.getActuals().presentTime, 0);
299 EXPECT_EQ(presentedSurfaceFrame2.getActuals().presentTime, 0);
300
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000301 addEmptyDisplayFrame();
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700302
303 // Fences have flushed, so the present timestamps should be updated
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800304 EXPECT_EQ(displayFrame->getActuals().presentTime, 42);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700305 EXPECT_EQ(presentedSurfaceFrame1.getActuals().presentTime, 42);
306 EXPECT_EQ(presentedSurfaceFrame2.getActuals().presentTime, 42);
Jorim Jaggi9c03b502020-11-24 23:51:31 +0100307 EXPECT_NE(surfaceFrame1->getJankType(), std::nullopt);
308 EXPECT_NE(surfaceFrame2->getJankType(), std::nullopt);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700309}
310
311TEST_F(FrameTimelineTest, displayFramesSlidingWindowMovesAfterLimit) {
312 // Insert kMaxDisplayFrames' count of DisplayFrames to fill the deque
313 int frameTimeFactor = 0;
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800314 // Layer specific increment
Alec Mouri363faf02021-01-29 16:34:55 -0800315 EXPECT_CALL(*mTimeStats, incrementJankyFrames(_))
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800316 .Times(static_cast<int32_t>(*maxDisplayFrames));
Adithya Srinivasan2d736322020-10-01 16:53:48 -0700317 for (size_t i = 0; i < *maxDisplayFrames; i++) {
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700318 auto presentFence = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
319 int64_t surfaceFrameToken = mTokenManager->generateTokenForPredictions(
320 {10 + frameTimeFactor, 20 + frameTimeFactor, 30 + frameTimeFactor});
321 int64_t sfToken = mTokenManager->generateTokenForPredictions(
322 {22 + frameTimeFactor, 26 + frameTimeFactor, 30 + frameTimeFactor});
Alec Mouri9a29e672020-09-14 12:39:14 -0700323 auto surfaceFrame =
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000324 mFrameTimeline->createSurfaceFrameForToken({surfaceFrameToken, sInputEventId},
Alec Mouriadebf5c2021-01-05 12:57:36 -0800325 sPidOne, sUidOne, sLayerIdOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000326 sLayerNameOne, sLayerNameOne,
327 /*isBuffer*/ true);
Alec Mouri7d436ec2021-01-27 20:40:50 -0800328 mFrameTimeline->setSfWakeUp(sfToken, 22 + frameTimeFactor, Fps::fromPeriodNsecs(11));
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800329 surfaceFrame->setPresentState(SurfaceFrame::PresentState::Presented);
330 mFrameTimeline->addSurfaceFrame(surfaceFrame);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700331 mFrameTimeline->setSfPresent(27 + frameTimeFactor, presentFence);
332 presentFence->signalForTest(32 + frameTimeFactor);
333 frameTimeFactor += 30;
334 }
335 auto displayFrame0 = getDisplayFrame(0);
336
337 // The 0th Display Frame should have actuals 22, 27, 32
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800338 EXPECT_EQ(compareTimelineItems(displayFrame0->getActuals(), TimelineItem(22, 27, 32)), true);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700339
340 // Add one more display frame
341 auto presentFence = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
342 int64_t surfaceFrameToken = mTokenManager->generateTokenForPredictions(
343 {10 + frameTimeFactor, 20 + frameTimeFactor, 30 + frameTimeFactor});
344 int64_t sfToken = mTokenManager->generateTokenForPredictions(
345 {22 + frameTimeFactor, 26 + frameTimeFactor, 30 + frameTimeFactor});
Alec Mouri9a29e672020-09-14 12:39:14 -0700346 auto surfaceFrame =
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000347 mFrameTimeline->createSurfaceFrameForToken({surfaceFrameToken, sInputEventId}, sPidOne,
Alec Mouriadebf5c2021-01-05 12:57:36 -0800348 sUidOne, sLayerIdOne, sLayerNameOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000349 sLayerNameOne, /*isBuffer*/ true);
Alec Mouri7d436ec2021-01-27 20:40:50 -0800350 mFrameTimeline->setSfWakeUp(sfToken, 22 + frameTimeFactor, Fps::fromPeriodNsecs(11));
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800351 surfaceFrame->setPresentState(SurfaceFrame::PresentState::Presented);
352 mFrameTimeline->addSurfaceFrame(surfaceFrame);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700353 mFrameTimeline->setSfPresent(27 + frameTimeFactor, presentFence);
354 presentFence->signalForTest(32 + frameTimeFactor);
355 displayFrame0 = getDisplayFrame(0);
356
357 // The window should have slided by 1 now and the previous 0th display frame
358 // should have been removed from the deque
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800359 EXPECT_EQ(compareTimelineItems(displayFrame0->getActuals(), TimelineItem(52, 57, 62)), true);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700360}
361
Ady Abraham7f8a1e62020-09-28 16:09:35 -0700362TEST_F(FrameTimelineTest, surfaceFrameEndTimeAcquireFenceAfterQueue) {
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000363 auto surfaceFrame =
364 mFrameTimeline->createSurfaceFrameForToken({}, sPidOne, 0, sLayerIdOne,
365 "acquireFenceAfterQueue",
366 "acquireFenceAfterQueue", /*isBuffer*/ true);
Ady Abraham7f8a1e62020-09-28 16:09:35 -0700367 surfaceFrame->setActualQueueTime(123);
368 surfaceFrame->setAcquireFenceTime(456);
369 EXPECT_EQ(surfaceFrame->getActuals().endTime, 456);
370}
371
372TEST_F(FrameTimelineTest, surfaceFrameEndTimeAcquireFenceBeforeQueue) {
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000373 auto surfaceFrame =
374 mFrameTimeline->createSurfaceFrameForToken({}, sPidOne, 0, sLayerIdOne,
375 "acquireFenceAfterQueue",
376 "acquireFenceAfterQueue", /*isBuffer*/ true);
Ady Abraham7f8a1e62020-09-28 16:09:35 -0700377 surfaceFrame->setActualQueueTime(456);
378 surfaceFrame->setAcquireFenceTime(123);
379 EXPECT_EQ(surfaceFrame->getActuals().endTime, 456);
380}
381
Adithya Srinivasan2d736322020-10-01 16:53:48 -0700382TEST_F(FrameTimelineTest, setMaxDisplayFramesSetsSizeProperly) {
383 auto presentFence = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
384 presentFence->signalForTest(2);
385
386 // Size shouldn't exceed maxDisplayFrames - 64
387 for (size_t i = 0; i < *maxDisplayFrames + 10; i++) {
Adithya Srinivasan9febda82020-10-19 10:49:41 -0700388 auto surfaceFrame =
Alec Mouriadebf5c2021-01-05 12:57:36 -0800389 mFrameTimeline->createSurfaceFrameForToken({}, sPidOne, sUidOne, sLayerIdOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000390 sLayerNameOne, sLayerNameOne,
391 /*isBuffer*/ true);
Adithya Srinivasan2d736322020-10-01 16:53:48 -0700392 int64_t sfToken = mTokenManager->generateTokenForPredictions({22, 26, 30});
Alec Mouri7d436ec2021-01-27 20:40:50 -0800393 mFrameTimeline->setSfWakeUp(sfToken, 22, Fps::fromPeriodNsecs(11));
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800394 surfaceFrame->setPresentState(SurfaceFrame::PresentState::Presented);
395 mFrameTimeline->addSurfaceFrame(surfaceFrame);
Adithya Srinivasan2d736322020-10-01 16:53:48 -0700396 mFrameTimeline->setSfPresent(27, presentFence);
397 }
398 EXPECT_EQ(getNumberOfDisplayFrames(), *maxDisplayFrames);
399
400 // Increase the size to 256
401 mFrameTimeline->setMaxDisplayFrames(256);
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000402 EXPECT_EQ(*maxDisplayFrames, 256u);
Adithya Srinivasan2d736322020-10-01 16:53:48 -0700403
404 for (size_t i = 0; i < *maxDisplayFrames + 10; i++) {
Adithya Srinivasan9febda82020-10-19 10:49:41 -0700405 auto surfaceFrame =
Alec Mouriadebf5c2021-01-05 12:57:36 -0800406 mFrameTimeline->createSurfaceFrameForToken({}, sPidOne, sUidOne, sLayerIdOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000407 sLayerNameOne, sLayerNameOne,
408 /*isBuffer*/ true);
Adithya Srinivasan2d736322020-10-01 16:53:48 -0700409 int64_t sfToken = mTokenManager->generateTokenForPredictions({22, 26, 30});
Alec Mouri7d436ec2021-01-27 20:40:50 -0800410 mFrameTimeline->setSfWakeUp(sfToken, 22, Fps::fromPeriodNsecs(11));
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800411 surfaceFrame->setPresentState(SurfaceFrame::PresentState::Presented);
412 mFrameTimeline->addSurfaceFrame(surfaceFrame);
Adithya Srinivasan2d736322020-10-01 16:53:48 -0700413 mFrameTimeline->setSfPresent(27, presentFence);
414 }
415 EXPECT_EQ(getNumberOfDisplayFrames(), *maxDisplayFrames);
416
417 // Shrink the size to 128
418 mFrameTimeline->setMaxDisplayFrames(128);
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000419 EXPECT_EQ(*maxDisplayFrames, 128u);
Adithya Srinivasan2d736322020-10-01 16:53:48 -0700420
421 for (size_t i = 0; i < *maxDisplayFrames + 10; i++) {
Adithya Srinivasan9febda82020-10-19 10:49:41 -0700422 auto surfaceFrame =
Alec Mouriadebf5c2021-01-05 12:57:36 -0800423 mFrameTimeline->createSurfaceFrameForToken({}, sPidOne, sUidOne, sLayerIdOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000424 sLayerNameOne, sLayerNameOne,
425 /*isBuffer*/ true);
Adithya Srinivasan2d736322020-10-01 16:53:48 -0700426 int64_t sfToken = mTokenManager->generateTokenForPredictions({22, 26, 30});
Alec Mouri7d436ec2021-01-27 20:40:50 -0800427 mFrameTimeline->setSfWakeUp(sfToken, 22, Fps::fromPeriodNsecs(11));
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800428 surfaceFrame->setPresentState(SurfaceFrame::PresentState::Presented);
429 mFrameTimeline->addSurfaceFrame(surfaceFrame);
Adithya Srinivasan2d736322020-10-01 16:53:48 -0700430 mFrameTimeline->setSfPresent(27, presentFence);
431 }
432 EXPECT_EQ(getNumberOfDisplayFrames(), *maxDisplayFrames);
433}
Alec Mouri9a29e672020-09-14 12:39:14 -0700434
Adithya Srinivasan7c4ac7a2021-03-08 23:48:03 +0000435TEST_F(FrameTimelineTest, presentFenceSignaled_invalidSignalTime) {
436 Fps refreshRate = Fps::fromPeriodNsecs(11);
437
438 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
439 int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions({10, 20, 60});
440 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({52, 60, 60});
441
442 auto surfaceFrame1 =
443 mFrameTimeline->createSurfaceFrameForToken({surfaceFrameToken1, sInputEventId}, sPidOne,
444 sUidOne, sLayerIdOne, sLayerNameOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000445 sLayerNameOne, /*isBuffer*/ true);
Adithya Srinivasan7c4ac7a2021-03-08 23:48:03 +0000446 mFrameTimeline->setSfWakeUp(sfToken1, 52, refreshRate);
447 surfaceFrame1->setAcquireFenceTime(20);
448 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
449 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
450
451 mFrameTimeline->setSfPresent(59, presentFence1);
452 presentFence1->signalForTest(-1);
453 addEmptyDisplayFrame();
454
455 auto displayFrame0 = getDisplayFrame(0);
456 EXPECT_EQ(displayFrame0->getActuals().presentTime, -1);
457 EXPECT_EQ(displayFrame0->getJankType(), JankType::Unknown);
458 EXPECT_EQ(surfaceFrame1->getActuals().presentTime, -1);
459 EXPECT_EQ(surfaceFrame1->getJankType(), JankType::Unknown);
460}
461
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800462// Tests related to TimeStats
Adithya Srinivasan7c4ac7a2021-03-08 23:48:03 +0000463TEST_F(FrameTimelineTest, presentFenceSignaled_doesNotReportForInvalidTokens) {
464 Fps refreshRate = Fps::fromPeriodNsecs(11);
465 EXPECT_CALL(*mTimeStats, incrementJankyFrames(_)).Times(0);
466 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
467 int64_t surfaceFrameToken1 = -1;
468 int64_t sfToken1 = -1;
469
470 auto surfaceFrame1 =
471 mFrameTimeline->createSurfaceFrameForToken({surfaceFrameToken1, sInputEventId}, sPidOne,
472 sUidOne, sLayerIdOne, sLayerNameOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000473 sLayerNameOne, /*isBuffer*/ true);
Adithya Srinivasan7c4ac7a2021-03-08 23:48:03 +0000474 mFrameTimeline->setSfWakeUp(sfToken1, 52, refreshRate);
475 surfaceFrame1->setAcquireFenceTime(20);
476 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
477 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
478 presentFence1->signalForTest(70);
479
480 mFrameTimeline->setSfPresent(59, presentFence1);
481}
482
Alec Mouri9a29e672020-09-14 12:39:14 -0700483TEST_F(FrameTimelineTest, presentFenceSignaled_reportsLongSfCpu) {
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000484 Fps refreshRate = Fps::fromPeriodNsecs(11);
Alec Mouri9a29e672020-09-14 12:39:14 -0700485 EXPECT_CALL(*mTimeStats,
Alec Mouri363faf02021-01-29 16:34:55 -0800486 incrementJankyFrames(
487 TimeStats::JankyFramesInfo{refreshRate, std::nullopt, sUidOne,
488 sLayerNameOne,
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000489 JankType::SurfaceFlingerCpuDeadlineMissed, 2, 10,
Alec Mouri363faf02021-01-29 16:34:55 -0800490 0}));
Alec Mouri9a29e672020-09-14 12:39:14 -0700491 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000492 int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions({10, 20, 60});
493 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({52, 60, 60});
494
Alec Mouri9a29e672020-09-14 12:39:14 -0700495 auto surfaceFrame1 =
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000496 mFrameTimeline->createSurfaceFrameForToken({surfaceFrameToken1, sInputEventId}, sPidOne,
Alec Mouriadebf5c2021-01-05 12:57:36 -0800497 sUidOne, sLayerIdOne, sLayerNameOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000498 sLayerNameOne, /*isBuffer*/ true);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000499 mFrameTimeline->setSfWakeUp(sfToken1, 52, refreshRate);
500 surfaceFrame1->setAcquireFenceTime(20);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800501 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
502 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000503 presentFence1->signalForTest(70);
Alec Mouri9a29e672020-09-14 12:39:14 -0700504
Adithya Srinivasan82eef322021-04-10 00:06:04 +0000505 mFrameTimeline->setSfPresent(62, presentFence1);
Alec Mouri9a29e672020-09-14 12:39:14 -0700506}
507
508TEST_F(FrameTimelineTest, presentFenceSignaled_reportsDisplayMiss) {
Alec Mouri363faf02021-01-29 16:34:55 -0800509 Fps refreshRate = Fps::fromPeriodNsecs(30);
Alec Mouri9a29e672020-09-14 12:39:14 -0700510 EXPECT_CALL(*mTimeStats,
Alec Mouri363faf02021-01-29 16:34:55 -0800511 incrementJankyFrames(TimeStats::JankyFramesInfo{refreshRate, std::nullopt, sUidOne,
512 sLayerNameOne, JankType::DisplayHAL,
Adithya Srinivasan82eef322021-04-10 00:06:04 +0000513 -4, 0, 0}));
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800514
Alec Mouri9a29e672020-09-14 12:39:14 -0700515 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000516 int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions({10, 20, 60});
517 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({52, 60, 60});
518
Alec Mouri9a29e672020-09-14 12:39:14 -0700519 auto surfaceFrame1 =
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000520 mFrameTimeline->createSurfaceFrameForToken({surfaceFrameToken1, sInputEventId}, sPidOne,
Alec Mouriadebf5c2021-01-05 12:57:36 -0800521 sUidOne, sLayerIdOne, sLayerNameOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000522 sLayerNameOne, /*isBuffer*/ true);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000523 mFrameTimeline->setSfWakeUp(sfToken1, 52, refreshRate);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800524 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000525 surfaceFrame1->setAcquireFenceTime(20);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800526 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000527 presentFence1->signalForTest(90);
528 mFrameTimeline->setSfPresent(56, presentFence1);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800529 EXPECT_EQ(surfaceFrame1->getJankType(), JankType::DisplayHAL);
Alec Mouri9a29e672020-09-14 12:39:14 -0700530}
531
532TEST_F(FrameTimelineTest, presentFenceSignaled_reportsAppMiss) {
Alec Mouri363faf02021-01-29 16:34:55 -0800533 Fps refreshRate = Fps(11.0);
Alec Mouri9a29e672020-09-14 12:39:14 -0700534 EXPECT_CALL(*mTimeStats,
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000535 incrementJankyFrames(TimeStats::JankyFramesInfo{refreshRate, std::nullopt, sUidOne,
536 sLayerNameOne,
Adithya Srinivasan82eef322021-04-10 00:06:04 +0000537 JankType::AppDeadlineMissed, -4, 0,
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000538 25}));
Alec Mouri9a29e672020-09-14 12:39:14 -0700539 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000540 int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions({10, 20, 60});
541 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({82, 90, 90});
542
Alec Mouri9a29e672020-09-14 12:39:14 -0700543 auto surfaceFrame1 =
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000544 mFrameTimeline->createSurfaceFrameForToken({surfaceFrameToken1, sInputEventId}, sPidOne,
Alec Mouriadebf5c2021-01-05 12:57:36 -0800545 sUidOne, sLayerIdOne, sLayerNameOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000546 sLayerNameOne, /*isBuffer*/ true);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000547 surfaceFrame1->setAcquireFenceTime(45);
548 mFrameTimeline->setSfWakeUp(sfToken1, 52, refreshRate);
Alec Mouri9a29e672020-09-14 12:39:14 -0700549
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800550 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
551 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000552 presentFence1->signalForTest(90);
553 mFrameTimeline->setSfPresent(86, presentFence1);
Jorim Jaggi9c03b502020-11-24 23:51:31 +0100554
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800555 EXPECT_EQ(surfaceFrame1->getJankType(), JankType::AppDeadlineMissed);
Alec Mouri9a29e672020-09-14 12:39:14 -0700556}
557
Adithya Srinivasanead17162021-02-18 02:17:37 +0000558TEST_F(FrameTimelineTest, presentFenceSignaled_reportsSfScheduling) {
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000559 Fps refreshRate = Fps::fromPeriodNsecs(32);
Adithya Srinivasanead17162021-02-18 02:17:37 +0000560 EXPECT_CALL(*mTimeStats,
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000561 incrementJankyFrames(TimeStats::JankyFramesInfo{refreshRate, std::nullopt, sUidOne,
562 sLayerNameOne,
563 JankType::SurfaceFlingerScheduling,
Adithya Srinivasan82eef322021-04-10 00:06:04 +0000564 -4, 0, -10}));
Adithya Srinivasanead17162021-02-18 02:17:37 +0000565 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000566 int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions({40, 60, 92});
567 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({52, 60, 60});
568
Adithya Srinivasanead17162021-02-18 02:17:37 +0000569 auto surfaceFrame1 =
570 mFrameTimeline->createSurfaceFrameForToken({surfaceFrameToken1, sInputEventId}, sPidOne,
Alec Mouriadebf5c2021-01-05 12:57:36 -0800571 sUidOne, sLayerIdOne, sLayerNameOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000572 sLayerNameOne, /*isBuffer*/ true);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000573 surfaceFrame1->setAcquireFenceTime(50);
574 mFrameTimeline->setSfWakeUp(sfToken1, 52, refreshRate);
Adithya Srinivasanead17162021-02-18 02:17:37 +0000575
576 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
577 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000578 presentFence1->signalForTest(60);
579 mFrameTimeline->setSfPresent(56, presentFence1);
Adithya Srinivasanead17162021-02-18 02:17:37 +0000580
581 EXPECT_EQ(surfaceFrame1->getJankType(), JankType::SurfaceFlingerScheduling);
582}
583
584TEST_F(FrameTimelineTest, presentFenceSignaled_reportsSfPredictionError) {
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000585 Fps refreshRate = Fps::fromPeriodNsecs(16);
Adithya Srinivasanead17162021-02-18 02:17:37 +0000586 EXPECT_CALL(*mTimeStats,
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000587 incrementJankyFrames(TimeStats::JankyFramesInfo{refreshRate, std::nullopt, sUidOne,
588 sLayerNameOne,
Adithya Srinivasan82eef322021-04-10 00:06:04 +0000589 JankType::PredictionError, -4, 5,
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000590 0}));
Adithya Srinivasanead17162021-02-18 02:17:37 +0000591 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000592 int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions({30, 40, 60});
593 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({52, 60, 60});
594
Adithya Srinivasanead17162021-02-18 02:17:37 +0000595 auto surfaceFrame1 =
596 mFrameTimeline->createSurfaceFrameForToken({surfaceFrameToken1, sInputEventId}, sPidOne,
Alec Mouriadebf5c2021-01-05 12:57:36 -0800597 sUidOne, sLayerIdOne, sLayerNameOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000598 sLayerNameOne, /*isBuffer*/ true);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000599 surfaceFrame1->setAcquireFenceTime(40);
600 mFrameTimeline->setSfWakeUp(sfToken1, 52, refreshRate);
Adithya Srinivasanead17162021-02-18 02:17:37 +0000601
602 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
603 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000604 presentFence1->signalForTest(65);
605 mFrameTimeline->setSfPresent(56, presentFence1);
Adithya Srinivasanead17162021-02-18 02:17:37 +0000606
607 EXPECT_EQ(surfaceFrame1->getJankType(), JankType::PredictionError);
608}
609
610TEST_F(FrameTimelineTest, presentFenceSignaled_reportsAppBufferStuffing) {
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000611 Fps refreshRate = Fps::fromPeriodNsecs(32);
Adithya Srinivasanead17162021-02-18 02:17:37 +0000612 EXPECT_CALL(*mTimeStats,
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000613 incrementJankyFrames(TimeStats::JankyFramesInfo{refreshRate, std::nullopt, sUidOne,
614 sLayerNameOne,
Adithya Srinivasan82eef322021-04-10 00:06:04 +0000615 JankType::BufferStuffing, -4, 0,
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000616 0}));
Adithya Srinivasanead17162021-02-18 02:17:37 +0000617 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000618 int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions({30, 40, 58});
619 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({82, 90, 90});
620
Adithya Srinivasanead17162021-02-18 02:17:37 +0000621 auto surfaceFrame1 =
622 mFrameTimeline->createSurfaceFrameForToken({surfaceFrameToken1, sInputEventId}, sPidOne,
Alec Mouriadebf5c2021-01-05 12:57:36 -0800623 sUidOne, sLayerIdOne, sLayerNameOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000624 sLayerNameOne, /*isBuffer*/ true);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000625 surfaceFrame1->setAcquireFenceTime(40);
626 mFrameTimeline->setSfWakeUp(sfToken1, 82, refreshRate);
Adithya Srinivasanead17162021-02-18 02:17:37 +0000627
628 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented,
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000629 /*previousLatchTime*/ 56);
Adithya Srinivasanead17162021-02-18 02:17:37 +0000630 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000631 presentFence1->signalForTest(90);
632 mFrameTimeline->setSfPresent(86, presentFence1);
Adithya Srinivasanead17162021-02-18 02:17:37 +0000633
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000634 EXPECT_EQ(surfaceFrame1->getJankType(), JankType::BufferStuffing);
Adithya Srinivasanead17162021-02-18 02:17:37 +0000635}
636
Alec Mouri363faf02021-01-29 16:34:55 -0800637TEST_F(FrameTimelineTest, presentFenceSignaled_reportsAppMissWithRenderRate) {
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000638 Fps refreshRate = Fps::fromPeriodNsecs(11);
639 Fps renderRate = Fps::fromPeriodNsecs(30);
Alec Mouri363faf02021-01-29 16:34:55 -0800640 EXPECT_CALL(*mTimeStats,
641 incrementJankyFrames(
642 TimeStats::JankyFramesInfo{refreshRate, renderRate, sUidOne, sLayerNameOne,
Adithya Srinivasan82eef322021-04-10 00:06:04 +0000643 JankType::AppDeadlineMissed, -4, 0, 25}));
Alec Mouri363faf02021-01-29 16:34:55 -0800644 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000645 int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions({10, 20, 60});
646 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({82, 90, 90});
647
Alec Mouri363faf02021-01-29 16:34:55 -0800648 auto surfaceFrame1 =
649 mFrameTimeline->createSurfaceFrameForToken({surfaceFrameToken1, sInputEventId}, sPidOne,
Alec Mouriadebf5c2021-01-05 12:57:36 -0800650 sUidOne, sLayerIdOne, sLayerNameOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000651 sLayerNameOne, /*isBuffer*/ true);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000652 surfaceFrame1->setAcquireFenceTime(45);
653 mFrameTimeline->setSfWakeUp(sfToken1, 52, refreshRate);
Alec Mouri363faf02021-01-29 16:34:55 -0800654
655 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
656 surfaceFrame1->setRenderRate(renderRate);
657 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000658 presentFence1->signalForTest(90);
659 mFrameTimeline->setSfPresent(86, presentFence1);
Alec Mouri363faf02021-01-29 16:34:55 -0800660
661 EXPECT_EQ(surfaceFrame1->getJankType(), JankType::AppDeadlineMissed);
662}
663
Adithya Srinivasan115ac692021-03-06 01:21:30 +0000664TEST_F(FrameTimelineTest, presentFenceSignaled_displayFramePredictionExpiredPresentsSurfaceFrame) {
665 Fps refreshRate = Fps::fromPeriodNsecs(11);
666 Fps renderRate = Fps::fromPeriodNsecs(30);
667
668 EXPECT_CALL(*mTimeStats,
Adithya Srinivasan8a945502021-03-19 19:12:32 +0000669 incrementJankyFrames(
670 TimeStats::JankyFramesInfo{refreshRate, renderRate, sUidOne, sLayerNameOne,
671 JankType::Unknown | JankType::AppDeadlineMissed,
Adithya Srinivasande272452021-04-10 00:21:00 +0000672 0, 0, 25}));
Adithya Srinivasan115ac692021-03-06 01:21:30 +0000673 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
674 int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions({10, 20, 60});
675 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({82, 90, 90});
676
677 auto surfaceFrame1 =
678 mFrameTimeline->createSurfaceFrameForToken({surfaceFrameToken1, sInputEventId}, sPidOne,
679 sUidOne, sLayerIdOne, sLayerNameOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000680 sLayerNameOne, /*isBuffer*/ true);
Adithya Srinivasan115ac692021-03-06 01:21:30 +0000681 surfaceFrame1->setAcquireFenceTime(45);
682 // Trigger a prediction expiry
683 flushTokens(systemTime() + maxTokenRetentionTime);
684 mFrameTimeline->setSfWakeUp(sfToken1, 52, refreshRate);
685
686 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
687 surfaceFrame1->setRenderRate(renderRate);
688 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
689 presentFence1->signalForTest(90);
690 mFrameTimeline->setSfPresent(86, presentFence1);
691
692 auto displayFrame = getDisplayFrame(0);
693 EXPECT_EQ(displayFrame->getJankType(), JankType::Unknown);
694 EXPECT_EQ(displayFrame->getFrameStartMetadata(), FrameStartMetadata::UnknownStart);
695 EXPECT_EQ(displayFrame->getFrameReadyMetadata(), FrameReadyMetadata::UnknownFinish);
696 EXPECT_EQ(displayFrame->getFramePresentMetadata(), FramePresentMetadata::UnknownPresent);
697
698 EXPECT_EQ(surfaceFrame1->getActuals().presentTime, 90);
Adithya Srinivasan8a945502021-03-19 19:12:32 +0000699 EXPECT_EQ(surfaceFrame1->getJankType(), JankType::Unknown | JankType::AppDeadlineMissed);
Adithya Srinivasan115ac692021-03-06 01:21:30 +0000700}
701
Adithya Srinivasan01189672020-10-20 14:23:05 -0700702/*
703 * Tracing Tests
704 *
705 * Trace packets are flushed all the way only when the next packet is traced.
706 * For example: trace<Display/Surface>Frame() will create a TracePacket but not flush it. Only when
707 * another TracePacket is created, the previous one is guaranteed to be flushed. The following tests
708 * will have additional empty frames created for this reason.
709 */
710TEST_F(FrameTimelineTest, tracing_noPacketsSentWithoutTraceStart) {
711 auto tracingSession = getTracingSessionForTest();
712 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan01189672020-10-20 14:23:05 -0700713 int64_t token1 = mTokenManager->generateTokenForPredictions({10, 20, 30});
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000714 auto surfaceFrame1 =
715 mFrameTimeline->createSurfaceFrameForToken({token1, sInputEventId}, sPidOne, sUidOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000716 sLayerIdOne, sLayerNameOne, sLayerNameOne,
717 /*isBuffer*/ true);
Adithya Srinivasan01189672020-10-20 14:23:05 -0700718
719 // Set up the display frame
Alec Mouri7d436ec2021-01-27 20:40:50 -0800720 mFrameTimeline->setSfWakeUp(token1, 20, Fps::fromPeriodNsecs(11));
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800721 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Dropped);
722 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
Adithya Srinivasan01189672020-10-20 14:23:05 -0700723 mFrameTimeline->setSfPresent(25, presentFence1);
724 presentFence1->signalForTest(30);
725
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000726 addEmptyDisplayFrame();
Adithya Srinivasan01189672020-10-20 14:23:05 -0700727
728 auto packets = readFrameTimelinePacketsBlocking(tracingSession.get());
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000729 EXPECT_EQ(packets.size(), 0u);
Adithya Srinivasan01189672020-10-20 14:23:05 -0700730}
731
732TEST_F(FrameTimelineTest, tracing_sanityTest) {
733 auto tracingSession = getTracingSessionForTest();
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800734 // Layer specific increment
Alec Mouri363faf02021-01-29 16:34:55 -0800735 EXPECT_CALL(*mTimeStats, incrementJankyFrames(_));
Adithya Srinivasan01189672020-10-20 14:23:05 -0700736 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan01189672020-10-20 14:23:05 -0700737
738 tracingSession->StartBlocking();
739 int64_t token1 = mTokenManager->generateTokenForPredictions({10, 20, 30});
740 int64_t token2 = mTokenManager->generateTokenForPredictions({40, 50, 60});
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000741 auto surfaceFrame1 =
742 mFrameTimeline->createSurfaceFrameForToken({token1, sInputEventId}, sPidOne, sUidOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000743 sLayerIdOne, sLayerNameOne, sLayerNameOne,
744 /*isBuffer*/ true);
Adithya Srinivasan01189672020-10-20 14:23:05 -0700745
746 // Set up the display frame
Alec Mouri7d436ec2021-01-27 20:40:50 -0800747 mFrameTimeline->setSfWakeUp(token2, 20, Fps::fromPeriodNsecs(11));
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800748 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
749 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
Adithya Srinivasan01189672020-10-20 14:23:05 -0700750 mFrameTimeline->setSfPresent(25, presentFence1);
751 presentFence1->signalForTest(30);
752
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000753 addEmptyDisplayFrame();
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000754 flushTrace();
Adithya Srinivasan01189672020-10-20 14:23:05 -0700755 tracingSession->StopBlocking();
756
757 auto packets = readFrameTimelinePacketsBlocking(tracingSession.get());
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000758 // Display Frame 1 has 8 packets - 4 from DisplayFrame and 4 from SurfaceFrame.
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000759 EXPECT_EQ(packets.size(), 8u);
Adithya Srinivasan01189672020-10-20 14:23:05 -0700760}
761
762TEST_F(FrameTimelineTest, traceDisplayFrame_invalidTokenDoesNotEmitTracePacket) {
763 auto tracingSession = getTracingSessionForTest();
764 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan01189672020-10-20 14:23:05 -0700765
766 tracingSession->StartBlocking();
Adithya Srinivasan01189672020-10-20 14:23:05 -0700767
768 // Set up the display frame
Alec Mouri7d436ec2021-01-27 20:40:50 -0800769 mFrameTimeline->setSfWakeUp(-1, 20, Fps::fromPeriodNsecs(11));
Adithya Srinivasan01189672020-10-20 14:23:05 -0700770 mFrameTimeline->setSfPresent(25, presentFence1);
771 presentFence1->signalForTest(30);
772
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000773 addEmptyDisplayFrame();
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000774 flushTrace();
Adithya Srinivasan01189672020-10-20 14:23:05 -0700775 tracingSession->StopBlocking();
776
777 auto packets = readFrameTimelinePacketsBlocking(tracingSession.get());
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000778 EXPECT_EQ(packets.size(), 0u);
Adithya Srinivasan01189672020-10-20 14:23:05 -0700779}
780
781TEST_F(FrameTimelineTest, traceSurfaceFrame_invalidTokenDoesNotEmitTracePacket) {
782 auto tracingSession = getTracingSessionForTest();
783 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan01189672020-10-20 14:23:05 -0700784
785 tracingSession->StartBlocking();
786 int64_t token1 = mTokenManager->generateTokenForPredictions({10, 20, 30});
Alec Mouriadebf5c2021-01-05 12:57:36 -0800787 auto surfaceFrame1 =
788 mFrameTimeline->createSurfaceFrameForToken({}, sPidOne, sUidOne, sLayerIdOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000789 sLayerNameOne, sLayerNameOne,
790 /*isBuffer*/ true);
Adithya Srinivasan01189672020-10-20 14:23:05 -0700791
792 // Set up the display frame
Alec Mouri7d436ec2021-01-27 20:40:50 -0800793 mFrameTimeline->setSfWakeUp(token1, 20, Fps::fromPeriodNsecs(11));
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800794 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Dropped);
795 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
Adithya Srinivasan01189672020-10-20 14:23:05 -0700796 mFrameTimeline->setSfPresent(25, presentFence1);
797 presentFence1->signalForTest(30);
798
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000799 addEmptyDisplayFrame();
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000800 flushTrace();
Adithya Srinivasan01189672020-10-20 14:23:05 -0700801 tracingSession->StopBlocking();
802
803 auto packets = readFrameTimelinePacketsBlocking(tracingSession.get());
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000804 // Display Frame 1 has 4 packets (SurfaceFrame shouldn't be traced since it has an invalid
805 // token).
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000806 EXPECT_EQ(packets.size(), 4u);
Adithya Srinivasan01189672020-10-20 14:23:05 -0700807}
808
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000809ProtoExpectedDisplayFrameStart createProtoExpectedDisplayFrameStart(int64_t cookie, int64_t token,
810 pid_t pid) {
811 ProtoExpectedDisplayFrameStart proto;
812 proto.set_cookie(cookie);
813 proto.set_token(token);
814 proto.set_pid(pid);
815 return proto;
816}
817
818ProtoActualDisplayFrameStart createProtoActualDisplayFrameStart(
819 int64_t cookie, int64_t token, pid_t pid, ProtoPresentType presentType, bool onTimeFinish,
Adithya Srinivasan78e58af2021-02-25 00:08:08 +0000820 bool gpuComposition, ProtoJankType jankType, ProtoPredictionType predictionType) {
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000821 ProtoActualDisplayFrameStart proto;
822 proto.set_cookie(cookie);
823 proto.set_token(token);
824 proto.set_pid(pid);
825 proto.set_present_type(presentType);
826 proto.set_on_time_finish(onTimeFinish);
827 proto.set_gpu_composition(gpuComposition);
828 proto.set_jank_type(jankType);
Adithya Srinivasan78e58af2021-02-25 00:08:08 +0000829 proto.set_prediction_type(predictionType);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000830 return proto;
831}
832
833ProtoExpectedSurfaceFrameStart createProtoExpectedSurfaceFrameStart(int64_t cookie, int64_t token,
834 int64_t displayFrameToken,
835 pid_t pid,
836 std::string layerName) {
837 ProtoExpectedSurfaceFrameStart proto;
838 proto.set_cookie(cookie);
839 proto.set_token(token);
840 proto.set_display_frame_token(displayFrameToken);
841 proto.set_pid(pid);
842 proto.set_layer_name(layerName);
843 return proto;
844}
845
846ProtoActualSurfaceFrameStart createProtoActualSurfaceFrameStart(
847 int64_t cookie, int64_t token, int64_t displayFrameToken, pid_t pid, std::string layerName,
848 ProtoPresentType presentType, bool onTimeFinish, bool gpuComposition,
Adithya Srinivasan78e58af2021-02-25 00:08:08 +0000849 ProtoJankType jankType, ProtoPredictionType predictionType) {
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000850 ProtoActualSurfaceFrameStart proto;
851 proto.set_cookie(cookie);
852 proto.set_token(token);
853 proto.set_display_frame_token(displayFrameToken);
854 proto.set_pid(pid);
855 proto.set_layer_name(layerName);
856 proto.set_present_type(presentType);
857 proto.set_on_time_finish(onTimeFinish);
858 proto.set_gpu_composition(gpuComposition);
859 proto.set_jank_type(jankType);
Adithya Srinivasan78e58af2021-02-25 00:08:08 +0000860 proto.set_prediction_type(predictionType);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000861 return proto;
862}
863
864ProtoFrameEnd createProtoFrameEnd(int64_t cookie) {
865 ProtoFrameEnd proto;
866 proto.set_cookie(cookie);
867 return proto;
868}
869
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000870void validateTraceEvent(const ProtoExpectedDisplayFrameStart& received,
871 const ProtoExpectedDisplayFrameStart& source) {
872 ASSERT_TRUE(received.has_cookie());
873 EXPECT_EQ(received.cookie(), source.cookie());
874
Adithya Srinivasan01189672020-10-20 14:23:05 -0700875 ASSERT_TRUE(received.has_token());
876 EXPECT_EQ(received.token(), source.token());
877
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000878 ASSERT_TRUE(received.has_pid());
879 EXPECT_EQ(received.pid(), source.pid());
880}
881
882void validateTraceEvent(const ProtoActualDisplayFrameStart& received,
883 const ProtoActualDisplayFrameStart& source) {
884 ASSERT_TRUE(received.has_cookie());
885 EXPECT_EQ(received.cookie(), source.cookie());
886
887 ASSERT_TRUE(received.has_token());
888 EXPECT_EQ(received.token(), source.token());
889
890 ASSERT_TRUE(received.has_pid());
891 EXPECT_EQ(received.pid(), source.pid());
892
Adithya Srinivasan01189672020-10-20 14:23:05 -0700893 ASSERT_TRUE(received.has_present_type());
894 EXPECT_EQ(received.present_type(), source.present_type());
895 ASSERT_TRUE(received.has_on_time_finish());
896 EXPECT_EQ(received.on_time_finish(), source.on_time_finish());
897 ASSERT_TRUE(received.has_gpu_composition());
898 EXPECT_EQ(received.gpu_composition(), source.gpu_composition());
899 ASSERT_TRUE(received.has_jank_type());
900 EXPECT_EQ(received.jank_type(), source.jank_type());
Adithya Srinivasan78e58af2021-02-25 00:08:08 +0000901 ASSERT_TRUE(received.has_prediction_type());
902 EXPECT_EQ(received.prediction_type(), source.prediction_type());
Adithya Srinivasan01189672020-10-20 14:23:05 -0700903}
904
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000905void validateTraceEvent(const ProtoExpectedSurfaceFrameStart& received,
906 const ProtoExpectedSurfaceFrameStart& source) {
907 ASSERT_TRUE(received.has_cookie());
908 EXPECT_EQ(received.cookie(), source.cookie());
909
Adithya Srinivasan01189672020-10-20 14:23:05 -0700910 ASSERT_TRUE(received.has_token());
911 EXPECT_EQ(received.token(), source.token());
912
913 ASSERT_TRUE(received.has_display_frame_token());
914 EXPECT_EQ(received.display_frame_token(), source.display_frame_token());
915
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000916 ASSERT_TRUE(received.has_pid());
917 EXPECT_EQ(received.pid(), source.pid());
918
919 ASSERT_TRUE(received.has_layer_name());
920 EXPECT_EQ(received.layer_name(), source.layer_name());
921}
922
923void validateTraceEvent(const ProtoActualSurfaceFrameStart& received,
924 const ProtoActualSurfaceFrameStart& source) {
925 ASSERT_TRUE(received.has_cookie());
926 EXPECT_EQ(received.cookie(), source.cookie());
927
928 ASSERT_TRUE(received.has_token());
929 EXPECT_EQ(received.token(), source.token());
930
931 ASSERT_TRUE(received.has_display_frame_token());
932 EXPECT_EQ(received.display_frame_token(), source.display_frame_token());
933
934 ASSERT_TRUE(received.has_pid());
935 EXPECT_EQ(received.pid(), source.pid());
936
937 ASSERT_TRUE(received.has_layer_name());
938 EXPECT_EQ(received.layer_name(), source.layer_name());
939
Adithya Srinivasan01189672020-10-20 14:23:05 -0700940 ASSERT_TRUE(received.has_present_type());
941 EXPECT_EQ(received.present_type(), source.present_type());
942 ASSERT_TRUE(received.has_on_time_finish());
943 EXPECT_EQ(received.on_time_finish(), source.on_time_finish());
944 ASSERT_TRUE(received.has_gpu_composition());
945 EXPECT_EQ(received.gpu_composition(), source.gpu_composition());
946 ASSERT_TRUE(received.has_jank_type());
947 EXPECT_EQ(received.jank_type(), source.jank_type());
Adithya Srinivasan78e58af2021-02-25 00:08:08 +0000948 ASSERT_TRUE(received.has_prediction_type());
949 EXPECT_EQ(received.prediction_type(), source.prediction_type());
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000950}
Adithya Srinivasan01189672020-10-20 14:23:05 -0700951
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000952void validateTraceEvent(const ProtoFrameEnd& received, const ProtoFrameEnd& source) {
953 ASSERT_TRUE(received.has_cookie());
954 EXPECT_EQ(received.cookie(), source.cookie());
Adithya Srinivasan01189672020-10-20 14:23:05 -0700955}
956
957TEST_F(FrameTimelineTest, traceDisplayFrame_emitsValidTracePacket) {
958 auto tracingSession = getTracingSessionForTest();
959 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan01189672020-10-20 14:23:05 -0700960
961 tracingSession->StartBlocking();
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000962 int64_t displayFrameToken1 = mTokenManager->generateTokenForPredictions({10, 30, 30});
Adithya Srinivasan01189672020-10-20 14:23:05 -0700963
964 // Set up the display frame
Alec Mouri7d436ec2021-01-27 20:40:50 -0800965 mFrameTimeline->setSfWakeUp(displayFrameToken1, 20, Fps::fromPeriodNsecs(11));
Adithya Srinivasan01189672020-10-20 14:23:05 -0700966 mFrameTimeline->setSfPresent(26, presentFence1);
967 presentFence1->signalForTest(31);
968
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000969 int64_t traceCookie = snoopCurrentTraceCookie();
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000970 auto protoExpectedDisplayFrameStart =
971 createProtoExpectedDisplayFrameStart(traceCookie + 1, displayFrameToken1,
972 kSurfaceFlingerPid);
973 auto protoExpectedDisplayFrameEnd = createProtoFrameEnd(traceCookie + 1);
974 auto protoActualDisplayFrameStart =
975 createProtoActualDisplayFrameStart(traceCookie + 2, displayFrameToken1,
976 kSurfaceFlingerPid,
977 FrameTimelineEvent::PRESENT_ON_TIME, true, false,
Adithya Srinivasan78e58af2021-02-25 00:08:08 +0000978 FrameTimelineEvent::JANK_NONE,
979 FrameTimelineEvent::PREDICTION_VALID);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000980 auto protoActualDisplayFrameEnd = createProtoFrameEnd(traceCookie + 2);
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000981
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000982 addEmptyDisplayFrame();
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000983 flushTrace();
Adithya Srinivasan01189672020-10-20 14:23:05 -0700984 tracingSession->StopBlocking();
985
986 auto packets = readFrameTimelinePacketsBlocking(tracingSession.get());
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000987 EXPECT_EQ(packets.size(), 4u);
Adithya Srinivasan01189672020-10-20 14:23:05 -0700988
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000989 // Packet - 0 : ExpectedDisplayFrameStart
990 const auto& packet0 = packets[0];
991 ASSERT_TRUE(packet0.has_timestamp());
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000992 EXPECT_EQ(packet0.timestamp(), 10u);
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000993 ASSERT_TRUE(packet0.has_frame_timeline_event());
Adithya Srinivasan01189672020-10-20 14:23:05 -0700994
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000995 const auto& event0 = packet0.frame_timeline_event();
996 ASSERT_TRUE(event0.has_expected_display_frame_start());
997 const auto& expectedDisplayFrameStart = event0.expected_display_frame_start();
998 validateTraceEvent(expectedDisplayFrameStart, protoExpectedDisplayFrameStart);
999
1000 // Packet - 1 : FrameEnd (ExpectedDisplayFrame)
1001 const auto& packet1 = packets[1];
1002 ASSERT_TRUE(packet1.has_timestamp());
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001003 EXPECT_EQ(packet1.timestamp(), 30u);
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001004 ASSERT_TRUE(packet1.has_frame_timeline_event());
1005
1006 const auto& event1 = packet1.frame_timeline_event();
1007 ASSERT_TRUE(event1.has_frame_end());
1008 const auto& expectedDisplayFrameEnd = event1.frame_end();
1009 validateTraceEvent(expectedDisplayFrameEnd, protoExpectedDisplayFrameEnd);
1010
1011 // Packet - 2 : ActualDisplayFrameStart
1012 const auto& packet2 = packets[2];
1013 ASSERT_TRUE(packet2.has_timestamp());
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001014 EXPECT_EQ(packet2.timestamp(), 20u);
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001015 ASSERT_TRUE(packet2.has_frame_timeline_event());
1016
1017 const auto& event2 = packet2.frame_timeline_event();
1018 ASSERT_TRUE(event2.has_actual_display_frame_start());
1019 const auto& actualDisplayFrameStart = event2.actual_display_frame_start();
1020 validateTraceEvent(actualDisplayFrameStart, protoActualDisplayFrameStart);
1021
1022 // Packet - 3 : FrameEnd (ActualDisplayFrame)
1023 const auto& packet3 = packets[3];
1024 ASSERT_TRUE(packet3.has_timestamp());
Adithya Srinivasan1a971632021-02-26 23:10:29 +00001025 EXPECT_EQ(packet3.timestamp(), 31u);
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001026 ASSERT_TRUE(packet3.has_frame_timeline_event());
1027
1028 const auto& event3 = packet3.frame_timeline_event();
1029 ASSERT_TRUE(event3.has_frame_end());
1030 const auto& actualDisplayFrameEnd = event3.frame_end();
1031 validateTraceEvent(actualDisplayFrameEnd, protoActualDisplayFrameEnd);
Adithya Srinivasan01189672020-10-20 14:23:05 -07001032}
1033
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001034TEST_F(FrameTimelineTest, traceDisplayFrame_predictionExpiredDoesNotTraceExpectedTimeline) {
1035 auto tracingSession = getTracingSessionForTest();
1036 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
1037
1038 tracingSession->StartBlocking();
1039 int64_t displayFrameToken1 = mTokenManager->generateTokenForPredictions({10, 25, 30});
1040 // Flush the token so that it would expire
1041 flushTokens(systemTime() + maxTokenRetentionTime);
1042
1043 // Set up the display frame
1044 mFrameTimeline->setSfWakeUp(displayFrameToken1, 20, Fps::fromPeriodNsecs(11));
1045 mFrameTimeline->setSfPresent(26, presentFence1);
1046 presentFence1->signalForTest(31);
1047
1048 int64_t traceCookie = snoopCurrentTraceCookie();
1049
1050 auto protoActualDisplayFrameStart =
1051 createProtoActualDisplayFrameStart(traceCookie + 1, displayFrameToken1,
1052 kSurfaceFlingerPid,
1053 FrameTimelineEvent::PRESENT_UNSPECIFIED, false,
Adithya Srinivasan78e58af2021-02-25 00:08:08 +00001054 false, FrameTimelineEvent::JANK_UNKNOWN,
1055 FrameTimelineEvent::PREDICTION_EXPIRED);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001056 auto protoActualDisplayFrameEnd = createProtoFrameEnd(traceCookie + 1);
1057
1058 addEmptyDisplayFrame();
1059 flushTrace();
1060 tracingSession->StopBlocking();
1061
1062 auto packets = readFrameTimelinePacketsBlocking(tracingSession.get());
1063 // Only actual timeline packets should be in the trace
1064 EXPECT_EQ(packets.size(), 2u);
1065
1066 // Packet - 0 : ActualDisplayFrameStart
1067 const auto& packet0 = packets[0];
1068 ASSERT_TRUE(packet0.has_timestamp());
1069 EXPECT_EQ(packet0.timestamp(), 20u);
1070 ASSERT_TRUE(packet0.has_frame_timeline_event());
1071
1072 const auto& event0 = packet0.frame_timeline_event();
1073 ASSERT_TRUE(event0.has_actual_display_frame_start());
1074 const auto& actualDisplayFrameStart = event0.actual_display_frame_start();
1075 validateTraceEvent(actualDisplayFrameStart, protoActualDisplayFrameStart);
1076
1077 // Packet - 1 : FrameEnd (ActualDisplayFrame)
1078 const auto& packet1 = packets[1];
1079 ASSERT_TRUE(packet1.has_timestamp());
Adithya Srinivasan1a971632021-02-26 23:10:29 +00001080 EXPECT_EQ(packet1.timestamp(), 31u);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001081 ASSERT_TRUE(packet1.has_frame_timeline_event());
1082
1083 const auto& event1 = packet1.frame_timeline_event();
1084 ASSERT_TRUE(event1.has_frame_end());
1085 const auto& actualDisplayFrameEnd = event1.frame_end();
1086 validateTraceEvent(actualDisplayFrameEnd, protoActualDisplayFrameEnd);
1087}
1088
Adithya Srinivasan01189672020-10-20 14:23:05 -07001089TEST_F(FrameTimelineTest, traceSurfaceFrame_emitsValidTracePacket) {
1090 auto tracingSession = getTracingSessionForTest();
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001091 // Layer specific increment
Alec Mouri363faf02021-01-29 16:34:55 -08001092 EXPECT_CALL(*mTimeStats, incrementJankyFrames(_));
Adithya Srinivasan01189672020-10-20 14:23:05 -07001093 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
1094 auto presentFence2 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
1095
1096 tracingSession->StartBlocking();
1097 int64_t surfaceFrameToken = mTokenManager->generateTokenForPredictions({10, 25, 40});
1098 int64_t displayFrameToken1 = mTokenManager->generateTokenForPredictions({30, 35, 40});
Adithya Srinivasan01189672020-10-20 14:23:05 -07001099
1100 auto surfaceFrame1 =
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001101 mFrameTimeline->createSurfaceFrameForToken({surfaceFrameToken, sInputEventId}, sPidOne,
Alec Mouriadebf5c2021-01-05 12:57:36 -08001102 sUidOne, sLayerIdOne, sLayerNameOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +00001103 sLayerNameOne, /*isBuffer*/ true);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001104 auto surfaceFrame2 =
1105 mFrameTimeline->createSurfaceFrameForToken({surfaceFrameToken, sInputEventId}, sPidOne,
Alec Mouriadebf5c2021-01-05 12:57:36 -08001106 sUidOne, sLayerIdOne, sLayerNameOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +00001107 sLayerNameOne, /*isBuffer*/ true);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001108 surfaceFrame1->setActualQueueTime(10);
1109 surfaceFrame1->setDropTime(15);
1110
1111 surfaceFrame2->setActualQueueTime(15);
1112 surfaceFrame2->setAcquireFenceTime(20);
Adithya Srinivasan01189672020-10-20 14:23:05 -07001113
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001114 // First 2 cookies will be used by the DisplayFrame
1115 int64_t traceCookie = snoopCurrentTraceCookie() + 2;
1116
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001117 auto protoDroppedSurfaceFrameExpectedStart =
1118 createProtoExpectedSurfaceFrameStart(traceCookie + 1, surfaceFrameToken,
1119 displayFrameToken1, sPidOne, sLayerNameOne);
1120 auto protoDroppedSurfaceFrameExpectedEnd = createProtoFrameEnd(traceCookie + 1);
1121 auto protoDroppedSurfaceFrameActualStart =
1122 createProtoActualSurfaceFrameStart(traceCookie + 2, surfaceFrameToken,
1123 displayFrameToken1, sPidOne, sLayerNameOne,
1124 FrameTimelineEvent::PRESENT_DROPPED, false, false,
Adithya Srinivasan78e58af2021-02-25 00:08:08 +00001125 FrameTimelineEvent::JANK_NONE,
1126 FrameTimelineEvent::PREDICTION_VALID);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001127 auto protoDroppedSurfaceFrameActualEnd = createProtoFrameEnd(traceCookie + 2);
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001128
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001129 auto protoPresentedSurfaceFrameExpectedStart =
1130 createProtoExpectedSurfaceFrameStart(traceCookie + 3, surfaceFrameToken,
1131 displayFrameToken1, sPidOne, sLayerNameOne);
1132 auto protoPresentedSurfaceFrameExpectedEnd = createProtoFrameEnd(traceCookie + 3);
1133 auto protoPresentedSurfaceFrameActualStart =
1134 createProtoActualSurfaceFrameStart(traceCookie + 4, surfaceFrameToken,
1135 displayFrameToken1, sPidOne, sLayerNameOne,
1136 FrameTimelineEvent::PRESENT_ON_TIME, true, false,
Adithya Srinivasan78e58af2021-02-25 00:08:08 +00001137 FrameTimelineEvent::JANK_NONE,
1138 FrameTimelineEvent::PREDICTION_VALID);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001139 auto protoPresentedSurfaceFrameActualEnd = createProtoFrameEnd(traceCookie + 4);
Adithya Srinivasan01189672020-10-20 14:23:05 -07001140
1141 // Set up the display frame
Alec Mouri7d436ec2021-01-27 20:40:50 -08001142 mFrameTimeline->setSfWakeUp(displayFrameToken1, 20, Fps::fromPeriodNsecs(11));
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001143 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Dropped);
1144 surfaceFrame2->setPresentState(SurfaceFrame::PresentState::Presented);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001145 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001146 mFrameTimeline->addSurfaceFrame(surfaceFrame2);
Adithya Srinivasan01189672020-10-20 14:23:05 -07001147 mFrameTimeline->setSfPresent(26, presentFence1);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001148 presentFence1->signalForTest(40);
Adithya Srinivasan01189672020-10-20 14:23:05 -07001149
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001150 addEmptyDisplayFrame();
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001151 flushTrace();
Adithya Srinivasan01189672020-10-20 14:23:05 -07001152 tracingSession->StopBlocking();
1153
1154 auto packets = readFrameTimelinePacketsBlocking(tracingSession.get());
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001155 // 4 DisplayFrame + 4 DroppedSurfaceFrame + 4 PresentedSurfaceFrame
1156 EXPECT_EQ(packets.size(), 12u);
Adithya Srinivasan01189672020-10-20 14:23:05 -07001157
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001158 // Packet - 4 : ExpectedSurfaceFrameStart1
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001159 const auto& packet4 = packets[4];
1160 ASSERT_TRUE(packet4.has_timestamp());
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001161 EXPECT_EQ(packet4.timestamp(), 10u);
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001162 ASSERT_TRUE(packet4.has_frame_timeline_event());
Adithya Srinivasan01189672020-10-20 14:23:05 -07001163
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001164 const auto& event4 = packet4.frame_timeline_event();
1165 ASSERT_TRUE(event4.has_expected_surface_frame_start());
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001166 const auto& expectedSurfaceFrameStart1 = event4.expected_surface_frame_start();
1167 validateTraceEvent(expectedSurfaceFrameStart1, protoDroppedSurfaceFrameExpectedStart);
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001168
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001169 // Packet - 5 : FrameEnd (ExpectedSurfaceFrame1)
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001170 const auto& packet5 = packets[5];
1171 ASSERT_TRUE(packet5.has_timestamp());
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001172 EXPECT_EQ(packet5.timestamp(), 25u);
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001173 ASSERT_TRUE(packet5.has_frame_timeline_event());
1174
1175 const auto& event5 = packet5.frame_timeline_event();
1176 ASSERT_TRUE(event5.has_frame_end());
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001177 const auto& expectedSurfaceFrameEnd1 = event5.frame_end();
1178 validateTraceEvent(expectedSurfaceFrameEnd1, protoDroppedSurfaceFrameExpectedEnd);
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001179
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001180 // Packet - 6 : ActualSurfaceFrameStart1
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001181 const auto& packet6 = packets[6];
1182 ASSERT_TRUE(packet6.has_timestamp());
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001183 EXPECT_EQ(packet6.timestamp(), 10u);
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001184 ASSERT_TRUE(packet6.has_frame_timeline_event());
1185
1186 const auto& event6 = packet6.frame_timeline_event();
1187 ASSERT_TRUE(event6.has_actual_surface_frame_start());
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001188 const auto& actualSurfaceFrameStart1 = event6.actual_surface_frame_start();
1189 validateTraceEvent(actualSurfaceFrameStart1, protoDroppedSurfaceFrameActualStart);
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001190
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001191 // Packet - 7 : FrameEnd (ActualSurfaceFrame1)
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001192 const auto& packet7 = packets[7];
1193 ASSERT_TRUE(packet7.has_timestamp());
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001194 EXPECT_EQ(packet7.timestamp(), 15u);
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001195 ASSERT_TRUE(packet7.has_frame_timeline_event());
1196
1197 const auto& event7 = packet7.frame_timeline_event();
1198 ASSERT_TRUE(event7.has_frame_end());
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001199 const auto& actualSurfaceFrameEnd1 = event7.frame_end();
1200 validateTraceEvent(actualSurfaceFrameEnd1, protoDroppedSurfaceFrameActualEnd);
1201
1202 // Packet - 8 : ExpectedSurfaceFrameStart2
1203 const auto& packet8 = packets[8];
1204 ASSERT_TRUE(packet8.has_timestamp());
1205 EXPECT_EQ(packet8.timestamp(), 10u);
1206 ASSERT_TRUE(packet8.has_frame_timeline_event());
1207
1208 const auto& event8 = packet8.frame_timeline_event();
1209 ASSERT_TRUE(event8.has_expected_surface_frame_start());
1210 const auto& expectedSurfaceFrameStart2 = event8.expected_surface_frame_start();
1211 validateTraceEvent(expectedSurfaceFrameStart2, protoPresentedSurfaceFrameExpectedStart);
1212
1213 // Packet - 9 : FrameEnd (ExpectedSurfaceFrame2)
1214 const auto& packet9 = packets[9];
1215 ASSERT_TRUE(packet9.has_timestamp());
1216 EXPECT_EQ(packet9.timestamp(), 25u);
1217 ASSERT_TRUE(packet9.has_frame_timeline_event());
1218
1219 const auto& event9 = packet9.frame_timeline_event();
1220 ASSERT_TRUE(event9.has_frame_end());
1221 const auto& expectedSurfaceFrameEnd2 = event9.frame_end();
1222 validateTraceEvent(expectedSurfaceFrameEnd2, protoPresentedSurfaceFrameExpectedEnd);
1223
1224 // Packet - 10 : ActualSurfaceFrameStart2
1225 const auto& packet10 = packets[10];
1226 ASSERT_TRUE(packet10.has_timestamp());
1227 EXPECT_EQ(packet10.timestamp(), 10u);
1228 ASSERT_TRUE(packet10.has_frame_timeline_event());
1229
1230 const auto& event10 = packet10.frame_timeline_event();
1231 ASSERT_TRUE(event10.has_actual_surface_frame_start());
1232 const auto& actualSurfaceFrameStart2 = event10.actual_surface_frame_start();
1233 validateTraceEvent(actualSurfaceFrameStart2, protoPresentedSurfaceFrameActualStart);
1234
1235 // Packet - 11 : FrameEnd (ActualSurfaceFrame2)
1236 const auto& packet11 = packets[11];
1237 ASSERT_TRUE(packet11.has_timestamp());
1238 EXPECT_EQ(packet11.timestamp(), 20u);
1239 ASSERT_TRUE(packet11.has_frame_timeline_event());
1240
1241 const auto& event11 = packet11.frame_timeline_event();
1242 ASSERT_TRUE(event11.has_frame_end());
1243 const auto& actualSurfaceFrameEnd2 = event11.frame_end();
1244 validateTraceEvent(actualSurfaceFrameEnd2, protoPresentedSurfaceFrameActualEnd);
1245}
1246
1247TEST_F(FrameTimelineTest, traceSurfaceFrame_predictionExpiredDoesNotTraceExpectedTimeline) {
1248 auto tracingSession = getTracingSessionForTest();
1249 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
1250
1251 tracingSession->StartBlocking();
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001252 constexpr nsecs_t appStartTime = std::chrono::nanoseconds(10ms).count();
1253 constexpr nsecs_t appEndTime = std::chrono::nanoseconds(20ms).count();
1254 constexpr nsecs_t appPresentTime = std::chrono::nanoseconds(30ms).count();
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001255 int64_t surfaceFrameToken =
1256 mTokenManager->generateTokenForPredictions({appStartTime, appEndTime, appPresentTime});
1257
1258 // Flush the token so that it would expire
1259 flushTokens(systemTime() + maxTokenRetentionTime);
1260 auto surfaceFrame1 =
1261 mFrameTimeline->createSurfaceFrameForToken({surfaceFrameToken, /*inputEventId*/ 0},
Alec Mouriadebf5c2021-01-05 12:57:36 -08001262 sPidOne, sUidOne, sLayerIdOne, sLayerNameOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +00001263 sLayerNameOne, /*isBuffer*/ true);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001264 surfaceFrame1->setActualQueueTime(appEndTime);
1265 surfaceFrame1->setAcquireFenceTime(appEndTime);
1266
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001267 constexpr nsecs_t sfStartTime = std::chrono::nanoseconds(20ms).count();
1268 constexpr nsecs_t sfEndTime = std::chrono::nanoseconds(30ms).count();
1269 constexpr nsecs_t sfPresentTime = std::chrono::nanoseconds(30ms).count();
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001270 int64_t displayFrameToken =
1271 mTokenManager->generateTokenForPredictions({sfStartTime, sfEndTime, sfPresentTime});
1272
1273 // First 2 cookies will be used by the DisplayFrame
1274 int64_t traceCookie = snoopCurrentTraceCookie() + 2;
1275
1276 auto protoActualSurfaceFrameStart =
1277 createProtoActualSurfaceFrameStart(traceCookie + 1, surfaceFrameToken,
1278 displayFrameToken, sPidOne, sLayerNameOne,
1279 FrameTimelineEvent::PRESENT_UNSPECIFIED, false,
Adithya Srinivasan78e58af2021-02-25 00:08:08 +00001280 false, FrameTimelineEvent::JANK_UNKNOWN,
1281 FrameTimelineEvent::PREDICTION_EXPIRED);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001282 auto protoActualSurfaceFrameEnd = createProtoFrameEnd(traceCookie + 1);
1283
1284 // Set up the display frame
1285 mFrameTimeline->setSfWakeUp(displayFrameToken, sfStartTime, Fps::fromPeriodNsecs(11));
1286 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
1287 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
1288 mFrameTimeline->setSfPresent(sfEndTime, presentFence1);
1289 presentFence1->signalForTest(sfPresentTime);
1290
1291 addEmptyDisplayFrame();
1292 flushTrace();
1293 tracingSession->StopBlocking();
1294
1295 auto packets = readFrameTimelinePacketsBlocking(tracingSession.get());
1296 // Display Frame 4 packets + SurfaceFrame 2 packets
1297 ASSERT_EQ(packets.size(), 6u);
1298
1299 // Packet - 4 : ActualSurfaceFrameStart
1300 const auto& packet4 = packets[4];
1301 ASSERT_TRUE(packet4.has_timestamp());
1302 EXPECT_EQ(packet4.timestamp(),
1303 static_cast<uint64_t>(appEndTime - SurfaceFrame::kPredictionExpiredStartTimeDelta));
1304 ASSERT_TRUE(packet4.has_frame_timeline_event());
1305
1306 const auto& event4 = packet4.frame_timeline_event();
1307 ASSERT_TRUE(event4.has_actual_surface_frame_start());
1308 const auto& actualSurfaceFrameStart = event4.actual_surface_frame_start();
1309 validateTraceEvent(actualSurfaceFrameStart, protoActualSurfaceFrameStart);
1310
1311 // Packet - 5 : FrameEnd (ActualSurfaceFrame)
1312 const auto& packet5 = packets[5];
1313 ASSERT_TRUE(packet5.has_timestamp());
1314 EXPECT_EQ(packet5.timestamp(), static_cast<uint64_t>(appEndTime));
1315 ASSERT_TRUE(packet5.has_frame_timeline_event());
1316
1317 const auto& event5 = packet5.frame_timeline_event();
1318 ASSERT_TRUE(event5.has_frame_end());
1319 const auto& actualSurfaceFrameEnd = event5.frame_end();
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001320 validateTraceEvent(actualSurfaceFrameEnd, protoActualSurfaceFrameEnd);
Adithya Srinivasan01189672020-10-20 14:23:05 -07001321}
1322
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001323// Tests for Jank classification
1324TEST_F(FrameTimelineTest, jankClassification_presentOnTimeDoesNotClassify) {
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001325 // Layer specific increment
Alec Mouri363faf02021-01-29 16:34:55 -08001326 EXPECT_CALL(*mTimeStats, incrementJankyFrames(_));
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001327 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
1328 int64_t surfaceFrameToken = mTokenManager->generateTokenForPredictions({10, 20, 30});
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001329 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({22, 30, 30});
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001330 auto surfaceFrame =
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001331 mFrameTimeline->createSurfaceFrameForToken({surfaceFrameToken, sInputEventId}, sPidOne,
Alec Mouriadebf5c2021-01-05 12:57:36 -08001332 sUidOne, sLayerIdOne, sLayerNameOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +00001333 sLayerNameOne, /*isBuffer*/ true);
Alec Mouri7d436ec2021-01-27 20:40:50 -08001334 mFrameTimeline->setSfWakeUp(sfToken1, 22, Fps::fromPeriodNsecs(11));
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001335 surfaceFrame->setPresentState(SurfaceFrame::PresentState::Presented);
1336 mFrameTimeline->addSurfaceFrame(surfaceFrame);
1337 mFrameTimeline->setSfPresent(26, presentFence1);
1338 auto displayFrame = getDisplayFrame(0);
1339 auto& presentedSurfaceFrame = getSurfaceFrame(0, 0);
1340 presentFence1->signalForTest(29);
1341
1342 // Fences haven't been flushed yet, so it should be 0
1343 EXPECT_EQ(displayFrame->getActuals().presentTime, 0);
1344 EXPECT_EQ(presentedSurfaceFrame.getActuals().presentTime, 0);
1345
1346 addEmptyDisplayFrame();
1347 displayFrame = getDisplayFrame(0);
1348
1349 // Fences have flushed, so the present timestamps should be updated
1350 EXPECT_EQ(displayFrame->getActuals().presentTime, 29);
1351 EXPECT_EQ(presentedSurfaceFrame.getActuals().presentTime, 29);
1352 EXPECT_EQ(displayFrame->getFramePresentMetadata(), FramePresentMetadata::OnTimePresent);
1353 EXPECT_EQ(displayFrame->getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
1354 EXPECT_EQ(displayFrame->getJankType(), JankType::None);
1355}
1356
1357TEST_F(FrameTimelineTest, jankClassification_displayFrameOnTimeFinishEarlyPresent) {
Alec Mouri363faf02021-01-29 16:34:55 -08001358 Fps vsyncRate = Fps::fromPeriodNsecs(11);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001359 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001360 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({22, 30, 40});
1361 int64_t sfToken2 = mTokenManager->generateTokenForPredictions({52, 60, 70});
Alec Mouri363faf02021-01-29 16:34:55 -08001362 mFrameTimeline->setSfWakeUp(sfToken1, 22, vsyncRate);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001363 mFrameTimeline->setSfPresent(26, presentFence1);
1364 auto displayFrame = getDisplayFrame(0);
1365 presentFence1->signalForTest(30);
1366
1367 // Fences for the first frame haven't been flushed yet, so it should be 0
1368 EXPECT_EQ(displayFrame->getActuals().presentTime, 0);
1369
1370 // Trigger a flush by finalizing the next DisplayFrame
1371 auto presentFence2 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Alec Mouri363faf02021-01-29 16:34:55 -08001372 mFrameTimeline->setSfWakeUp(sfToken2, 52, vsyncRate);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001373 mFrameTimeline->setSfPresent(56, presentFence2);
1374 displayFrame = getDisplayFrame(0);
1375
1376 // Fences for the first frame have flushed, so the present timestamps should be updated
1377 EXPECT_EQ(displayFrame->getActuals().presentTime, 30);
1378 EXPECT_EQ(displayFrame->getFramePresentMetadata(), FramePresentMetadata::EarlyPresent);
1379 EXPECT_EQ(displayFrame->getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
1380 EXPECT_EQ(displayFrame->getJankType(), JankType::SurfaceFlingerScheduling);
1381
1382 // Fences for the second frame haven't been flushed yet, so it should be 0
1383 auto displayFrame2 = getDisplayFrame(1);
1384 presentFence2->signalForTest(65);
1385 EXPECT_EQ(displayFrame2->getActuals().presentTime, 0);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001386 addEmptyDisplayFrame();
1387 displayFrame2 = getDisplayFrame(1);
1388
1389 // Fences for the second frame have flushed, so the present timestamps should be updated
1390 EXPECT_EQ(displayFrame2->getActuals().presentTime, 65);
1391 EXPECT_EQ(displayFrame2->getFramePresentMetadata(), FramePresentMetadata::EarlyPresent);
1392 EXPECT_EQ(displayFrame2->getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
1393 EXPECT_EQ(displayFrame2->getJankType(), JankType::PredictionError);
1394}
1395
1396TEST_F(FrameTimelineTest, jankClassification_displayFrameOnTimeFinishLatePresent) {
Alec Mouri363faf02021-01-29 16:34:55 -08001397 Fps vsyncRate = Fps::fromPeriodNsecs(11);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001398 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001399 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({22, 30, 40});
1400 int64_t sfToken2 = mTokenManager->generateTokenForPredictions({52, 60, 70});
Alec Mouri363faf02021-01-29 16:34:55 -08001401 mFrameTimeline->setSfWakeUp(sfToken1, 22, vsyncRate);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001402 mFrameTimeline->setSfPresent(26, presentFence1);
1403 auto displayFrame = getDisplayFrame(0);
1404 presentFence1->signalForTest(50);
1405
1406 // Fences for the first frame haven't been flushed yet, so it should be 0
1407 EXPECT_EQ(displayFrame->getActuals().presentTime, 0);
1408
1409 // Trigger a flush by finalizing the next DisplayFrame
1410 auto presentFence2 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Alec Mouri363faf02021-01-29 16:34:55 -08001411 mFrameTimeline->setSfWakeUp(sfToken2, 52, vsyncRate);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001412 mFrameTimeline->setSfPresent(56, presentFence2);
1413 displayFrame = getDisplayFrame(0);
1414
1415 // Fences for the first frame have flushed, so the present timestamps should be updated
1416 EXPECT_EQ(displayFrame->getActuals().presentTime, 50);
1417 EXPECT_EQ(displayFrame->getFramePresentMetadata(), FramePresentMetadata::LatePresent);
1418 EXPECT_EQ(displayFrame->getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
1419 EXPECT_EQ(displayFrame->getJankType(), JankType::DisplayHAL);
1420
1421 // Fences for the second frame haven't been flushed yet, so it should be 0
1422 auto displayFrame2 = getDisplayFrame(1);
1423 presentFence2->signalForTest(75);
1424 EXPECT_EQ(displayFrame2->getActuals().presentTime, 0);
1425
1426 addEmptyDisplayFrame();
1427 displayFrame2 = getDisplayFrame(1);
1428
1429 // Fences for the second frame have flushed, so the present timestamps should be updated
1430 EXPECT_EQ(displayFrame2->getActuals().presentTime, 75);
1431 EXPECT_EQ(displayFrame2->getFramePresentMetadata(), FramePresentMetadata::LatePresent);
1432 EXPECT_EQ(displayFrame2->getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
1433 EXPECT_EQ(displayFrame2->getJankType(), JankType::PredictionError);
1434}
1435
1436TEST_F(FrameTimelineTest, jankClassification_displayFrameLateFinishEarlyPresent) {
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001437 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
1438 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({12, 18, 40});
Alec Mouri7d436ec2021-01-27 20:40:50 -08001439 mFrameTimeline->setSfWakeUp(sfToken1, 12, Fps::fromPeriodNsecs(11));
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001440
1441 mFrameTimeline->setSfPresent(22, presentFence1);
1442 auto displayFrame = getDisplayFrame(0);
1443 presentFence1->signalForTest(28);
1444
1445 // Fences haven't been flushed yet, so it should be 0
1446 EXPECT_EQ(displayFrame->getActuals().presentTime, 0);
1447
1448 addEmptyDisplayFrame();
1449 displayFrame = getDisplayFrame(0);
1450
1451 // Fences have flushed, so the present timestamps should be updated
1452 EXPECT_EQ(displayFrame->getActuals().presentTime, 28);
1453 EXPECT_EQ(displayFrame->getFramePresentMetadata(), FramePresentMetadata::EarlyPresent);
1454 EXPECT_EQ(displayFrame->getFrameReadyMetadata(), FrameReadyMetadata::LateFinish);
1455 EXPECT_EQ(displayFrame->getJankType(), JankType::SurfaceFlingerScheduling);
1456}
1457
1458TEST_F(FrameTimelineTest, jankClassification_displayFrameLateFinishLatePresent) {
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001459 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
1460 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({22, 26, 40});
Alec Mouri7d436ec2021-01-27 20:40:50 -08001461 mFrameTimeline->setSfWakeUp(sfToken1, 12, Fps::fromPeriodNsecs(11));
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001462 mFrameTimeline->setSfPresent(36, presentFence1);
1463 auto displayFrame = getDisplayFrame(0);
1464 presentFence1->signalForTest(52);
1465
1466 // Fences haven't been flushed yet, so it should be 0
1467 EXPECT_EQ(displayFrame->getActuals().presentTime, 0);
1468
1469 addEmptyDisplayFrame();
1470 displayFrame = getDisplayFrame(0);
1471
1472 // Fences have flushed, so the present timestamps should be updated
1473 EXPECT_EQ(displayFrame->getActuals().presentTime, 52);
1474 EXPECT_EQ(displayFrame->getFramePresentMetadata(), FramePresentMetadata::LatePresent);
1475 EXPECT_EQ(displayFrame->getFrameReadyMetadata(), FrameReadyMetadata::LateFinish);
1476 EXPECT_EQ(displayFrame->getJankType(), JankType::SurfaceFlingerCpuDeadlineMissed);
1477}
1478
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001479TEST_F(FrameTimelineTest, jankClassification_displayFrameLateStartLateFinishLatePresent) {
1480 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
1481 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({22, 26, 40});
1482 mFrameTimeline->setSfWakeUp(sfToken1, 26, Fps::fromPeriodNsecs(11));
1483 mFrameTimeline->setSfPresent(36, presentFence1);
1484 auto displayFrame = getDisplayFrame(0);
1485 presentFence1->signalForTest(52);
1486
1487 // Fences haven't been flushed yet, so it should be 0
1488 EXPECT_EQ(displayFrame->getActuals().presentTime, 0);
1489
1490 addEmptyDisplayFrame();
1491 displayFrame = getDisplayFrame(0);
1492
1493 // Fences have flushed, so the present timestamps should be updated
1494 EXPECT_EQ(displayFrame->getActuals().presentTime, 52);
1495 EXPECT_EQ(displayFrame->getFrameStartMetadata(), FrameStartMetadata::LateStart);
1496 EXPECT_EQ(displayFrame->getFramePresentMetadata(), FramePresentMetadata::LatePresent);
1497 EXPECT_EQ(displayFrame->getFrameReadyMetadata(), FrameReadyMetadata::LateFinish);
1498 EXPECT_EQ(displayFrame->getJankType(), JankType::SurfaceFlingerScheduling);
1499}
1500
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001501TEST_F(FrameTimelineTest, jankClassification_surfaceFrameOnTimeFinishEarlyPresent) {
Alec Mouri363faf02021-01-29 16:34:55 -08001502 EXPECT_CALL(*mTimeStats, incrementJankyFrames(_));
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001503 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001504 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({22, 30, 40});
1505 int64_t sfToken2 = mTokenManager->generateTokenForPredictions({52, 60, 70});
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001506 int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions({5, 16, 40});
1507 int64_t surfaceFrameToken2 = mTokenManager->generateTokenForPredictions({25, 36, 70});
1508 auto surfaceFrame1 =
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001509 mFrameTimeline->createSurfaceFrameForToken({surfaceFrameToken1, sInputEventId}, sPidOne,
Alec Mouriadebf5c2021-01-05 12:57:36 -08001510 sUidOne, sLayerIdOne, sLayerNameOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +00001511 sLayerNameOne, /*isBuffer*/ true);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001512 surfaceFrame1->setAcquireFenceTime(16);
Alec Mouri7d436ec2021-01-27 20:40:50 -08001513 mFrameTimeline->setSfWakeUp(sfToken1, 22, Fps::fromPeriodNsecs(11));
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001514 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
1515 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001516 mFrameTimeline->setSfPresent(27, presentFence1);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001517 auto displayFrame1 = getDisplayFrame(0);
1518 auto& presentedSurfaceFrame1 = getSurfaceFrame(0, 0);
1519 presentFence1->signalForTest(30);
1520
1521 // Fences for the first frame haven't been flushed yet, so it should be 0
1522 EXPECT_EQ(displayFrame1->getActuals().presentTime, 0);
1523 auto actuals1 = presentedSurfaceFrame1.getActuals();
1524 EXPECT_EQ(actuals1.presentTime, 0);
1525
1526 // Trigger a flush by finalizing the next DisplayFrame
1527 auto presentFence2 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
1528 auto surfaceFrame2 =
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001529 mFrameTimeline->createSurfaceFrameForToken({surfaceFrameToken2, sInputEventId}, sPidOne,
Alec Mouriadebf5c2021-01-05 12:57:36 -08001530 sUidOne, sLayerIdOne, sLayerNameOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +00001531 sLayerNameOne, /*isBuffer*/ true);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001532 surfaceFrame2->setAcquireFenceTime(36);
Alec Mouri7d436ec2021-01-27 20:40:50 -08001533 mFrameTimeline->setSfWakeUp(sfToken2, 52, Fps::fromPeriodNsecs(11));
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001534 surfaceFrame2->setPresentState(SurfaceFrame::PresentState::Presented);
1535 mFrameTimeline->addSurfaceFrame(surfaceFrame2);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001536 mFrameTimeline->setSfPresent(57, presentFence2);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001537 auto displayFrame2 = getDisplayFrame(1);
1538 auto& presentedSurfaceFrame2 = getSurfaceFrame(1, 0);
1539
1540 // Fences for the first frame have flushed, so the present timestamps should be updated
1541 EXPECT_EQ(displayFrame1->getActuals().presentTime, 30);
1542 EXPECT_EQ(displayFrame1->getFramePresentMetadata(), FramePresentMetadata::EarlyPresent);
1543 EXPECT_EQ(displayFrame1->getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
1544 EXPECT_EQ(displayFrame1->getJankType(), JankType::SurfaceFlingerScheduling);
1545
1546 actuals1 = presentedSurfaceFrame1.getActuals();
1547 EXPECT_EQ(actuals1.presentTime, 30);
1548 EXPECT_EQ(presentedSurfaceFrame1.getFramePresentMetadata(), FramePresentMetadata::EarlyPresent);
1549 EXPECT_EQ(presentedSurfaceFrame1.getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
1550 EXPECT_EQ(presentedSurfaceFrame1.getJankType(), JankType::SurfaceFlingerScheduling);
1551
1552 // Fences for the second frame haven't been flushed yet, so it should be 0
1553 presentFence2->signalForTest(65);
1554 EXPECT_EQ(displayFrame2->getActuals().presentTime, 0);
1555 auto actuals2 = presentedSurfaceFrame2.getActuals();
1556 EXPECT_EQ(actuals2.presentTime, 0);
1557
Alec Mouri363faf02021-01-29 16:34:55 -08001558 ::testing::Mock::VerifyAndClearExpectations(mTimeStats.get());
1559
1560 EXPECT_CALL(*mTimeStats,
1561 incrementJankyFrames(
1562 TimeStats::JankyFramesInfo{Fps::fromPeriodNsecs(11), std::nullopt, sUidOne,
Adithya Srinivasan82eef322021-04-10 00:06:04 +00001563 sLayerNameOne, JankType::PredictionError, -3, 5,
Alec Mouri363faf02021-01-29 16:34:55 -08001564 0}));
1565
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001566 addEmptyDisplayFrame();
1567
1568 // Fences for the second frame have flushed, so the present timestamps should be updated
1569 EXPECT_EQ(displayFrame2->getActuals().presentTime, 65);
1570 EXPECT_EQ(displayFrame2->getFramePresentMetadata(), FramePresentMetadata::EarlyPresent);
1571 EXPECT_EQ(displayFrame2->getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
1572 EXPECT_EQ(displayFrame2->getJankType(), JankType::PredictionError);
1573
1574 actuals2 = presentedSurfaceFrame2.getActuals();
1575 EXPECT_EQ(actuals2.presentTime, 65);
1576 EXPECT_EQ(presentedSurfaceFrame2.getFramePresentMetadata(), FramePresentMetadata::EarlyPresent);
1577 EXPECT_EQ(presentedSurfaceFrame2.getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
1578 EXPECT_EQ(presentedSurfaceFrame2.getJankType(), JankType::PredictionError);
1579}
1580
1581TEST_F(FrameTimelineTest, jankClassification_surfaceFrameOnTimeFinishLatePresent) {
Alec Mouri363faf02021-01-29 16:34:55 -08001582 EXPECT_CALL(*mTimeStats, incrementJankyFrames(_));
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001583 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001584 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({22, 30, 40});
1585 int64_t sfToken2 = mTokenManager->generateTokenForPredictions({52, 60, 70});
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001586 int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions({5, 16, 40});
1587 int64_t surfaceFrameToken2 = mTokenManager->generateTokenForPredictions({25, 36, 70});
1588 auto surfaceFrame1 =
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001589 mFrameTimeline->createSurfaceFrameForToken({surfaceFrameToken1, sInputEventId}, sPidOne,
Alec Mouriadebf5c2021-01-05 12:57:36 -08001590 sUidOne, sLayerIdOne, sLayerNameOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +00001591 sLayerNameOne, /*isBuffer*/ true);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001592 surfaceFrame1->setAcquireFenceTime(16);
Alec Mouri7d436ec2021-01-27 20:40:50 -08001593 mFrameTimeline->setSfWakeUp(sfToken1, 22, Fps::fromPeriodNsecs(11));
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001594 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
1595 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
1596 mFrameTimeline->setSfPresent(26, presentFence1);
1597 auto displayFrame1 = getDisplayFrame(0);
1598 auto& presentedSurfaceFrame1 = getSurfaceFrame(0, 0);
1599 presentFence1->signalForTest(50);
1600
1601 // Fences for the first frame haven't been flushed yet, so it should be 0
1602 EXPECT_EQ(displayFrame1->getActuals().presentTime, 0);
1603 auto actuals1 = presentedSurfaceFrame1.getActuals();
1604 EXPECT_EQ(actuals1.presentTime, 0);
1605
1606 // Trigger a flush by finalizing the next DisplayFrame
1607 auto presentFence2 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
1608 auto surfaceFrame2 =
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001609 mFrameTimeline->createSurfaceFrameForToken({surfaceFrameToken2, sInputEventId}, sPidOne,
Alec Mouriadebf5c2021-01-05 12:57:36 -08001610 sUidOne, sLayerIdOne, sLayerNameOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +00001611 sLayerNameOne, /*isBuffer*/ true);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001612 surfaceFrame2->setAcquireFenceTime(36);
Alec Mouri7d436ec2021-01-27 20:40:50 -08001613 mFrameTimeline->setSfWakeUp(sfToken2, 52, Fps::fromPeriodNsecs(11));
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001614 surfaceFrame2->setPresentState(SurfaceFrame::PresentState::Presented);
1615 mFrameTimeline->addSurfaceFrame(surfaceFrame2);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001616 mFrameTimeline->setSfPresent(57, presentFence2);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001617 auto displayFrame2 = getDisplayFrame(1);
1618 auto& presentedSurfaceFrame2 = getSurfaceFrame(1, 0);
1619
1620 // Fences for the first frame have flushed, so the present timestamps should be updated
1621 EXPECT_EQ(displayFrame1->getActuals().presentTime, 50);
1622 EXPECT_EQ(displayFrame1->getFramePresentMetadata(), FramePresentMetadata::LatePresent);
1623 EXPECT_EQ(displayFrame1->getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
1624 EXPECT_EQ(displayFrame1->getJankType(), JankType::DisplayHAL);
1625
1626 actuals1 = presentedSurfaceFrame1.getActuals();
1627 EXPECT_EQ(actuals1.presentTime, 50);
1628 EXPECT_EQ(presentedSurfaceFrame1.getFramePresentMetadata(), FramePresentMetadata::LatePresent);
1629 EXPECT_EQ(presentedSurfaceFrame1.getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
1630 EXPECT_EQ(presentedSurfaceFrame1.getJankType(), JankType::DisplayHAL);
1631
1632 // Fences for the second frame haven't been flushed yet, so it should be 0
1633 presentFence2->signalForTest(86);
1634 EXPECT_EQ(displayFrame2->getActuals().presentTime, 0);
1635 auto actuals2 = presentedSurfaceFrame2.getActuals();
1636 EXPECT_EQ(actuals2.presentTime, 0);
1637
Alec Mouri363faf02021-01-29 16:34:55 -08001638 ::testing::Mock::VerifyAndClearExpectations(mTimeStats.get());
1639
1640 EXPECT_CALL(*mTimeStats,
1641 incrementJankyFrames(
1642 TimeStats::JankyFramesInfo{Fps::fromPeriodNsecs(11), std::nullopt, sUidOne,
Adithya Srinivasan82eef322021-04-10 00:06:04 +00001643 sLayerNameOne, JankType::PredictionError, -3, 5,
Alec Mouri363faf02021-01-29 16:34:55 -08001644 0}));
1645
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001646 addEmptyDisplayFrame();
1647
1648 // Fences for the second frame have flushed, so the present timestamps should be updated
1649 EXPECT_EQ(displayFrame2->getActuals().presentTime, 86);
1650 EXPECT_EQ(displayFrame2->getFramePresentMetadata(), FramePresentMetadata::LatePresent);
1651 EXPECT_EQ(displayFrame2->getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
1652 EXPECT_EQ(displayFrame2->getJankType(), JankType::PredictionError);
1653
1654 actuals2 = presentedSurfaceFrame2.getActuals();
1655 EXPECT_EQ(actuals2.presentTime, 86);
1656 EXPECT_EQ(presentedSurfaceFrame2.getFramePresentMetadata(), FramePresentMetadata::LatePresent);
1657 EXPECT_EQ(presentedSurfaceFrame2.getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
1658 EXPECT_EQ(presentedSurfaceFrame2.getJankType(), JankType::PredictionError);
1659}
1660
1661TEST_F(FrameTimelineTest, jankClassification_surfaceFrameLateFinishEarlyPresent) {
Alec Mouri363faf02021-01-29 16:34:55 -08001662 EXPECT_CALL(*mTimeStats, incrementJankyFrames(_));
Alec Mouri7d436ec2021-01-27 20:40:50 -08001663
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001664 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001665 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({42, 50, 50});
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001666 int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions({5, 26, 60});
1667 auto surfaceFrame1 =
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001668 mFrameTimeline->createSurfaceFrameForToken({surfaceFrameToken1, sInputEventId}, sPidOne,
Alec Mouriadebf5c2021-01-05 12:57:36 -08001669 sUidOne, sLayerIdOne, sLayerNameOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +00001670 sLayerNameOne, /*isBuffer*/ true);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001671 surfaceFrame1->setAcquireFenceTime(40);
Alec Mouri7d436ec2021-01-27 20:40:50 -08001672 mFrameTimeline->setSfWakeUp(sfToken1, 42, Fps::fromPeriodNsecs(11));
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001673 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
1674 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
1675 mFrameTimeline->setSfPresent(46, presentFence1);
1676 auto displayFrame1 = getDisplayFrame(0);
1677 auto& presentedSurfaceFrame1 = getSurfaceFrame(0, 0);
1678 presentFence1->signalForTest(50);
1679
1680 // Fences for the first frame haven't been flushed yet, so it should be 0
1681 EXPECT_EQ(displayFrame1->getActuals().presentTime, 0);
1682 auto actuals1 = presentedSurfaceFrame1.getActuals();
1683 EXPECT_EQ(actuals1.presentTime, 0);
1684
1685 addEmptyDisplayFrame();
1686
1687 // Fences for the first frame have flushed, so the present timestamps should be updated
1688 EXPECT_EQ(displayFrame1->getActuals().presentTime, 50);
1689 EXPECT_EQ(displayFrame1->getFramePresentMetadata(), FramePresentMetadata::OnTimePresent);
1690 EXPECT_EQ(displayFrame1->getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
1691 EXPECT_EQ(displayFrame1->getJankType(), JankType::None);
1692
1693 actuals1 = presentedSurfaceFrame1.getActuals();
1694 EXPECT_EQ(actuals1.presentTime, 50);
1695 EXPECT_EQ(presentedSurfaceFrame1.getFramePresentMetadata(), FramePresentMetadata::EarlyPresent);
1696 EXPECT_EQ(presentedSurfaceFrame1.getFrameReadyMetadata(), FrameReadyMetadata::LateFinish);
1697 EXPECT_EQ(presentedSurfaceFrame1.getJankType(), JankType::Unknown);
1698}
1699
1700TEST_F(FrameTimelineTest, jankClassification_surfaceFrameLateFinishLatePresent) {
Adithya Srinivasan8a945502021-03-19 19:12:32 +00001701 // First frame - DisplayFrame is not janky. This should classify the SurfaceFrame as only
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001702 // AppDeadlineMissed. Second frame - DisplayFrame is janky. This should propagate DisplayFrame's
Adithya Srinivasan8a945502021-03-19 19:12:32 +00001703 // jank to the SurfaceFrame along with AppDeadlineMissed.
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001704
Alec Mouri363faf02021-01-29 16:34:55 -08001705 EXPECT_CALL(*mTimeStats, incrementJankyFrames(_)).Times(2);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001706 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001707 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({32, 40, 40});
1708 int64_t sfToken2 = mTokenManager->generateTokenForPredictions({42, 50, 50});
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001709 int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions({5, 16, 30});
1710 int64_t surfaceFrameToken2 = mTokenManager->generateTokenForPredictions({25, 36, 50});
1711 auto surfaceFrame1 =
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001712 mFrameTimeline->createSurfaceFrameForToken({surfaceFrameToken1, sInputEventId}, sPidOne,
Alec Mouriadebf5c2021-01-05 12:57:36 -08001713 sUidOne, sLayerIdOne, sLayerNameOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +00001714 sLayerNameOne, /*isBuffer*/ true);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001715 surfaceFrame1->setAcquireFenceTime(26);
Alec Mouri7d436ec2021-01-27 20:40:50 -08001716 mFrameTimeline->setSfWakeUp(sfToken1, 32, Fps::fromPeriodNsecs(11));
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001717 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
1718 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
1719 mFrameTimeline->setSfPresent(36, presentFence1);
1720 auto displayFrame1 = getDisplayFrame(0);
1721 auto& presentedSurfaceFrame1 = getSurfaceFrame(0, 0);
1722 presentFence1->signalForTest(40);
1723
1724 // Fences for the first frame haven't been flushed yet, so it should be 0
1725 EXPECT_EQ(displayFrame1->getActuals().presentTime, 0);
1726 auto actuals1 = presentedSurfaceFrame1.getActuals();
1727 EXPECT_EQ(actuals1.presentTime, 0);
1728
1729 // Trigger a flush by finalizing the next DisplayFrame
1730 auto presentFence2 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
1731 auto surfaceFrame2 =
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001732 mFrameTimeline->createSurfaceFrameForToken({surfaceFrameToken2, sInputEventId}, sPidOne,
Alec Mouriadebf5c2021-01-05 12:57:36 -08001733 sUidOne, sLayerIdOne, sLayerNameOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +00001734 sLayerNameOne, /*isBuffer*/ true);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001735 surfaceFrame2->setAcquireFenceTime(40);
Alec Mouri7d436ec2021-01-27 20:40:50 -08001736 mFrameTimeline->setSfWakeUp(sfToken2, 43, Fps::fromPeriodNsecs(11));
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001737 surfaceFrame2->setPresentState(SurfaceFrame::PresentState::Presented);
1738 mFrameTimeline->addSurfaceFrame(surfaceFrame2);
1739 mFrameTimeline->setSfPresent(56, presentFence2);
1740 auto displayFrame2 = getDisplayFrame(1);
1741 auto& presentedSurfaceFrame2 = getSurfaceFrame(1, 0);
1742
1743 // Fences for the first frame have flushed, so the present timestamps should be updated
1744 EXPECT_EQ(displayFrame1->getActuals().presentTime, 40);
1745 EXPECT_EQ(displayFrame1->getFramePresentMetadata(), FramePresentMetadata::OnTimePresent);
1746 EXPECT_EQ(displayFrame1->getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
1747 EXPECT_EQ(displayFrame1->getJankType(), JankType::None);
1748
1749 actuals1 = presentedSurfaceFrame1.getActuals();
1750 EXPECT_EQ(actuals1.presentTime, 40);
1751 EXPECT_EQ(presentedSurfaceFrame1.getFramePresentMetadata(), FramePresentMetadata::LatePresent);
1752 EXPECT_EQ(presentedSurfaceFrame1.getFrameReadyMetadata(), FrameReadyMetadata::LateFinish);
1753 EXPECT_EQ(presentedSurfaceFrame1.getJankType(), JankType::AppDeadlineMissed);
1754
1755 // Fences for the second frame haven't been flushed yet, so it should be 0
1756 presentFence2->signalForTest(60);
1757 EXPECT_EQ(displayFrame2->getActuals().presentTime, 0);
1758 auto actuals2 = presentedSurfaceFrame2.getActuals();
1759 EXPECT_EQ(actuals2.presentTime, 0);
1760
1761 addEmptyDisplayFrame();
1762
1763 // Fences for the second frame have flushed, so the present timestamps should be updated
1764 EXPECT_EQ(displayFrame2->getActuals().presentTime, 60);
1765 EXPECT_EQ(displayFrame2->getFramePresentMetadata(), FramePresentMetadata::LatePresent);
1766 EXPECT_EQ(displayFrame2->getFrameReadyMetadata(), FrameReadyMetadata::LateFinish);
1767 EXPECT_EQ(displayFrame2->getJankType(), JankType::SurfaceFlingerCpuDeadlineMissed);
1768
1769 actuals2 = presentedSurfaceFrame2.getActuals();
1770 EXPECT_EQ(actuals2.presentTime, 60);
1771 EXPECT_EQ(presentedSurfaceFrame2.getFramePresentMetadata(), FramePresentMetadata::LatePresent);
1772 EXPECT_EQ(presentedSurfaceFrame2.getFrameReadyMetadata(), FrameReadyMetadata::LateFinish);
Adithya Srinivasan8a945502021-03-19 19:12:32 +00001773 EXPECT_EQ(presentedSurfaceFrame2.getJankType(),
1774 JankType::SurfaceFlingerCpuDeadlineMissed | JankType::AppDeadlineMissed);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001775}
1776
1777TEST_F(FrameTimelineTest, jankClassification_multiJankBufferStuffingAndAppDeadlineMissed) {
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001778 // Layer specific increment
Alec Mouri363faf02021-01-29 16:34:55 -08001779 EXPECT_CALL(*mTimeStats, incrementJankyFrames(_)).Times(2);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001780 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
1781 int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions({10, 20, 30});
1782 int64_t surfaceFrameToken2 = mTokenManager->generateTokenForPredictions({40, 50, 60});
1783
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001784 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({52, 60, 60});
1785 int64_t sfToken2 = mTokenManager->generateTokenForPredictions({112, 120, 120});
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001786 auto surfaceFrame1 =
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001787 mFrameTimeline->createSurfaceFrameForToken({surfaceFrameToken1, sInputEventId}, sPidOne,
Alec Mouriadebf5c2021-01-05 12:57:36 -08001788 sUidOne, sLayerIdOne, sLayerNameOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +00001789 sLayerNameOne, /*isBuffer*/ true);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001790 surfaceFrame1->setAcquireFenceTime(50);
Alec Mouri7d436ec2021-01-27 20:40:50 -08001791 mFrameTimeline->setSfWakeUp(sfToken1, 52, Fps::fromPeriodNsecs(30));
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001792 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
1793 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
1794 mFrameTimeline->setSfPresent(56, presentFence1);
1795 auto displayFrame1 = getDisplayFrame(0);
1796 auto& presentedSurfaceFrame1 = getSurfaceFrame(0, 0);
1797 presentFence1->signalForTest(60);
1798
1799 // Fences for the first frame haven't been flushed yet, so it should be 0
1800 EXPECT_EQ(displayFrame1->getActuals().presentTime, 0);
1801 auto actuals1 = presentedSurfaceFrame1.getActuals();
1802 EXPECT_EQ(actuals1.presentTime, 0);
1803
1804 // Trigger a flush by finalizing the next DisplayFrame
1805 auto presentFence2 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
1806 auto surfaceFrame2 =
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001807 mFrameTimeline->createSurfaceFrameForToken({surfaceFrameToken2, sInputEventId}, sPidOne,
Alec Mouriadebf5c2021-01-05 12:57:36 -08001808 sUidOne, sLayerIdOne, sLayerNameOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +00001809 sLayerNameOne, /*isBuffer*/ true);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001810 surfaceFrame2->setAcquireFenceTime(84);
Alec Mouri7d436ec2021-01-27 20:40:50 -08001811 mFrameTimeline->setSfWakeUp(sfToken2, 112, Fps::fromPeriodNsecs(30));
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001812 surfaceFrame2->setPresentState(SurfaceFrame::PresentState::Presented, 54);
1813 mFrameTimeline->addSurfaceFrame(surfaceFrame2);
1814 mFrameTimeline->setSfPresent(116, presentFence2);
1815 auto displayFrame2 = getDisplayFrame(1);
1816 auto& presentedSurfaceFrame2 = getSurfaceFrame(1, 0);
1817 presentFence2->signalForTest(120);
1818
1819 // Fences for the first frame have flushed, so the present timestamps should be updated
1820 EXPECT_EQ(displayFrame1->getActuals().presentTime, 60);
1821 actuals1 = presentedSurfaceFrame1.getActuals();
1822 EXPECT_EQ(actuals1.endTime, 50);
1823 EXPECT_EQ(actuals1.presentTime, 60);
1824
1825 EXPECT_EQ(displayFrame1->getFramePresentMetadata(), FramePresentMetadata::OnTimePresent);
1826 EXPECT_EQ(displayFrame1->getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
1827 EXPECT_EQ(displayFrame1->getJankType(), JankType::None);
1828
1829 EXPECT_EQ(presentedSurfaceFrame1.getFramePresentMetadata(), FramePresentMetadata::LatePresent);
1830 EXPECT_EQ(presentedSurfaceFrame1.getFrameReadyMetadata(), FrameReadyMetadata::LateFinish);
1831 EXPECT_EQ(presentedSurfaceFrame1.getJankType(), JankType::AppDeadlineMissed);
1832
1833 // Fences for the second frame haven't been flushed yet, so it should be 0
1834 EXPECT_EQ(displayFrame2->getActuals().presentTime, 0);
1835 auto actuals2 = presentedSurfaceFrame2.getActuals();
1836 EXPECT_EQ(actuals2.presentTime, 0);
1837
1838 addEmptyDisplayFrame();
1839
1840 // Fences for the second frame have flushed, so the present timestamps should be updated
1841 EXPECT_EQ(displayFrame2->getActuals().presentTime, 120);
1842 actuals2 = presentedSurfaceFrame2.getActuals();
1843 EXPECT_EQ(actuals2.presentTime, 120);
1844
1845 EXPECT_EQ(displayFrame2->getFramePresentMetadata(), FramePresentMetadata::OnTimePresent);
1846 EXPECT_EQ(displayFrame2->getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
1847 EXPECT_EQ(displayFrame2->getJankType(), JankType::None);
1848
1849 EXPECT_EQ(presentedSurfaceFrame2.getFramePresentMetadata(), FramePresentMetadata::LatePresent);
1850 EXPECT_EQ(presentedSurfaceFrame2.getFrameReadyMetadata(), FrameReadyMetadata::LateFinish);
1851 EXPECT_EQ(presentedSurfaceFrame2.getJankType(),
1852 JankType::AppDeadlineMissed | JankType::BufferStuffing);
1853}
Alec Mouriadebf5c2021-01-05 12:57:36 -08001854
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001855TEST_F(FrameTimelineTest, jankClassification_appDeadlineAdjustedForBufferStuffing) {
1856 // Layer specific increment
1857 EXPECT_CALL(*mTimeStats, incrementJankyFrames(_)).Times(2);
1858 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
1859 int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions({10, 20, 30});
1860 int64_t surfaceFrameToken2 = mTokenManager->generateTokenForPredictions({40, 50, 60});
1861
1862 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({52, 60, 60});
1863 int64_t sfToken2 = mTokenManager->generateTokenForPredictions({82, 90, 90});
1864 auto surfaceFrame1 =
1865 mFrameTimeline->createSurfaceFrameForToken({surfaceFrameToken1, sInputEventId}, sPidOne,
1866 sUidOne, sLayerIdOne, sLayerNameOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +00001867 sLayerNameOne, /*isBuffer*/ true);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001868 surfaceFrame1->setAcquireFenceTime(50);
1869 mFrameTimeline->setSfWakeUp(sfToken1, 52, Fps::fromPeriodNsecs(30));
1870 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
1871 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
1872 mFrameTimeline->setSfPresent(56, presentFence1);
1873 auto displayFrame1 = getDisplayFrame(0);
1874 auto& presentedSurfaceFrame1 = getSurfaceFrame(0, 0);
1875 presentFence1->signalForTest(60);
1876
1877 // Fences for the first frame haven't been flushed yet, so it should be 0
1878 EXPECT_EQ(displayFrame1->getActuals().presentTime, 0);
1879 auto actuals1 = presentedSurfaceFrame1.getActuals();
1880 EXPECT_EQ(actuals1.presentTime, 0);
1881
1882 // Trigger a flush by finalizing the next DisplayFrame
1883 auto presentFence2 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
1884 auto surfaceFrame2 =
1885 mFrameTimeline->createSurfaceFrameForToken({surfaceFrameToken2, sInputEventId}, sPidOne,
1886 sUidOne, sLayerIdOne, sLayerNameOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +00001887 sLayerNameOne, /*isBuffer*/ true);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001888 surfaceFrame2->setAcquireFenceTime(80);
1889 mFrameTimeline->setSfWakeUp(sfToken2, 82, Fps::fromPeriodNsecs(30));
1890 // Setting previous latch time to 54, adjusted deadline will be 54 + vsyncTime(30) = 84
1891 surfaceFrame2->setPresentState(SurfaceFrame::PresentState::Presented, 54);
1892 mFrameTimeline->addSurfaceFrame(surfaceFrame2);
1893 mFrameTimeline->setSfPresent(86, presentFence2);
1894 auto displayFrame2 = getDisplayFrame(1);
1895 auto& presentedSurfaceFrame2 = getSurfaceFrame(1, 0);
1896 presentFence2->signalForTest(90);
1897
1898 // Fences for the first frame have flushed, so the present timestamps should be updated
1899 EXPECT_EQ(displayFrame1->getActuals().presentTime, 60);
1900 actuals1 = presentedSurfaceFrame1.getActuals();
1901 EXPECT_EQ(actuals1.endTime, 50);
1902 EXPECT_EQ(actuals1.presentTime, 60);
1903
1904 EXPECT_EQ(displayFrame1->getFramePresentMetadata(), FramePresentMetadata::OnTimePresent);
1905 EXPECT_EQ(displayFrame1->getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
1906 EXPECT_EQ(displayFrame1->getJankType(), JankType::None);
1907
1908 EXPECT_EQ(presentedSurfaceFrame1.getFramePresentMetadata(), FramePresentMetadata::LatePresent);
1909 EXPECT_EQ(presentedSurfaceFrame1.getFrameReadyMetadata(), FrameReadyMetadata::LateFinish);
1910 EXPECT_EQ(presentedSurfaceFrame1.getJankType(), JankType::AppDeadlineMissed);
1911
1912 // Fences for the second frame haven't been flushed yet, so it should be 0
1913 EXPECT_EQ(displayFrame2->getActuals().presentTime, 0);
1914 auto actuals2 = presentedSurfaceFrame2.getActuals();
1915 EXPECT_EQ(actuals2.presentTime, 0);
1916
1917 addEmptyDisplayFrame();
1918
1919 // Fences for the second frame have flushed, so the present timestamps should be updated
1920 EXPECT_EQ(displayFrame2->getActuals().presentTime, 90);
1921 actuals2 = presentedSurfaceFrame2.getActuals();
1922 EXPECT_EQ(actuals2.presentTime, 90);
1923
1924 EXPECT_EQ(displayFrame2->getFramePresentMetadata(), FramePresentMetadata::OnTimePresent);
1925 EXPECT_EQ(displayFrame2->getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
1926 EXPECT_EQ(displayFrame2->getJankType(), JankType::None);
1927
1928 EXPECT_EQ(presentedSurfaceFrame2.getFramePresentMetadata(), FramePresentMetadata::LatePresent);
1929 EXPECT_EQ(presentedSurfaceFrame2.getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
1930 EXPECT_EQ(presentedSurfaceFrame2.getJankType(), JankType::BufferStuffing);
1931}
1932
Alec Mouriadebf5c2021-01-05 12:57:36 -08001933TEST_F(FrameTimelineTest, computeFps_noLayerIds_returnsZero) {
1934 EXPECT_EQ(mFrameTimeline->computeFps({}), 0.0f);
1935}
1936
1937TEST_F(FrameTimelineTest, computeFps_singleDisplayFrame_returnsZero) {
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001938 const auto oneHundredMs = std::chrono::nanoseconds(100ms).count();
Alec Mouriadebf5c2021-01-05 12:57:36 -08001939
1940 auto surfaceFrame1 =
1941 mFrameTimeline->createSurfaceFrameForToken(FrameTimelineInfo(), sPidOne, sUidOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +00001942 sLayerIdOne, sLayerNameOne, sLayerNameOne,
1943 /*isBuffer*/ true);
Alec Mouriadebf5c2021-01-05 12:57:36 -08001944 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
1945 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
1946 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
1947 presentFence1->signalForTest(oneHundredMs);
1948 mFrameTimeline->setSfPresent(oneHundredMs, presentFence1);
1949
1950 EXPECT_EQ(mFrameTimeline->computeFps({sLayerIdOne}), 0.0f);
1951}
1952
1953TEST_F(FrameTimelineTest, computeFps_twoDisplayFrames_oneLayer) {
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001954 const auto oneHundredMs = std::chrono::nanoseconds(100ms).count();
1955 const auto twoHundredMs = std::chrono::nanoseconds(200ms).count();
Alec Mouriadebf5c2021-01-05 12:57:36 -08001956 auto surfaceFrame1 =
1957 mFrameTimeline->createSurfaceFrameForToken(FrameTimelineInfo(), sPidOne, sUidOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +00001958 sLayerIdOne, sLayerNameOne, sLayerNameOne,
1959 /*isBuffer*/ true);
Alec Mouriadebf5c2021-01-05 12:57:36 -08001960 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
1961 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
1962 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
1963 presentFence1->signalForTest(oneHundredMs);
1964 mFrameTimeline->setSfPresent(oneHundredMs, presentFence1);
1965
1966 auto surfaceFrame2 =
1967 mFrameTimeline->createSurfaceFrameForToken(FrameTimelineInfo(), sPidOne, sUidOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +00001968 sLayerIdOne, sLayerNameOne, sLayerNameOne,
1969 /*isBuffer*/ true);
Alec Mouriadebf5c2021-01-05 12:57:36 -08001970 auto presentFence2 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
1971 surfaceFrame2->setPresentState(SurfaceFrame::PresentState::Presented);
1972 mFrameTimeline->addSurfaceFrame(surfaceFrame2);
1973 presentFence2->signalForTest(twoHundredMs);
1974 mFrameTimeline->setSfPresent(twoHundredMs, presentFence2);
1975
1976 EXPECT_EQ(mFrameTimeline->computeFps({sLayerIdOne}), 10.0);
1977}
1978
1979TEST_F(FrameTimelineTest, computeFps_twoDisplayFrames_twoLayers) {
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001980 const auto oneHundredMs = std::chrono::nanoseconds(100ms).count();
1981 const auto twoHundredMs = std::chrono::nanoseconds(200ms).count();
Alec Mouriadebf5c2021-01-05 12:57:36 -08001982 auto surfaceFrame1 =
1983 mFrameTimeline->createSurfaceFrameForToken(FrameTimelineInfo(), sPidOne, sUidOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +00001984 sLayerIdOne, sLayerNameOne, sLayerNameOne,
1985 /*isBuffer*/ true);
Alec Mouriadebf5c2021-01-05 12:57:36 -08001986 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
1987 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
1988 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
1989 presentFence1->signalForTest(oneHundredMs);
1990 mFrameTimeline->setSfPresent(oneHundredMs, presentFence1);
1991
1992 auto surfaceFrame2 =
1993 mFrameTimeline->createSurfaceFrameForToken(FrameTimelineInfo(), sPidOne, sUidOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +00001994 sLayerIdTwo, sLayerNameTwo, sLayerNameTwo,
1995 /*isBuffer*/ true);
Alec Mouriadebf5c2021-01-05 12:57:36 -08001996 auto presentFence2 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
1997 surfaceFrame2->setPresentState(SurfaceFrame::PresentState::Presented);
1998 mFrameTimeline->addSurfaceFrame(surfaceFrame2);
1999 presentFence2->signalForTest(twoHundredMs);
2000 mFrameTimeline->setSfPresent(twoHundredMs, presentFence2);
2001
2002 EXPECT_EQ(mFrameTimeline->computeFps({sLayerIdOne, sLayerIdTwo}), 10.0f);
2003}
2004
2005TEST_F(FrameTimelineTest, computeFps_filtersOutLayers) {
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00002006 const auto oneHundredMs = std::chrono::nanoseconds(100ms).count();
2007 const auto twoHundredMs = std::chrono::nanoseconds(200ms).count();
Alec Mouriadebf5c2021-01-05 12:57:36 -08002008 auto surfaceFrame1 =
2009 mFrameTimeline->createSurfaceFrameForToken(FrameTimelineInfo(), sPidOne, sUidOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +00002010 sLayerIdOne, sLayerNameOne, sLayerNameOne,
2011 /*isBuffer*/ true);
Alec Mouriadebf5c2021-01-05 12:57:36 -08002012 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
2013 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
2014 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
2015 presentFence1->signalForTest(oneHundredMs);
2016 mFrameTimeline->setSfPresent(oneHundredMs, presentFence1);
2017
2018 auto surfaceFrame2 =
2019 mFrameTimeline->createSurfaceFrameForToken(FrameTimelineInfo(), sPidOne, sUidOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +00002020 sLayerIdTwo, sLayerNameTwo, sLayerNameTwo,
2021 /*isBuffer*/ true);
Alec Mouriadebf5c2021-01-05 12:57:36 -08002022 auto presentFence2 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
2023 surfaceFrame2->setPresentState(SurfaceFrame::PresentState::Presented);
2024 mFrameTimeline->addSurfaceFrame(surfaceFrame2);
2025 presentFence2->signalForTest(twoHundredMs);
2026 mFrameTimeline->setSfPresent(twoHundredMs, presentFence2);
2027
2028 EXPECT_EQ(mFrameTimeline->computeFps({sLayerIdOne}), 0.0f);
2029}
2030
2031TEST_F(FrameTimelineTest, computeFps_averagesOverMultipleFrames) {
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00002032 const auto oneHundredMs = std::chrono::nanoseconds(100ms).count();
2033 const auto twoHundredMs = std::chrono::nanoseconds(200ms).count();
2034 const auto threeHundredMs = std::chrono::nanoseconds(300ms).count();
2035 const auto fiveHundredMs = std::chrono::nanoseconds(500ms).count();
2036 const auto sixHundredMs = std::chrono::nanoseconds(600ms).count();
Alec Mouriadebf5c2021-01-05 12:57:36 -08002037 auto surfaceFrame1 =
2038 mFrameTimeline->createSurfaceFrameForToken(FrameTimelineInfo(), sPidOne, sUidOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +00002039 sLayerIdOne, sLayerNameOne, sLayerNameOne,
2040 /*isBuffer*/ true);
Alec Mouriadebf5c2021-01-05 12:57:36 -08002041 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
2042 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
2043 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
2044 presentFence1->signalForTest(oneHundredMs);
2045 mFrameTimeline->setSfPresent(oneHundredMs, presentFence1);
2046
2047 auto surfaceFrame2 =
2048 mFrameTimeline->createSurfaceFrameForToken(FrameTimelineInfo(), sPidOne, sUidOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +00002049 sLayerIdOne, sLayerNameOne, sLayerNameOne,
2050 /*isBuffer*/ true);
Alec Mouriadebf5c2021-01-05 12:57:36 -08002051 auto presentFence2 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
2052 surfaceFrame2->setPresentState(SurfaceFrame::PresentState::Presented);
2053 mFrameTimeline->addSurfaceFrame(surfaceFrame2);
2054 presentFence2->signalForTest(twoHundredMs);
2055 mFrameTimeline->setSfPresent(twoHundredMs, presentFence2);
2056
2057 auto surfaceFrame3 =
2058 mFrameTimeline->createSurfaceFrameForToken(FrameTimelineInfo(), sPidOne, sUidOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +00002059 sLayerIdTwo, sLayerNameTwo, sLayerNameTwo,
2060 /*isBuffer*/ true);
Alec Mouriadebf5c2021-01-05 12:57:36 -08002061 auto presentFence3 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
2062 surfaceFrame3->setPresentState(SurfaceFrame::PresentState::Presented);
2063 mFrameTimeline->addSurfaceFrame(surfaceFrame3);
2064 presentFence3->signalForTest(threeHundredMs);
2065 mFrameTimeline->setSfPresent(threeHundredMs, presentFence3);
2066
2067 auto surfaceFrame4 =
2068 mFrameTimeline->createSurfaceFrameForToken(FrameTimelineInfo(), sPidOne, sUidOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +00002069 sLayerIdOne, sLayerNameOne, sLayerNameOne,
2070 /*isBuffer*/ true);
Alec Mouriadebf5c2021-01-05 12:57:36 -08002071 auto presentFence4 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
2072 surfaceFrame4->setPresentState(SurfaceFrame::PresentState::Presented);
2073 mFrameTimeline->addSurfaceFrame(surfaceFrame4);
2074 presentFence4->signalForTest(fiveHundredMs);
2075 mFrameTimeline->setSfPresent(fiveHundredMs, presentFence4);
2076
2077 auto surfaceFrame5 =
2078 mFrameTimeline->createSurfaceFrameForToken(FrameTimelineInfo(), sPidOne, sUidOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +00002079 sLayerIdOne, sLayerNameOne, sLayerNameOne,
2080 /*isBuffer*/ true);
Alec Mouriadebf5c2021-01-05 12:57:36 -08002081 auto presentFence5 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
2082 // Dropped frames will be excluded from fps computation
2083 surfaceFrame5->setPresentState(SurfaceFrame::PresentState::Dropped);
2084 mFrameTimeline->addSurfaceFrame(surfaceFrame5);
2085 presentFence5->signalForTest(sixHundredMs);
2086 mFrameTimeline->setSfPresent(sixHundredMs, presentFence5);
2087
2088 EXPECT_EQ(mFrameTimeline->computeFps({sLayerIdOne}), 5.0f);
2089}
2090
Adithya Srinivasanf279e042020-08-17 14:56:27 -07002091} // namespace android::frametimeline