blob: 7e6141eaaa52729d4058568ce32146817174982e [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;
Alec Mouri9a29e672020-09-14 12:39:14 -070043
Adithya Srinivasanf279e042020-08-17 14:56:27 -070044namespace android::frametimeline {
45
46class FrameTimelineTest : public testing::Test {
47public:
48 FrameTimelineTest() {
49 const ::testing::TestInfo* const test_info =
50 ::testing::UnitTest::GetInstance()->current_test_info();
51 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
52 }
53
54 ~FrameTimelineTest() {
55 const ::testing::TestInfo* const test_info =
56 ::testing::UnitTest::GetInstance()->current_test_info();
57 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
58 }
59
Adithya Srinivasan01189672020-10-20 14:23:05 -070060 static void SetUpTestSuite() {
61 // Need to initialize tracing in process for testing, and only once per test suite.
62 perfetto::TracingInitArgs args;
63 args.backends = perfetto::kInProcessBackend;
64 perfetto::Tracing::Initialize(args);
65 }
66
Adithya Srinivasanf279e042020-08-17 14:56:27 -070067 void SetUp() override {
Alec Mouri9a29e672020-09-14 12:39:14 -070068 mTimeStats = std::make_shared<mock::TimeStats>();
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +000069 mFrameTimeline = std::make_unique<impl::FrameTimeline>(mTimeStats, kSurfaceFlingerPid,
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +000070 kTestThresholds, kHwcDuration);
Adithya Srinivasan01189672020-10-20 14:23:05 -070071 mFrameTimeline->registerDataSource();
Adithya Srinivasanf279e042020-08-17 14:56:27 -070072 mTokenManager = &mFrameTimeline->mTokenManager;
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +000073 mTraceCookieCounter = &mFrameTimeline->mTraceCookieCounter;
Adithya Srinivasan2d736322020-10-01 16:53:48 -070074 maxDisplayFrames = &mFrameTimeline->mMaxDisplayFrames;
Adithya Srinivasanf279e042020-08-17 14:56:27 -070075 maxTokenRetentionTime = mTokenManager->kMaxRetentionTime;
76 }
77
Adithya Srinivasan01189672020-10-20 14:23:05 -070078 // Each tracing session can be used for a single block of Start -> Stop.
79 static std::unique_ptr<perfetto::TracingSession> getTracingSessionForTest() {
80 perfetto::TraceConfig cfg;
81 cfg.set_duration_ms(500);
82 cfg.add_buffers()->set_size_kb(1024);
83 auto* ds_cfg = cfg.add_data_sources()->mutable_config();
84 ds_cfg->set_name(impl::FrameTimeline::kFrameTimelineDataSource);
85
86 auto tracingSession = perfetto::Tracing::NewTrace(perfetto::kInProcessBackend);
87 tracingSession->Setup(cfg);
88 return tracingSession;
89 }
90
91 std::vector<perfetto::protos::TracePacket> readFrameTimelinePacketsBlocking(
92 perfetto::TracingSession* tracingSession) {
93 std::vector<char> raw_trace = tracingSession->ReadTraceBlocking();
94 perfetto::protos::Trace trace;
95 EXPECT_TRUE(trace.ParseFromArray(raw_trace.data(), int(raw_trace.size())));
96
97 std::vector<perfetto::protos::TracePacket> packets;
98 for (const auto& packet : trace.packet()) {
99 if (!packet.has_frame_timeline_event()) {
100 continue;
101 }
102 packets.emplace_back(packet);
103 }
104 return packets;
105 }
106
107 void addEmptyDisplayFrame() {
108 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000109 // Trigger a flushPresentFence by calling setSfPresent for the next frame
Adithya Srinivasan01189672020-10-20 14:23:05 -0700110 mFrameTimeline->setSfPresent(2500, presentFence1);
111 }
112
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700113 void flushTokens(nsecs_t flushTime) {
114 std::lock_guard<std::mutex> lock(mTokenManager->mMutex);
115 mTokenManager->flushTokens(flushTime);
116 }
117
118 SurfaceFrame& getSurfaceFrame(size_t displayFrameIdx, size_t surfaceFrameIdx) {
119 std::lock_guard<std::mutex> lock(mFrameTimeline->mMutex);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800120 return *(mFrameTimeline->mDisplayFrames[displayFrameIdx]
121 ->getSurfaceFrames()[surfaceFrameIdx]);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700122 }
123
124 std::shared_ptr<impl::FrameTimeline::DisplayFrame> getDisplayFrame(size_t idx) {
125 std::lock_guard<std::mutex> lock(mFrameTimeline->mMutex);
126 return mFrameTimeline->mDisplayFrames[idx];
127 }
128
129 static bool compareTimelineItems(const TimelineItem& a, const TimelineItem& b) {
130 return a.startTime == b.startTime && a.endTime == b.endTime &&
131 a.presentTime == b.presentTime;
132 }
133
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000134 const std::map<int64_t, TokenManagerPrediction>& getPredictions() const {
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700135 return mTokenManager->mPredictions;
136 }
137
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000138 uint32_t getNumberOfDisplayFrames() const {
Adithya Srinivasan2d736322020-10-01 16:53:48 -0700139 std::lock_guard<std::mutex> lock(mFrameTimeline->mMutex);
140 return static_cast<uint32_t>(mFrameTimeline->mDisplayFrames.size());
141 }
142
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000143 int64_t snoopCurrentTraceCookie() const { return mTraceCookieCounter->mTraceCookie; }
144
145 void flushTrace() {
146 using FrameTimelineDataSource = impl::FrameTimeline::FrameTimelineDataSource;
147 FrameTimelineDataSource::Trace(
148 [&](FrameTimelineDataSource::TraceContext ctx) { ctx.Flush(); });
149 }
150
Alec Mouri9a29e672020-09-14 12:39:14 -0700151 std::shared_ptr<mock::TimeStats> mTimeStats;
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700152 std::unique_ptr<impl::FrameTimeline> mFrameTimeline;
153 impl::TokenManager* mTokenManager;
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000154 TraceCookieCounter* mTraceCookieCounter;
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700155 FenceToFenceTimeMap fenceFactory;
Adithya Srinivasan2d736322020-10-01 16:53:48 -0700156 uint32_t* maxDisplayFrames;
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700157 nsecs_t maxTokenRetentionTime;
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000158 static constexpr pid_t kSurfaceFlingerPid = 666;
Adithya Srinivasanead17162021-02-18 02:17:37 +0000159 static constexpr nsecs_t kPresentThreshold = std::chrono::nanoseconds(2ns).count();
160 static constexpr nsecs_t kDeadlineThreshold = std::chrono::nanoseconds(2ns).count();
161 static constexpr nsecs_t kStartThreshold = std::chrono::nanoseconds(2ns).count();
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800162 static constexpr JankClassificationThresholds kTestThresholds{kPresentThreshold,
163 kDeadlineThreshold,
164 kStartThreshold};
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000165 static constexpr nsecs_t kHwcDuration = std::chrono::nanoseconds(3ns).count();
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,
195 sLayerNameOne, sLayerNameOne);
196 auto surfaceFrame2 =
197 mFrameTimeline->createSurfaceFrameForToken({}, sPidTwo, sUidOne, sLayerIdOne,
198 sLayerNameOne, sLayerNameOne);
Adithya Srinivasan9febda82020-10-19 10:49:41 -0700199 EXPECT_EQ(surfaceFrame1->getOwnerPid(), sPidOne);
200 EXPECT_EQ(surfaceFrame2->getOwnerPid(), sPidTwo);
201}
202
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700203TEST_F(FrameTimelineTest, createSurfaceFrameForToken_noToken) {
Alec Mouriadebf5c2021-01-05 12:57:36 -0800204 auto surfaceFrame =
205 mFrameTimeline->createSurfaceFrameForToken({}, sPidOne, sUidOne, sLayerIdOne,
206 sLayerNameOne, sLayerNameOne);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700207 EXPECT_EQ(surfaceFrame->getPredictionState(), PredictionState::None);
208}
209
210TEST_F(FrameTimelineTest, createSurfaceFrameForToken_expiredToken) {
211 int64_t token1 = mTokenManager->generateTokenForPredictions({0, 0, 0});
212 flushTokens(systemTime() + maxTokenRetentionTime);
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000213 auto surfaceFrame =
214 mFrameTimeline->createSurfaceFrameForToken({token1, sInputEventId}, sPidOne, sUidOne,
Alec Mouriadebf5c2021-01-05 12:57:36 -0800215 sLayerIdOne, sLayerNameOne, sLayerNameOne);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700216
217 EXPECT_EQ(surfaceFrame->getPredictionState(), PredictionState::Expired);
218}
219
220TEST_F(FrameTimelineTest, createSurfaceFrameForToken_validToken) {
221 int64_t token1 = mTokenManager->generateTokenForPredictions({10, 20, 30});
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000222 auto surfaceFrame =
223 mFrameTimeline->createSurfaceFrameForToken({token1, sInputEventId}, sPidOne, sUidOne,
Alec Mouriadebf5c2021-01-05 12:57:36 -0800224 sLayerIdOne, sLayerNameOne, sLayerNameOne);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700225
226 EXPECT_EQ(surfaceFrame->getPredictionState(), PredictionState::Valid);
227 EXPECT_EQ(compareTimelineItems(surfaceFrame->getPredictions(), TimelineItem(10, 20, 30)), true);
228}
229
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000230TEST_F(FrameTimelineTest, createSurfaceFrameForToken_validInputEventId) {
231 int64_t token1 = mTokenManager->generateTokenForPredictions({10, 20, 30});
232 constexpr int32_t inputEventId = 1;
233 auto surfaceFrame =
234 mFrameTimeline->createSurfaceFrameForToken({token1, inputEventId}, sPidOne, sUidOne,
Alec Mouriadebf5c2021-01-05 12:57:36 -0800235 sLayerIdOne, sLayerNameOne, sLayerNameOne);
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000236
237 EXPECT_EQ(inputEventId, surfaceFrame->getInputEventId());
238}
239
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700240TEST_F(FrameTimelineTest, presentFenceSignaled_droppedFramesNotUpdated) {
241 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700242 int64_t token1 = mTokenManager->generateTokenForPredictions({10, 20, 30});
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000243 auto surfaceFrame1 =
244 mFrameTimeline->createSurfaceFrameForToken({token1, sInputEventId}, sPidOne, sUidOne,
Alec Mouriadebf5c2021-01-05 12:57:36 -0800245 sLayerIdOne, sLayerNameOne, sLayerNameOne);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700246
247 // Set up the display frame
Alec Mouri7d436ec2021-01-27 20:40:50 -0800248 mFrameTimeline->setSfWakeUp(token1, 20, Fps::fromPeriodNsecs(11));
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000249 surfaceFrame1->setDropTime(12);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800250 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Dropped);
251 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700252 mFrameTimeline->setSfPresent(25, presentFence1);
253 presentFence1->signalForTest(30);
254
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000255 addEmptyDisplayFrame();
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700256
257 auto& droppedSurfaceFrame = getSurfaceFrame(0, 0);
258 EXPECT_EQ(droppedSurfaceFrame.getPresentState(), SurfaceFrame::PresentState::Dropped);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000259 EXPECT_EQ(0u, droppedSurfaceFrame.getActuals().endTime);
260 EXPECT_EQ(12u, droppedSurfaceFrame.getDropTime());
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700261 EXPECT_EQ(droppedSurfaceFrame.getActuals().presentTime, 0);
262}
263
264TEST_F(FrameTimelineTest, presentFenceSignaled_presentedFramesUpdated) {
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800265 // Layer specific increment
Alec Mouri363faf02021-01-29 16:34:55 -0800266 EXPECT_CALL(*mTimeStats, incrementJankyFrames(_)).Times(2);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700267 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
268 int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions({10, 20, 30});
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700269 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({22, 26, 30});
Alec Mouri9a29e672020-09-14 12:39:14 -0700270 auto surfaceFrame1 =
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000271 mFrameTimeline->createSurfaceFrameForToken({surfaceFrameToken1, sInputEventId}, sPidOne,
Alec Mouriadebf5c2021-01-05 12:57:36 -0800272 sUidOne, sLayerIdOne, sLayerNameOne,
273 sLayerNameOne);
Alec Mouri9a29e672020-09-14 12:39:14 -0700274 auto surfaceFrame2 =
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000275 mFrameTimeline->createSurfaceFrameForToken({surfaceFrameToken1, sInputEventId}, sPidOne,
Alec Mouriadebf5c2021-01-05 12:57:36 -0800276 sUidOne, sLayerIdTwo, sLayerNameTwo,
277 sLayerNameTwo);
Alec Mouri7d436ec2021-01-27 20:40:50 -0800278 mFrameTimeline->setSfWakeUp(sfToken1, 22, Fps::fromPeriodNsecs(11));
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800279 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
280 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
281 surfaceFrame2->setPresentState(SurfaceFrame::PresentState::Presented);
282 mFrameTimeline->addSurfaceFrame(surfaceFrame2);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700283 mFrameTimeline->setSfPresent(26, presentFence1);
284 auto displayFrame = getDisplayFrame(0);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800285 auto& presentedSurfaceFrame1 = getSurfaceFrame(0, 0);
286 auto& presentedSurfaceFrame2 = getSurfaceFrame(0, 1);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700287 presentFence1->signalForTest(42);
288
289 // Fences haven't been flushed yet, so it should be 0
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800290 EXPECT_EQ(displayFrame->getActuals().presentTime, 0);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700291 EXPECT_EQ(presentedSurfaceFrame1.getActuals().presentTime, 0);
292 EXPECT_EQ(presentedSurfaceFrame2.getActuals().presentTime, 0);
293
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000294 addEmptyDisplayFrame();
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700295
296 // Fences have flushed, so the present timestamps should be updated
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800297 EXPECT_EQ(displayFrame->getActuals().presentTime, 42);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700298 EXPECT_EQ(presentedSurfaceFrame1.getActuals().presentTime, 42);
299 EXPECT_EQ(presentedSurfaceFrame2.getActuals().presentTime, 42);
Jorim Jaggi9c03b502020-11-24 23:51:31 +0100300 EXPECT_NE(surfaceFrame1->getJankType(), std::nullopt);
301 EXPECT_NE(surfaceFrame2->getJankType(), std::nullopt);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700302}
303
304TEST_F(FrameTimelineTest, displayFramesSlidingWindowMovesAfterLimit) {
305 // Insert kMaxDisplayFrames' count of DisplayFrames to fill the deque
306 int frameTimeFactor = 0;
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800307 // Layer specific increment
Alec Mouri363faf02021-01-29 16:34:55 -0800308 EXPECT_CALL(*mTimeStats, incrementJankyFrames(_))
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800309 .Times(static_cast<int32_t>(*maxDisplayFrames));
Adithya Srinivasan2d736322020-10-01 16:53:48 -0700310 for (size_t i = 0; i < *maxDisplayFrames; i++) {
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700311 auto presentFence = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
312 int64_t surfaceFrameToken = mTokenManager->generateTokenForPredictions(
313 {10 + frameTimeFactor, 20 + frameTimeFactor, 30 + frameTimeFactor});
314 int64_t sfToken = mTokenManager->generateTokenForPredictions(
315 {22 + frameTimeFactor, 26 + frameTimeFactor, 30 + frameTimeFactor});
Alec Mouri9a29e672020-09-14 12:39:14 -0700316 auto surfaceFrame =
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000317 mFrameTimeline->createSurfaceFrameForToken({surfaceFrameToken, sInputEventId},
Alec Mouriadebf5c2021-01-05 12:57:36 -0800318 sPidOne, sUidOne, sLayerIdOne,
319 sLayerNameOne, sLayerNameOne);
Alec Mouri7d436ec2021-01-27 20:40:50 -0800320 mFrameTimeline->setSfWakeUp(sfToken, 22 + frameTimeFactor, Fps::fromPeriodNsecs(11));
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800321 surfaceFrame->setPresentState(SurfaceFrame::PresentState::Presented);
322 mFrameTimeline->addSurfaceFrame(surfaceFrame);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700323 mFrameTimeline->setSfPresent(27 + frameTimeFactor, presentFence);
324 presentFence->signalForTest(32 + frameTimeFactor);
325 frameTimeFactor += 30;
326 }
327 auto displayFrame0 = getDisplayFrame(0);
328
329 // The 0th Display Frame should have actuals 22, 27, 32
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800330 EXPECT_EQ(compareTimelineItems(displayFrame0->getActuals(), TimelineItem(22, 27, 32)), true);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700331
332 // Add one more display frame
333 auto presentFence = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
334 int64_t surfaceFrameToken = mTokenManager->generateTokenForPredictions(
335 {10 + frameTimeFactor, 20 + frameTimeFactor, 30 + frameTimeFactor});
336 int64_t sfToken = mTokenManager->generateTokenForPredictions(
337 {22 + frameTimeFactor, 26 + frameTimeFactor, 30 + frameTimeFactor});
Alec Mouri9a29e672020-09-14 12:39:14 -0700338 auto surfaceFrame =
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000339 mFrameTimeline->createSurfaceFrameForToken({surfaceFrameToken, sInputEventId}, sPidOne,
Alec Mouriadebf5c2021-01-05 12:57:36 -0800340 sUidOne, sLayerIdOne, sLayerNameOne,
341 sLayerNameOne);
Alec Mouri7d436ec2021-01-27 20:40:50 -0800342 mFrameTimeline->setSfWakeUp(sfToken, 22 + frameTimeFactor, Fps::fromPeriodNsecs(11));
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800343 surfaceFrame->setPresentState(SurfaceFrame::PresentState::Presented);
344 mFrameTimeline->addSurfaceFrame(surfaceFrame);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700345 mFrameTimeline->setSfPresent(27 + frameTimeFactor, presentFence);
346 presentFence->signalForTest(32 + frameTimeFactor);
347 displayFrame0 = getDisplayFrame(0);
348
349 // The window should have slided by 1 now and the previous 0th display frame
350 // should have been removed from the deque
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800351 EXPECT_EQ(compareTimelineItems(displayFrame0->getActuals(), TimelineItem(52, 57, 62)), true);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700352}
353
Ady Abraham7f8a1e62020-09-28 16:09:35 -0700354TEST_F(FrameTimelineTest, surfaceFrameEndTimeAcquireFenceAfterQueue) {
Alec Mouriadebf5c2021-01-05 12:57:36 -0800355 auto surfaceFrame = mFrameTimeline->createSurfaceFrameForToken({}, sPidOne, 0, sLayerIdOne,
356 "acquireFenceAfterQueue",
357 "acquireFenceAfterQueue");
Ady Abraham7f8a1e62020-09-28 16:09:35 -0700358 surfaceFrame->setActualQueueTime(123);
359 surfaceFrame->setAcquireFenceTime(456);
360 EXPECT_EQ(surfaceFrame->getActuals().endTime, 456);
361}
362
363TEST_F(FrameTimelineTest, surfaceFrameEndTimeAcquireFenceBeforeQueue) {
Alec Mouriadebf5c2021-01-05 12:57:36 -0800364 auto surfaceFrame = mFrameTimeline->createSurfaceFrameForToken({}, sPidOne, 0, sLayerIdOne,
365 "acquireFenceAfterQueue",
366 "acquireFenceAfterQueue");
Ady Abraham7f8a1e62020-09-28 16:09:35 -0700367 surfaceFrame->setActualQueueTime(456);
368 surfaceFrame->setAcquireFenceTime(123);
369 EXPECT_EQ(surfaceFrame->getActuals().endTime, 456);
370}
371
Adithya Srinivasan2d736322020-10-01 16:53:48 -0700372TEST_F(FrameTimelineTest, setMaxDisplayFramesSetsSizeProperly) {
373 auto presentFence = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
374 presentFence->signalForTest(2);
375
376 // Size shouldn't exceed maxDisplayFrames - 64
377 for (size_t i = 0; i < *maxDisplayFrames + 10; i++) {
Adithya Srinivasan9febda82020-10-19 10:49:41 -0700378 auto surfaceFrame =
Alec Mouriadebf5c2021-01-05 12:57:36 -0800379 mFrameTimeline->createSurfaceFrameForToken({}, sPidOne, sUidOne, sLayerIdOne,
380 sLayerNameOne, sLayerNameOne);
Adithya Srinivasan2d736322020-10-01 16:53:48 -0700381 int64_t sfToken = mTokenManager->generateTokenForPredictions({22, 26, 30});
Alec Mouri7d436ec2021-01-27 20:40:50 -0800382 mFrameTimeline->setSfWakeUp(sfToken, 22, Fps::fromPeriodNsecs(11));
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800383 surfaceFrame->setPresentState(SurfaceFrame::PresentState::Presented);
384 mFrameTimeline->addSurfaceFrame(surfaceFrame);
Adithya Srinivasan2d736322020-10-01 16:53:48 -0700385 mFrameTimeline->setSfPresent(27, presentFence);
386 }
387 EXPECT_EQ(getNumberOfDisplayFrames(), *maxDisplayFrames);
388
389 // Increase the size to 256
390 mFrameTimeline->setMaxDisplayFrames(256);
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000391 EXPECT_EQ(*maxDisplayFrames, 256u);
Adithya Srinivasan2d736322020-10-01 16:53:48 -0700392
393 for (size_t i = 0; i < *maxDisplayFrames + 10; i++) {
Adithya Srinivasan9febda82020-10-19 10:49:41 -0700394 auto surfaceFrame =
Alec Mouriadebf5c2021-01-05 12:57:36 -0800395 mFrameTimeline->createSurfaceFrameForToken({}, sPidOne, sUidOne, sLayerIdOne,
396 sLayerNameOne, sLayerNameOne);
Adithya Srinivasan2d736322020-10-01 16:53:48 -0700397 int64_t sfToken = mTokenManager->generateTokenForPredictions({22, 26, 30});
Alec Mouri7d436ec2021-01-27 20:40:50 -0800398 mFrameTimeline->setSfWakeUp(sfToken, 22, Fps::fromPeriodNsecs(11));
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800399 surfaceFrame->setPresentState(SurfaceFrame::PresentState::Presented);
400 mFrameTimeline->addSurfaceFrame(surfaceFrame);
Adithya Srinivasan2d736322020-10-01 16:53:48 -0700401 mFrameTimeline->setSfPresent(27, presentFence);
402 }
403 EXPECT_EQ(getNumberOfDisplayFrames(), *maxDisplayFrames);
404
405 // Shrink the size to 128
406 mFrameTimeline->setMaxDisplayFrames(128);
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000407 EXPECT_EQ(*maxDisplayFrames, 128u);
Adithya Srinivasan2d736322020-10-01 16:53:48 -0700408
409 for (size_t i = 0; i < *maxDisplayFrames + 10; i++) {
Adithya Srinivasan9febda82020-10-19 10:49:41 -0700410 auto surfaceFrame =
Alec Mouriadebf5c2021-01-05 12:57:36 -0800411 mFrameTimeline->createSurfaceFrameForToken({}, sPidOne, sUidOne, sLayerIdOne,
412 sLayerNameOne, sLayerNameOne);
Adithya Srinivasan2d736322020-10-01 16:53:48 -0700413 int64_t sfToken = mTokenManager->generateTokenForPredictions({22, 26, 30});
Alec Mouri7d436ec2021-01-27 20:40:50 -0800414 mFrameTimeline->setSfWakeUp(sfToken, 22, Fps::fromPeriodNsecs(11));
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800415 surfaceFrame->setPresentState(SurfaceFrame::PresentState::Presented);
416 mFrameTimeline->addSurfaceFrame(surfaceFrame);
Adithya Srinivasan2d736322020-10-01 16:53:48 -0700417 mFrameTimeline->setSfPresent(27, presentFence);
418 }
419 EXPECT_EQ(getNumberOfDisplayFrames(), *maxDisplayFrames);
420}
Alec Mouri9a29e672020-09-14 12:39:14 -0700421
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800422// Tests related to TimeStats
Alec Mouri9a29e672020-09-14 12:39:14 -0700423TEST_F(FrameTimelineTest, presentFenceSignaled_reportsLongSfCpu) {
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000424 Fps refreshRate = Fps::fromPeriodNsecs(11);
425 // Deadline delta is 2ms because, sf's adjusted deadline is 60 - composerTime(3) = 57ms.
Alec Mouri9a29e672020-09-14 12:39:14 -0700426 EXPECT_CALL(*mTimeStats,
Alec Mouri363faf02021-01-29 16:34:55 -0800427 incrementJankyFrames(
428 TimeStats::JankyFramesInfo{refreshRate, std::nullopt, sUidOne,
429 sLayerNameOne,
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000430 JankType::SurfaceFlingerCpuDeadlineMissed, 2, 10,
Alec Mouri363faf02021-01-29 16:34:55 -0800431 0}));
Alec Mouri9a29e672020-09-14 12:39:14 -0700432 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000433 int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions({10, 20, 60});
434 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({52, 60, 60});
435
Alec Mouri9a29e672020-09-14 12:39:14 -0700436 auto surfaceFrame1 =
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000437 mFrameTimeline->createSurfaceFrameForToken({surfaceFrameToken1, sInputEventId}, sPidOne,
Alec Mouriadebf5c2021-01-05 12:57:36 -0800438 sUidOne, sLayerIdOne, sLayerNameOne,
439 sLayerNameOne);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000440 mFrameTimeline->setSfWakeUp(sfToken1, 52, refreshRate);
441 surfaceFrame1->setAcquireFenceTime(20);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800442 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
443 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000444 presentFence1->signalForTest(70);
Alec Mouri9a29e672020-09-14 12:39:14 -0700445
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000446 mFrameTimeline->setSfPresent(59, presentFence1);
Alec Mouri9a29e672020-09-14 12:39:14 -0700447}
448
449TEST_F(FrameTimelineTest, presentFenceSignaled_reportsDisplayMiss) {
Alec Mouri363faf02021-01-29 16:34:55 -0800450 Fps refreshRate = Fps::fromPeriodNsecs(30);
Alec Mouri9a29e672020-09-14 12:39:14 -0700451 EXPECT_CALL(*mTimeStats,
Alec Mouri363faf02021-01-29 16:34:55 -0800452 incrementJankyFrames(TimeStats::JankyFramesInfo{refreshRate, std::nullopt, sUidOne,
453 sLayerNameOne, JankType::DisplayHAL,
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000454 -1, 0, 0}));
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800455
Alec Mouri9a29e672020-09-14 12:39:14 -0700456 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000457 int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions({10, 20, 60});
458 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({52, 60, 60});
459
Alec Mouri9a29e672020-09-14 12:39:14 -0700460 auto surfaceFrame1 =
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000461 mFrameTimeline->createSurfaceFrameForToken({surfaceFrameToken1, sInputEventId}, sPidOne,
Alec Mouriadebf5c2021-01-05 12:57:36 -0800462 sUidOne, sLayerIdOne, sLayerNameOne,
463 sLayerNameOne);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000464 mFrameTimeline->setSfWakeUp(sfToken1, 52, refreshRate);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800465 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000466 surfaceFrame1->setAcquireFenceTime(20);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800467 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000468 presentFence1->signalForTest(90);
469 mFrameTimeline->setSfPresent(56, presentFence1);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800470 EXPECT_EQ(surfaceFrame1->getJankType(), JankType::DisplayHAL);
Alec Mouri9a29e672020-09-14 12:39:14 -0700471}
472
473TEST_F(FrameTimelineTest, presentFenceSignaled_reportsAppMiss) {
Alec Mouri363faf02021-01-29 16:34:55 -0800474 Fps refreshRate = Fps(11.0);
Alec Mouri9a29e672020-09-14 12:39:14 -0700475 EXPECT_CALL(*mTimeStats,
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000476 incrementJankyFrames(TimeStats::JankyFramesInfo{refreshRate, std::nullopt, sUidOne,
477 sLayerNameOne,
478 JankType::AppDeadlineMissed, -1, 0,
479 25}));
Alec Mouri9a29e672020-09-14 12:39:14 -0700480 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000481 int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions({10, 20, 60});
482 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({82, 90, 90});
483
Alec Mouri9a29e672020-09-14 12:39:14 -0700484 auto surfaceFrame1 =
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000485 mFrameTimeline->createSurfaceFrameForToken({surfaceFrameToken1, sInputEventId}, sPidOne,
Alec Mouriadebf5c2021-01-05 12:57:36 -0800486 sUidOne, sLayerIdOne, sLayerNameOne,
487 sLayerNameOne);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000488 surfaceFrame1->setAcquireFenceTime(45);
489 mFrameTimeline->setSfWakeUp(sfToken1, 52, refreshRate);
Alec Mouri9a29e672020-09-14 12:39:14 -0700490
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800491 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
492 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000493 presentFence1->signalForTest(90);
494 mFrameTimeline->setSfPresent(86, presentFence1);
Jorim Jaggi9c03b502020-11-24 23:51:31 +0100495
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800496 EXPECT_EQ(surfaceFrame1->getJankType(), JankType::AppDeadlineMissed);
Alec Mouri9a29e672020-09-14 12:39:14 -0700497}
498
Adithya Srinivasanead17162021-02-18 02:17:37 +0000499TEST_F(FrameTimelineTest, presentFenceSignaled_reportsSfScheduling) {
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000500 Fps refreshRate = Fps::fromPeriodNsecs(32);
Adithya Srinivasanead17162021-02-18 02:17:37 +0000501 EXPECT_CALL(*mTimeStats,
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000502 incrementJankyFrames(TimeStats::JankyFramesInfo{refreshRate, std::nullopt, sUidOne,
503 sLayerNameOne,
504 JankType::SurfaceFlingerScheduling,
505 -1, 0, -10}));
Adithya Srinivasanead17162021-02-18 02:17:37 +0000506 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000507 int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions({40, 60, 92});
508 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({52, 60, 60});
509
Adithya Srinivasanead17162021-02-18 02:17:37 +0000510 auto surfaceFrame1 =
511 mFrameTimeline->createSurfaceFrameForToken({surfaceFrameToken1, sInputEventId}, sPidOne,
Alec Mouriadebf5c2021-01-05 12:57:36 -0800512 sUidOne, sLayerIdOne, sLayerNameOne,
513 sLayerNameOne);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000514 surfaceFrame1->setAcquireFenceTime(50);
515 mFrameTimeline->setSfWakeUp(sfToken1, 52, refreshRate);
Adithya Srinivasanead17162021-02-18 02:17:37 +0000516
517 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
518 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000519 presentFence1->signalForTest(60);
520 mFrameTimeline->setSfPresent(56, presentFence1);
Adithya Srinivasanead17162021-02-18 02:17:37 +0000521
522 EXPECT_EQ(surfaceFrame1->getJankType(), JankType::SurfaceFlingerScheduling);
523}
524
525TEST_F(FrameTimelineTest, presentFenceSignaled_reportsSfPredictionError) {
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000526 Fps refreshRate = Fps::fromPeriodNsecs(16);
Adithya Srinivasanead17162021-02-18 02:17:37 +0000527 EXPECT_CALL(*mTimeStats,
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000528 incrementJankyFrames(TimeStats::JankyFramesInfo{refreshRate, std::nullopt, sUidOne,
529 sLayerNameOne,
530 JankType::PredictionError, -1, 5,
531 0}));
Adithya Srinivasanead17162021-02-18 02:17:37 +0000532 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000533 int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions({30, 40, 60});
534 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({52, 60, 60});
535
Adithya Srinivasanead17162021-02-18 02:17:37 +0000536 auto surfaceFrame1 =
537 mFrameTimeline->createSurfaceFrameForToken({surfaceFrameToken1, sInputEventId}, sPidOne,
Alec Mouriadebf5c2021-01-05 12:57:36 -0800538 sUidOne, sLayerIdOne, sLayerNameOne,
539 sLayerNameOne);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000540 surfaceFrame1->setAcquireFenceTime(40);
541 mFrameTimeline->setSfWakeUp(sfToken1, 52, refreshRate);
Adithya Srinivasanead17162021-02-18 02:17:37 +0000542
543 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
544 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000545 presentFence1->signalForTest(65);
546 mFrameTimeline->setSfPresent(56, presentFence1);
Adithya Srinivasanead17162021-02-18 02:17:37 +0000547
548 EXPECT_EQ(surfaceFrame1->getJankType(), JankType::PredictionError);
549}
550
551TEST_F(FrameTimelineTest, presentFenceSignaled_reportsAppBufferStuffing) {
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000552 Fps refreshRate = Fps::fromPeriodNsecs(32);
Adithya Srinivasanead17162021-02-18 02:17:37 +0000553 EXPECT_CALL(*mTimeStats,
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000554 incrementJankyFrames(TimeStats::JankyFramesInfo{refreshRate, std::nullopt, sUidOne,
555 sLayerNameOne,
556 JankType::BufferStuffing, -1, 0,
557 0}));
Adithya Srinivasanead17162021-02-18 02:17:37 +0000558 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000559 int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions({30, 40, 58});
560 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({82, 90, 90});
561
Adithya Srinivasanead17162021-02-18 02:17:37 +0000562 auto surfaceFrame1 =
563 mFrameTimeline->createSurfaceFrameForToken({surfaceFrameToken1, sInputEventId}, sPidOne,
Alec Mouriadebf5c2021-01-05 12:57:36 -0800564 sUidOne, sLayerIdOne, sLayerNameOne,
565 sLayerNameOne);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000566 surfaceFrame1->setAcquireFenceTime(40);
567 mFrameTimeline->setSfWakeUp(sfToken1, 82, refreshRate);
Adithya Srinivasanead17162021-02-18 02:17:37 +0000568
569 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented,
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000570 /*previousLatchTime*/ 56);
Adithya Srinivasanead17162021-02-18 02:17:37 +0000571 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000572 presentFence1->signalForTest(90);
573 mFrameTimeline->setSfPresent(86, presentFence1);
Adithya Srinivasanead17162021-02-18 02:17:37 +0000574
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000575 EXPECT_EQ(surfaceFrame1->getJankType(), JankType::BufferStuffing);
Adithya Srinivasanead17162021-02-18 02:17:37 +0000576}
577
Alec Mouri363faf02021-01-29 16:34:55 -0800578TEST_F(FrameTimelineTest, presentFenceSignaled_reportsAppMissWithRenderRate) {
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000579 Fps refreshRate = Fps::fromPeriodNsecs(11);
580 Fps renderRate = Fps::fromPeriodNsecs(30);
Alec Mouri363faf02021-01-29 16:34:55 -0800581 EXPECT_CALL(*mTimeStats,
582 incrementJankyFrames(
583 TimeStats::JankyFramesInfo{refreshRate, renderRate, sUidOne, sLayerNameOne,
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000584 JankType::AppDeadlineMissed, -1, 0, 25}));
Alec Mouri363faf02021-01-29 16:34:55 -0800585 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000586 int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions({10, 20, 60});
587 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({82, 90, 90});
588
Alec Mouri363faf02021-01-29 16:34:55 -0800589 auto surfaceFrame1 =
590 mFrameTimeline->createSurfaceFrameForToken({surfaceFrameToken1, sInputEventId}, sPidOne,
Alec Mouriadebf5c2021-01-05 12:57:36 -0800591 sUidOne, sLayerIdOne, sLayerNameOne,
592 sLayerNameOne);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000593 surfaceFrame1->setAcquireFenceTime(45);
594 mFrameTimeline->setSfWakeUp(sfToken1, 52, refreshRate);
Alec Mouri363faf02021-01-29 16:34:55 -0800595
596 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
597 surfaceFrame1->setRenderRate(renderRate);
598 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000599 presentFence1->signalForTest(90);
600 mFrameTimeline->setSfPresent(86, presentFence1);
Alec Mouri363faf02021-01-29 16:34:55 -0800601
602 EXPECT_EQ(surfaceFrame1->getJankType(), JankType::AppDeadlineMissed);
603}
604
Adithya Srinivasan01189672020-10-20 14:23:05 -0700605/*
606 * Tracing Tests
607 *
608 * Trace packets are flushed all the way only when the next packet is traced.
609 * For example: trace<Display/Surface>Frame() will create a TracePacket but not flush it. Only when
610 * another TracePacket is created, the previous one is guaranteed to be flushed. The following tests
611 * will have additional empty frames created for this reason.
612 */
613TEST_F(FrameTimelineTest, tracing_noPacketsSentWithoutTraceStart) {
614 auto tracingSession = getTracingSessionForTest();
615 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan01189672020-10-20 14:23:05 -0700616 int64_t token1 = mTokenManager->generateTokenForPredictions({10, 20, 30});
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000617 auto surfaceFrame1 =
618 mFrameTimeline->createSurfaceFrameForToken({token1, sInputEventId}, sPidOne, sUidOne,
Alec Mouriadebf5c2021-01-05 12:57:36 -0800619 sLayerIdOne, sLayerNameOne, sLayerNameOne);
Adithya Srinivasan01189672020-10-20 14:23:05 -0700620
621 // Set up the display frame
Alec Mouri7d436ec2021-01-27 20:40:50 -0800622 mFrameTimeline->setSfWakeUp(token1, 20, Fps::fromPeriodNsecs(11));
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800623 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Dropped);
624 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
Adithya Srinivasan01189672020-10-20 14:23:05 -0700625 mFrameTimeline->setSfPresent(25, presentFence1);
626 presentFence1->signalForTest(30);
627
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000628 addEmptyDisplayFrame();
Adithya Srinivasan01189672020-10-20 14:23:05 -0700629
630 auto packets = readFrameTimelinePacketsBlocking(tracingSession.get());
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000631 EXPECT_EQ(packets.size(), 0u);
Adithya Srinivasan01189672020-10-20 14:23:05 -0700632}
633
634TEST_F(FrameTimelineTest, tracing_sanityTest) {
635 auto tracingSession = getTracingSessionForTest();
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800636 // Layer specific increment
Alec Mouri363faf02021-01-29 16:34:55 -0800637 EXPECT_CALL(*mTimeStats, incrementJankyFrames(_));
Adithya Srinivasan01189672020-10-20 14:23:05 -0700638 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan01189672020-10-20 14:23:05 -0700639
640 tracingSession->StartBlocking();
641 int64_t token1 = mTokenManager->generateTokenForPredictions({10, 20, 30});
642 int64_t token2 = mTokenManager->generateTokenForPredictions({40, 50, 60});
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000643 auto surfaceFrame1 =
644 mFrameTimeline->createSurfaceFrameForToken({token1, sInputEventId}, sPidOne, sUidOne,
Alec Mouriadebf5c2021-01-05 12:57:36 -0800645 sLayerIdOne, sLayerNameOne, sLayerNameOne);
Adithya Srinivasan01189672020-10-20 14:23:05 -0700646
647 // Set up the display frame
Alec Mouri7d436ec2021-01-27 20:40:50 -0800648 mFrameTimeline->setSfWakeUp(token2, 20, Fps::fromPeriodNsecs(11));
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800649 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
650 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
Adithya Srinivasan01189672020-10-20 14:23:05 -0700651 mFrameTimeline->setSfPresent(25, presentFence1);
652 presentFence1->signalForTest(30);
653
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000654 addEmptyDisplayFrame();
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000655 flushTrace();
Adithya Srinivasan01189672020-10-20 14:23:05 -0700656 tracingSession->StopBlocking();
657
658 auto packets = readFrameTimelinePacketsBlocking(tracingSession.get());
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000659 // Display Frame 1 has 8 packets - 4 from DisplayFrame and 4 from SurfaceFrame.
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000660 EXPECT_EQ(packets.size(), 8u);
Adithya Srinivasan01189672020-10-20 14:23:05 -0700661}
662
663TEST_F(FrameTimelineTest, traceDisplayFrame_invalidTokenDoesNotEmitTracePacket) {
664 auto tracingSession = getTracingSessionForTest();
665 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan01189672020-10-20 14:23:05 -0700666
667 tracingSession->StartBlocking();
Adithya Srinivasan01189672020-10-20 14:23:05 -0700668
669 // Set up the display frame
Alec Mouri7d436ec2021-01-27 20:40:50 -0800670 mFrameTimeline->setSfWakeUp(-1, 20, Fps::fromPeriodNsecs(11));
Adithya Srinivasan01189672020-10-20 14:23:05 -0700671 mFrameTimeline->setSfPresent(25, presentFence1);
672 presentFence1->signalForTest(30);
673
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000674 addEmptyDisplayFrame();
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000675 flushTrace();
Adithya Srinivasan01189672020-10-20 14:23:05 -0700676 tracingSession->StopBlocking();
677
678 auto packets = readFrameTimelinePacketsBlocking(tracingSession.get());
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000679 EXPECT_EQ(packets.size(), 0u);
Adithya Srinivasan01189672020-10-20 14:23:05 -0700680}
681
682TEST_F(FrameTimelineTest, traceSurfaceFrame_invalidTokenDoesNotEmitTracePacket) {
683 auto tracingSession = getTracingSessionForTest();
684 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan01189672020-10-20 14:23:05 -0700685
686 tracingSession->StartBlocking();
687 int64_t token1 = mTokenManager->generateTokenForPredictions({10, 20, 30});
Alec Mouriadebf5c2021-01-05 12:57:36 -0800688 auto surfaceFrame1 =
689 mFrameTimeline->createSurfaceFrameForToken({}, sPidOne, sUidOne, sLayerIdOne,
690 sLayerNameOne, sLayerNameOne);
Adithya Srinivasan01189672020-10-20 14:23:05 -0700691
692 // Set up the display frame
Alec Mouri7d436ec2021-01-27 20:40:50 -0800693 mFrameTimeline->setSfWakeUp(token1, 20, Fps::fromPeriodNsecs(11));
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800694 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Dropped);
695 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
Adithya Srinivasan01189672020-10-20 14:23:05 -0700696 mFrameTimeline->setSfPresent(25, presentFence1);
697 presentFence1->signalForTest(30);
698
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000699 addEmptyDisplayFrame();
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000700 flushTrace();
Adithya Srinivasan01189672020-10-20 14:23:05 -0700701 tracingSession->StopBlocking();
702
703 auto packets = readFrameTimelinePacketsBlocking(tracingSession.get());
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000704 // Display Frame 1 has 4 packets (SurfaceFrame shouldn't be traced since it has an invalid
705 // token).
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000706 EXPECT_EQ(packets.size(), 4u);
Adithya Srinivasan01189672020-10-20 14:23:05 -0700707}
708
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000709ProtoExpectedDisplayFrameStart createProtoExpectedDisplayFrameStart(int64_t cookie, int64_t token,
710 pid_t pid) {
711 ProtoExpectedDisplayFrameStart proto;
712 proto.set_cookie(cookie);
713 proto.set_token(token);
714 proto.set_pid(pid);
715 return proto;
716}
717
718ProtoActualDisplayFrameStart createProtoActualDisplayFrameStart(
719 int64_t cookie, int64_t token, pid_t pid, ProtoPresentType presentType, bool onTimeFinish,
720 bool gpuComposition, ProtoJankType jankType) {
721 ProtoActualDisplayFrameStart proto;
722 proto.set_cookie(cookie);
723 proto.set_token(token);
724 proto.set_pid(pid);
725 proto.set_present_type(presentType);
726 proto.set_on_time_finish(onTimeFinish);
727 proto.set_gpu_composition(gpuComposition);
728 proto.set_jank_type(jankType);
729 return proto;
730}
731
732ProtoExpectedSurfaceFrameStart createProtoExpectedSurfaceFrameStart(int64_t cookie, int64_t token,
733 int64_t displayFrameToken,
734 pid_t pid,
735 std::string layerName) {
736 ProtoExpectedSurfaceFrameStart proto;
737 proto.set_cookie(cookie);
738 proto.set_token(token);
739 proto.set_display_frame_token(displayFrameToken);
740 proto.set_pid(pid);
741 proto.set_layer_name(layerName);
742 return proto;
743}
744
745ProtoActualSurfaceFrameStart createProtoActualSurfaceFrameStart(
746 int64_t cookie, int64_t token, int64_t displayFrameToken, pid_t pid, std::string layerName,
747 ProtoPresentType presentType, bool onTimeFinish, bool gpuComposition,
748 ProtoJankType jankType) {
749 ProtoActualSurfaceFrameStart proto;
750 proto.set_cookie(cookie);
751 proto.set_token(token);
752 proto.set_display_frame_token(displayFrameToken);
753 proto.set_pid(pid);
754 proto.set_layer_name(layerName);
755 proto.set_present_type(presentType);
756 proto.set_on_time_finish(onTimeFinish);
757 proto.set_gpu_composition(gpuComposition);
758 proto.set_jank_type(jankType);
759 return proto;
760}
761
762ProtoFrameEnd createProtoFrameEnd(int64_t cookie) {
763 ProtoFrameEnd proto;
764 proto.set_cookie(cookie);
765 return proto;
766}
767
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000768void validateTraceEvent(const ProtoExpectedDisplayFrameStart& received,
769 const ProtoExpectedDisplayFrameStart& source) {
770 ASSERT_TRUE(received.has_cookie());
771 EXPECT_EQ(received.cookie(), source.cookie());
772
Adithya Srinivasan01189672020-10-20 14:23:05 -0700773 ASSERT_TRUE(received.has_token());
774 EXPECT_EQ(received.token(), source.token());
775
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000776 ASSERT_TRUE(received.has_pid());
777 EXPECT_EQ(received.pid(), source.pid());
778}
779
780void validateTraceEvent(const ProtoActualDisplayFrameStart& received,
781 const ProtoActualDisplayFrameStart& source) {
782 ASSERT_TRUE(received.has_cookie());
783 EXPECT_EQ(received.cookie(), source.cookie());
784
785 ASSERT_TRUE(received.has_token());
786 EXPECT_EQ(received.token(), source.token());
787
788 ASSERT_TRUE(received.has_pid());
789 EXPECT_EQ(received.pid(), source.pid());
790
Adithya Srinivasan01189672020-10-20 14:23:05 -0700791 ASSERT_TRUE(received.has_present_type());
792 EXPECT_EQ(received.present_type(), source.present_type());
793 ASSERT_TRUE(received.has_on_time_finish());
794 EXPECT_EQ(received.on_time_finish(), source.on_time_finish());
795 ASSERT_TRUE(received.has_gpu_composition());
796 EXPECT_EQ(received.gpu_composition(), source.gpu_composition());
797 ASSERT_TRUE(received.has_jank_type());
798 EXPECT_EQ(received.jank_type(), source.jank_type());
Adithya Srinivasan01189672020-10-20 14:23:05 -0700799}
800
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000801void validateTraceEvent(const ProtoExpectedSurfaceFrameStart& received,
802 const ProtoExpectedSurfaceFrameStart& source) {
803 ASSERT_TRUE(received.has_cookie());
804 EXPECT_EQ(received.cookie(), source.cookie());
805
Adithya Srinivasan01189672020-10-20 14:23:05 -0700806 ASSERT_TRUE(received.has_token());
807 EXPECT_EQ(received.token(), source.token());
808
809 ASSERT_TRUE(received.has_display_frame_token());
810 EXPECT_EQ(received.display_frame_token(), source.display_frame_token());
811
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000812 ASSERT_TRUE(received.has_pid());
813 EXPECT_EQ(received.pid(), source.pid());
814
815 ASSERT_TRUE(received.has_layer_name());
816 EXPECT_EQ(received.layer_name(), source.layer_name());
817}
818
819void validateTraceEvent(const ProtoActualSurfaceFrameStart& received,
820 const ProtoActualSurfaceFrameStart& source) {
821 ASSERT_TRUE(received.has_cookie());
822 EXPECT_EQ(received.cookie(), source.cookie());
823
824 ASSERT_TRUE(received.has_token());
825 EXPECT_EQ(received.token(), source.token());
826
827 ASSERT_TRUE(received.has_display_frame_token());
828 EXPECT_EQ(received.display_frame_token(), source.display_frame_token());
829
830 ASSERT_TRUE(received.has_pid());
831 EXPECT_EQ(received.pid(), source.pid());
832
833 ASSERT_TRUE(received.has_layer_name());
834 EXPECT_EQ(received.layer_name(), source.layer_name());
835
Adithya Srinivasan01189672020-10-20 14:23:05 -0700836 ASSERT_TRUE(received.has_present_type());
837 EXPECT_EQ(received.present_type(), source.present_type());
838 ASSERT_TRUE(received.has_on_time_finish());
839 EXPECT_EQ(received.on_time_finish(), source.on_time_finish());
840 ASSERT_TRUE(received.has_gpu_composition());
841 EXPECT_EQ(received.gpu_composition(), source.gpu_composition());
842 ASSERT_TRUE(received.has_jank_type());
843 EXPECT_EQ(received.jank_type(), source.jank_type());
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000844}
Adithya Srinivasan01189672020-10-20 14:23:05 -0700845
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000846void validateTraceEvent(const ProtoFrameEnd& received, const ProtoFrameEnd& source) {
847 ASSERT_TRUE(received.has_cookie());
848 EXPECT_EQ(received.cookie(), source.cookie());
Adithya Srinivasan01189672020-10-20 14:23:05 -0700849}
850
851TEST_F(FrameTimelineTest, traceDisplayFrame_emitsValidTracePacket) {
852 auto tracingSession = getTracingSessionForTest();
853 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan01189672020-10-20 14:23:05 -0700854
855 tracingSession->StartBlocking();
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000856 int64_t displayFrameToken1 = mTokenManager->generateTokenForPredictions({10, 30, 30});
Adithya Srinivasan01189672020-10-20 14:23:05 -0700857
858 // Set up the display frame
Alec Mouri7d436ec2021-01-27 20:40:50 -0800859 mFrameTimeline->setSfWakeUp(displayFrameToken1, 20, Fps::fromPeriodNsecs(11));
Adithya Srinivasan01189672020-10-20 14:23:05 -0700860 mFrameTimeline->setSfPresent(26, presentFence1);
861 presentFence1->signalForTest(31);
862
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000863 int64_t traceCookie = snoopCurrentTraceCookie();
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000864 auto protoExpectedDisplayFrameStart =
865 createProtoExpectedDisplayFrameStart(traceCookie + 1, displayFrameToken1,
866 kSurfaceFlingerPid);
867 auto protoExpectedDisplayFrameEnd = createProtoFrameEnd(traceCookie + 1);
868 auto protoActualDisplayFrameStart =
869 createProtoActualDisplayFrameStart(traceCookie + 2, displayFrameToken1,
870 kSurfaceFlingerPid,
871 FrameTimelineEvent::PRESENT_ON_TIME, true, false,
872 FrameTimelineEvent::JANK_NONE);
873 auto protoActualDisplayFrameEnd = createProtoFrameEnd(traceCookie + 2);
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000874
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000875 addEmptyDisplayFrame();
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000876 flushTrace();
Adithya Srinivasan01189672020-10-20 14:23:05 -0700877 tracingSession->StopBlocking();
878
879 auto packets = readFrameTimelinePacketsBlocking(tracingSession.get());
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000880 EXPECT_EQ(packets.size(), 4u);
Adithya Srinivasan01189672020-10-20 14:23:05 -0700881
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000882 // Packet - 0 : ExpectedDisplayFrameStart
883 const auto& packet0 = packets[0];
884 ASSERT_TRUE(packet0.has_timestamp());
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000885 EXPECT_EQ(packet0.timestamp(), 10u);
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000886 ASSERT_TRUE(packet0.has_frame_timeline_event());
Adithya Srinivasan01189672020-10-20 14:23:05 -0700887
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000888 const auto& event0 = packet0.frame_timeline_event();
889 ASSERT_TRUE(event0.has_expected_display_frame_start());
890 const auto& expectedDisplayFrameStart = event0.expected_display_frame_start();
891 validateTraceEvent(expectedDisplayFrameStart, protoExpectedDisplayFrameStart);
892
893 // Packet - 1 : FrameEnd (ExpectedDisplayFrame)
894 const auto& packet1 = packets[1];
895 ASSERT_TRUE(packet1.has_timestamp());
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000896 EXPECT_EQ(packet1.timestamp(), 30u);
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000897 ASSERT_TRUE(packet1.has_frame_timeline_event());
898
899 const auto& event1 = packet1.frame_timeline_event();
900 ASSERT_TRUE(event1.has_frame_end());
901 const auto& expectedDisplayFrameEnd = event1.frame_end();
902 validateTraceEvent(expectedDisplayFrameEnd, protoExpectedDisplayFrameEnd);
903
904 // Packet - 2 : ActualDisplayFrameStart
905 const auto& packet2 = packets[2];
906 ASSERT_TRUE(packet2.has_timestamp());
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000907 EXPECT_EQ(packet2.timestamp(), 20u);
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000908 ASSERT_TRUE(packet2.has_frame_timeline_event());
909
910 const auto& event2 = packet2.frame_timeline_event();
911 ASSERT_TRUE(event2.has_actual_display_frame_start());
912 const auto& actualDisplayFrameStart = event2.actual_display_frame_start();
913 validateTraceEvent(actualDisplayFrameStart, protoActualDisplayFrameStart);
914
915 // Packet - 3 : FrameEnd (ActualDisplayFrame)
916 const auto& packet3 = packets[3];
917 ASSERT_TRUE(packet3.has_timestamp());
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000918 EXPECT_EQ(packet3.timestamp(), 26u);
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000919 ASSERT_TRUE(packet3.has_frame_timeline_event());
920
921 const auto& event3 = packet3.frame_timeline_event();
922 ASSERT_TRUE(event3.has_frame_end());
923 const auto& actualDisplayFrameEnd = event3.frame_end();
924 validateTraceEvent(actualDisplayFrameEnd, protoActualDisplayFrameEnd);
Adithya Srinivasan01189672020-10-20 14:23:05 -0700925}
926
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000927TEST_F(FrameTimelineTest, traceDisplayFrame_predictionExpiredDoesNotTraceExpectedTimeline) {
928 auto tracingSession = getTracingSessionForTest();
929 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
930
931 tracingSession->StartBlocking();
932 int64_t displayFrameToken1 = mTokenManager->generateTokenForPredictions({10, 25, 30});
933 // Flush the token so that it would expire
934 flushTokens(systemTime() + maxTokenRetentionTime);
935
936 // Set up the display frame
937 mFrameTimeline->setSfWakeUp(displayFrameToken1, 20, Fps::fromPeriodNsecs(11));
938 mFrameTimeline->setSfPresent(26, presentFence1);
939 presentFence1->signalForTest(31);
940
941 int64_t traceCookie = snoopCurrentTraceCookie();
942
943 auto protoActualDisplayFrameStart =
944 createProtoActualDisplayFrameStart(traceCookie + 1, displayFrameToken1,
945 kSurfaceFlingerPid,
946 FrameTimelineEvent::PRESENT_UNSPECIFIED, false,
947 false, FrameTimelineEvent::JANK_UNKNOWN);
948 auto protoActualDisplayFrameEnd = createProtoFrameEnd(traceCookie + 1);
949
950 addEmptyDisplayFrame();
951 flushTrace();
952 tracingSession->StopBlocking();
953
954 auto packets = readFrameTimelinePacketsBlocking(tracingSession.get());
955 // Only actual timeline packets should be in the trace
956 EXPECT_EQ(packets.size(), 2u);
957
958 // Packet - 0 : ActualDisplayFrameStart
959 const auto& packet0 = packets[0];
960 ASSERT_TRUE(packet0.has_timestamp());
961 EXPECT_EQ(packet0.timestamp(), 20u);
962 ASSERT_TRUE(packet0.has_frame_timeline_event());
963
964 const auto& event0 = packet0.frame_timeline_event();
965 ASSERT_TRUE(event0.has_actual_display_frame_start());
966 const auto& actualDisplayFrameStart = event0.actual_display_frame_start();
967 validateTraceEvent(actualDisplayFrameStart, protoActualDisplayFrameStart);
968
969 // Packet - 1 : FrameEnd (ActualDisplayFrame)
970 const auto& packet1 = packets[1];
971 ASSERT_TRUE(packet1.has_timestamp());
972 EXPECT_EQ(packet1.timestamp(), 26u);
973 ASSERT_TRUE(packet1.has_frame_timeline_event());
974
975 const auto& event1 = packet1.frame_timeline_event();
976 ASSERT_TRUE(event1.has_frame_end());
977 const auto& actualDisplayFrameEnd = event1.frame_end();
978 validateTraceEvent(actualDisplayFrameEnd, protoActualDisplayFrameEnd);
979}
980
Adithya Srinivasan01189672020-10-20 14:23:05 -0700981TEST_F(FrameTimelineTest, traceSurfaceFrame_emitsValidTracePacket) {
982 auto tracingSession = getTracingSessionForTest();
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800983 // Layer specific increment
Alec Mouri363faf02021-01-29 16:34:55 -0800984 EXPECT_CALL(*mTimeStats, incrementJankyFrames(_));
Adithya Srinivasan01189672020-10-20 14:23:05 -0700985 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
986 auto presentFence2 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
987
988 tracingSession->StartBlocking();
989 int64_t surfaceFrameToken = mTokenManager->generateTokenForPredictions({10, 25, 40});
990 int64_t displayFrameToken1 = mTokenManager->generateTokenForPredictions({30, 35, 40});
Adithya Srinivasan01189672020-10-20 14:23:05 -0700991
992 auto surfaceFrame1 =
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000993 mFrameTimeline->createSurfaceFrameForToken({surfaceFrameToken, sInputEventId}, sPidOne,
Alec Mouriadebf5c2021-01-05 12:57:36 -0800994 sUidOne, sLayerIdOne, sLayerNameOne,
995 sLayerNameOne);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000996 auto surfaceFrame2 =
997 mFrameTimeline->createSurfaceFrameForToken({surfaceFrameToken, sInputEventId}, sPidOne,
Alec Mouriadebf5c2021-01-05 12:57:36 -0800998 sUidOne, sLayerIdOne, sLayerNameOne,
999 sLayerNameOne);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001000 surfaceFrame1->setActualQueueTime(10);
1001 surfaceFrame1->setDropTime(15);
1002
1003 surfaceFrame2->setActualQueueTime(15);
1004 surfaceFrame2->setAcquireFenceTime(20);
Adithya Srinivasan01189672020-10-20 14:23:05 -07001005
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001006 // First 2 cookies will be used by the DisplayFrame
1007 int64_t traceCookie = snoopCurrentTraceCookie() + 2;
1008
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001009 auto protoDroppedSurfaceFrameExpectedStart =
1010 createProtoExpectedSurfaceFrameStart(traceCookie + 1, surfaceFrameToken,
1011 displayFrameToken1, sPidOne, sLayerNameOne);
1012 auto protoDroppedSurfaceFrameExpectedEnd = createProtoFrameEnd(traceCookie + 1);
1013 auto protoDroppedSurfaceFrameActualStart =
1014 createProtoActualSurfaceFrameStart(traceCookie + 2, surfaceFrameToken,
1015 displayFrameToken1, sPidOne, sLayerNameOne,
1016 FrameTimelineEvent::PRESENT_DROPPED, false, false,
1017 FrameTimelineEvent::JANK_NONE);
1018 auto protoDroppedSurfaceFrameActualEnd = createProtoFrameEnd(traceCookie + 2);
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001019
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001020 auto protoPresentedSurfaceFrameExpectedStart =
1021 createProtoExpectedSurfaceFrameStart(traceCookie + 3, surfaceFrameToken,
1022 displayFrameToken1, sPidOne, sLayerNameOne);
1023 auto protoPresentedSurfaceFrameExpectedEnd = createProtoFrameEnd(traceCookie + 3);
1024 auto protoPresentedSurfaceFrameActualStart =
1025 createProtoActualSurfaceFrameStart(traceCookie + 4, surfaceFrameToken,
1026 displayFrameToken1, sPidOne, sLayerNameOne,
1027 FrameTimelineEvent::PRESENT_ON_TIME, true, false,
1028 FrameTimelineEvent::JANK_NONE);
1029 auto protoPresentedSurfaceFrameActualEnd = createProtoFrameEnd(traceCookie + 4);
Adithya Srinivasan01189672020-10-20 14:23:05 -07001030
1031 // Set up the display frame
Alec Mouri7d436ec2021-01-27 20:40:50 -08001032 mFrameTimeline->setSfWakeUp(displayFrameToken1, 20, Fps::fromPeriodNsecs(11));
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001033 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Dropped);
1034 surfaceFrame2->setPresentState(SurfaceFrame::PresentState::Presented);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001035 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001036 mFrameTimeline->addSurfaceFrame(surfaceFrame2);
Adithya Srinivasan01189672020-10-20 14:23:05 -07001037 mFrameTimeline->setSfPresent(26, presentFence1);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001038 presentFence1->signalForTest(40);
Adithya Srinivasan01189672020-10-20 14:23:05 -07001039
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001040 addEmptyDisplayFrame();
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001041 flushTrace();
Adithya Srinivasan01189672020-10-20 14:23:05 -07001042 tracingSession->StopBlocking();
1043
1044 auto packets = readFrameTimelinePacketsBlocking(tracingSession.get());
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001045 // 4 DisplayFrame + 4 DroppedSurfaceFrame + 4 PresentedSurfaceFrame
1046 EXPECT_EQ(packets.size(), 12u);
Adithya Srinivasan01189672020-10-20 14:23:05 -07001047
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001048 // Packet - 4 : ExpectedSurfaceFrameStart1
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001049 const auto& packet4 = packets[4];
1050 ASSERT_TRUE(packet4.has_timestamp());
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001051 EXPECT_EQ(packet4.timestamp(), 10u);
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001052 ASSERT_TRUE(packet4.has_frame_timeline_event());
Adithya Srinivasan01189672020-10-20 14:23:05 -07001053
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001054 const auto& event4 = packet4.frame_timeline_event();
1055 ASSERT_TRUE(event4.has_expected_surface_frame_start());
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001056 const auto& expectedSurfaceFrameStart1 = event4.expected_surface_frame_start();
1057 validateTraceEvent(expectedSurfaceFrameStart1, protoDroppedSurfaceFrameExpectedStart);
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001058
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001059 // Packet - 5 : FrameEnd (ExpectedSurfaceFrame1)
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001060 const auto& packet5 = packets[5];
1061 ASSERT_TRUE(packet5.has_timestamp());
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001062 EXPECT_EQ(packet5.timestamp(), 25u);
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001063 ASSERT_TRUE(packet5.has_frame_timeline_event());
1064
1065 const auto& event5 = packet5.frame_timeline_event();
1066 ASSERT_TRUE(event5.has_frame_end());
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001067 const auto& expectedSurfaceFrameEnd1 = event5.frame_end();
1068 validateTraceEvent(expectedSurfaceFrameEnd1, protoDroppedSurfaceFrameExpectedEnd);
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001069
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001070 // Packet - 6 : ActualSurfaceFrameStart1
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001071 const auto& packet6 = packets[6];
1072 ASSERT_TRUE(packet6.has_timestamp());
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001073 EXPECT_EQ(packet6.timestamp(), 10u);
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001074 ASSERT_TRUE(packet6.has_frame_timeline_event());
1075
1076 const auto& event6 = packet6.frame_timeline_event();
1077 ASSERT_TRUE(event6.has_actual_surface_frame_start());
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001078 const auto& actualSurfaceFrameStart1 = event6.actual_surface_frame_start();
1079 validateTraceEvent(actualSurfaceFrameStart1, protoDroppedSurfaceFrameActualStart);
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001080
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001081 // Packet - 7 : FrameEnd (ActualSurfaceFrame1)
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001082 const auto& packet7 = packets[7];
1083 ASSERT_TRUE(packet7.has_timestamp());
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001084 EXPECT_EQ(packet7.timestamp(), 15u);
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001085 ASSERT_TRUE(packet7.has_frame_timeline_event());
1086
1087 const auto& event7 = packet7.frame_timeline_event();
1088 ASSERT_TRUE(event7.has_frame_end());
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001089 const auto& actualSurfaceFrameEnd1 = event7.frame_end();
1090 validateTraceEvent(actualSurfaceFrameEnd1, protoDroppedSurfaceFrameActualEnd);
1091
1092 // Packet - 8 : ExpectedSurfaceFrameStart2
1093 const auto& packet8 = packets[8];
1094 ASSERT_TRUE(packet8.has_timestamp());
1095 EXPECT_EQ(packet8.timestamp(), 10u);
1096 ASSERT_TRUE(packet8.has_frame_timeline_event());
1097
1098 const auto& event8 = packet8.frame_timeline_event();
1099 ASSERT_TRUE(event8.has_expected_surface_frame_start());
1100 const auto& expectedSurfaceFrameStart2 = event8.expected_surface_frame_start();
1101 validateTraceEvent(expectedSurfaceFrameStart2, protoPresentedSurfaceFrameExpectedStart);
1102
1103 // Packet - 9 : FrameEnd (ExpectedSurfaceFrame2)
1104 const auto& packet9 = packets[9];
1105 ASSERT_TRUE(packet9.has_timestamp());
1106 EXPECT_EQ(packet9.timestamp(), 25u);
1107 ASSERT_TRUE(packet9.has_frame_timeline_event());
1108
1109 const auto& event9 = packet9.frame_timeline_event();
1110 ASSERT_TRUE(event9.has_frame_end());
1111 const auto& expectedSurfaceFrameEnd2 = event9.frame_end();
1112 validateTraceEvent(expectedSurfaceFrameEnd2, protoPresentedSurfaceFrameExpectedEnd);
1113
1114 // Packet - 10 : ActualSurfaceFrameStart2
1115 const auto& packet10 = packets[10];
1116 ASSERT_TRUE(packet10.has_timestamp());
1117 EXPECT_EQ(packet10.timestamp(), 10u);
1118 ASSERT_TRUE(packet10.has_frame_timeline_event());
1119
1120 const auto& event10 = packet10.frame_timeline_event();
1121 ASSERT_TRUE(event10.has_actual_surface_frame_start());
1122 const auto& actualSurfaceFrameStart2 = event10.actual_surface_frame_start();
1123 validateTraceEvent(actualSurfaceFrameStart2, protoPresentedSurfaceFrameActualStart);
1124
1125 // Packet - 11 : FrameEnd (ActualSurfaceFrame2)
1126 const auto& packet11 = packets[11];
1127 ASSERT_TRUE(packet11.has_timestamp());
1128 EXPECT_EQ(packet11.timestamp(), 20u);
1129 ASSERT_TRUE(packet11.has_frame_timeline_event());
1130
1131 const auto& event11 = packet11.frame_timeline_event();
1132 ASSERT_TRUE(event11.has_frame_end());
1133 const auto& actualSurfaceFrameEnd2 = event11.frame_end();
1134 validateTraceEvent(actualSurfaceFrameEnd2, protoPresentedSurfaceFrameActualEnd);
1135}
1136
1137TEST_F(FrameTimelineTest, traceSurfaceFrame_predictionExpiredDoesNotTraceExpectedTimeline) {
1138 auto tracingSession = getTracingSessionForTest();
1139 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
1140
1141 tracingSession->StartBlocking();
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001142 constexpr nsecs_t appStartTime = std::chrono::nanoseconds(10ms).count();
1143 constexpr nsecs_t appEndTime = std::chrono::nanoseconds(20ms).count();
1144 constexpr nsecs_t appPresentTime = std::chrono::nanoseconds(30ms).count();
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001145 int64_t surfaceFrameToken =
1146 mTokenManager->generateTokenForPredictions({appStartTime, appEndTime, appPresentTime});
1147
1148 // Flush the token so that it would expire
1149 flushTokens(systemTime() + maxTokenRetentionTime);
1150 auto surfaceFrame1 =
1151 mFrameTimeline->createSurfaceFrameForToken({surfaceFrameToken, /*inputEventId*/ 0},
Alec Mouriadebf5c2021-01-05 12:57:36 -08001152 sPidOne, sUidOne, sLayerIdOne, sLayerNameOne,
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001153 sLayerNameOne);
1154 surfaceFrame1->setActualQueueTime(appEndTime);
1155 surfaceFrame1->setAcquireFenceTime(appEndTime);
1156
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001157 constexpr nsecs_t sfStartTime = std::chrono::nanoseconds(20ms).count();
1158 constexpr nsecs_t sfEndTime = std::chrono::nanoseconds(30ms).count();
1159 constexpr nsecs_t sfPresentTime = std::chrono::nanoseconds(30ms).count();
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001160 int64_t displayFrameToken =
1161 mTokenManager->generateTokenForPredictions({sfStartTime, sfEndTime, sfPresentTime});
1162
1163 // First 2 cookies will be used by the DisplayFrame
1164 int64_t traceCookie = snoopCurrentTraceCookie() + 2;
1165
1166 auto protoActualSurfaceFrameStart =
1167 createProtoActualSurfaceFrameStart(traceCookie + 1, surfaceFrameToken,
1168 displayFrameToken, sPidOne, sLayerNameOne,
1169 FrameTimelineEvent::PRESENT_UNSPECIFIED, false,
1170 false, FrameTimelineEvent::JANK_UNKNOWN);
1171 auto protoActualSurfaceFrameEnd = createProtoFrameEnd(traceCookie + 1);
1172
1173 // Set up the display frame
1174 mFrameTimeline->setSfWakeUp(displayFrameToken, sfStartTime, Fps::fromPeriodNsecs(11));
1175 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
1176 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
1177 mFrameTimeline->setSfPresent(sfEndTime, presentFence1);
1178 presentFence1->signalForTest(sfPresentTime);
1179
1180 addEmptyDisplayFrame();
1181 flushTrace();
1182 tracingSession->StopBlocking();
1183
1184 auto packets = readFrameTimelinePacketsBlocking(tracingSession.get());
1185 // Display Frame 4 packets + SurfaceFrame 2 packets
1186 ASSERT_EQ(packets.size(), 6u);
1187
1188 // Packet - 4 : ActualSurfaceFrameStart
1189 const auto& packet4 = packets[4];
1190 ASSERT_TRUE(packet4.has_timestamp());
1191 EXPECT_EQ(packet4.timestamp(),
1192 static_cast<uint64_t>(appEndTime - SurfaceFrame::kPredictionExpiredStartTimeDelta));
1193 ASSERT_TRUE(packet4.has_frame_timeline_event());
1194
1195 const auto& event4 = packet4.frame_timeline_event();
1196 ASSERT_TRUE(event4.has_actual_surface_frame_start());
1197 const auto& actualSurfaceFrameStart = event4.actual_surface_frame_start();
1198 validateTraceEvent(actualSurfaceFrameStart, protoActualSurfaceFrameStart);
1199
1200 // Packet - 5 : FrameEnd (ActualSurfaceFrame)
1201 const auto& packet5 = packets[5];
1202 ASSERT_TRUE(packet5.has_timestamp());
1203 EXPECT_EQ(packet5.timestamp(), static_cast<uint64_t>(appEndTime));
1204 ASSERT_TRUE(packet5.has_frame_timeline_event());
1205
1206 const auto& event5 = packet5.frame_timeline_event();
1207 ASSERT_TRUE(event5.has_frame_end());
1208 const auto& actualSurfaceFrameEnd = event5.frame_end();
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001209 validateTraceEvent(actualSurfaceFrameEnd, protoActualSurfaceFrameEnd);
Adithya Srinivasan01189672020-10-20 14:23:05 -07001210}
1211
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001212// Tests for Jank classification
1213TEST_F(FrameTimelineTest, jankClassification_presentOnTimeDoesNotClassify) {
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001214 // Layer specific increment
Alec Mouri363faf02021-01-29 16:34:55 -08001215 EXPECT_CALL(*mTimeStats, incrementJankyFrames(_));
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001216 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
1217 int64_t surfaceFrameToken = mTokenManager->generateTokenForPredictions({10, 20, 30});
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001218 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({22, 30, 30});
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001219 auto surfaceFrame =
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001220 mFrameTimeline->createSurfaceFrameForToken({surfaceFrameToken, sInputEventId}, sPidOne,
Alec Mouriadebf5c2021-01-05 12:57:36 -08001221 sUidOne, sLayerIdOne, sLayerNameOne,
1222 sLayerNameOne);
Alec Mouri7d436ec2021-01-27 20:40:50 -08001223 mFrameTimeline->setSfWakeUp(sfToken1, 22, Fps::fromPeriodNsecs(11));
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001224 surfaceFrame->setPresentState(SurfaceFrame::PresentState::Presented);
1225 mFrameTimeline->addSurfaceFrame(surfaceFrame);
1226 mFrameTimeline->setSfPresent(26, presentFence1);
1227 auto displayFrame = getDisplayFrame(0);
1228 auto& presentedSurfaceFrame = getSurfaceFrame(0, 0);
1229 presentFence1->signalForTest(29);
1230
1231 // Fences haven't been flushed yet, so it should be 0
1232 EXPECT_EQ(displayFrame->getActuals().presentTime, 0);
1233 EXPECT_EQ(presentedSurfaceFrame.getActuals().presentTime, 0);
1234
1235 addEmptyDisplayFrame();
1236 displayFrame = getDisplayFrame(0);
1237
1238 // Fences have flushed, so the present timestamps should be updated
1239 EXPECT_EQ(displayFrame->getActuals().presentTime, 29);
1240 EXPECT_EQ(presentedSurfaceFrame.getActuals().presentTime, 29);
1241 EXPECT_EQ(displayFrame->getFramePresentMetadata(), FramePresentMetadata::OnTimePresent);
1242 EXPECT_EQ(displayFrame->getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
1243 EXPECT_EQ(displayFrame->getJankType(), JankType::None);
1244}
1245
1246TEST_F(FrameTimelineTest, jankClassification_displayFrameOnTimeFinishEarlyPresent) {
Alec Mouri363faf02021-01-29 16:34:55 -08001247 Fps vsyncRate = Fps::fromPeriodNsecs(11);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001248 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001249 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({22, 30, 40});
1250 int64_t sfToken2 = mTokenManager->generateTokenForPredictions({52, 60, 70});
Alec Mouri363faf02021-01-29 16:34:55 -08001251 mFrameTimeline->setSfWakeUp(sfToken1, 22, vsyncRate);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001252 mFrameTimeline->setSfPresent(26, presentFence1);
1253 auto displayFrame = getDisplayFrame(0);
1254 presentFence1->signalForTest(30);
1255
1256 // Fences for the first frame haven't been flushed yet, so it should be 0
1257 EXPECT_EQ(displayFrame->getActuals().presentTime, 0);
1258
1259 // Trigger a flush by finalizing the next DisplayFrame
1260 auto presentFence2 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Alec Mouri363faf02021-01-29 16:34:55 -08001261 mFrameTimeline->setSfWakeUp(sfToken2, 52, vsyncRate);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001262 mFrameTimeline->setSfPresent(56, presentFence2);
1263 displayFrame = getDisplayFrame(0);
1264
1265 // Fences for the first frame have flushed, so the present timestamps should be updated
1266 EXPECT_EQ(displayFrame->getActuals().presentTime, 30);
1267 EXPECT_EQ(displayFrame->getFramePresentMetadata(), FramePresentMetadata::EarlyPresent);
1268 EXPECT_EQ(displayFrame->getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
1269 EXPECT_EQ(displayFrame->getJankType(), JankType::SurfaceFlingerScheduling);
1270
1271 // Fences for the second frame haven't been flushed yet, so it should be 0
1272 auto displayFrame2 = getDisplayFrame(1);
1273 presentFence2->signalForTest(65);
1274 EXPECT_EQ(displayFrame2->getActuals().presentTime, 0);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001275 addEmptyDisplayFrame();
1276 displayFrame2 = getDisplayFrame(1);
1277
1278 // Fences for the second frame have flushed, so the present timestamps should be updated
1279 EXPECT_EQ(displayFrame2->getActuals().presentTime, 65);
1280 EXPECT_EQ(displayFrame2->getFramePresentMetadata(), FramePresentMetadata::EarlyPresent);
1281 EXPECT_EQ(displayFrame2->getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
1282 EXPECT_EQ(displayFrame2->getJankType(), JankType::PredictionError);
1283}
1284
1285TEST_F(FrameTimelineTest, jankClassification_displayFrameOnTimeFinishLatePresent) {
Alec Mouri363faf02021-01-29 16:34:55 -08001286 Fps vsyncRate = Fps::fromPeriodNsecs(11);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001287 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001288 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({22, 30, 40});
1289 int64_t sfToken2 = mTokenManager->generateTokenForPredictions({52, 60, 70});
Alec Mouri363faf02021-01-29 16:34:55 -08001290 mFrameTimeline->setSfWakeUp(sfToken1, 22, vsyncRate);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001291 mFrameTimeline->setSfPresent(26, presentFence1);
1292 auto displayFrame = getDisplayFrame(0);
1293 presentFence1->signalForTest(50);
1294
1295 // Fences for the first frame haven't been flushed yet, so it should be 0
1296 EXPECT_EQ(displayFrame->getActuals().presentTime, 0);
1297
1298 // Trigger a flush by finalizing the next DisplayFrame
1299 auto presentFence2 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Alec Mouri363faf02021-01-29 16:34:55 -08001300 mFrameTimeline->setSfWakeUp(sfToken2, 52, vsyncRate);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001301 mFrameTimeline->setSfPresent(56, presentFence2);
1302 displayFrame = getDisplayFrame(0);
1303
1304 // Fences for the first frame have flushed, so the present timestamps should be updated
1305 EXPECT_EQ(displayFrame->getActuals().presentTime, 50);
1306 EXPECT_EQ(displayFrame->getFramePresentMetadata(), FramePresentMetadata::LatePresent);
1307 EXPECT_EQ(displayFrame->getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
1308 EXPECT_EQ(displayFrame->getJankType(), JankType::DisplayHAL);
1309
1310 // Fences for the second frame haven't been flushed yet, so it should be 0
1311 auto displayFrame2 = getDisplayFrame(1);
1312 presentFence2->signalForTest(75);
1313 EXPECT_EQ(displayFrame2->getActuals().presentTime, 0);
1314
1315 addEmptyDisplayFrame();
1316 displayFrame2 = getDisplayFrame(1);
1317
1318 // Fences for the second frame have flushed, so the present timestamps should be updated
1319 EXPECT_EQ(displayFrame2->getActuals().presentTime, 75);
1320 EXPECT_EQ(displayFrame2->getFramePresentMetadata(), FramePresentMetadata::LatePresent);
1321 EXPECT_EQ(displayFrame2->getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
1322 EXPECT_EQ(displayFrame2->getJankType(), JankType::PredictionError);
1323}
1324
1325TEST_F(FrameTimelineTest, jankClassification_displayFrameLateFinishEarlyPresent) {
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001326 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
1327 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({12, 18, 40});
Alec Mouri7d436ec2021-01-27 20:40:50 -08001328 mFrameTimeline->setSfWakeUp(sfToken1, 12, Fps::fromPeriodNsecs(11));
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001329
1330 mFrameTimeline->setSfPresent(22, presentFence1);
1331 auto displayFrame = getDisplayFrame(0);
1332 presentFence1->signalForTest(28);
1333
1334 // Fences haven't been flushed yet, so it should be 0
1335 EXPECT_EQ(displayFrame->getActuals().presentTime, 0);
1336
1337 addEmptyDisplayFrame();
1338 displayFrame = getDisplayFrame(0);
1339
1340 // Fences have flushed, so the present timestamps should be updated
1341 EXPECT_EQ(displayFrame->getActuals().presentTime, 28);
1342 EXPECT_EQ(displayFrame->getFramePresentMetadata(), FramePresentMetadata::EarlyPresent);
1343 EXPECT_EQ(displayFrame->getFrameReadyMetadata(), FrameReadyMetadata::LateFinish);
1344 EXPECT_EQ(displayFrame->getJankType(), JankType::SurfaceFlingerScheduling);
1345}
1346
1347TEST_F(FrameTimelineTest, jankClassification_displayFrameLateFinishLatePresent) {
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001348 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
1349 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({22, 26, 40});
Alec Mouri7d436ec2021-01-27 20:40:50 -08001350 mFrameTimeline->setSfWakeUp(sfToken1, 12, Fps::fromPeriodNsecs(11));
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001351 mFrameTimeline->setSfPresent(36, presentFence1);
1352 auto displayFrame = getDisplayFrame(0);
1353 presentFence1->signalForTest(52);
1354
1355 // Fences haven't been flushed yet, so it should be 0
1356 EXPECT_EQ(displayFrame->getActuals().presentTime, 0);
1357
1358 addEmptyDisplayFrame();
1359 displayFrame = getDisplayFrame(0);
1360
1361 // Fences have flushed, so the present timestamps should be updated
1362 EXPECT_EQ(displayFrame->getActuals().presentTime, 52);
1363 EXPECT_EQ(displayFrame->getFramePresentMetadata(), FramePresentMetadata::LatePresent);
1364 EXPECT_EQ(displayFrame->getFrameReadyMetadata(), FrameReadyMetadata::LateFinish);
1365 EXPECT_EQ(displayFrame->getJankType(), JankType::SurfaceFlingerCpuDeadlineMissed);
1366}
1367
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001368TEST_F(FrameTimelineTest, jankClassification_displayFrameLateStartLateFinishLatePresent) {
1369 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
1370 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({22, 26, 40});
1371 mFrameTimeline->setSfWakeUp(sfToken1, 26, Fps::fromPeriodNsecs(11));
1372 mFrameTimeline->setSfPresent(36, presentFence1);
1373 auto displayFrame = getDisplayFrame(0);
1374 presentFence1->signalForTest(52);
1375
1376 // Fences haven't been flushed yet, so it should be 0
1377 EXPECT_EQ(displayFrame->getActuals().presentTime, 0);
1378
1379 addEmptyDisplayFrame();
1380 displayFrame = getDisplayFrame(0);
1381
1382 // Fences have flushed, so the present timestamps should be updated
1383 EXPECT_EQ(displayFrame->getActuals().presentTime, 52);
1384 EXPECT_EQ(displayFrame->getFrameStartMetadata(), FrameStartMetadata::LateStart);
1385 EXPECT_EQ(displayFrame->getFramePresentMetadata(), FramePresentMetadata::LatePresent);
1386 EXPECT_EQ(displayFrame->getFrameReadyMetadata(), FrameReadyMetadata::LateFinish);
1387 EXPECT_EQ(displayFrame->getJankType(), JankType::SurfaceFlingerScheduling);
1388}
1389
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001390TEST_F(FrameTimelineTest, jankClassification_surfaceFrameOnTimeFinishEarlyPresent) {
Alec Mouri363faf02021-01-29 16:34:55 -08001391 EXPECT_CALL(*mTimeStats, incrementJankyFrames(_));
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001392 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001393 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({22, 30, 40});
1394 int64_t sfToken2 = mTokenManager->generateTokenForPredictions({52, 60, 70});
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001395 int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions({5, 16, 40});
1396 int64_t surfaceFrameToken2 = mTokenManager->generateTokenForPredictions({25, 36, 70});
1397 auto surfaceFrame1 =
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001398 mFrameTimeline->createSurfaceFrameForToken({surfaceFrameToken1, sInputEventId}, sPidOne,
Alec Mouriadebf5c2021-01-05 12:57:36 -08001399 sUidOne, sLayerIdOne, sLayerNameOne,
1400 sLayerNameOne);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001401 surfaceFrame1->setAcquireFenceTime(16);
Alec Mouri7d436ec2021-01-27 20:40:50 -08001402 mFrameTimeline->setSfWakeUp(sfToken1, 22, Fps::fromPeriodNsecs(11));
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001403 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
1404 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001405 mFrameTimeline->setSfPresent(27, presentFence1);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001406 auto displayFrame1 = getDisplayFrame(0);
1407 auto& presentedSurfaceFrame1 = getSurfaceFrame(0, 0);
1408 presentFence1->signalForTest(30);
1409
1410 // Fences for the first frame haven't been flushed yet, so it should be 0
1411 EXPECT_EQ(displayFrame1->getActuals().presentTime, 0);
1412 auto actuals1 = presentedSurfaceFrame1.getActuals();
1413 EXPECT_EQ(actuals1.presentTime, 0);
1414
1415 // Trigger a flush by finalizing the next DisplayFrame
1416 auto presentFence2 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
1417 auto surfaceFrame2 =
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001418 mFrameTimeline->createSurfaceFrameForToken({surfaceFrameToken2, sInputEventId}, sPidOne,
Alec Mouriadebf5c2021-01-05 12:57:36 -08001419 sUidOne, sLayerIdOne, sLayerNameOne,
1420 sLayerNameOne);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001421 surfaceFrame2->setAcquireFenceTime(36);
Alec Mouri7d436ec2021-01-27 20:40:50 -08001422 mFrameTimeline->setSfWakeUp(sfToken2, 52, Fps::fromPeriodNsecs(11));
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001423 surfaceFrame2->setPresentState(SurfaceFrame::PresentState::Presented);
1424 mFrameTimeline->addSurfaceFrame(surfaceFrame2);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001425 mFrameTimeline->setSfPresent(57, presentFence2);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001426 auto displayFrame2 = getDisplayFrame(1);
1427 auto& presentedSurfaceFrame2 = getSurfaceFrame(1, 0);
1428
1429 // Fences for the first frame have flushed, so the present timestamps should be updated
1430 EXPECT_EQ(displayFrame1->getActuals().presentTime, 30);
1431 EXPECT_EQ(displayFrame1->getFramePresentMetadata(), FramePresentMetadata::EarlyPresent);
1432 EXPECT_EQ(displayFrame1->getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
1433 EXPECT_EQ(displayFrame1->getJankType(), JankType::SurfaceFlingerScheduling);
1434
1435 actuals1 = presentedSurfaceFrame1.getActuals();
1436 EXPECT_EQ(actuals1.presentTime, 30);
1437 EXPECT_EQ(presentedSurfaceFrame1.getFramePresentMetadata(), FramePresentMetadata::EarlyPresent);
1438 EXPECT_EQ(presentedSurfaceFrame1.getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
1439 EXPECT_EQ(presentedSurfaceFrame1.getJankType(), JankType::SurfaceFlingerScheduling);
1440
1441 // Fences for the second frame haven't been flushed yet, so it should be 0
1442 presentFence2->signalForTest(65);
1443 EXPECT_EQ(displayFrame2->getActuals().presentTime, 0);
1444 auto actuals2 = presentedSurfaceFrame2.getActuals();
1445 EXPECT_EQ(actuals2.presentTime, 0);
1446
Alec Mouri363faf02021-01-29 16:34:55 -08001447 ::testing::Mock::VerifyAndClearExpectations(mTimeStats.get());
1448
1449 EXPECT_CALL(*mTimeStats,
1450 incrementJankyFrames(
1451 TimeStats::JankyFramesInfo{Fps::fromPeriodNsecs(11), std::nullopt, sUidOne,
1452 sLayerNameOne, JankType::PredictionError, 0, 5,
1453 0}));
1454
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001455 addEmptyDisplayFrame();
1456
1457 // Fences for the second frame have flushed, so the present timestamps should be updated
1458 EXPECT_EQ(displayFrame2->getActuals().presentTime, 65);
1459 EXPECT_EQ(displayFrame2->getFramePresentMetadata(), FramePresentMetadata::EarlyPresent);
1460 EXPECT_EQ(displayFrame2->getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
1461 EXPECT_EQ(displayFrame2->getJankType(), JankType::PredictionError);
1462
1463 actuals2 = presentedSurfaceFrame2.getActuals();
1464 EXPECT_EQ(actuals2.presentTime, 65);
1465 EXPECT_EQ(presentedSurfaceFrame2.getFramePresentMetadata(), FramePresentMetadata::EarlyPresent);
1466 EXPECT_EQ(presentedSurfaceFrame2.getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
1467 EXPECT_EQ(presentedSurfaceFrame2.getJankType(), JankType::PredictionError);
1468}
1469
1470TEST_F(FrameTimelineTest, jankClassification_surfaceFrameOnTimeFinishLatePresent) {
Alec Mouri363faf02021-01-29 16:34:55 -08001471 EXPECT_CALL(*mTimeStats, incrementJankyFrames(_));
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001472 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001473 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({22, 30, 40});
1474 int64_t sfToken2 = mTokenManager->generateTokenForPredictions({52, 60, 70});
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001475 int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions({5, 16, 40});
1476 int64_t surfaceFrameToken2 = mTokenManager->generateTokenForPredictions({25, 36, 70});
1477 auto surfaceFrame1 =
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001478 mFrameTimeline->createSurfaceFrameForToken({surfaceFrameToken1, sInputEventId}, sPidOne,
Alec Mouriadebf5c2021-01-05 12:57:36 -08001479 sUidOne, sLayerIdOne, sLayerNameOne,
1480 sLayerNameOne);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001481 surfaceFrame1->setAcquireFenceTime(16);
Alec Mouri7d436ec2021-01-27 20:40:50 -08001482 mFrameTimeline->setSfWakeUp(sfToken1, 22, Fps::fromPeriodNsecs(11));
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001483 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
1484 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
1485 mFrameTimeline->setSfPresent(26, presentFence1);
1486 auto displayFrame1 = getDisplayFrame(0);
1487 auto& presentedSurfaceFrame1 = getSurfaceFrame(0, 0);
1488 presentFence1->signalForTest(50);
1489
1490 // Fences for the first frame haven't been flushed yet, so it should be 0
1491 EXPECT_EQ(displayFrame1->getActuals().presentTime, 0);
1492 auto actuals1 = presentedSurfaceFrame1.getActuals();
1493 EXPECT_EQ(actuals1.presentTime, 0);
1494
1495 // Trigger a flush by finalizing the next DisplayFrame
1496 auto presentFence2 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
1497 auto surfaceFrame2 =
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001498 mFrameTimeline->createSurfaceFrameForToken({surfaceFrameToken2, sInputEventId}, sPidOne,
Alec Mouriadebf5c2021-01-05 12:57:36 -08001499 sUidOne, sLayerIdOne, sLayerNameOne,
1500 sLayerNameOne);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001501 surfaceFrame2->setAcquireFenceTime(36);
Alec Mouri7d436ec2021-01-27 20:40:50 -08001502 mFrameTimeline->setSfWakeUp(sfToken2, 52, Fps::fromPeriodNsecs(11));
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001503 surfaceFrame2->setPresentState(SurfaceFrame::PresentState::Presented);
1504 mFrameTimeline->addSurfaceFrame(surfaceFrame2);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001505 mFrameTimeline->setSfPresent(57, presentFence2);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001506 auto displayFrame2 = getDisplayFrame(1);
1507 auto& presentedSurfaceFrame2 = getSurfaceFrame(1, 0);
1508
1509 // Fences for the first frame have flushed, so the present timestamps should be updated
1510 EXPECT_EQ(displayFrame1->getActuals().presentTime, 50);
1511 EXPECT_EQ(displayFrame1->getFramePresentMetadata(), FramePresentMetadata::LatePresent);
1512 EXPECT_EQ(displayFrame1->getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
1513 EXPECT_EQ(displayFrame1->getJankType(), JankType::DisplayHAL);
1514
1515 actuals1 = presentedSurfaceFrame1.getActuals();
1516 EXPECT_EQ(actuals1.presentTime, 50);
1517 EXPECT_EQ(presentedSurfaceFrame1.getFramePresentMetadata(), FramePresentMetadata::LatePresent);
1518 EXPECT_EQ(presentedSurfaceFrame1.getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
1519 EXPECT_EQ(presentedSurfaceFrame1.getJankType(), JankType::DisplayHAL);
1520
1521 // Fences for the second frame haven't been flushed yet, so it should be 0
1522 presentFence2->signalForTest(86);
1523 EXPECT_EQ(displayFrame2->getActuals().presentTime, 0);
1524 auto actuals2 = presentedSurfaceFrame2.getActuals();
1525 EXPECT_EQ(actuals2.presentTime, 0);
1526
Alec Mouri363faf02021-01-29 16:34:55 -08001527 ::testing::Mock::VerifyAndClearExpectations(mTimeStats.get());
1528
1529 EXPECT_CALL(*mTimeStats,
1530 incrementJankyFrames(
1531 TimeStats::JankyFramesInfo{Fps::fromPeriodNsecs(11), std::nullopt, sUidOne,
1532 sLayerNameOne, JankType::PredictionError, 0, 5,
1533 0}));
1534
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001535 addEmptyDisplayFrame();
1536
1537 // Fences for the second frame have flushed, so the present timestamps should be updated
1538 EXPECT_EQ(displayFrame2->getActuals().presentTime, 86);
1539 EXPECT_EQ(displayFrame2->getFramePresentMetadata(), FramePresentMetadata::LatePresent);
1540 EXPECT_EQ(displayFrame2->getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
1541 EXPECT_EQ(displayFrame2->getJankType(), JankType::PredictionError);
1542
1543 actuals2 = presentedSurfaceFrame2.getActuals();
1544 EXPECT_EQ(actuals2.presentTime, 86);
1545 EXPECT_EQ(presentedSurfaceFrame2.getFramePresentMetadata(), FramePresentMetadata::LatePresent);
1546 EXPECT_EQ(presentedSurfaceFrame2.getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
1547 EXPECT_EQ(presentedSurfaceFrame2.getJankType(), JankType::PredictionError);
1548}
1549
1550TEST_F(FrameTimelineTest, jankClassification_surfaceFrameLateFinishEarlyPresent) {
Alec Mouri363faf02021-01-29 16:34:55 -08001551 EXPECT_CALL(*mTimeStats, incrementJankyFrames(_));
Alec Mouri7d436ec2021-01-27 20:40:50 -08001552
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001553 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001554 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({42, 50, 50});
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001555 int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions({5, 26, 60});
1556 auto surfaceFrame1 =
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001557 mFrameTimeline->createSurfaceFrameForToken({surfaceFrameToken1, sInputEventId}, sPidOne,
Alec Mouriadebf5c2021-01-05 12:57:36 -08001558 sUidOne, sLayerIdOne, sLayerNameOne,
1559 sLayerNameOne);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001560 surfaceFrame1->setAcquireFenceTime(40);
Alec Mouri7d436ec2021-01-27 20:40:50 -08001561 mFrameTimeline->setSfWakeUp(sfToken1, 42, Fps::fromPeriodNsecs(11));
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001562 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
1563 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
1564 mFrameTimeline->setSfPresent(46, presentFence1);
1565 auto displayFrame1 = getDisplayFrame(0);
1566 auto& presentedSurfaceFrame1 = getSurfaceFrame(0, 0);
1567 presentFence1->signalForTest(50);
1568
1569 // Fences for the first frame haven't been flushed yet, so it should be 0
1570 EXPECT_EQ(displayFrame1->getActuals().presentTime, 0);
1571 auto actuals1 = presentedSurfaceFrame1.getActuals();
1572 EXPECT_EQ(actuals1.presentTime, 0);
1573
1574 addEmptyDisplayFrame();
1575
1576 // Fences for the first frame have flushed, so the present timestamps should be updated
1577 EXPECT_EQ(displayFrame1->getActuals().presentTime, 50);
1578 EXPECT_EQ(displayFrame1->getFramePresentMetadata(), FramePresentMetadata::OnTimePresent);
1579 EXPECT_EQ(displayFrame1->getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
1580 EXPECT_EQ(displayFrame1->getJankType(), JankType::None);
1581
1582 actuals1 = presentedSurfaceFrame1.getActuals();
1583 EXPECT_EQ(actuals1.presentTime, 50);
1584 EXPECT_EQ(presentedSurfaceFrame1.getFramePresentMetadata(), FramePresentMetadata::EarlyPresent);
1585 EXPECT_EQ(presentedSurfaceFrame1.getFrameReadyMetadata(), FrameReadyMetadata::LateFinish);
1586 EXPECT_EQ(presentedSurfaceFrame1.getJankType(), JankType::Unknown);
1587}
1588
1589TEST_F(FrameTimelineTest, jankClassification_surfaceFrameLateFinishLatePresent) {
1590 // First frame - DisplayFrame is not janky. This should classify the SurfaceFrame as
1591 // AppDeadlineMissed. Second frame - DisplayFrame is janky. This should propagate DisplayFrame's
1592 // jank to the SurfaceFrame.
1593
Alec Mouri363faf02021-01-29 16:34:55 -08001594 EXPECT_CALL(*mTimeStats, incrementJankyFrames(_)).Times(2);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001595 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001596 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({32, 40, 40});
1597 int64_t sfToken2 = mTokenManager->generateTokenForPredictions({42, 50, 50});
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001598 int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions({5, 16, 30});
1599 int64_t surfaceFrameToken2 = mTokenManager->generateTokenForPredictions({25, 36, 50});
1600 auto surfaceFrame1 =
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001601 mFrameTimeline->createSurfaceFrameForToken({surfaceFrameToken1, sInputEventId}, sPidOne,
Alec Mouriadebf5c2021-01-05 12:57:36 -08001602 sUidOne, sLayerIdOne, sLayerNameOne,
1603 sLayerNameOne);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001604 surfaceFrame1->setAcquireFenceTime(26);
Alec Mouri7d436ec2021-01-27 20:40:50 -08001605 mFrameTimeline->setSfWakeUp(sfToken1, 32, Fps::fromPeriodNsecs(11));
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001606 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
1607 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
1608 mFrameTimeline->setSfPresent(36, presentFence1);
1609 auto displayFrame1 = getDisplayFrame(0);
1610 auto& presentedSurfaceFrame1 = getSurfaceFrame(0, 0);
1611 presentFence1->signalForTest(40);
1612
1613 // Fences for the first frame haven't been flushed yet, so it should be 0
1614 EXPECT_EQ(displayFrame1->getActuals().presentTime, 0);
1615 auto actuals1 = presentedSurfaceFrame1.getActuals();
1616 EXPECT_EQ(actuals1.presentTime, 0);
1617
1618 // Trigger a flush by finalizing the next DisplayFrame
1619 auto presentFence2 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
1620 auto surfaceFrame2 =
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001621 mFrameTimeline->createSurfaceFrameForToken({surfaceFrameToken2, sInputEventId}, sPidOne,
Alec Mouriadebf5c2021-01-05 12:57:36 -08001622 sUidOne, sLayerIdOne, sLayerNameOne,
1623 sLayerNameOne);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001624 surfaceFrame2->setAcquireFenceTime(40);
Alec Mouri7d436ec2021-01-27 20:40:50 -08001625 mFrameTimeline->setSfWakeUp(sfToken2, 43, Fps::fromPeriodNsecs(11));
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001626 surfaceFrame2->setPresentState(SurfaceFrame::PresentState::Presented);
1627 mFrameTimeline->addSurfaceFrame(surfaceFrame2);
1628 mFrameTimeline->setSfPresent(56, presentFence2);
1629 auto displayFrame2 = getDisplayFrame(1);
1630 auto& presentedSurfaceFrame2 = getSurfaceFrame(1, 0);
1631
1632 // Fences for the first frame have flushed, so the present timestamps should be updated
1633 EXPECT_EQ(displayFrame1->getActuals().presentTime, 40);
1634 EXPECT_EQ(displayFrame1->getFramePresentMetadata(), FramePresentMetadata::OnTimePresent);
1635 EXPECT_EQ(displayFrame1->getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
1636 EXPECT_EQ(displayFrame1->getJankType(), JankType::None);
1637
1638 actuals1 = presentedSurfaceFrame1.getActuals();
1639 EXPECT_EQ(actuals1.presentTime, 40);
1640 EXPECT_EQ(presentedSurfaceFrame1.getFramePresentMetadata(), FramePresentMetadata::LatePresent);
1641 EXPECT_EQ(presentedSurfaceFrame1.getFrameReadyMetadata(), FrameReadyMetadata::LateFinish);
1642 EXPECT_EQ(presentedSurfaceFrame1.getJankType(), JankType::AppDeadlineMissed);
1643
1644 // Fences for the second frame haven't been flushed yet, so it should be 0
1645 presentFence2->signalForTest(60);
1646 EXPECT_EQ(displayFrame2->getActuals().presentTime, 0);
1647 auto actuals2 = presentedSurfaceFrame2.getActuals();
1648 EXPECT_EQ(actuals2.presentTime, 0);
1649
1650 addEmptyDisplayFrame();
1651
1652 // Fences for the second frame have flushed, so the present timestamps should be updated
1653 EXPECT_EQ(displayFrame2->getActuals().presentTime, 60);
1654 EXPECT_EQ(displayFrame2->getFramePresentMetadata(), FramePresentMetadata::LatePresent);
1655 EXPECT_EQ(displayFrame2->getFrameReadyMetadata(), FrameReadyMetadata::LateFinish);
1656 EXPECT_EQ(displayFrame2->getJankType(), JankType::SurfaceFlingerCpuDeadlineMissed);
1657
1658 actuals2 = presentedSurfaceFrame2.getActuals();
1659 EXPECT_EQ(actuals2.presentTime, 60);
1660 EXPECT_EQ(presentedSurfaceFrame2.getFramePresentMetadata(), FramePresentMetadata::LatePresent);
1661 EXPECT_EQ(presentedSurfaceFrame2.getFrameReadyMetadata(), FrameReadyMetadata::LateFinish);
1662 EXPECT_EQ(presentedSurfaceFrame2.getJankType(), JankType::SurfaceFlingerCpuDeadlineMissed);
1663}
1664
1665TEST_F(FrameTimelineTest, jankClassification_multiJankBufferStuffingAndAppDeadlineMissed) {
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001666 // Layer specific increment
Alec Mouri363faf02021-01-29 16:34:55 -08001667 EXPECT_CALL(*mTimeStats, incrementJankyFrames(_)).Times(2);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001668 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
1669 int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions({10, 20, 30});
1670 int64_t surfaceFrameToken2 = mTokenManager->generateTokenForPredictions({40, 50, 60});
1671
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001672 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({52, 60, 60});
1673 int64_t sfToken2 = mTokenManager->generateTokenForPredictions({112, 120, 120});
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001674 auto surfaceFrame1 =
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001675 mFrameTimeline->createSurfaceFrameForToken({surfaceFrameToken1, sInputEventId}, sPidOne,
Alec Mouriadebf5c2021-01-05 12:57:36 -08001676 sUidOne, sLayerIdOne, sLayerNameOne,
1677 sLayerNameOne);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001678 surfaceFrame1->setAcquireFenceTime(50);
Alec Mouri7d436ec2021-01-27 20:40:50 -08001679 mFrameTimeline->setSfWakeUp(sfToken1, 52, Fps::fromPeriodNsecs(30));
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001680 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
1681 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
1682 mFrameTimeline->setSfPresent(56, presentFence1);
1683 auto displayFrame1 = getDisplayFrame(0);
1684 auto& presentedSurfaceFrame1 = getSurfaceFrame(0, 0);
1685 presentFence1->signalForTest(60);
1686
1687 // Fences for the first frame haven't been flushed yet, so it should be 0
1688 EXPECT_EQ(displayFrame1->getActuals().presentTime, 0);
1689 auto actuals1 = presentedSurfaceFrame1.getActuals();
1690 EXPECT_EQ(actuals1.presentTime, 0);
1691
1692 // Trigger a flush by finalizing the next DisplayFrame
1693 auto presentFence2 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
1694 auto surfaceFrame2 =
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001695 mFrameTimeline->createSurfaceFrameForToken({surfaceFrameToken2, sInputEventId}, sPidOne,
Alec Mouriadebf5c2021-01-05 12:57:36 -08001696 sUidOne, sLayerIdOne, sLayerNameOne,
1697 sLayerNameOne);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001698 surfaceFrame2->setAcquireFenceTime(84);
Alec Mouri7d436ec2021-01-27 20:40:50 -08001699 mFrameTimeline->setSfWakeUp(sfToken2, 112, Fps::fromPeriodNsecs(30));
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001700 surfaceFrame2->setPresentState(SurfaceFrame::PresentState::Presented, 54);
1701 mFrameTimeline->addSurfaceFrame(surfaceFrame2);
1702 mFrameTimeline->setSfPresent(116, presentFence2);
1703 auto displayFrame2 = getDisplayFrame(1);
1704 auto& presentedSurfaceFrame2 = getSurfaceFrame(1, 0);
1705 presentFence2->signalForTest(120);
1706
1707 // Fences for the first frame have flushed, so the present timestamps should be updated
1708 EXPECT_EQ(displayFrame1->getActuals().presentTime, 60);
1709 actuals1 = presentedSurfaceFrame1.getActuals();
1710 EXPECT_EQ(actuals1.endTime, 50);
1711 EXPECT_EQ(actuals1.presentTime, 60);
1712
1713 EXPECT_EQ(displayFrame1->getFramePresentMetadata(), FramePresentMetadata::OnTimePresent);
1714 EXPECT_EQ(displayFrame1->getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
1715 EXPECT_EQ(displayFrame1->getJankType(), JankType::None);
1716
1717 EXPECT_EQ(presentedSurfaceFrame1.getFramePresentMetadata(), FramePresentMetadata::LatePresent);
1718 EXPECT_EQ(presentedSurfaceFrame1.getFrameReadyMetadata(), FrameReadyMetadata::LateFinish);
1719 EXPECT_EQ(presentedSurfaceFrame1.getJankType(), JankType::AppDeadlineMissed);
1720
1721 // Fences for the second frame haven't been flushed yet, so it should be 0
1722 EXPECT_EQ(displayFrame2->getActuals().presentTime, 0);
1723 auto actuals2 = presentedSurfaceFrame2.getActuals();
1724 EXPECT_EQ(actuals2.presentTime, 0);
1725
1726 addEmptyDisplayFrame();
1727
1728 // Fences for the second frame have flushed, so the present timestamps should be updated
1729 EXPECT_EQ(displayFrame2->getActuals().presentTime, 120);
1730 actuals2 = presentedSurfaceFrame2.getActuals();
1731 EXPECT_EQ(actuals2.presentTime, 120);
1732
1733 EXPECT_EQ(displayFrame2->getFramePresentMetadata(), FramePresentMetadata::OnTimePresent);
1734 EXPECT_EQ(displayFrame2->getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
1735 EXPECT_EQ(displayFrame2->getJankType(), JankType::None);
1736
1737 EXPECT_EQ(presentedSurfaceFrame2.getFramePresentMetadata(), FramePresentMetadata::LatePresent);
1738 EXPECT_EQ(presentedSurfaceFrame2.getFrameReadyMetadata(), FrameReadyMetadata::LateFinish);
1739 EXPECT_EQ(presentedSurfaceFrame2.getJankType(),
1740 JankType::AppDeadlineMissed | JankType::BufferStuffing);
1741}
Alec Mouriadebf5c2021-01-05 12:57:36 -08001742
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001743TEST_F(FrameTimelineTest, jankClassification_appDeadlineAdjustedForBufferStuffing) {
1744 // Layer specific increment
1745 EXPECT_CALL(*mTimeStats, incrementJankyFrames(_)).Times(2);
1746 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
1747 int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions({10, 20, 30});
1748 int64_t surfaceFrameToken2 = mTokenManager->generateTokenForPredictions({40, 50, 60});
1749
1750 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({52, 60, 60});
1751 int64_t sfToken2 = mTokenManager->generateTokenForPredictions({82, 90, 90});
1752 auto surfaceFrame1 =
1753 mFrameTimeline->createSurfaceFrameForToken({surfaceFrameToken1, sInputEventId}, sPidOne,
1754 sUidOne, sLayerIdOne, sLayerNameOne,
1755 sLayerNameOne);
1756 surfaceFrame1->setAcquireFenceTime(50);
1757 mFrameTimeline->setSfWakeUp(sfToken1, 52, Fps::fromPeriodNsecs(30));
1758 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
1759 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
1760 mFrameTimeline->setSfPresent(56, presentFence1);
1761 auto displayFrame1 = getDisplayFrame(0);
1762 auto& presentedSurfaceFrame1 = getSurfaceFrame(0, 0);
1763 presentFence1->signalForTest(60);
1764
1765 // Fences for the first frame haven't been flushed yet, so it should be 0
1766 EXPECT_EQ(displayFrame1->getActuals().presentTime, 0);
1767 auto actuals1 = presentedSurfaceFrame1.getActuals();
1768 EXPECT_EQ(actuals1.presentTime, 0);
1769
1770 // Trigger a flush by finalizing the next DisplayFrame
1771 auto presentFence2 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
1772 auto surfaceFrame2 =
1773 mFrameTimeline->createSurfaceFrameForToken({surfaceFrameToken2, sInputEventId}, sPidOne,
1774 sUidOne, sLayerIdOne, sLayerNameOne,
1775 sLayerNameOne);
1776 surfaceFrame2->setAcquireFenceTime(80);
1777 mFrameTimeline->setSfWakeUp(sfToken2, 82, Fps::fromPeriodNsecs(30));
1778 // Setting previous latch time to 54, adjusted deadline will be 54 + vsyncTime(30) = 84
1779 surfaceFrame2->setPresentState(SurfaceFrame::PresentState::Presented, 54);
1780 mFrameTimeline->addSurfaceFrame(surfaceFrame2);
1781 mFrameTimeline->setSfPresent(86, presentFence2);
1782 auto displayFrame2 = getDisplayFrame(1);
1783 auto& presentedSurfaceFrame2 = getSurfaceFrame(1, 0);
1784 presentFence2->signalForTest(90);
1785
1786 // Fences for the first frame have flushed, so the present timestamps should be updated
1787 EXPECT_EQ(displayFrame1->getActuals().presentTime, 60);
1788 actuals1 = presentedSurfaceFrame1.getActuals();
1789 EXPECT_EQ(actuals1.endTime, 50);
1790 EXPECT_EQ(actuals1.presentTime, 60);
1791
1792 EXPECT_EQ(displayFrame1->getFramePresentMetadata(), FramePresentMetadata::OnTimePresent);
1793 EXPECT_EQ(displayFrame1->getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
1794 EXPECT_EQ(displayFrame1->getJankType(), JankType::None);
1795
1796 EXPECT_EQ(presentedSurfaceFrame1.getFramePresentMetadata(), FramePresentMetadata::LatePresent);
1797 EXPECT_EQ(presentedSurfaceFrame1.getFrameReadyMetadata(), FrameReadyMetadata::LateFinish);
1798 EXPECT_EQ(presentedSurfaceFrame1.getJankType(), JankType::AppDeadlineMissed);
1799
1800 // Fences for the second frame haven't been flushed yet, so it should be 0
1801 EXPECT_EQ(displayFrame2->getActuals().presentTime, 0);
1802 auto actuals2 = presentedSurfaceFrame2.getActuals();
1803 EXPECT_EQ(actuals2.presentTime, 0);
1804
1805 addEmptyDisplayFrame();
1806
1807 // Fences for the second frame have flushed, so the present timestamps should be updated
1808 EXPECT_EQ(displayFrame2->getActuals().presentTime, 90);
1809 actuals2 = presentedSurfaceFrame2.getActuals();
1810 EXPECT_EQ(actuals2.presentTime, 90);
1811
1812 EXPECT_EQ(displayFrame2->getFramePresentMetadata(), FramePresentMetadata::OnTimePresent);
1813 EXPECT_EQ(displayFrame2->getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
1814 EXPECT_EQ(displayFrame2->getJankType(), JankType::None);
1815
1816 EXPECT_EQ(presentedSurfaceFrame2.getFramePresentMetadata(), FramePresentMetadata::LatePresent);
1817 EXPECT_EQ(presentedSurfaceFrame2.getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
1818 EXPECT_EQ(presentedSurfaceFrame2.getJankType(), JankType::BufferStuffing);
1819}
1820
Alec Mouriadebf5c2021-01-05 12:57:36 -08001821TEST_F(FrameTimelineTest, computeFps_noLayerIds_returnsZero) {
1822 EXPECT_EQ(mFrameTimeline->computeFps({}), 0.0f);
1823}
1824
1825TEST_F(FrameTimelineTest, computeFps_singleDisplayFrame_returnsZero) {
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001826 const auto oneHundredMs = std::chrono::nanoseconds(100ms).count();
Alec Mouriadebf5c2021-01-05 12:57:36 -08001827
1828 auto surfaceFrame1 =
1829 mFrameTimeline->createSurfaceFrameForToken(FrameTimelineInfo(), sPidOne, sUidOne,
1830 sLayerIdOne, sLayerNameOne, sLayerNameOne);
1831 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
1832 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
1833 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
1834 presentFence1->signalForTest(oneHundredMs);
1835 mFrameTimeline->setSfPresent(oneHundredMs, presentFence1);
1836
1837 EXPECT_EQ(mFrameTimeline->computeFps({sLayerIdOne}), 0.0f);
1838}
1839
1840TEST_F(FrameTimelineTest, computeFps_twoDisplayFrames_oneLayer) {
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001841 const auto oneHundredMs = std::chrono::nanoseconds(100ms).count();
1842 const auto twoHundredMs = std::chrono::nanoseconds(200ms).count();
Alec Mouriadebf5c2021-01-05 12:57:36 -08001843 auto surfaceFrame1 =
1844 mFrameTimeline->createSurfaceFrameForToken(FrameTimelineInfo(), sPidOne, sUidOne,
1845 sLayerIdOne, sLayerNameOne, sLayerNameOne);
1846 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
1847 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
1848 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
1849 presentFence1->signalForTest(oneHundredMs);
1850 mFrameTimeline->setSfPresent(oneHundredMs, presentFence1);
1851
1852 auto surfaceFrame2 =
1853 mFrameTimeline->createSurfaceFrameForToken(FrameTimelineInfo(), sPidOne, sUidOne,
1854 sLayerIdOne, sLayerNameOne, sLayerNameOne);
1855 auto presentFence2 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
1856 surfaceFrame2->setPresentState(SurfaceFrame::PresentState::Presented);
1857 mFrameTimeline->addSurfaceFrame(surfaceFrame2);
1858 presentFence2->signalForTest(twoHundredMs);
1859 mFrameTimeline->setSfPresent(twoHundredMs, presentFence2);
1860
1861 EXPECT_EQ(mFrameTimeline->computeFps({sLayerIdOne}), 10.0);
1862}
1863
1864TEST_F(FrameTimelineTest, computeFps_twoDisplayFrames_twoLayers) {
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001865 const auto oneHundredMs = std::chrono::nanoseconds(100ms).count();
1866 const auto twoHundredMs = std::chrono::nanoseconds(200ms).count();
Alec Mouriadebf5c2021-01-05 12:57:36 -08001867 auto surfaceFrame1 =
1868 mFrameTimeline->createSurfaceFrameForToken(FrameTimelineInfo(), sPidOne, sUidOne,
1869 sLayerIdOne, sLayerNameOne, sLayerNameOne);
1870 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
1871 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
1872 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
1873 presentFence1->signalForTest(oneHundredMs);
1874 mFrameTimeline->setSfPresent(oneHundredMs, presentFence1);
1875
1876 auto surfaceFrame2 =
1877 mFrameTimeline->createSurfaceFrameForToken(FrameTimelineInfo(), sPidOne, sUidOne,
1878 sLayerIdTwo, sLayerNameTwo, sLayerNameTwo);
1879 auto presentFence2 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
1880 surfaceFrame2->setPresentState(SurfaceFrame::PresentState::Presented);
1881 mFrameTimeline->addSurfaceFrame(surfaceFrame2);
1882 presentFence2->signalForTest(twoHundredMs);
1883 mFrameTimeline->setSfPresent(twoHundredMs, presentFence2);
1884
1885 EXPECT_EQ(mFrameTimeline->computeFps({sLayerIdOne, sLayerIdTwo}), 10.0f);
1886}
1887
1888TEST_F(FrameTimelineTest, computeFps_filtersOutLayers) {
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001889 const auto oneHundredMs = std::chrono::nanoseconds(100ms).count();
1890 const auto twoHundredMs = std::chrono::nanoseconds(200ms).count();
Alec Mouriadebf5c2021-01-05 12:57:36 -08001891 auto surfaceFrame1 =
1892 mFrameTimeline->createSurfaceFrameForToken(FrameTimelineInfo(), sPidOne, sUidOne,
1893 sLayerIdOne, sLayerNameOne, sLayerNameOne);
1894 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
1895 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
1896 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
1897 presentFence1->signalForTest(oneHundredMs);
1898 mFrameTimeline->setSfPresent(oneHundredMs, presentFence1);
1899
1900 auto surfaceFrame2 =
1901 mFrameTimeline->createSurfaceFrameForToken(FrameTimelineInfo(), sPidOne, sUidOne,
1902 sLayerIdTwo, sLayerNameTwo, sLayerNameTwo);
1903 auto presentFence2 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
1904 surfaceFrame2->setPresentState(SurfaceFrame::PresentState::Presented);
1905 mFrameTimeline->addSurfaceFrame(surfaceFrame2);
1906 presentFence2->signalForTest(twoHundredMs);
1907 mFrameTimeline->setSfPresent(twoHundredMs, presentFence2);
1908
1909 EXPECT_EQ(mFrameTimeline->computeFps({sLayerIdOne}), 0.0f);
1910}
1911
1912TEST_F(FrameTimelineTest, computeFps_averagesOverMultipleFrames) {
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001913 const auto oneHundredMs = std::chrono::nanoseconds(100ms).count();
1914 const auto twoHundredMs = std::chrono::nanoseconds(200ms).count();
1915 const auto threeHundredMs = std::chrono::nanoseconds(300ms).count();
1916 const auto fiveHundredMs = std::chrono::nanoseconds(500ms).count();
1917 const auto sixHundredMs = std::chrono::nanoseconds(600ms).count();
Alec Mouriadebf5c2021-01-05 12:57:36 -08001918 auto surfaceFrame1 =
1919 mFrameTimeline->createSurfaceFrameForToken(FrameTimelineInfo(), sPidOne, sUidOne,
1920 sLayerIdOne, sLayerNameOne, sLayerNameOne);
1921 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
1922 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
1923 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
1924 presentFence1->signalForTest(oneHundredMs);
1925 mFrameTimeline->setSfPresent(oneHundredMs, presentFence1);
1926
1927 auto surfaceFrame2 =
1928 mFrameTimeline->createSurfaceFrameForToken(FrameTimelineInfo(), sPidOne, sUidOne,
1929 sLayerIdOne, sLayerNameOne, sLayerNameOne);
1930 auto presentFence2 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
1931 surfaceFrame2->setPresentState(SurfaceFrame::PresentState::Presented);
1932 mFrameTimeline->addSurfaceFrame(surfaceFrame2);
1933 presentFence2->signalForTest(twoHundredMs);
1934 mFrameTimeline->setSfPresent(twoHundredMs, presentFence2);
1935
1936 auto surfaceFrame3 =
1937 mFrameTimeline->createSurfaceFrameForToken(FrameTimelineInfo(), sPidOne, sUidOne,
1938 sLayerIdTwo, sLayerNameTwo, sLayerNameTwo);
1939 auto presentFence3 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
1940 surfaceFrame3->setPresentState(SurfaceFrame::PresentState::Presented);
1941 mFrameTimeline->addSurfaceFrame(surfaceFrame3);
1942 presentFence3->signalForTest(threeHundredMs);
1943 mFrameTimeline->setSfPresent(threeHundredMs, presentFence3);
1944
1945 auto surfaceFrame4 =
1946 mFrameTimeline->createSurfaceFrameForToken(FrameTimelineInfo(), sPidOne, sUidOne,
1947 sLayerIdOne, sLayerNameOne, sLayerNameOne);
1948 auto presentFence4 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
1949 surfaceFrame4->setPresentState(SurfaceFrame::PresentState::Presented);
1950 mFrameTimeline->addSurfaceFrame(surfaceFrame4);
1951 presentFence4->signalForTest(fiveHundredMs);
1952 mFrameTimeline->setSfPresent(fiveHundredMs, presentFence4);
1953
1954 auto surfaceFrame5 =
1955 mFrameTimeline->createSurfaceFrameForToken(FrameTimelineInfo(), sPidOne, sUidOne,
1956 sLayerIdOne, sLayerNameOne, sLayerNameOne);
1957 auto presentFence5 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
1958 // Dropped frames will be excluded from fps computation
1959 surfaceFrame5->setPresentState(SurfaceFrame::PresentState::Dropped);
1960 mFrameTimeline->addSurfaceFrame(surfaceFrame5);
1961 presentFence5->signalForTest(sixHundredMs);
1962 mFrameTimeline->setSfPresent(sixHundredMs, presentFence5);
1963
1964 EXPECT_EQ(mFrameTimeline->computeFps({sLayerIdOne}), 5.0f);
1965}
1966
Adithya Srinivasanf279e042020-08-17 14:56:27 -07001967} // namespace android::frametimeline