blob: ddc3967c407704728dcad55c53c189fddef4e7be [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
Ady Abraham3db8a3c2023-11-20 17:53:47 -080017#include <common/test/FlagUtils.h>
Sally Qif5721252023-11-17 11:14:53 -080018#include "com_android_graphics_surfaceflinger_flags.h"
Alec Mouri9a29e672020-09-14 12:39:14 -070019#include "gmock/gmock-spec-builders.h"
20#include "mock/MockTimeStats.h"
Adithya Srinivasanf279e042020-08-17 14:56:27 -070021#undef LOG_TAG
22#define LOG_TAG "LibSurfaceFlingerUnittests"
23
24#include <FrameTimeline/FrameTimeline.h>
25#include <gtest/gtest.h>
26#include <log/log.h>
Adithya Srinivasan01189672020-10-20 14:23:05 -070027#include <perfetto/trace/trace.pb.h>
Adithya Srinivasanf279e042020-08-17 14:56:27 -070028#include <cinttypes>
29
30using namespace std::chrono_literals;
Alec Mouri363faf02021-01-29 16:34:55 -080031using testing::_;
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -080032using testing::AtLeast;
Alec Mouri9a29e672020-09-14 12:39:14 -070033using testing::Contains;
Adithya Srinivasan01189672020-10-20 14:23:05 -070034using FrameTimelineEvent = perfetto::protos::FrameTimelineEvent;
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +000035using ProtoExpectedDisplayFrameStart =
36 perfetto::protos::FrameTimelineEvent_ExpectedDisplayFrameStart;
37using ProtoExpectedSurfaceFrameStart =
38 perfetto::protos::FrameTimelineEvent_ExpectedSurfaceFrameStart;
39using ProtoActualDisplayFrameStart = perfetto::protos::FrameTimelineEvent_ActualDisplayFrameStart;
40using ProtoActualSurfaceFrameStart = perfetto::protos::FrameTimelineEvent_ActualSurfaceFrameStart;
41using ProtoFrameEnd = perfetto::protos::FrameTimelineEvent_FrameEnd;
Adithya Srinivasan01189672020-10-20 14:23:05 -070042using ProtoPresentType = perfetto::protos::FrameTimelineEvent_PresentType;
43using ProtoJankType = perfetto::protos::FrameTimelineEvent_JankType;
Ying Wei96eb5352023-11-21 17:37:21 +000044using ProtoJankSeverityType = perfetto::protos::FrameTimelineEvent_JankSeverityType;
Adithya Srinivasan78e58af2021-02-25 00:08:08 +000045using ProtoPredictionType = perfetto::protos::FrameTimelineEvent_PredictionType;
Alec Mouri9a29e672020-09-14 12:39:14 -070046
Adithya Srinivasanf279e042020-08-17 14:56:27 -070047namespace android::frametimeline {
48
Ady Abraham57a8ab42023-01-26 15:28:19 -080049static const std::string sLayerNameOne = "layer1";
50static const std::string sLayerNameTwo = "layer2";
51
52constexpr const uid_t sUidOne = 0;
53constexpr pid_t sPidOne = 10;
54constexpr pid_t sPidTwo = 20;
55constexpr int32_t sInputEventId = 5;
56constexpr int32_t sLayerIdOne = 1;
57constexpr int32_t sLayerIdTwo = 2;
58constexpr GameMode sGameMode = GameMode::Unsupported;
Pascal Muetschardac7bcd92023-10-03 15:05:36 +020059constexpr Fps RR_11 = Fps::fromPeriodNsecs(11);
60constexpr Fps RR_30 = Fps::fromPeriodNsecs(30);
Ady Abraham57a8ab42023-01-26 15:28:19 -080061
Adithya Srinivasanf279e042020-08-17 14:56:27 -070062class FrameTimelineTest : public testing::Test {
63public:
64 FrameTimelineTest() {
65 const ::testing::TestInfo* const test_info =
66 ::testing::UnitTest::GetInstance()->current_test_info();
67 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
68 }
69
70 ~FrameTimelineTest() {
71 const ::testing::TestInfo* const test_info =
72 ::testing::UnitTest::GetInstance()->current_test_info();
73 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
74 }
75
Adithya Srinivasan01189672020-10-20 14:23:05 -070076 static void SetUpTestSuite() {
77 // Need to initialize tracing in process for testing, and only once per test suite.
78 perfetto::TracingInitArgs args;
79 args.backends = perfetto::kInProcessBackend;
80 perfetto::Tracing::Initialize(args);
81 }
82
Adithya Srinivasanf279e042020-08-17 14:56:27 -070083 void SetUp() override {
Ady Abraham57f8e182022-03-08 15:54:33 -080084 constexpr bool kUseBootTimeClock = true;
Alec Mouri9a29e672020-09-14 12:39:14 -070085 mTimeStats = std::make_shared<mock::TimeStats>();
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +000086 mFrameTimeline = std::make_unique<impl::FrameTimeline>(mTimeStats, kSurfaceFlingerPid,
Ady Abraham57f8e182022-03-08 15:54:33 -080087 kTestThresholds, !kUseBootTimeClock);
Adithya Srinivasan01189672020-10-20 14:23:05 -070088 mFrameTimeline->registerDataSource();
Adithya Srinivasanf279e042020-08-17 14:56:27 -070089 mTokenManager = &mFrameTimeline->mTokenManager;
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +000090 mTraceCookieCounter = &mFrameTimeline->mTraceCookieCounter;
Adithya Srinivasan2d736322020-10-01 16:53:48 -070091 maxDisplayFrames = &mFrameTimeline->mMaxDisplayFrames;
Adithya Srinivasanbed4c4f2021-05-03 20:24:46 +000092 maxTokens = mTokenManager->kMaxTokens;
Adithya Srinivasanf279e042020-08-17 14:56:27 -070093 }
94
Adithya Srinivasan01189672020-10-20 14:23:05 -070095 // Each tracing session can be used for a single block of Start -> Stop.
96 static std::unique_ptr<perfetto::TracingSession> getTracingSessionForTest() {
97 perfetto::TraceConfig cfg;
98 cfg.set_duration_ms(500);
99 cfg.add_buffers()->set_size_kb(1024);
100 auto* ds_cfg = cfg.add_data_sources()->mutable_config();
101 ds_cfg->set_name(impl::FrameTimeline::kFrameTimelineDataSource);
102
103 auto tracingSession = perfetto::Tracing::NewTrace(perfetto::kInProcessBackend);
104 tracingSession->Setup(cfg);
105 return tracingSession;
106 }
107
108 std::vector<perfetto::protos::TracePacket> readFrameTimelinePacketsBlocking(
109 perfetto::TracingSession* tracingSession) {
110 std::vector<char> raw_trace = tracingSession->ReadTraceBlocking();
111 perfetto::protos::Trace trace;
112 EXPECT_TRUE(trace.ParseFromArray(raw_trace.data(), int(raw_trace.size())));
113
114 std::vector<perfetto::protos::TracePacket> packets;
115 for (const auto& packet : trace.packet()) {
116 if (!packet.has_frame_timeline_event()) {
117 continue;
118 }
119 packets.emplace_back(packet);
120 }
121 return packets;
122 }
123
Ady Abraham57a8ab42023-01-26 15:28:19 -0800124 void addEmptySurfaceFrame() {
125 auto surfaceFrame =
126 mFrameTimeline->createSurfaceFrameForToken({}, sPidOne, sUidOne, sLayerIdOne,
127 sLayerNameOne, sLayerNameOne,
128 /*isBuffer*/ false, sGameMode);
129 mFrameTimeline->addSurfaceFrame(std::move(surfaceFrame));
130 }
131
Adithya Srinivasan01189672020-10-20 14:23:05 -0700132 void addEmptyDisplayFrame() {
133 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000134 // Trigger a flushPresentFence by calling setSfPresent for the next frame
Adithya Srinivasan01189672020-10-20 14:23:05 -0700135 mFrameTimeline->setSfPresent(2500, presentFence1);
136 }
137
Adithya Srinivasanbed4c4f2021-05-03 20:24:46 +0000138 void flushTokens() {
139 for (size_t i = 0; i < maxTokens; i++) {
140 mTokenManager->generateTokenForPredictions({});
141 }
142 EXPECT_EQ(getPredictions().size(), maxTokens);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700143 }
144
145 SurfaceFrame& getSurfaceFrame(size_t displayFrameIdx, size_t surfaceFrameIdx) {
146 std::lock_guard<std::mutex> lock(mFrameTimeline->mMutex);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800147 return *(mFrameTimeline->mDisplayFrames[displayFrameIdx]
148 ->getSurfaceFrames()[surfaceFrameIdx]);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700149 }
150
151 std::shared_ptr<impl::FrameTimeline::DisplayFrame> getDisplayFrame(size_t idx) {
152 std::lock_guard<std::mutex> lock(mFrameTimeline->mMutex);
153 return mFrameTimeline->mDisplayFrames[idx];
154 }
155
156 static bool compareTimelineItems(const TimelineItem& a, const TimelineItem& b) {
157 return a.startTime == b.startTime && a.endTime == b.endTime &&
158 a.presentTime == b.presentTime;
159 }
160
Adithya Srinivasanbed4c4f2021-05-03 20:24:46 +0000161 const std::map<int64_t, TimelineItem>& getPredictions() const {
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700162 return mTokenManager->mPredictions;
163 }
164
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000165 uint32_t getNumberOfDisplayFrames() const {
Adithya Srinivasan2d736322020-10-01 16:53:48 -0700166 std::lock_guard<std::mutex> lock(mFrameTimeline->mMutex);
167 return static_cast<uint32_t>(mFrameTimeline->mDisplayFrames.size());
168 }
169
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000170 int64_t snoopCurrentTraceCookie() const { return mTraceCookieCounter->mTraceCookie; }
171
172 void flushTrace() {
173 using FrameTimelineDataSource = impl::FrameTimeline::FrameTimelineDataSource;
174 FrameTimelineDataSource::Trace(
175 [&](FrameTimelineDataSource::TraceContext ctx) { ctx.Flush(); });
176 }
177
Alec Mouri9a29e672020-09-14 12:39:14 -0700178 std::shared_ptr<mock::TimeStats> mTimeStats;
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700179 std::unique_ptr<impl::FrameTimeline> mFrameTimeline;
180 impl::TokenManager* mTokenManager;
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000181 TraceCookieCounter* mTraceCookieCounter;
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700182 FenceToFenceTimeMap fenceFactory;
Adithya Srinivasan2d736322020-10-01 16:53:48 -0700183 uint32_t* maxDisplayFrames;
Adithya Srinivasanbed4c4f2021-05-03 20:24:46 +0000184 size_t maxTokens;
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000185 static constexpr pid_t kSurfaceFlingerPid = 666;
Adithya Srinivasanead17162021-02-18 02:17:37 +0000186 static constexpr nsecs_t kPresentThreshold = std::chrono::nanoseconds(2ns).count();
Adithya Srinivasan54996e22021-06-25 22:26:45 +0000187 static constexpr nsecs_t kDeadlineThreshold = std::chrono::nanoseconds(0ns).count();
Adithya Srinivasanead17162021-02-18 02:17:37 +0000188 static constexpr nsecs_t kStartThreshold = std::chrono::nanoseconds(2ns).count();
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800189 static constexpr JankClassificationThresholds kTestThresholds{kPresentThreshold,
190 kDeadlineThreshold,
191 kStartThreshold};
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700192};
193
194TEST_F(FrameTimelineTest, tokenManagerRemovesStalePredictions) {
195 int64_t token1 = mTokenManager->generateTokenForPredictions({0, 0, 0});
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000196 EXPECT_EQ(getPredictions().size(), 1u);
Adithya Srinivasanbed4c4f2021-05-03 20:24:46 +0000197 flushTokens();
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700198 int64_t token2 = mTokenManager->generateTokenForPredictions({10, 20, 30});
199 std::optional<TimelineItem> predictions = mTokenManager->getPredictionsForToken(token1);
200
201 // token1 should have expired
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700202 EXPECT_EQ(predictions.has_value(), false);
203
204 predictions = mTokenManager->getPredictionsForToken(token2);
205 EXPECT_EQ(compareTimelineItems(*predictions, TimelineItem(10, 20, 30)), true);
206}
207
Adithya Srinivasan9febda82020-10-19 10:49:41 -0700208TEST_F(FrameTimelineTest, createSurfaceFrameForToken_getOwnerPidReturnsCorrectPid) {
Alec Mouriadebf5c2021-01-05 12:57:36 -0800209 auto surfaceFrame1 =
210 mFrameTimeline->createSurfaceFrameForToken({}, sPidOne, sUidOne, sLayerIdOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000211 sLayerNameOne, sLayerNameOne,
Adithya Srinivasan58069dc2021-06-04 20:37:02 +0000212 /*isBuffer*/ true, sGameMode);
Alec Mouriadebf5c2021-01-05 12:57:36 -0800213 auto surfaceFrame2 =
214 mFrameTimeline->createSurfaceFrameForToken({}, sPidTwo, sUidOne, sLayerIdOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000215 sLayerNameOne, sLayerNameOne,
Adithya Srinivasan58069dc2021-06-04 20:37:02 +0000216 /*isBuffer*/ true, sGameMode);
Adithya Srinivasan9febda82020-10-19 10:49:41 -0700217 EXPECT_EQ(surfaceFrame1->getOwnerPid(), sPidOne);
218 EXPECT_EQ(surfaceFrame2->getOwnerPid(), sPidTwo);
219}
220
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700221TEST_F(FrameTimelineTest, createSurfaceFrameForToken_noToken) {
Alec Mouriadebf5c2021-01-05 12:57:36 -0800222 auto surfaceFrame =
223 mFrameTimeline->createSurfaceFrameForToken({}, sPidOne, sUidOne, sLayerIdOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000224 sLayerNameOne, sLayerNameOne,
Adithya Srinivasan58069dc2021-06-04 20:37:02 +0000225 /*isBuffer*/ true, sGameMode);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700226 EXPECT_EQ(surfaceFrame->getPredictionState(), PredictionState::None);
227}
228
229TEST_F(FrameTimelineTest, createSurfaceFrameForToken_expiredToken) {
230 int64_t token1 = mTokenManager->generateTokenForPredictions({0, 0, 0});
Adithya Srinivasanbed4c4f2021-05-03 20:24:46 +0000231 flushTokens();
Huihong Luo3bdef862022-03-03 11:57:19 -0800232 FrameTimelineInfo ftInfo;
233 ftInfo.vsyncId = token1;
234 ftInfo.inputEventId = sInputEventId;
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000235 auto surfaceFrame =
Huihong Luo3bdef862022-03-03 11:57:19 -0800236 mFrameTimeline->createSurfaceFrameForToken(ftInfo, sPidOne, sUidOne, sLayerIdOne,
237 sLayerNameOne, sLayerNameOne,
Adithya Srinivasan58069dc2021-06-04 20:37:02 +0000238 /*isBuffer*/ true, sGameMode);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700239
240 EXPECT_EQ(surfaceFrame->getPredictionState(), PredictionState::Expired);
241}
242
243TEST_F(FrameTimelineTest, createSurfaceFrameForToken_validToken) {
244 int64_t token1 = mTokenManager->generateTokenForPredictions({10, 20, 30});
Huihong Luo3bdef862022-03-03 11:57:19 -0800245 FrameTimelineInfo ftInfo;
246 ftInfo.vsyncId = token1;
247 ftInfo.inputEventId = sInputEventId;
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000248 auto surfaceFrame =
Huihong Luo3bdef862022-03-03 11:57:19 -0800249 mFrameTimeline->createSurfaceFrameForToken(ftInfo, sPidOne, sUidOne, sLayerIdOne,
250 sLayerNameOne, sLayerNameOne,
Adithya Srinivasan58069dc2021-06-04 20:37:02 +0000251 /*isBuffer*/ true, sGameMode);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700252
253 EXPECT_EQ(surfaceFrame->getPredictionState(), PredictionState::Valid);
254 EXPECT_EQ(compareTimelineItems(surfaceFrame->getPredictions(), TimelineItem(10, 20, 30)), true);
255}
256
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000257TEST_F(FrameTimelineTest, createSurfaceFrameForToken_validInputEventId) {
258 int64_t token1 = mTokenManager->generateTokenForPredictions({10, 20, 30});
259 constexpr int32_t inputEventId = 1;
Huihong Luo3bdef862022-03-03 11:57:19 -0800260 FrameTimelineInfo ftInfo;
261 ftInfo.vsyncId = token1;
262 ftInfo.inputEventId = inputEventId;
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000263 auto surfaceFrame =
Huihong Luo3bdef862022-03-03 11:57:19 -0800264 mFrameTimeline->createSurfaceFrameForToken(ftInfo, sPidOne, sUidOne, sLayerIdOne,
265 sLayerNameOne, sLayerNameOne,
Adithya Srinivasan58069dc2021-06-04 20:37:02 +0000266 /*isBuffer*/ true, sGameMode);
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000267
268 EXPECT_EQ(inputEventId, surfaceFrame->getInputEventId());
269}
270
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700271TEST_F(FrameTimelineTest, presentFenceSignaled_droppedFramesNotUpdated) {
272 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700273 int64_t token1 = mTokenManager->generateTokenForPredictions({10, 20, 30});
Huihong Luo3bdef862022-03-03 11:57:19 -0800274 FrameTimelineInfo ftInfo;
275 ftInfo.vsyncId = token1;
276 ftInfo.inputEventId = sInputEventId;
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000277 auto surfaceFrame1 =
Huihong Luo3bdef862022-03-03 11:57:19 -0800278 mFrameTimeline->createSurfaceFrameForToken(ftInfo, sPidOne, sUidOne, sLayerIdOne,
279 sLayerNameOne, sLayerNameOne,
Adithya Srinivasan58069dc2021-06-04 20:37:02 +0000280 /*isBuffer*/ true, sGameMode);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700281
282 // Set up the display frame
Pascal Muetschardac7bcd92023-10-03 15:05:36 +0200283 mFrameTimeline->setSfWakeUp(token1, 20, RR_11, RR_11);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000284 surfaceFrame1->setDropTime(12);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800285 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Dropped);
286 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700287 mFrameTimeline->setSfPresent(25, presentFence1);
288 presentFence1->signalForTest(30);
289
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000290 addEmptyDisplayFrame();
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700291
292 auto& droppedSurfaceFrame = getSurfaceFrame(0, 0);
293 EXPECT_EQ(droppedSurfaceFrame.getPresentState(), SurfaceFrame::PresentState::Dropped);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000294 EXPECT_EQ(0u, droppedSurfaceFrame.getActuals().endTime);
295 EXPECT_EQ(12u, droppedSurfaceFrame.getDropTime());
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700296 EXPECT_EQ(droppedSurfaceFrame.getActuals().presentTime, 0);
297}
298
299TEST_F(FrameTimelineTest, presentFenceSignaled_presentedFramesUpdated) {
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800300 // Layer specific increment
Alec Mouri363faf02021-01-29 16:34:55 -0800301 EXPECT_CALL(*mTimeStats, incrementJankyFrames(_)).Times(2);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700302 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
303 int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions({10, 20, 30});
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700304 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({22, 26, 30});
Huihong Luo3bdef862022-03-03 11:57:19 -0800305 FrameTimelineInfo ftInfo;
306 ftInfo.vsyncId = surfaceFrameToken1;
307 ftInfo.inputEventId = sInputEventId;
Alec Mouri9a29e672020-09-14 12:39:14 -0700308 auto surfaceFrame1 =
Huihong Luo3bdef862022-03-03 11:57:19 -0800309 mFrameTimeline->createSurfaceFrameForToken(ftInfo, sPidOne, sUidOne, sLayerIdOne,
310 sLayerNameOne, sLayerNameOne,
311 /*isBuffer*/ true, sGameMode);
Alec Mouri9a29e672020-09-14 12:39:14 -0700312 auto surfaceFrame2 =
Huihong Luo3bdef862022-03-03 11:57:19 -0800313 mFrameTimeline->createSurfaceFrameForToken(ftInfo, sPidOne, sUidOne, sLayerIdTwo,
314 sLayerNameTwo, sLayerNameTwo,
315 /*isBuffer*/ true, sGameMode);
Pascal Muetschardac7bcd92023-10-03 15:05:36 +0200316 mFrameTimeline->setSfWakeUp(sfToken1, 22, RR_11, RR_11);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800317 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
318 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
319 surfaceFrame2->setPresentState(SurfaceFrame::PresentState::Presented);
320 mFrameTimeline->addSurfaceFrame(surfaceFrame2);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700321 mFrameTimeline->setSfPresent(26, presentFence1);
322 auto displayFrame = getDisplayFrame(0);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800323 auto& presentedSurfaceFrame1 = getSurfaceFrame(0, 0);
324 auto& presentedSurfaceFrame2 = getSurfaceFrame(0, 1);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700325 presentFence1->signalForTest(42);
326
327 // Fences haven't been flushed yet, so it should be 0
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800328 EXPECT_EQ(displayFrame->getActuals().presentTime, 0);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700329 EXPECT_EQ(presentedSurfaceFrame1.getActuals().presentTime, 0);
330 EXPECT_EQ(presentedSurfaceFrame2.getActuals().presentTime, 0);
331
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000332 addEmptyDisplayFrame();
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700333
334 // Fences have flushed, so the present timestamps should be updated
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800335 EXPECT_EQ(displayFrame->getActuals().presentTime, 42);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700336 EXPECT_EQ(presentedSurfaceFrame1.getActuals().presentTime, 42);
337 EXPECT_EQ(presentedSurfaceFrame2.getActuals().presentTime, 42);
Jorim Jaggi9c03b502020-11-24 23:51:31 +0100338 EXPECT_NE(surfaceFrame1->getJankType(), std::nullopt);
Ying Wei96eb5352023-11-21 17:37:21 +0000339 EXPECT_NE(surfaceFrame1->getJankSeverityType(), std::nullopt);
Jorim Jaggi9c03b502020-11-24 23:51:31 +0100340 EXPECT_NE(surfaceFrame2->getJankType(), std::nullopt);
Ying Wei96eb5352023-11-21 17:37:21 +0000341 EXPECT_NE(surfaceFrame2->getJankSeverityType(), std::nullopt);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700342}
343
344TEST_F(FrameTimelineTest, displayFramesSlidingWindowMovesAfterLimit) {
345 // Insert kMaxDisplayFrames' count of DisplayFrames to fill the deque
346 int frameTimeFactor = 0;
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800347 // Layer specific increment
Alec Mouri363faf02021-01-29 16:34:55 -0800348 EXPECT_CALL(*mTimeStats, incrementJankyFrames(_))
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800349 .Times(static_cast<int32_t>(*maxDisplayFrames));
Adithya Srinivasan2d736322020-10-01 16:53:48 -0700350 for (size_t i = 0; i < *maxDisplayFrames; i++) {
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700351 auto presentFence = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
352 int64_t surfaceFrameToken = mTokenManager->generateTokenForPredictions(
353 {10 + frameTimeFactor, 20 + frameTimeFactor, 30 + frameTimeFactor});
354 int64_t sfToken = mTokenManager->generateTokenForPredictions(
355 {22 + frameTimeFactor, 26 + frameTimeFactor, 30 + frameTimeFactor});
Huihong Luo3bdef862022-03-03 11:57:19 -0800356 FrameTimelineInfo ftInfo;
357 ftInfo.vsyncId = surfaceFrameToken;
358 ftInfo.inputEventId = sInputEventId;
Alec Mouri9a29e672020-09-14 12:39:14 -0700359 auto surfaceFrame =
Huihong Luo3bdef862022-03-03 11:57:19 -0800360 mFrameTimeline->createSurfaceFrameForToken(ftInfo, sPidOne, sUidOne, sLayerIdOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000361 sLayerNameOne, sLayerNameOne,
Adithya Srinivasan58069dc2021-06-04 20:37:02 +0000362 /*isBuffer*/ true, sGameMode);
Pascal Muetschardac7bcd92023-10-03 15:05:36 +0200363 mFrameTimeline->setSfWakeUp(sfToken, 22 + frameTimeFactor, RR_11, RR_11);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800364 surfaceFrame->setPresentState(SurfaceFrame::PresentState::Presented);
365 mFrameTimeline->addSurfaceFrame(surfaceFrame);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700366 mFrameTimeline->setSfPresent(27 + frameTimeFactor, presentFence);
367 presentFence->signalForTest(32 + frameTimeFactor);
368 frameTimeFactor += 30;
369 }
370 auto displayFrame0 = getDisplayFrame(0);
371
372 // The 0th Display Frame should have actuals 22, 27, 32
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800373 EXPECT_EQ(compareTimelineItems(displayFrame0->getActuals(), TimelineItem(22, 27, 32)), true);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700374
375 // Add one more display frame
376 auto presentFence = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
377 int64_t surfaceFrameToken = mTokenManager->generateTokenForPredictions(
378 {10 + frameTimeFactor, 20 + frameTimeFactor, 30 + frameTimeFactor});
379 int64_t sfToken = mTokenManager->generateTokenForPredictions(
380 {22 + frameTimeFactor, 26 + frameTimeFactor, 30 + frameTimeFactor});
Huihong Luo3bdef862022-03-03 11:57:19 -0800381 FrameTimelineInfo ftInfo;
382 ftInfo.vsyncId = surfaceFrameToken;
383 ftInfo.inputEventId = sInputEventId;
Alec Mouri9a29e672020-09-14 12:39:14 -0700384 auto surfaceFrame =
Huihong Luo3bdef862022-03-03 11:57:19 -0800385 mFrameTimeline->createSurfaceFrameForToken(ftInfo, sPidOne, sUidOne, sLayerIdOne,
386 sLayerNameOne, sLayerNameOne,
387 /*isBuffer*/ true, sGameMode);
Pascal Muetschardac7bcd92023-10-03 15:05:36 +0200388 mFrameTimeline->setSfWakeUp(sfToken, 22 + frameTimeFactor, RR_11, RR_11);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800389 surfaceFrame->setPresentState(SurfaceFrame::PresentState::Presented);
390 mFrameTimeline->addSurfaceFrame(surfaceFrame);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700391 mFrameTimeline->setSfPresent(27 + frameTimeFactor, presentFence);
392 presentFence->signalForTest(32 + frameTimeFactor);
393 displayFrame0 = getDisplayFrame(0);
394
395 // The window should have slided by 1 now and the previous 0th display frame
396 // should have been removed from the deque
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800397 EXPECT_EQ(compareTimelineItems(displayFrame0->getActuals(), TimelineItem(52, 57, 62)), true);
Adithya Srinivasanf279e042020-08-17 14:56:27 -0700398}
399
Ady Abraham7f8a1e62020-09-28 16:09:35 -0700400TEST_F(FrameTimelineTest, surfaceFrameEndTimeAcquireFenceAfterQueue) {
Adithya Srinivasan58069dc2021-06-04 20:37:02 +0000401 auto surfaceFrame = mFrameTimeline->createSurfaceFrameForToken({}, sPidOne, 0, sLayerIdOne,
402 "acquireFenceAfterQueue",
403 "acquireFenceAfterQueue",
404 /*isBuffer*/ true, sGameMode);
Ady Abraham7f8a1e62020-09-28 16:09:35 -0700405 surfaceFrame->setActualQueueTime(123);
406 surfaceFrame->setAcquireFenceTime(456);
407 EXPECT_EQ(surfaceFrame->getActuals().endTime, 456);
408}
409
410TEST_F(FrameTimelineTest, surfaceFrameEndTimeAcquireFenceBeforeQueue) {
Adithya Srinivasan58069dc2021-06-04 20:37:02 +0000411 auto surfaceFrame = mFrameTimeline->createSurfaceFrameForToken({}, sPidOne, 0, sLayerIdOne,
412 "acquireFenceAfterQueue",
413 "acquireFenceAfterQueue",
414 /*isBuffer*/ true, sGameMode);
Ady Abraham7f8a1e62020-09-28 16:09:35 -0700415 surfaceFrame->setActualQueueTime(456);
416 surfaceFrame->setAcquireFenceTime(123);
417 EXPECT_EQ(surfaceFrame->getActuals().endTime, 456);
418}
419
Adithya Srinivasan2d736322020-10-01 16:53:48 -0700420TEST_F(FrameTimelineTest, setMaxDisplayFramesSetsSizeProperly) {
421 auto presentFence = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
422 presentFence->signalForTest(2);
423
424 // Size shouldn't exceed maxDisplayFrames - 64
425 for (size_t i = 0; i < *maxDisplayFrames + 10; i++) {
Adithya Srinivasan9febda82020-10-19 10:49:41 -0700426 auto surfaceFrame =
Alec Mouriadebf5c2021-01-05 12:57:36 -0800427 mFrameTimeline->createSurfaceFrameForToken({}, sPidOne, sUidOne, sLayerIdOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000428 sLayerNameOne, sLayerNameOne,
Adithya Srinivasan58069dc2021-06-04 20:37:02 +0000429 /*isBuffer*/ true, sGameMode);
Adithya Srinivasan2d736322020-10-01 16:53:48 -0700430 int64_t sfToken = mTokenManager->generateTokenForPredictions({22, 26, 30});
Pascal Muetschardac7bcd92023-10-03 15:05:36 +0200431 mFrameTimeline->setSfWakeUp(sfToken, 22, RR_11, RR_11);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800432 surfaceFrame->setPresentState(SurfaceFrame::PresentState::Presented);
433 mFrameTimeline->addSurfaceFrame(surfaceFrame);
Adithya Srinivasan2d736322020-10-01 16:53:48 -0700434 mFrameTimeline->setSfPresent(27, presentFence);
435 }
436 EXPECT_EQ(getNumberOfDisplayFrames(), *maxDisplayFrames);
437
438 // Increase the size to 256
439 mFrameTimeline->setMaxDisplayFrames(256);
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000440 EXPECT_EQ(*maxDisplayFrames, 256u);
Adithya Srinivasan2d736322020-10-01 16:53:48 -0700441
442 for (size_t i = 0; i < *maxDisplayFrames + 10; i++) {
Adithya Srinivasan9febda82020-10-19 10:49:41 -0700443 auto surfaceFrame =
Alec Mouriadebf5c2021-01-05 12:57:36 -0800444 mFrameTimeline->createSurfaceFrameForToken({}, sPidOne, sUidOne, sLayerIdOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000445 sLayerNameOne, sLayerNameOne,
Adithya Srinivasan58069dc2021-06-04 20:37:02 +0000446 /*isBuffer*/ true, sGameMode);
Adithya Srinivasan2d736322020-10-01 16:53:48 -0700447 int64_t sfToken = mTokenManager->generateTokenForPredictions({22, 26, 30});
Pascal Muetschardac7bcd92023-10-03 15:05:36 +0200448 mFrameTimeline->setSfWakeUp(sfToken, 22, RR_11, RR_11);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800449 surfaceFrame->setPresentState(SurfaceFrame::PresentState::Presented);
450 mFrameTimeline->addSurfaceFrame(surfaceFrame);
Adithya Srinivasan2d736322020-10-01 16:53:48 -0700451 mFrameTimeline->setSfPresent(27, presentFence);
452 }
453 EXPECT_EQ(getNumberOfDisplayFrames(), *maxDisplayFrames);
454
455 // Shrink the size to 128
456 mFrameTimeline->setMaxDisplayFrames(128);
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000457 EXPECT_EQ(*maxDisplayFrames, 128u);
Adithya Srinivasan2d736322020-10-01 16:53:48 -0700458
459 for (size_t i = 0; i < *maxDisplayFrames + 10; i++) {
Adithya Srinivasan9febda82020-10-19 10:49:41 -0700460 auto surfaceFrame =
Alec Mouriadebf5c2021-01-05 12:57:36 -0800461 mFrameTimeline->createSurfaceFrameForToken({}, sPidOne, sUidOne, sLayerIdOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000462 sLayerNameOne, sLayerNameOne,
Adithya Srinivasan58069dc2021-06-04 20:37:02 +0000463 /*isBuffer*/ true, sGameMode);
Adithya Srinivasan2d736322020-10-01 16:53:48 -0700464 int64_t sfToken = mTokenManager->generateTokenForPredictions({22, 26, 30});
Pascal Muetschardac7bcd92023-10-03 15:05:36 +0200465 mFrameTimeline->setSfWakeUp(sfToken, 22, RR_11, RR_11);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800466 surfaceFrame->setPresentState(SurfaceFrame::PresentState::Presented);
467 mFrameTimeline->addSurfaceFrame(surfaceFrame);
Adithya Srinivasan2d736322020-10-01 16:53:48 -0700468 mFrameTimeline->setSfPresent(27, presentFence);
469 }
470 EXPECT_EQ(getNumberOfDisplayFrames(), *maxDisplayFrames);
471}
Alec Mouri9a29e672020-09-14 12:39:14 -0700472
Adithya Srinivasan7c4ac7a2021-03-08 23:48:03 +0000473TEST_F(FrameTimelineTest, presentFenceSignaled_invalidSignalTime) {
Pascal Muetschardac7bcd92023-10-03 15:05:36 +0200474 Fps refreshRate = RR_11;
Adithya Srinivasan7c4ac7a2021-03-08 23:48:03 +0000475
476 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
477 int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions({10, 20, 60});
478 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({52, 60, 60});
Huihong Luo3bdef862022-03-03 11:57:19 -0800479 FrameTimelineInfo ftInfo;
480 ftInfo.vsyncId = surfaceFrameToken1;
481 ftInfo.inputEventId = sInputEventId;
Adithya Srinivasan7c4ac7a2021-03-08 23:48:03 +0000482
483 auto surfaceFrame1 =
Huihong Luo3bdef862022-03-03 11:57:19 -0800484 mFrameTimeline->createSurfaceFrameForToken(ftInfo, sPidOne, sUidOne, sLayerIdOne,
485 sLayerNameOne, sLayerNameOne,
486 /*isBuffer*/ true, sGameMode);
Pascal Muetschardac7bcd92023-10-03 15:05:36 +0200487 mFrameTimeline->setSfWakeUp(sfToken1, 52, refreshRate, refreshRate);
Adithya Srinivasan7c4ac7a2021-03-08 23:48:03 +0000488 surfaceFrame1->setAcquireFenceTime(20);
489 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
490 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
491
492 mFrameTimeline->setSfPresent(59, presentFence1);
493 presentFence1->signalForTest(-1);
494 addEmptyDisplayFrame();
495
496 auto displayFrame0 = getDisplayFrame(0);
Ady Abrahamfcb16862022-10-10 14:35:21 -0700497 EXPECT_EQ(displayFrame0->getActuals().presentTime, 59);
Ady Abrahamb1e10d12023-03-13 15:23:54 -0700498 EXPECT_EQ(displayFrame0->getJankType(), JankType::Unknown | JankType::DisplayHAL);
Ying Wei96eb5352023-11-21 17:37:21 +0000499 EXPECT_EQ(displayFrame0->getJankSeverityType(), JankSeverityType::Unknown);
Adithya Srinivasan7c4ac7a2021-03-08 23:48:03 +0000500 EXPECT_EQ(surfaceFrame1->getActuals().presentTime, -1);
501 EXPECT_EQ(surfaceFrame1->getJankType(), JankType::Unknown);
Ying Wei96eb5352023-11-21 17:37:21 +0000502 EXPECT_EQ(surfaceFrame1->getJankSeverityType(), JankSeverityType::Unknown);
Adithya Srinivasan7c4ac7a2021-03-08 23:48:03 +0000503}
504
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800505// Tests related to TimeStats
Adithya Srinivasan7c4ac7a2021-03-08 23:48:03 +0000506TEST_F(FrameTimelineTest, presentFenceSignaled_doesNotReportForInvalidTokens) {
Pascal Muetschardac7bcd92023-10-03 15:05:36 +0200507 Fps refreshRate = RR_11;
Adithya Srinivasan7c4ac7a2021-03-08 23:48:03 +0000508 EXPECT_CALL(*mTimeStats, incrementJankyFrames(_)).Times(0);
509 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
510 int64_t surfaceFrameToken1 = -1;
511 int64_t sfToken1 = -1;
Huihong Luo3bdef862022-03-03 11:57:19 -0800512 FrameTimelineInfo ftInfo;
513 ftInfo.vsyncId = surfaceFrameToken1;
514 ftInfo.inputEventId = sInputEventId;
Adithya Srinivasan7c4ac7a2021-03-08 23:48:03 +0000515
516 auto surfaceFrame1 =
Huihong Luo3bdef862022-03-03 11:57:19 -0800517 mFrameTimeline->createSurfaceFrameForToken(ftInfo, sPidOne, sUidOne, sLayerIdOne,
518 sLayerNameOne, sLayerNameOne,
519 /*isBuffer*/ true, sGameMode);
Pascal Muetschardac7bcd92023-10-03 15:05:36 +0200520 mFrameTimeline->setSfWakeUp(sfToken1, 52, refreshRate, refreshRate);
Adithya Srinivasan7c4ac7a2021-03-08 23:48:03 +0000521 surfaceFrame1->setAcquireFenceTime(20);
522 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
523 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
524 presentFence1->signalForTest(70);
525
526 mFrameTimeline->setSfPresent(59, presentFence1);
527}
528
Alec Mouri9a29e672020-09-14 12:39:14 -0700529TEST_F(FrameTimelineTest, presentFenceSignaled_reportsLongSfCpu) {
Pascal Muetschardac7bcd92023-10-03 15:05:36 +0200530 Fps refreshRate = RR_11;
Alec Mouri9a29e672020-09-14 12:39:14 -0700531 EXPECT_CALL(*mTimeStats,
Alec Mouri363faf02021-01-29 16:34:55 -0800532 incrementJankyFrames(
533 TimeStats::JankyFramesInfo{refreshRate, std::nullopt, sUidOne,
Adithya Srinivasan58069dc2021-06-04 20:37:02 +0000534 sLayerNameOne, sGameMode,
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000535 JankType::SurfaceFlingerCpuDeadlineMissed, 2, 10,
Alec Mouri363faf02021-01-29 16:34:55 -0800536 0}));
Alec Mouri9a29e672020-09-14 12:39:14 -0700537 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000538 int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions({10, 20, 60});
539 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({52, 60, 60});
Huihong Luo3bdef862022-03-03 11:57:19 -0800540 FrameTimelineInfo ftInfo;
541 ftInfo.vsyncId = surfaceFrameToken1;
542 ftInfo.inputEventId = sInputEventId;
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000543
Alec Mouri9a29e672020-09-14 12:39:14 -0700544 auto surfaceFrame1 =
Huihong Luo3bdef862022-03-03 11:57:19 -0800545 mFrameTimeline->createSurfaceFrameForToken(ftInfo, sPidOne, sUidOne, sLayerIdOne,
546 sLayerNameOne, sLayerNameOne,
547 /*isBuffer*/ true, sGameMode);
Pascal Muetschardac7bcd92023-10-03 15:05:36 +0200548 mFrameTimeline->setSfWakeUp(sfToken1, 52, refreshRate, refreshRate);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000549 surfaceFrame1->setAcquireFenceTime(20);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800550 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
551 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000552 presentFence1->signalForTest(70);
Alec Mouri9a29e672020-09-14 12:39:14 -0700553
Adithya Srinivasan82eef322021-04-10 00:06:04 +0000554 mFrameTimeline->setSfPresent(62, presentFence1);
Alec Mouri9a29e672020-09-14 12:39:14 -0700555}
556
Adithya Srinivasan36b01af2021-04-07 22:29:47 +0000557TEST_F(FrameTimelineTest, presentFenceSignaled_reportsLongSfGpu) {
Pascal Muetschardac7bcd92023-10-03 15:05:36 +0200558 Fps refreshRate = RR_11;
Adithya Srinivasan36b01af2021-04-07 22:29:47 +0000559 EXPECT_CALL(*mTimeStats,
560 incrementJankyFrames(
561 TimeStats::JankyFramesInfo{refreshRate, std::nullopt, sUidOne,
Adithya Srinivasan58069dc2021-06-04 20:37:02 +0000562 sLayerNameOne, sGameMode,
Adithya Srinivasan36b01af2021-04-07 22:29:47 +0000563 JankType::SurfaceFlingerGpuDeadlineMissed, 4, 10,
564 0}));
565 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
566 auto gpuFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
567 int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions({10, 20, 60});
568 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({52, 60, 60});
Huihong Luo3bdef862022-03-03 11:57:19 -0800569 FrameTimelineInfo ftInfo;
570 ftInfo.vsyncId = surfaceFrameToken1;
571 ftInfo.inputEventId = sInputEventId;
Adithya Srinivasan36b01af2021-04-07 22:29:47 +0000572
573 auto surfaceFrame1 =
Huihong Luo3bdef862022-03-03 11:57:19 -0800574 mFrameTimeline->createSurfaceFrameForToken(ftInfo, sPidOne, sUidOne, sLayerIdOne,
575 sLayerNameOne, sLayerNameOne,
576 /*isBuffer*/ true, sGameMode);
Pascal Muetschardac7bcd92023-10-03 15:05:36 +0200577 mFrameTimeline->setSfWakeUp(sfToken1, 52, refreshRate, refreshRate);
Adithya Srinivasan36b01af2021-04-07 22:29:47 +0000578 surfaceFrame1->setAcquireFenceTime(20);
579 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
580 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
581 gpuFence1->signalForTest(64);
582 presentFence1->signalForTest(70);
583
584 mFrameTimeline->setSfPresent(59, presentFence1, gpuFence1);
585}
586
Alec Mouri9a29e672020-09-14 12:39:14 -0700587TEST_F(FrameTimelineTest, presentFenceSignaled_reportsDisplayMiss) {
Pascal Muetschardac7bcd92023-10-03 15:05:36 +0200588 Fps refreshRate = RR_30;
Alec Mouri9a29e672020-09-14 12:39:14 -0700589 EXPECT_CALL(*mTimeStats,
Alec Mouri363faf02021-01-29 16:34:55 -0800590 incrementJankyFrames(TimeStats::JankyFramesInfo{refreshRate, std::nullopt, sUidOne,
Adithya Srinivasan58069dc2021-06-04 20:37:02 +0000591 sLayerNameOne, sGameMode,
592 JankType::DisplayHAL, -4, 0, 0}));
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800593
Alec Mouri9a29e672020-09-14 12:39:14 -0700594 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000595 int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions({10, 20, 60});
596 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({52, 60, 60});
Huihong Luo3bdef862022-03-03 11:57:19 -0800597 FrameTimelineInfo ftInfo;
598 ftInfo.vsyncId = surfaceFrameToken1;
599 ftInfo.inputEventId = sInputEventId;
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000600
Alec Mouri9a29e672020-09-14 12:39:14 -0700601 auto surfaceFrame1 =
Huihong Luo3bdef862022-03-03 11:57:19 -0800602 mFrameTimeline->createSurfaceFrameForToken(ftInfo, sPidOne, sUidOne, sLayerIdOne,
603 sLayerNameOne, sLayerNameOne,
604 /*isBuffer*/ true, sGameMode);
Pascal Muetschardac7bcd92023-10-03 15:05:36 +0200605 mFrameTimeline->setSfWakeUp(sfToken1, 52, refreshRate, refreshRate);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800606 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000607 surfaceFrame1->setAcquireFenceTime(20);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800608 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000609 presentFence1->signalForTest(90);
610 mFrameTimeline->setSfPresent(56, presentFence1);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800611 EXPECT_EQ(surfaceFrame1->getJankType(), JankType::DisplayHAL);
Ying Wei96eb5352023-11-21 17:37:21 +0000612 EXPECT_EQ(surfaceFrame1->getJankSeverityType(), JankSeverityType::Full);
Alec Mouri9a29e672020-09-14 12:39:14 -0700613}
614
615TEST_F(FrameTimelineTest, presentFenceSignaled_reportsAppMiss) {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700616 Fps refreshRate = 11_Hz;
Alec Mouri9a29e672020-09-14 12:39:14 -0700617 EXPECT_CALL(*mTimeStats,
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000618 incrementJankyFrames(TimeStats::JankyFramesInfo{refreshRate, std::nullopt, sUidOne,
Adithya Srinivasan58069dc2021-06-04 20:37:02 +0000619 sLayerNameOne, sGameMode,
Adithya Srinivasan82eef322021-04-10 00:06:04 +0000620 JankType::AppDeadlineMissed, -4, 0,
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000621 25}));
Alec Mouri9a29e672020-09-14 12:39:14 -0700622 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000623 int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions({10, 20, 60});
624 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({82, 90, 90});
Huihong Luo3bdef862022-03-03 11:57:19 -0800625 FrameTimelineInfo ftInfo;
626 ftInfo.vsyncId = surfaceFrameToken1;
627 ftInfo.inputEventId = sInputEventId;
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000628
Alec Mouri9a29e672020-09-14 12:39:14 -0700629 auto surfaceFrame1 =
Huihong Luo3bdef862022-03-03 11:57:19 -0800630 mFrameTimeline->createSurfaceFrameForToken(ftInfo, sPidOne, sUidOne, sLayerIdOne,
631 sLayerNameOne, sLayerNameOne,
632 /*isBuffer*/ true, sGameMode);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000633 surfaceFrame1->setAcquireFenceTime(45);
Pascal Muetschardac7bcd92023-10-03 15:05:36 +0200634 mFrameTimeline->setSfWakeUp(sfToken1, 52, refreshRate, refreshRate);
Alec Mouri9a29e672020-09-14 12:39:14 -0700635
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800636 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
637 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000638 presentFence1->signalForTest(90);
639 mFrameTimeline->setSfPresent(86, presentFence1);
Jorim Jaggi9c03b502020-11-24 23:51:31 +0100640
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800641 EXPECT_EQ(surfaceFrame1->getJankType(), JankType::AppDeadlineMissed);
Ying Wei96eb5352023-11-21 17:37:21 +0000642 EXPECT_EQ(surfaceFrame1->getJankSeverityType(), JankSeverityType::Partial);
Alec Mouri9a29e672020-09-14 12:39:14 -0700643}
644
Adithya Srinivasanead17162021-02-18 02:17:37 +0000645TEST_F(FrameTimelineTest, presentFenceSignaled_reportsSfScheduling) {
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000646 Fps refreshRate = Fps::fromPeriodNsecs(32);
Adithya Srinivasanead17162021-02-18 02:17:37 +0000647 EXPECT_CALL(*mTimeStats,
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000648 incrementJankyFrames(TimeStats::JankyFramesInfo{refreshRate, std::nullopt, sUidOne,
Adithya Srinivasan58069dc2021-06-04 20:37:02 +0000649 sLayerNameOne, sGameMode,
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000650 JankType::SurfaceFlingerScheduling,
Adithya Srinivasan82eef322021-04-10 00:06:04 +0000651 -4, 0, -10}));
Adithya Srinivasanead17162021-02-18 02:17:37 +0000652 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000653 int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions({40, 60, 92});
654 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({52, 60, 60});
Huihong Luo3bdef862022-03-03 11:57:19 -0800655 FrameTimelineInfo ftInfo;
656 ftInfo.vsyncId = surfaceFrameToken1;
657 ftInfo.inputEventId = sInputEventId;
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000658
Adithya Srinivasanead17162021-02-18 02:17:37 +0000659 auto surfaceFrame1 =
Huihong Luo3bdef862022-03-03 11:57:19 -0800660 mFrameTimeline->createSurfaceFrameForToken(ftInfo, sPidOne, sUidOne, sLayerIdOne,
661 sLayerNameOne, sLayerNameOne,
662 /*isBuffer*/ true, sGameMode);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000663 surfaceFrame1->setAcquireFenceTime(50);
Pascal Muetschardac7bcd92023-10-03 15:05:36 +0200664 mFrameTimeline->setSfWakeUp(sfToken1, 52, refreshRate, refreshRate);
Adithya Srinivasanead17162021-02-18 02:17:37 +0000665
666 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
667 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000668 presentFence1->signalForTest(60);
669 mFrameTimeline->setSfPresent(56, presentFence1);
Adithya Srinivasanead17162021-02-18 02:17:37 +0000670
671 EXPECT_EQ(surfaceFrame1->getJankType(), JankType::SurfaceFlingerScheduling);
Ying Wei96eb5352023-11-21 17:37:21 +0000672 EXPECT_EQ(surfaceFrame1->getJankSeverityType(), JankSeverityType::Full);
Adithya Srinivasanead17162021-02-18 02:17:37 +0000673}
674
675TEST_F(FrameTimelineTest, presentFenceSignaled_reportsSfPredictionError) {
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000676 Fps refreshRate = Fps::fromPeriodNsecs(16);
Adithya Srinivasanead17162021-02-18 02:17:37 +0000677 EXPECT_CALL(*mTimeStats,
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000678 incrementJankyFrames(TimeStats::JankyFramesInfo{refreshRate, std::nullopt, sUidOne,
Adithya Srinivasan58069dc2021-06-04 20:37:02 +0000679 sLayerNameOne, sGameMode,
Adithya Srinivasan82eef322021-04-10 00:06:04 +0000680 JankType::PredictionError, -4, 5,
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000681 0}));
Adithya Srinivasanead17162021-02-18 02:17:37 +0000682 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000683 int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions({30, 40, 60});
684 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({52, 60, 60});
Huihong Luo3bdef862022-03-03 11:57:19 -0800685 FrameTimelineInfo ftInfo;
686 ftInfo.vsyncId = surfaceFrameToken1;
687 ftInfo.inputEventId = sInputEventId;
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000688
Adithya Srinivasanead17162021-02-18 02:17:37 +0000689 auto surfaceFrame1 =
Huihong Luo3bdef862022-03-03 11:57:19 -0800690 mFrameTimeline->createSurfaceFrameForToken(ftInfo, sPidOne, sUidOne, sLayerIdOne,
691 sLayerNameOne, sLayerNameOne,
692 /*isBuffer*/ true, sGameMode);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000693 surfaceFrame1->setAcquireFenceTime(40);
Pascal Muetschardac7bcd92023-10-03 15:05:36 +0200694 mFrameTimeline->setSfWakeUp(sfToken1, 52, refreshRate, refreshRate);
Adithya Srinivasanead17162021-02-18 02:17:37 +0000695
696 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
697 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000698 presentFence1->signalForTest(65);
699 mFrameTimeline->setSfPresent(56, presentFence1);
Adithya Srinivasanead17162021-02-18 02:17:37 +0000700
701 EXPECT_EQ(surfaceFrame1->getJankType(), JankType::PredictionError);
Ying Wei96eb5352023-11-21 17:37:21 +0000702 EXPECT_EQ(surfaceFrame1->getJankSeverityType(), JankSeverityType::Partial);
Adithya Srinivasanead17162021-02-18 02:17:37 +0000703}
704
705TEST_F(FrameTimelineTest, presentFenceSignaled_reportsAppBufferStuffing) {
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000706 Fps refreshRate = Fps::fromPeriodNsecs(32);
Adithya Srinivasanead17162021-02-18 02:17:37 +0000707 EXPECT_CALL(*mTimeStats,
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000708 incrementJankyFrames(TimeStats::JankyFramesInfo{refreshRate, std::nullopt, sUidOne,
Adithya Srinivasan58069dc2021-06-04 20:37:02 +0000709 sLayerNameOne, sGameMode,
Adithya Srinivasan82eef322021-04-10 00:06:04 +0000710 JankType::BufferStuffing, -4, 0,
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000711 0}));
Adithya Srinivasanead17162021-02-18 02:17:37 +0000712 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000713 int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions({30, 40, 58});
714 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({82, 90, 90});
Huihong Luo3bdef862022-03-03 11:57:19 -0800715 FrameTimelineInfo ftInfo;
716 ftInfo.vsyncId = surfaceFrameToken1;
717 ftInfo.inputEventId = sInputEventId;
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000718
Adithya Srinivasanead17162021-02-18 02:17:37 +0000719 auto surfaceFrame1 =
Huihong Luo3bdef862022-03-03 11:57:19 -0800720 mFrameTimeline->createSurfaceFrameForToken(ftInfo, sPidOne, sUidOne, sLayerIdOne,
721 sLayerNameOne, sLayerNameOne,
722 /*isBuffer*/ true, sGameMode);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000723 surfaceFrame1->setAcquireFenceTime(40);
Pascal Muetschardac7bcd92023-10-03 15:05:36 +0200724 mFrameTimeline->setSfWakeUp(sfToken1, 82, refreshRate, refreshRate);
Adithya Srinivasanead17162021-02-18 02:17:37 +0000725
726 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented,
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000727 /*previousLatchTime*/ 56);
Adithya Srinivasanead17162021-02-18 02:17:37 +0000728 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000729 presentFence1->signalForTest(90);
730 mFrameTimeline->setSfPresent(86, presentFence1);
Adithya Srinivasanead17162021-02-18 02:17:37 +0000731
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000732 EXPECT_EQ(surfaceFrame1->getJankType(), JankType::BufferStuffing);
Ying Wei96eb5352023-11-21 17:37:21 +0000733 EXPECT_EQ(surfaceFrame1->getJankSeverityType(), JankSeverityType::Full);
Adithya Srinivasanead17162021-02-18 02:17:37 +0000734}
735
Alec Mouri363faf02021-01-29 16:34:55 -0800736TEST_F(FrameTimelineTest, presentFenceSignaled_reportsAppMissWithRenderRate) {
Pascal Muetschardac7bcd92023-10-03 15:05:36 +0200737 Fps refreshRate = RR_11;
738 Fps renderRate = RR_30;
Alec Mouri363faf02021-01-29 16:34:55 -0800739 EXPECT_CALL(*mTimeStats,
Adithya Srinivasan58069dc2021-06-04 20:37:02 +0000740 incrementJankyFrames(TimeStats::JankyFramesInfo{refreshRate, renderRate, sUidOne,
741 sLayerNameOne, sGameMode,
742 JankType::AppDeadlineMissed, -4, 0,
743 25}));
Alec Mouri363faf02021-01-29 16:34:55 -0800744 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000745 int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions({10, 20, 60});
746 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({82, 90, 90});
Huihong Luo3bdef862022-03-03 11:57:19 -0800747 FrameTimelineInfo ftInfo;
748 ftInfo.vsyncId = surfaceFrameToken1;
749 ftInfo.inputEventId = sInputEventId;
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000750
Alec Mouri363faf02021-01-29 16:34:55 -0800751 auto surfaceFrame1 =
Huihong Luo3bdef862022-03-03 11:57:19 -0800752 mFrameTimeline->createSurfaceFrameForToken(ftInfo, sPidOne, sUidOne, sLayerIdOne,
753 sLayerNameOne, sLayerNameOne,
754 /*isBuffer*/ true, sGameMode);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000755 surfaceFrame1->setAcquireFenceTime(45);
Pascal Muetschardac7bcd92023-10-03 15:05:36 +0200756 mFrameTimeline->setSfWakeUp(sfToken1, 52, refreshRate, refreshRate);
Alec Mouri363faf02021-01-29 16:34:55 -0800757
758 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
759 surfaceFrame1->setRenderRate(renderRate);
760 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +0000761 presentFence1->signalForTest(90);
762 mFrameTimeline->setSfPresent(86, presentFence1);
Alec Mouri363faf02021-01-29 16:34:55 -0800763
764 EXPECT_EQ(surfaceFrame1->getJankType(), JankType::AppDeadlineMissed);
Ying Wei96eb5352023-11-21 17:37:21 +0000765 EXPECT_EQ(surfaceFrame1->getJankSeverityType(), JankSeverityType::Full);
Alec Mouri363faf02021-01-29 16:34:55 -0800766}
767
Adithya Srinivasan115ac692021-03-06 01:21:30 +0000768TEST_F(FrameTimelineTest, presentFenceSignaled_displayFramePredictionExpiredPresentsSurfaceFrame) {
Pascal Muetschardac7bcd92023-10-03 15:05:36 +0200769 Fps refreshRate = RR_11;
770 Fps renderRate = RR_30;
Adithya Srinivasan115ac692021-03-06 01:21:30 +0000771
772 EXPECT_CALL(*mTimeStats,
Adithya Srinivasan8a945502021-03-19 19:12:32 +0000773 incrementJankyFrames(
774 TimeStats::JankyFramesInfo{refreshRate, renderRate, sUidOne, sLayerNameOne,
Adithya Srinivasan58069dc2021-06-04 20:37:02 +0000775 sGameMode,
Adithya Srinivasan8a945502021-03-19 19:12:32 +0000776 JankType::Unknown | JankType::AppDeadlineMissed,
Adithya Srinivasande272452021-04-10 00:21:00 +0000777 0, 0, 25}));
Adithya Srinivasan115ac692021-03-06 01:21:30 +0000778 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
779 int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions({10, 20, 60});
780 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({82, 90, 90});
Huihong Luo3bdef862022-03-03 11:57:19 -0800781 FrameTimelineInfo ftInfo;
782 ftInfo.vsyncId = surfaceFrameToken1;
783 ftInfo.inputEventId = sInputEventId;
Adithya Srinivasan115ac692021-03-06 01:21:30 +0000784
785 auto surfaceFrame1 =
Huihong Luo3bdef862022-03-03 11:57:19 -0800786 mFrameTimeline->createSurfaceFrameForToken(ftInfo, sPidOne, sUidOne, sLayerIdOne,
787 sLayerNameOne, sLayerNameOne,
788 /*isBuffer*/ true, sGameMode);
Adithya Srinivasan115ac692021-03-06 01:21:30 +0000789 surfaceFrame1->setAcquireFenceTime(45);
790 // Trigger a prediction expiry
Adithya Srinivasanbed4c4f2021-05-03 20:24:46 +0000791 flushTokens();
Pascal Muetschardac7bcd92023-10-03 15:05:36 +0200792 mFrameTimeline->setSfWakeUp(sfToken1, 52, refreshRate, refreshRate);
Adithya Srinivasan115ac692021-03-06 01:21:30 +0000793
794 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
795 surfaceFrame1->setRenderRate(renderRate);
796 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
797 presentFence1->signalForTest(90);
798 mFrameTimeline->setSfPresent(86, presentFence1);
799
800 auto displayFrame = getDisplayFrame(0);
801 EXPECT_EQ(displayFrame->getJankType(), JankType::Unknown);
Ying Wei96eb5352023-11-21 17:37:21 +0000802 EXPECT_EQ(displayFrame->getJankSeverityType(), JankSeverityType::Unknown);
Adithya Srinivasan115ac692021-03-06 01:21:30 +0000803 EXPECT_EQ(displayFrame->getFrameStartMetadata(), FrameStartMetadata::UnknownStart);
804 EXPECT_EQ(displayFrame->getFrameReadyMetadata(), FrameReadyMetadata::UnknownFinish);
805 EXPECT_EQ(displayFrame->getFramePresentMetadata(), FramePresentMetadata::UnknownPresent);
806
807 EXPECT_EQ(surfaceFrame1->getActuals().presentTime, 90);
Adithya Srinivasan8a945502021-03-19 19:12:32 +0000808 EXPECT_EQ(surfaceFrame1->getJankType(), JankType::Unknown | JankType::AppDeadlineMissed);
Ying Wei96eb5352023-11-21 17:37:21 +0000809 EXPECT_EQ(surfaceFrame1->getJankSeverityType(), JankSeverityType::Full);
Adithya Srinivasan115ac692021-03-06 01:21:30 +0000810}
811
Adithya Srinivasan01189672020-10-20 14:23:05 -0700812/*
813 * Tracing Tests
814 *
815 * Trace packets are flushed all the way only when the next packet is traced.
816 * For example: trace<Display/Surface>Frame() will create a TracePacket but not flush it. Only when
817 * another TracePacket is created, the previous one is guaranteed to be flushed. The following tests
818 * will have additional empty frames created for this reason.
819 */
820TEST_F(FrameTimelineTest, tracing_noPacketsSentWithoutTraceStart) {
821 auto tracingSession = getTracingSessionForTest();
822 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan01189672020-10-20 14:23:05 -0700823 int64_t token1 = mTokenManager->generateTokenForPredictions({10, 20, 30});
Huihong Luo3bdef862022-03-03 11:57:19 -0800824 FrameTimelineInfo ftInfo;
825 ftInfo.vsyncId = token1;
826 ftInfo.inputEventId = sInputEventId;
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000827 auto surfaceFrame1 =
Huihong Luo3bdef862022-03-03 11:57:19 -0800828 mFrameTimeline->createSurfaceFrameForToken(ftInfo, sPidOne, sUidOne, sLayerIdOne,
829 sLayerNameOne, sLayerNameOne,
Adithya Srinivasan58069dc2021-06-04 20:37:02 +0000830 /*isBuffer*/ true, sGameMode);
Adithya Srinivasan01189672020-10-20 14:23:05 -0700831
832 // Set up the display frame
Pascal Muetschardac7bcd92023-10-03 15:05:36 +0200833 mFrameTimeline->setSfWakeUp(token1, 20, RR_11, RR_11);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800834 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Dropped);
835 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
Adithya Srinivasan01189672020-10-20 14:23:05 -0700836 mFrameTimeline->setSfPresent(25, presentFence1);
837 presentFence1->signalForTest(30);
838
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000839 addEmptyDisplayFrame();
Adithya Srinivasan01189672020-10-20 14:23:05 -0700840
841 auto packets = readFrameTimelinePacketsBlocking(tracingSession.get());
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000842 EXPECT_EQ(packets.size(), 0u);
Adithya Srinivasan01189672020-10-20 14:23:05 -0700843}
844
845TEST_F(FrameTimelineTest, tracing_sanityTest) {
846 auto tracingSession = getTracingSessionForTest();
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800847 // Layer specific increment
Alec Mouri363faf02021-01-29 16:34:55 -0800848 EXPECT_CALL(*mTimeStats, incrementJankyFrames(_));
Adithya Srinivasan01189672020-10-20 14:23:05 -0700849 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan01189672020-10-20 14:23:05 -0700850
851 tracingSession->StartBlocking();
852 int64_t token1 = mTokenManager->generateTokenForPredictions({10, 20, 30});
853 int64_t token2 = mTokenManager->generateTokenForPredictions({40, 50, 60});
Huihong Luo3bdef862022-03-03 11:57:19 -0800854 FrameTimelineInfo ftInfo;
855 ftInfo.vsyncId = token1;
856 ftInfo.inputEventId = sInputEventId;
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000857 auto surfaceFrame1 =
Huihong Luo3bdef862022-03-03 11:57:19 -0800858 mFrameTimeline->createSurfaceFrameForToken(ftInfo, sPidOne, sUidOne, sLayerIdOne,
859 sLayerNameOne, sLayerNameOne,
Adithya Srinivasan58069dc2021-06-04 20:37:02 +0000860 /*isBuffer*/ true, sGameMode);
Adithya Srinivasan01189672020-10-20 14:23:05 -0700861
862 // Set up the display frame
Pascal Muetschardac7bcd92023-10-03 15:05:36 +0200863 mFrameTimeline->setSfWakeUp(token2, 20, RR_11, RR_11);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800864 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
865 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
Adithya Srinivasan01189672020-10-20 14:23:05 -0700866 mFrameTimeline->setSfPresent(25, presentFence1);
867 presentFence1->signalForTest(30);
868
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000869 addEmptyDisplayFrame();
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000870 flushTrace();
Adithya Srinivasan01189672020-10-20 14:23:05 -0700871 tracingSession->StopBlocking();
872
873 auto packets = readFrameTimelinePacketsBlocking(tracingSession.get());
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000874 // Display Frame 1 has 8 packets - 4 from DisplayFrame and 4 from SurfaceFrame.
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000875 EXPECT_EQ(packets.size(), 8u);
Adithya Srinivasan01189672020-10-20 14:23:05 -0700876}
877
878TEST_F(FrameTimelineTest, traceDisplayFrame_invalidTokenDoesNotEmitTracePacket) {
879 auto tracingSession = getTracingSessionForTest();
880 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan01189672020-10-20 14:23:05 -0700881
882 tracingSession->StartBlocking();
Adithya Srinivasan01189672020-10-20 14:23:05 -0700883
884 // Set up the display frame
Pascal Muetschardac7bcd92023-10-03 15:05:36 +0200885 mFrameTimeline->setSfWakeUp(-1, 20, RR_11, RR_11);
Adithya Srinivasan01189672020-10-20 14:23:05 -0700886 mFrameTimeline->setSfPresent(25, presentFence1);
887 presentFence1->signalForTest(30);
888
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000889 addEmptyDisplayFrame();
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000890 flushTrace();
Adithya Srinivasan01189672020-10-20 14:23:05 -0700891 tracingSession->StopBlocking();
892
893 auto packets = readFrameTimelinePacketsBlocking(tracingSession.get());
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000894 EXPECT_EQ(packets.size(), 0u);
Adithya Srinivasan01189672020-10-20 14:23:05 -0700895}
896
897TEST_F(FrameTimelineTest, traceSurfaceFrame_invalidTokenDoesNotEmitTracePacket) {
898 auto tracingSession = getTracingSessionForTest();
899 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan01189672020-10-20 14:23:05 -0700900
901 tracingSession->StartBlocking();
902 int64_t token1 = mTokenManager->generateTokenForPredictions({10, 20, 30});
Alec Mouriadebf5c2021-01-05 12:57:36 -0800903 auto surfaceFrame1 =
904 mFrameTimeline->createSurfaceFrameForToken({}, sPidOne, sUidOne, sLayerIdOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000905 sLayerNameOne, sLayerNameOne,
Adithya Srinivasan58069dc2021-06-04 20:37:02 +0000906 /*isBuffer*/ true, sGameMode);
Adithya Srinivasan01189672020-10-20 14:23:05 -0700907
908 // Set up the display frame
Pascal Muetschardac7bcd92023-10-03 15:05:36 +0200909 mFrameTimeline->setSfWakeUp(token1, 20, RR_11, RR_11);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -0800910 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Dropped);
911 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
Adithya Srinivasan01189672020-10-20 14:23:05 -0700912 mFrameTimeline->setSfPresent(25, presentFence1);
913 presentFence1->signalForTest(30);
914
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000915 addEmptyDisplayFrame();
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000916 flushTrace();
Adithya Srinivasan01189672020-10-20 14:23:05 -0700917 tracingSession->StopBlocking();
918
919 auto packets = readFrameTimelinePacketsBlocking(tracingSession.get());
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000920 // Display Frame 1 has 4 packets (SurfaceFrame shouldn't be traced since it has an invalid
921 // token).
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000922 EXPECT_EQ(packets.size(), 4u);
Adithya Srinivasan01189672020-10-20 14:23:05 -0700923}
924
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000925ProtoExpectedDisplayFrameStart createProtoExpectedDisplayFrameStart(int64_t cookie, int64_t token,
926 pid_t pid) {
927 ProtoExpectedDisplayFrameStart proto;
928 proto.set_cookie(cookie);
929 proto.set_token(token);
930 proto.set_pid(pid);
931 return proto;
932}
933
934ProtoActualDisplayFrameStart createProtoActualDisplayFrameStart(
935 int64_t cookie, int64_t token, pid_t pid, ProtoPresentType presentType, bool onTimeFinish,
Ying Wei96eb5352023-11-21 17:37:21 +0000936 bool gpuComposition, ProtoJankType jankType, ProtoJankSeverityType jankSeverityType,
937 ProtoPredictionType predictionType) {
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000938 ProtoActualDisplayFrameStart proto;
939 proto.set_cookie(cookie);
940 proto.set_token(token);
941 proto.set_pid(pid);
942 proto.set_present_type(presentType);
943 proto.set_on_time_finish(onTimeFinish);
944 proto.set_gpu_composition(gpuComposition);
945 proto.set_jank_type(jankType);
Ying Wei96eb5352023-11-21 17:37:21 +0000946 proto.set_jank_severity_type(jankSeverityType);
Adithya Srinivasan78e58af2021-02-25 00:08:08 +0000947 proto.set_prediction_type(predictionType);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000948 return proto;
949}
950
951ProtoExpectedSurfaceFrameStart createProtoExpectedSurfaceFrameStart(int64_t cookie, int64_t token,
952 int64_t displayFrameToken,
953 pid_t pid,
954 std::string layerName) {
955 ProtoExpectedSurfaceFrameStart proto;
956 proto.set_cookie(cookie);
957 proto.set_token(token);
958 proto.set_display_frame_token(displayFrameToken);
959 proto.set_pid(pid);
960 proto.set_layer_name(layerName);
961 return proto;
962}
963
964ProtoActualSurfaceFrameStart createProtoActualSurfaceFrameStart(
965 int64_t cookie, int64_t token, int64_t displayFrameToken, pid_t pid, std::string layerName,
966 ProtoPresentType presentType, bool onTimeFinish, bool gpuComposition,
Ying Wei96eb5352023-11-21 17:37:21 +0000967 ProtoJankType jankType, ProtoJankSeverityType jankSeverityType,
968 ProtoPredictionType predictionType, bool isBuffer) {
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000969 ProtoActualSurfaceFrameStart proto;
970 proto.set_cookie(cookie);
971 proto.set_token(token);
972 proto.set_display_frame_token(displayFrameToken);
973 proto.set_pid(pid);
974 proto.set_layer_name(layerName);
975 proto.set_present_type(presentType);
976 proto.set_on_time_finish(onTimeFinish);
977 proto.set_gpu_composition(gpuComposition);
978 proto.set_jank_type(jankType);
Ying Wei96eb5352023-11-21 17:37:21 +0000979 proto.set_jank_severity_type(jankSeverityType);
Adithya Srinivasan78e58af2021-02-25 00:08:08 +0000980 proto.set_prediction_type(predictionType);
Adithya Srinivasan1f9450c2021-06-10 22:39:19 +0000981 proto.set_is_buffer(isBuffer);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +0000982 return proto;
983}
984
985ProtoFrameEnd createProtoFrameEnd(int64_t cookie) {
986 ProtoFrameEnd proto;
987 proto.set_cookie(cookie);
988 return proto;
989}
990
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000991void validateTraceEvent(const ProtoExpectedDisplayFrameStart& received,
992 const ProtoExpectedDisplayFrameStart& source) {
993 ASSERT_TRUE(received.has_cookie());
994 EXPECT_EQ(received.cookie(), source.cookie());
995
Adithya Srinivasan01189672020-10-20 14:23:05 -0700996 ASSERT_TRUE(received.has_token());
997 EXPECT_EQ(received.token(), source.token());
998
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +0000999 ASSERT_TRUE(received.has_pid());
1000 EXPECT_EQ(received.pid(), source.pid());
1001}
1002
1003void validateTraceEvent(const ProtoActualDisplayFrameStart& received,
1004 const ProtoActualDisplayFrameStart& source) {
1005 ASSERT_TRUE(received.has_cookie());
1006 EXPECT_EQ(received.cookie(), source.cookie());
1007
1008 ASSERT_TRUE(received.has_token());
1009 EXPECT_EQ(received.token(), source.token());
1010
1011 ASSERT_TRUE(received.has_pid());
1012 EXPECT_EQ(received.pid(), source.pid());
1013
Adithya Srinivasan01189672020-10-20 14:23:05 -07001014 ASSERT_TRUE(received.has_present_type());
1015 EXPECT_EQ(received.present_type(), source.present_type());
1016 ASSERT_TRUE(received.has_on_time_finish());
1017 EXPECT_EQ(received.on_time_finish(), source.on_time_finish());
1018 ASSERT_TRUE(received.has_gpu_composition());
1019 EXPECT_EQ(received.gpu_composition(), source.gpu_composition());
1020 ASSERT_TRUE(received.has_jank_type());
1021 EXPECT_EQ(received.jank_type(), source.jank_type());
Ying Wei96eb5352023-11-21 17:37:21 +00001022 ASSERT_TRUE(received.has_jank_severity_type());
1023 EXPECT_EQ(received.jank_severity_type(), source.jank_severity_type());
Adithya Srinivasan78e58af2021-02-25 00:08:08 +00001024 ASSERT_TRUE(received.has_prediction_type());
1025 EXPECT_EQ(received.prediction_type(), source.prediction_type());
Adithya Srinivasan01189672020-10-20 14:23:05 -07001026}
1027
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001028void validateTraceEvent(const ProtoExpectedSurfaceFrameStart& received,
1029 const ProtoExpectedSurfaceFrameStart& source) {
1030 ASSERT_TRUE(received.has_cookie());
1031 EXPECT_EQ(received.cookie(), source.cookie());
1032
Adithya Srinivasan01189672020-10-20 14:23:05 -07001033 ASSERT_TRUE(received.has_token());
1034 EXPECT_EQ(received.token(), source.token());
1035
1036 ASSERT_TRUE(received.has_display_frame_token());
1037 EXPECT_EQ(received.display_frame_token(), source.display_frame_token());
1038
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001039 ASSERT_TRUE(received.has_pid());
1040 EXPECT_EQ(received.pid(), source.pid());
1041
1042 ASSERT_TRUE(received.has_layer_name());
1043 EXPECT_EQ(received.layer_name(), source.layer_name());
1044}
1045
1046void validateTraceEvent(const ProtoActualSurfaceFrameStart& received,
1047 const ProtoActualSurfaceFrameStart& source) {
1048 ASSERT_TRUE(received.has_cookie());
1049 EXPECT_EQ(received.cookie(), source.cookie());
1050
1051 ASSERT_TRUE(received.has_token());
1052 EXPECT_EQ(received.token(), source.token());
1053
1054 ASSERT_TRUE(received.has_display_frame_token());
1055 EXPECT_EQ(received.display_frame_token(), source.display_frame_token());
1056
1057 ASSERT_TRUE(received.has_pid());
1058 EXPECT_EQ(received.pid(), source.pid());
1059
1060 ASSERT_TRUE(received.has_layer_name());
1061 EXPECT_EQ(received.layer_name(), source.layer_name());
1062
Adithya Srinivasan01189672020-10-20 14:23:05 -07001063 ASSERT_TRUE(received.has_present_type());
1064 EXPECT_EQ(received.present_type(), source.present_type());
1065 ASSERT_TRUE(received.has_on_time_finish());
1066 EXPECT_EQ(received.on_time_finish(), source.on_time_finish());
1067 ASSERT_TRUE(received.has_gpu_composition());
1068 EXPECT_EQ(received.gpu_composition(), source.gpu_composition());
1069 ASSERT_TRUE(received.has_jank_type());
1070 EXPECT_EQ(received.jank_type(), source.jank_type());
Ying Wei96eb5352023-11-21 17:37:21 +00001071 ASSERT_TRUE(received.has_jank_severity_type());
1072 EXPECT_EQ(received.jank_severity_type(), source.jank_severity_type());
Adithya Srinivasan78e58af2021-02-25 00:08:08 +00001073 ASSERT_TRUE(received.has_prediction_type());
1074 EXPECT_EQ(received.prediction_type(), source.prediction_type());
Adithya Srinivasan1f9450c2021-06-10 22:39:19 +00001075 ASSERT_TRUE(received.has_is_buffer());
1076 EXPECT_EQ(received.is_buffer(), source.is_buffer());
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001077}
Adithya Srinivasan01189672020-10-20 14:23:05 -07001078
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001079void validateTraceEvent(const ProtoFrameEnd& received, const ProtoFrameEnd& source) {
1080 ASSERT_TRUE(received.has_cookie());
1081 EXPECT_EQ(received.cookie(), source.cookie());
Adithya Srinivasan01189672020-10-20 14:23:05 -07001082}
1083
Sally Qiaa107742023-09-29 14:53:14 -07001084TEST_F(FrameTimelineTest, traceDisplayFrameSkipped) {
Sally Qif5721252023-11-17 11:14:53 -08001085 SET_FLAG_FOR_TEST(com::android::graphics::surfaceflinger::flags::add_sf_skipped_frames_to_trace,
1086 true);
1087
Sally Qiaa107742023-09-29 14:53:14 -07001088 // setup 2 display frames
1089 // DF 1: [22,40] -> [5, 40]
1090 // DF : [36, 70] (Skipped one, added by the trace)
1091 // DF 2: [82, 100] -> SF [25, 70]
1092 auto tracingSession = getTracingSessionForTest();
1093 tracingSession->StartBlocking();
1094 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({22, 30, 40});
1095 int64_t sfToken2 = mTokenManager->generateTokenForPredictions({82, 90, 100});
1096 int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions({5, 16, 40});
1097 int64_t surfaceFrameToken2 = mTokenManager->generateTokenForPredictions({25, 36, 70});
1098 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
1099
1100 int64_t traceCookie = snoopCurrentTraceCookie();
1101
1102 // set up 1st display frame
1103 FrameTimelineInfo ftInfo1;
1104 ftInfo1.vsyncId = surfaceFrameToken1;
1105 ftInfo1.inputEventId = sInputEventId;
1106 auto surfaceFrame1 =
1107 mFrameTimeline->createSurfaceFrameForToken(ftInfo1, sPidOne, sUidOne, sLayerIdOne,
1108 sLayerNameOne, sLayerNameOne,
1109 /*isBuffer*/ true, sGameMode);
1110 surfaceFrame1->setAcquireFenceTime(16);
1111 mFrameTimeline->setSfWakeUp(sfToken1, 22, RR_11, RR_30);
1112 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
1113 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
1114 mFrameTimeline->setSfPresent(30, presentFence1);
1115 presentFence1->signalForTest(40);
1116
1117 // Trigger a flush by finalizing the next DisplayFrame
1118 auto presentFence2 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
1119 FrameTimelineInfo ftInfo2;
1120 ftInfo2.vsyncId = surfaceFrameToken2;
1121 ftInfo2.inputEventId = sInputEventId;
1122 auto surfaceFrame2 =
1123 mFrameTimeline->createSurfaceFrameForToken(ftInfo2, sPidOne, sUidOne, sLayerIdOne,
1124 sLayerNameOne, sLayerNameOne,
1125 /*isBuffer*/ true, sGameMode);
1126
1127 // set up 2nd display frame
1128 surfaceFrame2->setAcquireFenceTime(36);
1129 mFrameTimeline->setSfWakeUp(sfToken2, 82, RR_11, RR_30);
1130 surfaceFrame2->setPresentState(SurfaceFrame::PresentState::Presented);
1131 mFrameTimeline->addSurfaceFrame(surfaceFrame2);
1132 mFrameTimeline->setSfPresent(90, presentFence2);
1133 presentFence2->signalForTest(100);
1134
1135 // the token of skipped Display Frame
1136 auto protoSkippedActualDisplayFrameStart =
1137 createProtoActualDisplayFrameStart(traceCookie + 9, 0, kSurfaceFlingerPid,
1138 FrameTimelineEvent::PRESENT_DROPPED, true, false,
1139 FrameTimelineEvent::JANK_DROPPED,
Ying Wei96eb5352023-11-21 17:37:21 +00001140 FrameTimelineEvent::SEVERITY_NONE,
Sally Qiaa107742023-09-29 14:53:14 -07001141 FrameTimelineEvent::PREDICTION_VALID);
1142 auto protoSkippedActualDisplayFrameEnd = createProtoFrameEnd(traceCookie + 9);
1143
1144 // Trigger a flush by finalizing the next DisplayFrame
1145 addEmptyDisplayFrame();
1146 flushTrace();
1147 tracingSession->StopBlocking();
1148
1149 auto packets = readFrameTimelinePacketsBlocking(tracingSession.get());
1150 // 8 Valid Display Frames + 8 Valid Surface Frames + 2 Skipped Display Frames
1151 EXPECT_EQ(packets.size(), 18u);
1152
1153 // Packet - 16: Actual skipped Display Frame Start
1154 // the timestamp should be equal to the 2nd expected surface frame's end time
1155 const auto& packet16 = packets[16];
1156 ASSERT_TRUE(packet16.has_timestamp());
1157 EXPECT_EQ(packet16.timestamp(), 36u);
1158 ASSERT_TRUE(packet16.has_frame_timeline_event());
1159
1160 const auto& event16 = packet16.frame_timeline_event();
1161 const auto& actualSkippedDisplayFrameStart = event16.actual_display_frame_start();
1162 validateTraceEvent(actualSkippedDisplayFrameStart, protoSkippedActualDisplayFrameStart);
1163
1164 // Packet - 17: Actual skipped Display Frame End
1165 // the timestamp should be equal to the 2nd expected surface frame's present time
1166 const auto& packet17 = packets[17];
1167 ASSERT_TRUE(packet17.has_timestamp());
1168 EXPECT_EQ(packet17.timestamp(), 70u);
1169 ASSERT_TRUE(packet17.has_frame_timeline_event());
1170
1171 const auto& event17 = packet17.frame_timeline_event();
1172 const auto& actualSkippedDisplayFrameEnd = event17.frame_end();
1173 validateTraceEvent(actualSkippedDisplayFrameEnd, protoSkippedActualDisplayFrameEnd);
1174}
1175
Adithya Srinivasan01189672020-10-20 14:23:05 -07001176TEST_F(FrameTimelineTest, traceDisplayFrame_emitsValidTracePacket) {
1177 auto tracingSession = getTracingSessionForTest();
1178 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan01189672020-10-20 14:23:05 -07001179
1180 tracingSession->StartBlocking();
Ady Abraham57a8ab42023-01-26 15:28:19 -08001181
1182 // Add an empty surface frame so that display frame would get traced.
1183 addEmptySurfaceFrame();
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001184 int64_t displayFrameToken1 = mTokenManager->generateTokenForPredictions({10, 30, 30});
Adithya Srinivasan01189672020-10-20 14:23:05 -07001185
1186 // Set up the display frame
Pascal Muetschardac7bcd92023-10-03 15:05:36 +02001187 mFrameTimeline->setSfWakeUp(displayFrameToken1, 20, RR_11, RR_11);
Adithya Srinivasan01189672020-10-20 14:23:05 -07001188 mFrameTimeline->setSfPresent(26, presentFence1);
1189 presentFence1->signalForTest(31);
1190
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001191 int64_t traceCookie = snoopCurrentTraceCookie();
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001192 auto protoExpectedDisplayFrameStart =
1193 createProtoExpectedDisplayFrameStart(traceCookie + 1, displayFrameToken1,
1194 kSurfaceFlingerPid);
1195 auto protoExpectedDisplayFrameEnd = createProtoFrameEnd(traceCookie + 1);
1196 auto protoActualDisplayFrameStart =
1197 createProtoActualDisplayFrameStart(traceCookie + 2, displayFrameToken1,
1198 kSurfaceFlingerPid,
1199 FrameTimelineEvent::PRESENT_ON_TIME, true, false,
Adithya Srinivasan78e58af2021-02-25 00:08:08 +00001200 FrameTimelineEvent::JANK_NONE,
Ying Wei96eb5352023-11-21 17:37:21 +00001201 FrameTimelineEvent::SEVERITY_NONE,
Adithya Srinivasan78e58af2021-02-25 00:08:08 +00001202 FrameTimelineEvent::PREDICTION_VALID);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001203 auto protoActualDisplayFrameEnd = createProtoFrameEnd(traceCookie + 2);
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001204
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001205 addEmptyDisplayFrame();
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001206 flushTrace();
Adithya Srinivasan01189672020-10-20 14:23:05 -07001207 tracingSession->StopBlocking();
1208
1209 auto packets = readFrameTimelinePacketsBlocking(tracingSession.get());
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001210 EXPECT_EQ(packets.size(), 4u);
Adithya Srinivasan01189672020-10-20 14:23:05 -07001211
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001212 // Packet - 0 : ExpectedDisplayFrameStart
1213 const auto& packet0 = packets[0];
1214 ASSERT_TRUE(packet0.has_timestamp());
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001215 EXPECT_EQ(packet0.timestamp(), 10u);
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001216 ASSERT_TRUE(packet0.has_frame_timeline_event());
Adithya Srinivasan01189672020-10-20 14:23:05 -07001217
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001218 const auto& event0 = packet0.frame_timeline_event();
1219 ASSERT_TRUE(event0.has_expected_display_frame_start());
1220 const auto& expectedDisplayFrameStart = event0.expected_display_frame_start();
1221 validateTraceEvent(expectedDisplayFrameStart, protoExpectedDisplayFrameStart);
1222
1223 // Packet - 1 : FrameEnd (ExpectedDisplayFrame)
1224 const auto& packet1 = packets[1];
1225 ASSERT_TRUE(packet1.has_timestamp());
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001226 EXPECT_EQ(packet1.timestamp(), 30u);
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001227 ASSERT_TRUE(packet1.has_frame_timeline_event());
1228
1229 const auto& event1 = packet1.frame_timeline_event();
1230 ASSERT_TRUE(event1.has_frame_end());
1231 const auto& expectedDisplayFrameEnd = event1.frame_end();
1232 validateTraceEvent(expectedDisplayFrameEnd, protoExpectedDisplayFrameEnd);
1233
1234 // Packet - 2 : ActualDisplayFrameStart
1235 const auto& packet2 = packets[2];
1236 ASSERT_TRUE(packet2.has_timestamp());
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001237 EXPECT_EQ(packet2.timestamp(), 20u);
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001238 ASSERT_TRUE(packet2.has_frame_timeline_event());
1239
1240 const auto& event2 = packet2.frame_timeline_event();
1241 ASSERT_TRUE(event2.has_actual_display_frame_start());
1242 const auto& actualDisplayFrameStart = event2.actual_display_frame_start();
1243 validateTraceEvent(actualDisplayFrameStart, protoActualDisplayFrameStart);
1244
1245 // Packet - 3 : FrameEnd (ActualDisplayFrame)
1246 const auto& packet3 = packets[3];
1247 ASSERT_TRUE(packet3.has_timestamp());
Adithya Srinivasan1a971632021-02-26 23:10:29 +00001248 EXPECT_EQ(packet3.timestamp(), 31u);
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001249 ASSERT_TRUE(packet3.has_frame_timeline_event());
1250
1251 const auto& event3 = packet3.frame_timeline_event();
1252 ASSERT_TRUE(event3.has_frame_end());
1253 const auto& actualDisplayFrameEnd = event3.frame_end();
1254 validateTraceEvent(actualDisplayFrameEnd, protoActualDisplayFrameEnd);
Adithya Srinivasan01189672020-10-20 14:23:05 -07001255}
1256
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001257TEST_F(FrameTimelineTest, traceDisplayFrame_predictionExpiredDoesNotTraceExpectedTimeline) {
1258 auto tracingSession = getTracingSessionForTest();
1259 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
1260
1261 tracingSession->StartBlocking();
1262 int64_t displayFrameToken1 = mTokenManager->generateTokenForPredictions({10, 25, 30});
1263 // Flush the token so that it would expire
Adithya Srinivasanbed4c4f2021-05-03 20:24:46 +00001264 flushTokens();
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001265
Ady Abraham57a8ab42023-01-26 15:28:19 -08001266 // Add an empty surface frame so that display frame would get traced.
1267 addEmptySurfaceFrame();
1268
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001269 // Set up the display frame
Pascal Muetschardac7bcd92023-10-03 15:05:36 +02001270 mFrameTimeline->setSfWakeUp(displayFrameToken1, 20, RR_11, RR_11);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001271 mFrameTimeline->setSfPresent(26, presentFence1);
1272 presentFence1->signalForTest(31);
1273
1274 int64_t traceCookie = snoopCurrentTraceCookie();
1275
1276 auto protoActualDisplayFrameStart =
1277 createProtoActualDisplayFrameStart(traceCookie + 1, displayFrameToken1,
1278 kSurfaceFlingerPid,
1279 FrameTimelineEvent::PRESENT_UNSPECIFIED, false,
Adithya Srinivasan78e58af2021-02-25 00:08:08 +00001280 false, FrameTimelineEvent::JANK_UNKNOWN,
Ying Wei96eb5352023-11-21 17:37:21 +00001281 FrameTimelineEvent::SEVERITY_UNKNOWN,
Adithya Srinivasan78e58af2021-02-25 00:08:08 +00001282 FrameTimelineEvent::PREDICTION_EXPIRED);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001283 auto protoActualDisplayFrameEnd = createProtoFrameEnd(traceCookie + 1);
1284
1285 addEmptyDisplayFrame();
1286 flushTrace();
1287 tracingSession->StopBlocking();
1288
1289 auto packets = readFrameTimelinePacketsBlocking(tracingSession.get());
1290 // Only actual timeline packets should be in the trace
1291 EXPECT_EQ(packets.size(), 2u);
1292
1293 // Packet - 0 : ActualDisplayFrameStart
1294 const auto& packet0 = packets[0];
1295 ASSERT_TRUE(packet0.has_timestamp());
1296 EXPECT_EQ(packet0.timestamp(), 20u);
1297 ASSERT_TRUE(packet0.has_frame_timeline_event());
1298
1299 const auto& event0 = packet0.frame_timeline_event();
1300 ASSERT_TRUE(event0.has_actual_display_frame_start());
1301 const auto& actualDisplayFrameStart = event0.actual_display_frame_start();
1302 validateTraceEvent(actualDisplayFrameStart, protoActualDisplayFrameStart);
1303
1304 // Packet - 1 : FrameEnd (ActualDisplayFrame)
1305 const auto& packet1 = packets[1];
1306 ASSERT_TRUE(packet1.has_timestamp());
Adithya Srinivasan1a971632021-02-26 23:10:29 +00001307 EXPECT_EQ(packet1.timestamp(), 31u);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001308 ASSERT_TRUE(packet1.has_frame_timeline_event());
1309
1310 const auto& event1 = packet1.frame_timeline_event();
1311 ASSERT_TRUE(event1.has_frame_end());
1312 const auto& actualDisplayFrameEnd = event1.frame_end();
1313 validateTraceEvent(actualDisplayFrameEnd, protoActualDisplayFrameEnd);
1314}
1315
Adithya Srinivasan01189672020-10-20 14:23:05 -07001316TEST_F(FrameTimelineTest, traceSurfaceFrame_emitsValidTracePacket) {
1317 auto tracingSession = getTracingSessionForTest();
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001318 // Layer specific increment
Edgar Arriaga631e4252023-03-02 02:11:24 +00001319 EXPECT_CALL(*mTimeStats, incrementJankyFrames(_)).Times(2);
Adithya Srinivasan01189672020-10-20 14:23:05 -07001320 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
1321 auto presentFence2 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
1322
1323 tracingSession->StartBlocking();
1324 int64_t surfaceFrameToken = mTokenManager->generateTokenForPredictions({10, 25, 40});
1325 int64_t displayFrameToken1 = mTokenManager->generateTokenForPredictions({30, 35, 40});
Adithya Srinivasan01189672020-10-20 14:23:05 -07001326
Huihong Luo3bdef862022-03-03 11:57:19 -08001327 FrameTimelineInfo ftInfo;
1328 ftInfo.vsyncId = surfaceFrameToken;
1329 ftInfo.inputEventId = sInputEventId;
1330
Adithya Srinivasan01189672020-10-20 14:23:05 -07001331 auto surfaceFrame1 =
Huihong Luo3bdef862022-03-03 11:57:19 -08001332 mFrameTimeline->createSurfaceFrameForToken(ftInfo, sPidOne, sUidOne, sLayerIdOne,
1333 sLayerNameOne, sLayerNameOne,
1334 /*isBuffer*/ true, sGameMode);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001335 auto surfaceFrame2 =
Huihong Luo3bdef862022-03-03 11:57:19 -08001336 mFrameTimeline->createSurfaceFrameForToken(ftInfo, sPidOne, sUidOne, sLayerIdOne,
1337 sLayerNameOne, sLayerNameOne,
1338 /*isBuffer*/ true, sGameMode);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001339 surfaceFrame1->setActualQueueTime(10);
1340 surfaceFrame1->setDropTime(15);
1341
1342 surfaceFrame2->setActualQueueTime(15);
1343 surfaceFrame2->setAcquireFenceTime(20);
Adithya Srinivasan01189672020-10-20 14:23:05 -07001344
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001345 // First 2 cookies will be used by the DisplayFrame
1346 int64_t traceCookie = snoopCurrentTraceCookie() + 2;
1347
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001348 auto protoDroppedSurfaceFrameExpectedStart =
1349 createProtoExpectedSurfaceFrameStart(traceCookie + 1, surfaceFrameToken,
1350 displayFrameToken1, sPidOne, sLayerNameOne);
1351 auto protoDroppedSurfaceFrameExpectedEnd = createProtoFrameEnd(traceCookie + 1);
1352 auto protoDroppedSurfaceFrameActualStart =
1353 createProtoActualSurfaceFrameStart(traceCookie + 2, surfaceFrameToken,
1354 displayFrameToken1, sPidOne, sLayerNameOne,
Edgar Arriaga631e4252023-03-02 02:11:24 +00001355 FrameTimelineEvent::PRESENT_DROPPED, true, false,
1356 FrameTimelineEvent::JANK_DROPPED,
Ying Wei96eb5352023-11-21 17:37:21 +00001357 FrameTimelineEvent::SEVERITY_UNKNOWN,
Adithya Srinivasan1f9450c2021-06-10 22:39:19 +00001358 FrameTimelineEvent::PREDICTION_VALID, true);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001359 auto protoDroppedSurfaceFrameActualEnd = createProtoFrameEnd(traceCookie + 2);
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001360
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001361 auto protoPresentedSurfaceFrameExpectedStart =
1362 createProtoExpectedSurfaceFrameStart(traceCookie + 3, surfaceFrameToken,
1363 displayFrameToken1, sPidOne, sLayerNameOne);
1364 auto protoPresentedSurfaceFrameExpectedEnd = createProtoFrameEnd(traceCookie + 3);
1365 auto protoPresentedSurfaceFrameActualStart =
1366 createProtoActualSurfaceFrameStart(traceCookie + 4, surfaceFrameToken,
1367 displayFrameToken1, sPidOne, sLayerNameOne,
1368 FrameTimelineEvent::PRESENT_ON_TIME, true, false,
Adithya Srinivasan78e58af2021-02-25 00:08:08 +00001369 FrameTimelineEvent::JANK_NONE,
Ying Wei96eb5352023-11-21 17:37:21 +00001370 FrameTimelineEvent::SEVERITY_NONE,
Adithya Srinivasan1f9450c2021-06-10 22:39:19 +00001371 FrameTimelineEvent::PREDICTION_VALID, true);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001372 auto protoPresentedSurfaceFrameActualEnd = createProtoFrameEnd(traceCookie + 4);
Adithya Srinivasan01189672020-10-20 14:23:05 -07001373
1374 // Set up the display frame
Pascal Muetschardac7bcd92023-10-03 15:05:36 +02001375 mFrameTimeline->setSfWakeUp(displayFrameToken1, 20, RR_11, RR_11);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001376 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Dropped);
1377 surfaceFrame2->setPresentState(SurfaceFrame::PresentState::Presented);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001378 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001379 mFrameTimeline->addSurfaceFrame(surfaceFrame2);
Adithya Srinivasan01189672020-10-20 14:23:05 -07001380 mFrameTimeline->setSfPresent(26, presentFence1);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001381 presentFence1->signalForTest(40);
Adithya Srinivasan01189672020-10-20 14:23:05 -07001382
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001383 addEmptyDisplayFrame();
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001384 flushTrace();
Adithya Srinivasan01189672020-10-20 14:23:05 -07001385 tracingSession->StopBlocking();
1386
1387 auto packets = readFrameTimelinePacketsBlocking(tracingSession.get());
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001388 // 4 DisplayFrame + 4 DroppedSurfaceFrame + 4 PresentedSurfaceFrame
1389 EXPECT_EQ(packets.size(), 12u);
Adithya Srinivasan01189672020-10-20 14:23:05 -07001390
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001391 // Packet - 4 : ExpectedSurfaceFrameStart1
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001392 const auto& packet4 = packets[4];
1393 ASSERT_TRUE(packet4.has_timestamp());
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001394 EXPECT_EQ(packet4.timestamp(), 10u);
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001395 ASSERT_TRUE(packet4.has_frame_timeline_event());
Adithya Srinivasan01189672020-10-20 14:23:05 -07001396
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001397 const auto& event4 = packet4.frame_timeline_event();
1398 ASSERT_TRUE(event4.has_expected_surface_frame_start());
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001399 const auto& expectedSurfaceFrameStart1 = event4.expected_surface_frame_start();
1400 validateTraceEvent(expectedSurfaceFrameStart1, protoDroppedSurfaceFrameExpectedStart);
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001401
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001402 // Packet - 5 : FrameEnd (ExpectedSurfaceFrame1)
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001403 const auto& packet5 = packets[5];
1404 ASSERT_TRUE(packet5.has_timestamp());
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001405 EXPECT_EQ(packet5.timestamp(), 25u);
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001406 ASSERT_TRUE(packet5.has_frame_timeline_event());
1407
1408 const auto& event5 = packet5.frame_timeline_event();
1409 ASSERT_TRUE(event5.has_frame_end());
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001410 const auto& expectedSurfaceFrameEnd1 = event5.frame_end();
1411 validateTraceEvent(expectedSurfaceFrameEnd1, protoDroppedSurfaceFrameExpectedEnd);
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001412
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001413 // Packet - 6 : ActualSurfaceFrameStart1
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001414 const auto& packet6 = packets[6];
1415 ASSERT_TRUE(packet6.has_timestamp());
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -10001416 EXPECT_EQ(packet6.timestamp(), 10u);
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001417 ASSERT_TRUE(packet6.has_frame_timeline_event());
1418
1419 const auto& event6 = packet6.frame_timeline_event();
1420 ASSERT_TRUE(event6.has_actual_surface_frame_start());
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001421 const auto& actualSurfaceFrameStart1 = event6.actual_surface_frame_start();
1422 validateTraceEvent(actualSurfaceFrameStart1, protoDroppedSurfaceFrameActualStart);
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001423
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001424 // Packet - 7 : FrameEnd (ActualSurfaceFrame1)
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001425 const auto& packet7 = packets[7];
1426 ASSERT_TRUE(packet7.has_timestamp());
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001427 EXPECT_EQ(packet7.timestamp(), 15u);
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001428 ASSERT_TRUE(packet7.has_frame_timeline_event());
1429
1430 const auto& event7 = packet7.frame_timeline_event();
1431 ASSERT_TRUE(event7.has_frame_end());
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001432 const auto& actualSurfaceFrameEnd1 = event7.frame_end();
1433 validateTraceEvent(actualSurfaceFrameEnd1, protoDroppedSurfaceFrameActualEnd);
1434
1435 // Packet - 8 : ExpectedSurfaceFrameStart2
1436 const auto& packet8 = packets[8];
1437 ASSERT_TRUE(packet8.has_timestamp());
1438 EXPECT_EQ(packet8.timestamp(), 10u);
1439 ASSERT_TRUE(packet8.has_frame_timeline_event());
1440
1441 const auto& event8 = packet8.frame_timeline_event();
1442 ASSERT_TRUE(event8.has_expected_surface_frame_start());
1443 const auto& expectedSurfaceFrameStart2 = event8.expected_surface_frame_start();
1444 validateTraceEvent(expectedSurfaceFrameStart2, protoPresentedSurfaceFrameExpectedStart);
1445
1446 // Packet - 9 : FrameEnd (ExpectedSurfaceFrame2)
1447 const auto& packet9 = packets[9];
1448 ASSERT_TRUE(packet9.has_timestamp());
1449 EXPECT_EQ(packet9.timestamp(), 25u);
1450 ASSERT_TRUE(packet9.has_frame_timeline_event());
1451
1452 const auto& event9 = packet9.frame_timeline_event();
1453 ASSERT_TRUE(event9.has_frame_end());
1454 const auto& expectedSurfaceFrameEnd2 = event9.frame_end();
1455 validateTraceEvent(expectedSurfaceFrameEnd2, protoPresentedSurfaceFrameExpectedEnd);
1456
1457 // Packet - 10 : ActualSurfaceFrameStart2
1458 const auto& packet10 = packets[10];
1459 ASSERT_TRUE(packet10.has_timestamp());
1460 EXPECT_EQ(packet10.timestamp(), 10u);
1461 ASSERT_TRUE(packet10.has_frame_timeline_event());
1462
1463 const auto& event10 = packet10.frame_timeline_event();
1464 ASSERT_TRUE(event10.has_actual_surface_frame_start());
1465 const auto& actualSurfaceFrameStart2 = event10.actual_surface_frame_start();
1466 validateTraceEvent(actualSurfaceFrameStart2, protoPresentedSurfaceFrameActualStart);
1467
1468 // Packet - 11 : FrameEnd (ActualSurfaceFrame2)
1469 const auto& packet11 = packets[11];
1470 ASSERT_TRUE(packet11.has_timestamp());
1471 EXPECT_EQ(packet11.timestamp(), 20u);
1472 ASSERT_TRUE(packet11.has_frame_timeline_event());
1473
1474 const auto& event11 = packet11.frame_timeline_event();
1475 ASSERT_TRUE(event11.has_frame_end());
1476 const auto& actualSurfaceFrameEnd2 = event11.frame_end();
1477 validateTraceEvent(actualSurfaceFrameEnd2, protoPresentedSurfaceFrameActualEnd);
1478}
1479
Ady Abrahame43ff722022-02-15 14:44:25 -08001480TEST_F(FrameTimelineTest, traceSurfaceFrame_predictionExpiredIsAppMissedDeadline) {
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001481 auto tracingSession = getTracingSessionForTest();
1482 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
1483
1484 tracingSession->StartBlocking();
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001485 constexpr nsecs_t appStartTime = std::chrono::nanoseconds(10ms).count();
1486 constexpr nsecs_t appEndTime = std::chrono::nanoseconds(20ms).count();
1487 constexpr nsecs_t appPresentTime = std::chrono::nanoseconds(30ms).count();
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001488 int64_t surfaceFrameToken =
1489 mTokenManager->generateTokenForPredictions({appStartTime, appEndTime, appPresentTime});
1490
1491 // Flush the token so that it would expire
Adithya Srinivasanbed4c4f2021-05-03 20:24:46 +00001492 flushTokens();
Huihong Luo3bdef862022-03-03 11:57:19 -08001493 FrameTimelineInfo ftInfo;
1494 ftInfo.vsyncId = surfaceFrameToken;
1495 ftInfo.inputEventId = 0;
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001496 auto surfaceFrame1 =
Huihong Luo3bdef862022-03-03 11:57:19 -08001497 mFrameTimeline->createSurfaceFrameForToken(ftInfo, sPidOne, sUidOne, sLayerIdOne,
1498 sLayerNameOne, sLayerNameOne,
1499 /*isBuffer*/ true, sGameMode);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001500 surfaceFrame1->setActualQueueTime(appEndTime);
1501 surfaceFrame1->setAcquireFenceTime(appEndTime);
1502
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001503 constexpr nsecs_t sfStartTime = std::chrono::nanoseconds(20ms).count();
1504 constexpr nsecs_t sfEndTime = std::chrono::nanoseconds(30ms).count();
1505 constexpr nsecs_t sfPresentTime = std::chrono::nanoseconds(30ms).count();
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001506 int64_t displayFrameToken =
1507 mTokenManager->generateTokenForPredictions({sfStartTime, sfEndTime, sfPresentTime});
1508
1509 // First 2 cookies will be used by the DisplayFrame
1510 int64_t traceCookie = snoopCurrentTraceCookie() + 2;
1511
1512 auto protoActualSurfaceFrameStart =
1513 createProtoActualSurfaceFrameStart(traceCookie + 1, surfaceFrameToken,
1514 displayFrameToken, sPidOne, sLayerNameOne,
1515 FrameTimelineEvent::PRESENT_UNSPECIFIED, false,
Ady Abrahame43ff722022-02-15 14:44:25 -08001516 false, FrameTimelineEvent::JANK_APP_DEADLINE_MISSED,
Ying Wei96eb5352023-11-21 17:37:21 +00001517 FrameTimelineEvent::SEVERITY_UNKNOWN,
Adithya Srinivasan1f9450c2021-06-10 22:39:19 +00001518 FrameTimelineEvent::PREDICTION_EXPIRED, true);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001519 auto protoActualSurfaceFrameEnd = createProtoFrameEnd(traceCookie + 1);
1520
1521 // Set up the display frame
Pascal Muetschardac7bcd92023-10-03 15:05:36 +02001522 mFrameTimeline->setSfWakeUp(displayFrameToken, sfStartTime, RR_11, RR_11);
Adithya Srinivasan061c14c2021-02-11 01:19:47 +00001523 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
1524 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
1525 mFrameTimeline->setSfPresent(sfEndTime, presentFence1);
1526 presentFence1->signalForTest(sfPresentTime);
1527
1528 addEmptyDisplayFrame();
1529 flushTrace();
1530 tracingSession->StopBlocking();
1531
1532 auto packets = readFrameTimelinePacketsBlocking(tracingSession.get());
1533 // Display Frame 4 packets + SurfaceFrame 2 packets
1534 ASSERT_EQ(packets.size(), 6u);
1535
1536 // Packet - 4 : ActualSurfaceFrameStart
1537 const auto& packet4 = packets[4];
1538 ASSERT_TRUE(packet4.has_timestamp());
1539 EXPECT_EQ(packet4.timestamp(),
1540 static_cast<uint64_t>(appEndTime - SurfaceFrame::kPredictionExpiredStartTimeDelta));
1541 ASSERT_TRUE(packet4.has_frame_timeline_event());
1542
1543 const auto& event4 = packet4.frame_timeline_event();
1544 ASSERT_TRUE(event4.has_actual_surface_frame_start());
1545 const auto& actualSurfaceFrameStart = event4.actual_surface_frame_start();
1546 validateTraceEvent(actualSurfaceFrameStart, protoActualSurfaceFrameStart);
1547
1548 // Packet - 5 : FrameEnd (ActualSurfaceFrame)
1549 const auto& packet5 = packets[5];
1550 ASSERT_TRUE(packet5.has_timestamp());
1551 EXPECT_EQ(packet5.timestamp(), static_cast<uint64_t>(appEndTime));
1552 ASSERT_TRUE(packet5.has_frame_timeline_event());
1553
1554 const auto& event5 = packet5.frame_timeline_event();
1555 ASSERT_TRUE(event5.has_frame_end());
1556 const auto& actualSurfaceFrameEnd = event5.frame_end();
Adithya Srinivasan05bd2d12021-01-11 18:49:58 +00001557 validateTraceEvent(actualSurfaceFrameEnd, protoActualSurfaceFrameEnd);
Adithya Srinivasan01189672020-10-20 14:23:05 -07001558}
1559
Adithya Srinivasanb2283c32021-04-21 21:31:56 +00001560TEST_F(FrameTimelineTest, traceSurfaceFrame_predictionExpiredDroppedFramesTracedProperly) {
1561 auto tracingSession = getTracingSessionForTest();
1562 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
1563
1564 tracingSession->StartBlocking();
1565 constexpr nsecs_t appStartTime = std::chrono::nanoseconds(10ms).count();
1566 constexpr nsecs_t appEndTime = std::chrono::nanoseconds(20ms).count();
1567 constexpr nsecs_t appPresentTime = std::chrono::nanoseconds(30ms).count();
1568 int64_t surfaceFrameToken =
1569 mTokenManager->generateTokenForPredictions({appStartTime, appEndTime, appPresentTime});
1570
1571 // Flush the token so that it would expire
Adithya Srinivasanbed4c4f2021-05-03 20:24:46 +00001572 flushTokens();
Huihong Luo3bdef862022-03-03 11:57:19 -08001573 FrameTimelineInfo ftInfo;
1574 ftInfo.vsyncId = surfaceFrameToken;
1575 ftInfo.inputEventId = 0;
Adithya Srinivasanb2283c32021-04-21 21:31:56 +00001576 auto surfaceFrame1 =
Huihong Luo3bdef862022-03-03 11:57:19 -08001577 mFrameTimeline->createSurfaceFrameForToken(ftInfo, sPidOne, sUidOne, sLayerIdOne,
1578 sLayerNameOne, sLayerNameOne,
1579 /*isBuffer*/ true, sGameMode);
Adithya Srinivasanb2283c32021-04-21 21:31:56 +00001580
1581 constexpr nsecs_t sfStartTime = std::chrono::nanoseconds(22ms).count();
1582 constexpr nsecs_t sfEndTime = std::chrono::nanoseconds(30ms).count();
1583 constexpr nsecs_t sfPresentTime = std::chrono::nanoseconds(30ms).count();
1584 int64_t displayFrameToken =
1585 mTokenManager->generateTokenForPredictions({sfStartTime, sfEndTime, sfPresentTime});
1586
1587 // First 2 cookies will be used by the DisplayFrame
1588 int64_t traceCookie = snoopCurrentTraceCookie() + 2;
1589
1590 auto protoActualSurfaceFrameStart =
1591 createProtoActualSurfaceFrameStart(traceCookie + 1, surfaceFrameToken,
1592 displayFrameToken, sPidOne, sLayerNameOne,
1593 FrameTimelineEvent::PRESENT_DROPPED, false, false,
Edgar Arriaga631e4252023-03-02 02:11:24 +00001594 FrameTimelineEvent::JANK_DROPPED,
Ying Wei96eb5352023-11-21 17:37:21 +00001595 FrameTimelineEvent::SEVERITY_UNKNOWN,
Adithya Srinivasan1f9450c2021-06-10 22:39:19 +00001596 FrameTimelineEvent::PREDICTION_EXPIRED, true);
Adithya Srinivasanb2283c32021-04-21 21:31:56 +00001597 auto protoActualSurfaceFrameEnd = createProtoFrameEnd(traceCookie + 1);
1598
1599 // Set up the display frame
Pascal Muetschardac7bcd92023-10-03 15:05:36 +02001600 mFrameTimeline->setSfWakeUp(displayFrameToken, sfStartTime, RR_11, RR_11);
Adithya Srinivasanb2283c32021-04-21 21:31:56 +00001601 surfaceFrame1->setDropTime(sfStartTime);
1602 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Dropped);
1603 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
1604 mFrameTimeline->setSfPresent(sfEndTime, presentFence1);
1605 presentFence1->signalForTest(sfPresentTime);
1606
1607 addEmptyDisplayFrame();
1608 flushTrace();
1609 tracingSession->StopBlocking();
1610
1611 auto packets = readFrameTimelinePacketsBlocking(tracingSession.get());
1612 // Display Frame 4 packets + SurfaceFrame 2 packets
1613 ASSERT_EQ(packets.size(), 6u);
1614
1615 // Packet - 4 : ActualSurfaceFrameStart
1616 const auto& packet4 = packets[4];
1617 ASSERT_TRUE(packet4.has_timestamp());
1618 EXPECT_EQ(packet4.timestamp(),
1619 static_cast<uint64_t>(sfStartTime - SurfaceFrame::kPredictionExpiredStartTimeDelta));
1620 ASSERT_TRUE(packet4.has_frame_timeline_event());
1621
1622 const auto& event4 = packet4.frame_timeline_event();
1623 ASSERT_TRUE(event4.has_actual_surface_frame_start());
1624 const auto& actualSurfaceFrameStart = event4.actual_surface_frame_start();
1625 validateTraceEvent(actualSurfaceFrameStart, protoActualSurfaceFrameStart);
1626
1627 // Packet - 5 : FrameEnd (ActualSurfaceFrame)
1628 const auto& packet5 = packets[5];
1629 ASSERT_TRUE(packet5.has_timestamp());
1630 EXPECT_EQ(packet5.timestamp(), static_cast<uint64_t>(sfStartTime));
1631 ASSERT_TRUE(packet5.has_frame_timeline_event());
1632
1633 const auto& event5 = packet5.frame_timeline_event();
1634 ASSERT_TRUE(event5.has_frame_end());
1635 const auto& actualSurfaceFrameEnd = event5.frame_end();
1636 validateTraceEvent(actualSurfaceFrameEnd, protoActualSurfaceFrameEnd);
1637}
1638
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001639// Tests for Jank classification
1640TEST_F(FrameTimelineTest, jankClassification_presentOnTimeDoesNotClassify) {
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001641 // Layer specific increment
Alec Mouri363faf02021-01-29 16:34:55 -08001642 EXPECT_CALL(*mTimeStats, incrementJankyFrames(_));
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001643 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
1644 int64_t surfaceFrameToken = mTokenManager->generateTokenForPredictions({10, 20, 30});
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001645 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({22, 30, 30});
Huihong Luo3bdef862022-03-03 11:57:19 -08001646 FrameTimelineInfo ftInfo;
1647 ftInfo.vsyncId = surfaceFrameToken;
1648 ftInfo.inputEventId = sInputEventId;
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001649 auto surfaceFrame =
Huihong Luo3bdef862022-03-03 11:57:19 -08001650 mFrameTimeline->createSurfaceFrameForToken(ftInfo, sPidOne, sUidOne, sLayerIdOne,
1651 sLayerNameOne, sLayerNameOne,
1652 /*isBuffer*/ true, sGameMode);
Pascal Muetschardac7bcd92023-10-03 15:05:36 +02001653 mFrameTimeline->setSfWakeUp(sfToken1, 22, RR_11, RR_11);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001654 surfaceFrame->setPresentState(SurfaceFrame::PresentState::Presented);
1655 mFrameTimeline->addSurfaceFrame(surfaceFrame);
1656 mFrameTimeline->setSfPresent(26, presentFence1);
1657 auto displayFrame = getDisplayFrame(0);
1658 auto& presentedSurfaceFrame = getSurfaceFrame(0, 0);
1659 presentFence1->signalForTest(29);
1660
1661 // Fences haven't been flushed yet, so it should be 0
1662 EXPECT_EQ(displayFrame->getActuals().presentTime, 0);
1663 EXPECT_EQ(presentedSurfaceFrame.getActuals().presentTime, 0);
1664
1665 addEmptyDisplayFrame();
1666 displayFrame = getDisplayFrame(0);
1667
1668 // Fences have flushed, so the present timestamps should be updated
1669 EXPECT_EQ(displayFrame->getActuals().presentTime, 29);
1670 EXPECT_EQ(presentedSurfaceFrame.getActuals().presentTime, 29);
1671 EXPECT_EQ(displayFrame->getFramePresentMetadata(), FramePresentMetadata::OnTimePresent);
1672 EXPECT_EQ(displayFrame->getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
1673 EXPECT_EQ(displayFrame->getJankType(), JankType::None);
Ying Wei96eb5352023-11-21 17:37:21 +00001674 EXPECT_EQ(displayFrame->getJankSeverityType(), JankSeverityType::None);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001675}
1676
1677TEST_F(FrameTimelineTest, jankClassification_displayFrameOnTimeFinishEarlyPresent) {
Pascal Muetschardac7bcd92023-10-03 15:05:36 +02001678 Fps vsyncRate = RR_11;
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001679 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001680 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({22, 30, 40});
1681 int64_t sfToken2 = mTokenManager->generateTokenForPredictions({52, 60, 70});
Pascal Muetschardac7bcd92023-10-03 15:05:36 +02001682 mFrameTimeline->setSfWakeUp(sfToken1, 22, vsyncRate, vsyncRate);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001683 mFrameTimeline->setSfPresent(26, presentFence1);
1684 auto displayFrame = getDisplayFrame(0);
1685 presentFence1->signalForTest(30);
1686
1687 // Fences for the first frame haven't been flushed yet, so it should be 0
1688 EXPECT_EQ(displayFrame->getActuals().presentTime, 0);
1689
1690 // Trigger a flush by finalizing the next DisplayFrame
1691 auto presentFence2 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Pascal Muetschardac7bcd92023-10-03 15:05:36 +02001692 mFrameTimeline->setSfWakeUp(sfToken2, 52, vsyncRate, vsyncRate);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001693 mFrameTimeline->setSfPresent(56, presentFence2);
1694 displayFrame = getDisplayFrame(0);
1695
1696 // Fences for the first frame have flushed, so the present timestamps should be updated
1697 EXPECT_EQ(displayFrame->getActuals().presentTime, 30);
1698 EXPECT_EQ(displayFrame->getFramePresentMetadata(), FramePresentMetadata::EarlyPresent);
1699 EXPECT_EQ(displayFrame->getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
1700 EXPECT_EQ(displayFrame->getJankType(), JankType::SurfaceFlingerScheduling);
Ying Wei96eb5352023-11-21 17:37:21 +00001701 EXPECT_EQ(displayFrame->getJankSeverityType(), JankSeverityType::Partial);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001702
1703 // Fences for the second frame haven't been flushed yet, so it should be 0
1704 auto displayFrame2 = getDisplayFrame(1);
1705 presentFence2->signalForTest(65);
1706 EXPECT_EQ(displayFrame2->getActuals().presentTime, 0);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001707 addEmptyDisplayFrame();
1708 displayFrame2 = getDisplayFrame(1);
1709
1710 // Fences for the second frame have flushed, so the present timestamps should be updated
1711 EXPECT_EQ(displayFrame2->getActuals().presentTime, 65);
1712 EXPECT_EQ(displayFrame2->getFramePresentMetadata(), FramePresentMetadata::EarlyPresent);
1713 EXPECT_EQ(displayFrame2->getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
1714 EXPECT_EQ(displayFrame2->getJankType(), JankType::PredictionError);
Ying Wei96eb5352023-11-21 17:37:21 +00001715 EXPECT_EQ(displayFrame->getJankSeverityType(), JankSeverityType::Partial);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001716}
1717
1718TEST_F(FrameTimelineTest, jankClassification_displayFrameOnTimeFinishLatePresent) {
Pascal Muetschardac7bcd92023-10-03 15:05:36 +02001719 Fps vsyncRate = RR_11;
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001720 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001721 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({22, 30, 40});
1722 int64_t sfToken2 = mTokenManager->generateTokenForPredictions({52, 60, 70});
Pascal Muetschardac7bcd92023-10-03 15:05:36 +02001723 mFrameTimeline->setSfWakeUp(sfToken1, 22, vsyncRate, vsyncRate);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001724 mFrameTimeline->setSfPresent(26, presentFence1);
1725 auto displayFrame = getDisplayFrame(0);
1726 presentFence1->signalForTest(50);
1727
1728 // Fences for the first frame haven't been flushed yet, so it should be 0
1729 EXPECT_EQ(displayFrame->getActuals().presentTime, 0);
1730
1731 // Trigger a flush by finalizing the next DisplayFrame
1732 auto presentFence2 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Pascal Muetschardac7bcd92023-10-03 15:05:36 +02001733 mFrameTimeline->setSfWakeUp(sfToken2, 52, vsyncRate, vsyncRate);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001734 mFrameTimeline->setSfPresent(56, presentFence2);
1735 displayFrame = getDisplayFrame(0);
1736
1737 // Fences for the first frame have flushed, so the present timestamps should be updated
1738 EXPECT_EQ(displayFrame->getActuals().presentTime, 50);
1739 EXPECT_EQ(displayFrame->getFramePresentMetadata(), FramePresentMetadata::LatePresent);
1740 EXPECT_EQ(displayFrame->getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
1741 EXPECT_EQ(displayFrame->getJankType(), JankType::DisplayHAL);
Ying Wei96eb5352023-11-21 17:37:21 +00001742 EXPECT_EQ(displayFrame->getJankSeverityType(), JankSeverityType::Partial);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001743
1744 // Fences for the second frame haven't been flushed yet, so it should be 0
1745 auto displayFrame2 = getDisplayFrame(1);
1746 presentFence2->signalForTest(75);
1747 EXPECT_EQ(displayFrame2->getActuals().presentTime, 0);
1748
1749 addEmptyDisplayFrame();
1750 displayFrame2 = getDisplayFrame(1);
1751
1752 // Fences for the second frame have flushed, so the present timestamps should be updated
1753 EXPECT_EQ(displayFrame2->getActuals().presentTime, 75);
1754 EXPECT_EQ(displayFrame2->getFramePresentMetadata(), FramePresentMetadata::LatePresent);
1755 EXPECT_EQ(displayFrame2->getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
1756 EXPECT_EQ(displayFrame2->getJankType(), JankType::PredictionError);
Ying Wei96eb5352023-11-21 17:37:21 +00001757 EXPECT_EQ(displayFrame->getJankSeverityType(), JankSeverityType::Partial);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001758}
1759
1760TEST_F(FrameTimelineTest, jankClassification_displayFrameLateFinishEarlyPresent) {
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001761 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
1762 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({12, 18, 40});
Pascal Muetschardac7bcd92023-10-03 15:05:36 +02001763 mFrameTimeline->setSfWakeUp(sfToken1, 12, RR_11, RR_11);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001764
1765 mFrameTimeline->setSfPresent(22, presentFence1);
1766 auto displayFrame = getDisplayFrame(0);
1767 presentFence1->signalForTest(28);
1768
1769 // Fences haven't been flushed yet, so it should be 0
1770 EXPECT_EQ(displayFrame->getActuals().presentTime, 0);
1771
1772 addEmptyDisplayFrame();
1773 displayFrame = getDisplayFrame(0);
1774
1775 // Fences have flushed, so the present timestamps should be updated
1776 EXPECT_EQ(displayFrame->getActuals().presentTime, 28);
1777 EXPECT_EQ(displayFrame->getFramePresentMetadata(), FramePresentMetadata::EarlyPresent);
1778 EXPECT_EQ(displayFrame->getFrameReadyMetadata(), FrameReadyMetadata::LateFinish);
1779 EXPECT_EQ(displayFrame->getJankType(), JankType::SurfaceFlingerScheduling);
Ying Wei96eb5352023-11-21 17:37:21 +00001780 EXPECT_EQ(displayFrame->getJankSeverityType(), JankSeverityType::Full);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001781}
1782
1783TEST_F(FrameTimelineTest, jankClassification_displayFrameLateFinishLatePresent) {
Adithya Srinivasan36b01af2021-04-07 22:29:47 +00001784 /*
1785 * Case 1 - cpu time > vsync period but combined time > deadline > deadline -> cpudeadlinemissed
1786 * Case 2 - cpu time < vsync period but combined time > deadline -> gpudeadlinemissed
Adithya Srinivasan57dc81d2021-04-14 17:31:41 +00001787 * Case 3 - previous frame ran longer -> sf_stuffing
1788 * Case 4 - Long cpu under SF stuffing -> cpudeadlinemissed
Adithya Srinivasan36b01af2021-04-07 22:29:47 +00001789 */
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001790 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan36b01af2021-04-07 22:29:47 +00001791 auto presentFence2 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan57dc81d2021-04-14 17:31:41 +00001792 auto presentFence3 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
1793 auto presentFence4 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan36b01af2021-04-07 22:29:47 +00001794 auto gpuFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
1795 auto gpuFence2 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan57dc81d2021-04-14 17:31:41 +00001796 auto gpuFence3 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
1797 auto gpuFence4 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001798 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({22, 26, 40});
Adithya Srinivasan36b01af2021-04-07 22:29:47 +00001799 int64_t sfToken2 = mTokenManager->generateTokenForPredictions({52, 60, 60});
Adithya Srinivasan57dc81d2021-04-14 17:31:41 +00001800 int64_t sfToken3 = mTokenManager->generateTokenForPredictions({82, 90, 90});
1801 int64_t sfToken4 = mTokenManager->generateTokenForPredictions({112, 120, 120});
1802
Adithya Srinivasan36b01af2021-04-07 22:29:47 +00001803 // case 1 - cpu time = 33 - 12 = 21, vsync period = 11
Pascal Muetschardac7bcd92023-10-03 15:05:36 +02001804 mFrameTimeline->setSfWakeUp(sfToken1, 12, RR_11, RR_11);
Adithya Srinivasan36b01af2021-04-07 22:29:47 +00001805 mFrameTimeline->setSfPresent(33, presentFence1, gpuFence1);
1806 auto displayFrame0 = getDisplayFrame(0);
1807 gpuFence1->signalForTest(36);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001808 presentFence1->signalForTest(52);
1809
1810 // Fences haven't been flushed yet, so it should be 0
Adithya Srinivasan36b01af2021-04-07 22:29:47 +00001811 EXPECT_EQ(displayFrame0->getActuals().presentTime, 0);
1812
Adithya Srinivasan57dc81d2021-04-14 17:31:41 +00001813 // case 2 - cpu time = 56 - 52 = 4, vsync period = 30
Pascal Muetschardac7bcd92023-10-03 15:05:36 +02001814 mFrameTimeline->setSfWakeUp(sfToken2, 52, RR_30, RR_30);
Adithya Srinivasan36b01af2021-04-07 22:29:47 +00001815 mFrameTimeline->setSfPresent(56, presentFence2, gpuFence2);
1816 auto displayFrame1 = getDisplayFrame(1);
Adithya Srinivasan57dc81d2021-04-14 17:31:41 +00001817 gpuFence2->signalForTest(76);
1818 presentFence2->signalForTest(90);
Adithya Srinivasan36b01af2021-04-07 22:29:47 +00001819
1820 EXPECT_EQ(displayFrame1->getActuals().presentTime, 0);
1821 // Fences have flushed for first displayFrame, so the present timestamps should be updated
1822 EXPECT_EQ(displayFrame0->getActuals().presentTime, 52);
1823 EXPECT_EQ(displayFrame0->getFramePresentMetadata(), FramePresentMetadata::LatePresent);
1824 EXPECT_EQ(displayFrame0->getFrameReadyMetadata(), FrameReadyMetadata::LateFinish);
Rachel Lee94917b32022-03-18 17:52:09 -07001825 EXPECT_EQ(displayFrame0->getJankType(), JankType::SurfaceFlingerGpuDeadlineMissed);
Ying Wei96eb5352023-11-21 17:37:21 +00001826 EXPECT_EQ(displayFrame0->getJankSeverityType(), JankSeverityType::Full);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001827
Adithya Srinivasan57dc81d2021-04-14 17:31:41 +00001828 // case 3 - cpu time = 86 - 82 = 4, vsync period = 30
Pascal Muetschardac7bcd92023-10-03 15:05:36 +02001829 mFrameTimeline->setSfWakeUp(sfToken3, 106, RR_30, RR_30);
Adithya Srinivasan57dc81d2021-04-14 17:31:41 +00001830 mFrameTimeline->setSfPresent(112, presentFence3, gpuFence3);
1831 auto displayFrame2 = getDisplayFrame(2);
1832 gpuFence3->signalForTest(116);
1833 presentFence3->signalForTest(120);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001834
Adithya Srinivasan57dc81d2021-04-14 17:31:41 +00001835 EXPECT_EQ(displayFrame2->getActuals().presentTime, 0);
Adithya Srinivasan36b01af2021-04-07 22:29:47 +00001836 // Fences have flushed for second displayFrame, so the present timestamps should be updated
Adithya Srinivasan57dc81d2021-04-14 17:31:41 +00001837 EXPECT_EQ(displayFrame1->getActuals().presentTime, 90);
Adithya Srinivasan36b01af2021-04-07 22:29:47 +00001838 EXPECT_EQ(displayFrame1->getFramePresentMetadata(), FramePresentMetadata::LatePresent);
1839 EXPECT_EQ(displayFrame1->getFrameReadyMetadata(), FrameReadyMetadata::LateFinish);
1840 EXPECT_EQ(displayFrame1->getJankType(), JankType::SurfaceFlingerGpuDeadlineMissed);
Ying Wei96eb5352023-11-21 17:37:21 +00001841 EXPECT_EQ(displayFrame1->getJankSeverityType(), JankSeverityType::Full);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001842
Adithya Srinivasan57dc81d2021-04-14 17:31:41 +00001843 // case 4 - cpu time = 86 - 82 = 4, vsync period = 30
Pascal Muetschardac7bcd92023-10-03 15:05:36 +02001844 mFrameTimeline->setSfWakeUp(sfToken4, 120, RR_30, RR_30);
Adithya Srinivasan57dc81d2021-04-14 17:31:41 +00001845 mFrameTimeline->setSfPresent(140, presentFence4, gpuFence4);
1846 auto displayFrame3 = getDisplayFrame(3);
1847 gpuFence4->signalForTest(156);
1848 presentFence4->signalForTest(180);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001849
Adithya Srinivasan57dc81d2021-04-14 17:31:41 +00001850 EXPECT_EQ(displayFrame3->getActuals().presentTime, 0);
1851 // Fences have flushed for third displayFrame, so the present timestamps should be updated
1852 EXPECT_EQ(displayFrame2->getActuals().presentTime, 120);
1853 EXPECT_EQ(displayFrame2->getFramePresentMetadata(), FramePresentMetadata::LatePresent);
1854 EXPECT_EQ(displayFrame2->getFrameReadyMetadata(), FrameReadyMetadata::LateFinish);
1855 EXPECT_EQ(displayFrame2->getJankType(), JankType::SurfaceFlingerStuffing);
Ying Wei96eb5352023-11-21 17:37:21 +00001856 EXPECT_EQ(displayFrame2->getJankSeverityType(), JankSeverityType::Full);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001857
1858 addEmptyDisplayFrame();
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001859
Adithya Srinivasan57dc81d2021-04-14 17:31:41 +00001860 // Fences have flushed for third displayFrame, so the present timestamps should be updated
1861 EXPECT_EQ(displayFrame3->getActuals().presentTime, 180);
1862 EXPECT_EQ(displayFrame3->getFramePresentMetadata(), FramePresentMetadata::LatePresent);
1863 EXPECT_EQ(displayFrame3->getFrameReadyMetadata(), FrameReadyMetadata::LateFinish);
1864 EXPECT_EQ(displayFrame3->getJankType(), JankType::SurfaceFlingerGpuDeadlineMissed);
Ying Wei96eb5352023-11-21 17:37:21 +00001865 EXPECT_EQ(displayFrame3->getJankSeverityType(), JankSeverityType::Full);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001866}
1867
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001868TEST_F(FrameTimelineTest, jankClassification_surfaceFrameOnTimeFinishEarlyPresent) {
Alec Mouri363faf02021-01-29 16:34:55 -08001869 EXPECT_CALL(*mTimeStats, incrementJankyFrames(_));
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001870 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001871 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({22, 30, 40});
1872 int64_t sfToken2 = mTokenManager->generateTokenForPredictions({52, 60, 70});
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001873 int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions({5, 16, 40});
1874 int64_t surfaceFrameToken2 = mTokenManager->generateTokenForPredictions({25, 36, 70});
Huihong Luo3bdef862022-03-03 11:57:19 -08001875 FrameTimelineInfo ftInfo;
1876 ftInfo.vsyncId = surfaceFrameToken1;
1877 ftInfo.inputEventId = sInputEventId;
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001878 auto surfaceFrame1 =
Huihong Luo3bdef862022-03-03 11:57:19 -08001879 mFrameTimeline->createSurfaceFrameForToken(ftInfo, sPidOne, sUidOne, sLayerIdOne,
1880 sLayerNameOne, sLayerNameOne,
1881 /*isBuffer*/ true, sGameMode);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001882 surfaceFrame1->setAcquireFenceTime(16);
Pascal Muetschardac7bcd92023-10-03 15:05:36 +02001883 mFrameTimeline->setSfWakeUp(sfToken1, 22, RR_11, RR_11);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001884 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
1885 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001886 mFrameTimeline->setSfPresent(27, presentFence1);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001887 auto displayFrame1 = getDisplayFrame(0);
1888 auto& presentedSurfaceFrame1 = getSurfaceFrame(0, 0);
1889 presentFence1->signalForTest(30);
1890
1891 // Fences for the first frame haven't been flushed yet, so it should be 0
1892 EXPECT_EQ(displayFrame1->getActuals().presentTime, 0);
1893 auto actuals1 = presentedSurfaceFrame1.getActuals();
1894 EXPECT_EQ(actuals1.presentTime, 0);
1895
1896 // Trigger a flush by finalizing the next DisplayFrame
1897 auto presentFence2 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Huihong Luo3bdef862022-03-03 11:57:19 -08001898 FrameTimelineInfo ftInfo2;
1899 ftInfo2.vsyncId = surfaceFrameToken2;
1900 ftInfo2.inputEventId = sInputEventId;
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001901 auto surfaceFrame2 =
Huihong Luo3bdef862022-03-03 11:57:19 -08001902 mFrameTimeline->createSurfaceFrameForToken(ftInfo2, sPidOne, sUidOne, sLayerIdOne,
1903 sLayerNameOne, sLayerNameOne,
1904 /*isBuffer*/ true, sGameMode);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001905 surfaceFrame2->setAcquireFenceTime(36);
Pascal Muetschardac7bcd92023-10-03 15:05:36 +02001906 mFrameTimeline->setSfWakeUp(sfToken2, 52, RR_11, RR_11);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001907 surfaceFrame2->setPresentState(SurfaceFrame::PresentState::Presented);
1908 mFrameTimeline->addSurfaceFrame(surfaceFrame2);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001909 mFrameTimeline->setSfPresent(57, presentFence2);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001910 auto displayFrame2 = getDisplayFrame(1);
1911 auto& presentedSurfaceFrame2 = getSurfaceFrame(1, 0);
1912
1913 // Fences for the first frame have flushed, so the present timestamps should be updated
1914 EXPECT_EQ(displayFrame1->getActuals().presentTime, 30);
1915 EXPECT_EQ(displayFrame1->getFramePresentMetadata(), FramePresentMetadata::EarlyPresent);
1916 EXPECT_EQ(displayFrame1->getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
1917 EXPECT_EQ(displayFrame1->getJankType(), JankType::SurfaceFlingerScheduling);
Ying Wei96eb5352023-11-21 17:37:21 +00001918 EXPECT_EQ(displayFrame1->getJankSeverityType(), JankSeverityType::Partial);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001919
1920 actuals1 = presentedSurfaceFrame1.getActuals();
1921 EXPECT_EQ(actuals1.presentTime, 30);
1922 EXPECT_EQ(presentedSurfaceFrame1.getFramePresentMetadata(), FramePresentMetadata::EarlyPresent);
1923 EXPECT_EQ(presentedSurfaceFrame1.getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
1924 EXPECT_EQ(presentedSurfaceFrame1.getJankType(), JankType::SurfaceFlingerScheduling);
Ying Wei96eb5352023-11-21 17:37:21 +00001925 EXPECT_EQ(presentedSurfaceFrame1.getJankSeverityType(), JankSeverityType::Partial);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001926
1927 // Fences for the second frame haven't been flushed yet, so it should be 0
1928 presentFence2->signalForTest(65);
1929 EXPECT_EQ(displayFrame2->getActuals().presentTime, 0);
1930 auto actuals2 = presentedSurfaceFrame2.getActuals();
1931 EXPECT_EQ(actuals2.presentTime, 0);
1932
Alec Mouri363faf02021-01-29 16:34:55 -08001933 ::testing::Mock::VerifyAndClearExpectations(mTimeStats.get());
1934
1935 EXPECT_CALL(*mTimeStats,
Pascal Muetschardac7bcd92023-10-03 15:05:36 +02001936 incrementJankyFrames(TimeStats::JankyFramesInfo{RR_11, std::nullopt, sUidOne,
1937 sLayerNameOne, sGameMode,
1938 JankType::PredictionError, -3, 5,
1939 0}));
Alec Mouri363faf02021-01-29 16:34:55 -08001940
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001941 addEmptyDisplayFrame();
1942
1943 // Fences for the second frame have flushed, so the present timestamps should be updated
1944 EXPECT_EQ(displayFrame2->getActuals().presentTime, 65);
1945 EXPECT_EQ(displayFrame2->getFramePresentMetadata(), FramePresentMetadata::EarlyPresent);
1946 EXPECT_EQ(displayFrame2->getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
1947 EXPECT_EQ(displayFrame2->getJankType(), JankType::PredictionError);
Ying Wei96eb5352023-11-21 17:37:21 +00001948 EXPECT_EQ(displayFrame2->getJankSeverityType(), JankSeverityType::Partial);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001949
1950 actuals2 = presentedSurfaceFrame2.getActuals();
1951 EXPECT_EQ(actuals2.presentTime, 65);
1952 EXPECT_EQ(presentedSurfaceFrame2.getFramePresentMetadata(), FramePresentMetadata::EarlyPresent);
1953 EXPECT_EQ(presentedSurfaceFrame2.getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
1954 EXPECT_EQ(presentedSurfaceFrame2.getJankType(), JankType::PredictionError);
Ying Wei96eb5352023-11-21 17:37:21 +00001955 EXPECT_EQ(presentedSurfaceFrame2.getJankSeverityType(), JankSeverityType::Partial);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001956}
1957
1958TEST_F(FrameTimelineTest, jankClassification_surfaceFrameOnTimeFinishLatePresent) {
Alec Mouri363faf02021-01-29 16:34:55 -08001959 EXPECT_CALL(*mTimeStats, incrementJankyFrames(_));
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001960 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001961 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({22, 30, 40});
1962 int64_t sfToken2 = mTokenManager->generateTokenForPredictions({52, 60, 70});
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001963 int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions({5, 16, 40});
1964 int64_t surfaceFrameToken2 = mTokenManager->generateTokenForPredictions({25, 36, 70});
Huihong Luo3bdef862022-03-03 11:57:19 -08001965 FrameTimelineInfo ftInfo;
1966 ftInfo.vsyncId = surfaceFrameToken1;
1967 ftInfo.inputEventId = sInputEventId;
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001968 auto surfaceFrame1 =
Huihong Luo3bdef862022-03-03 11:57:19 -08001969 mFrameTimeline->createSurfaceFrameForToken(ftInfo, sPidOne, sUidOne, sLayerIdOne,
1970 sLayerNameOne, sLayerNameOne,
1971 /*isBuffer*/ true, sGameMode);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001972 surfaceFrame1->setAcquireFenceTime(16);
Pascal Muetschardac7bcd92023-10-03 15:05:36 +02001973 mFrameTimeline->setSfWakeUp(sfToken1, 22, RR_11, RR_11);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001974 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
1975 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
1976 mFrameTimeline->setSfPresent(26, presentFence1);
1977 auto displayFrame1 = getDisplayFrame(0);
1978 auto& presentedSurfaceFrame1 = getSurfaceFrame(0, 0);
1979 presentFence1->signalForTest(50);
1980
1981 // Fences for the first frame haven't been flushed yet, so it should be 0
1982 EXPECT_EQ(displayFrame1->getActuals().presentTime, 0);
1983 auto actuals1 = presentedSurfaceFrame1.getActuals();
1984 EXPECT_EQ(actuals1.presentTime, 0);
1985
1986 // Trigger a flush by finalizing the next DisplayFrame
1987 auto presentFence2 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Huihong Luo3bdef862022-03-03 11:57:19 -08001988 FrameTimelineInfo ftInfo2;
1989 ftInfo2.vsyncId = surfaceFrameToken2;
1990 ftInfo2.inputEventId = sInputEventId;
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001991 auto surfaceFrame2 =
Huihong Luo3bdef862022-03-03 11:57:19 -08001992 mFrameTimeline->createSurfaceFrameForToken(ftInfo2, sPidOne, sUidOne, sLayerIdOne,
1993 sLayerNameOne, sLayerNameOne,
1994 /*isBuffer*/ true, sGameMode);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001995 surfaceFrame2->setAcquireFenceTime(36);
Pascal Muetschardac7bcd92023-10-03 15:05:36 +02001996 mFrameTimeline->setSfWakeUp(sfToken2, 52, RR_11, RR_11);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08001997 surfaceFrame2->setPresentState(SurfaceFrame::PresentState::Presented);
1998 mFrameTimeline->addSurfaceFrame(surfaceFrame2);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00001999 mFrameTimeline->setSfPresent(57, presentFence2);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08002000 auto displayFrame2 = getDisplayFrame(1);
2001 auto& presentedSurfaceFrame2 = getSurfaceFrame(1, 0);
2002
2003 // Fences for the first frame have flushed, so the present timestamps should be updated
2004 EXPECT_EQ(displayFrame1->getActuals().presentTime, 50);
2005 EXPECT_EQ(displayFrame1->getFramePresentMetadata(), FramePresentMetadata::LatePresent);
2006 EXPECT_EQ(displayFrame1->getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
2007 EXPECT_EQ(displayFrame1->getJankType(), JankType::DisplayHAL);
Ying Wei96eb5352023-11-21 17:37:21 +00002008 EXPECT_EQ(displayFrame1->getJankSeverityType(), JankSeverityType::Partial);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08002009
2010 actuals1 = presentedSurfaceFrame1.getActuals();
2011 EXPECT_EQ(actuals1.presentTime, 50);
2012 EXPECT_EQ(presentedSurfaceFrame1.getFramePresentMetadata(), FramePresentMetadata::LatePresent);
2013 EXPECT_EQ(presentedSurfaceFrame1.getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
2014 EXPECT_EQ(presentedSurfaceFrame1.getJankType(), JankType::DisplayHAL);
Ying Wei96eb5352023-11-21 17:37:21 +00002015 EXPECT_EQ(presentedSurfaceFrame1.getJankSeverityType(), JankSeverityType::Partial);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08002016
2017 // Fences for the second frame haven't been flushed yet, so it should be 0
2018 presentFence2->signalForTest(86);
2019 EXPECT_EQ(displayFrame2->getActuals().presentTime, 0);
2020 auto actuals2 = presentedSurfaceFrame2.getActuals();
2021 EXPECT_EQ(actuals2.presentTime, 0);
2022
Alec Mouri363faf02021-01-29 16:34:55 -08002023 ::testing::Mock::VerifyAndClearExpectations(mTimeStats.get());
2024
2025 EXPECT_CALL(*mTimeStats,
Pascal Muetschardac7bcd92023-10-03 15:05:36 +02002026 incrementJankyFrames(TimeStats::JankyFramesInfo{RR_11, std::nullopt, sUidOne,
2027 sLayerNameOne, sGameMode,
2028 JankType::PredictionError, -3, 5,
2029 0}));
Alec Mouri363faf02021-01-29 16:34:55 -08002030
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08002031 addEmptyDisplayFrame();
2032
2033 // Fences for the second frame have flushed, so the present timestamps should be updated
2034 EXPECT_EQ(displayFrame2->getActuals().presentTime, 86);
2035 EXPECT_EQ(displayFrame2->getFramePresentMetadata(), FramePresentMetadata::LatePresent);
2036 EXPECT_EQ(displayFrame2->getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
2037 EXPECT_EQ(displayFrame2->getJankType(), JankType::PredictionError);
Ying Wei96eb5352023-11-21 17:37:21 +00002038 EXPECT_EQ(displayFrame2->getJankSeverityType(), JankSeverityType::Full);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08002039
2040 actuals2 = presentedSurfaceFrame2.getActuals();
2041 EXPECT_EQ(actuals2.presentTime, 86);
2042 EXPECT_EQ(presentedSurfaceFrame2.getFramePresentMetadata(), FramePresentMetadata::LatePresent);
2043 EXPECT_EQ(presentedSurfaceFrame2.getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
2044 EXPECT_EQ(presentedSurfaceFrame2.getJankType(), JankType::PredictionError);
Ying Wei96eb5352023-11-21 17:37:21 +00002045 EXPECT_EQ(presentedSurfaceFrame2.getJankSeverityType(), JankSeverityType::Full);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08002046}
2047
2048TEST_F(FrameTimelineTest, jankClassification_surfaceFrameLateFinishEarlyPresent) {
Alec Mouri363faf02021-01-29 16:34:55 -08002049 EXPECT_CALL(*mTimeStats, incrementJankyFrames(_));
Alec Mouri7d436ec2021-01-27 20:40:50 -08002050
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08002051 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00002052 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({42, 50, 50});
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08002053 int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions({5, 26, 60});
Huihong Luo3bdef862022-03-03 11:57:19 -08002054 FrameTimelineInfo ftInfo;
2055 ftInfo.vsyncId = surfaceFrameToken1;
2056 ftInfo.inputEventId = sInputEventId;
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08002057 auto surfaceFrame1 =
Huihong Luo3bdef862022-03-03 11:57:19 -08002058 mFrameTimeline->createSurfaceFrameForToken(ftInfo, sPidOne, sUidOne, sLayerIdOne,
2059 sLayerNameOne, sLayerNameOne,
2060 /*isBuffer*/ true, sGameMode);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08002061 surfaceFrame1->setAcquireFenceTime(40);
Pascal Muetschardac7bcd92023-10-03 15:05:36 +02002062 mFrameTimeline->setSfWakeUp(sfToken1, 42, RR_11, RR_11);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08002063 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
2064 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
2065 mFrameTimeline->setSfPresent(46, presentFence1);
2066 auto displayFrame1 = getDisplayFrame(0);
2067 auto& presentedSurfaceFrame1 = getSurfaceFrame(0, 0);
2068 presentFence1->signalForTest(50);
2069
2070 // Fences for the first frame haven't been flushed yet, so it should be 0
2071 EXPECT_EQ(displayFrame1->getActuals().presentTime, 0);
2072 auto actuals1 = presentedSurfaceFrame1.getActuals();
2073 EXPECT_EQ(actuals1.presentTime, 0);
2074
2075 addEmptyDisplayFrame();
2076
2077 // Fences for the first frame have flushed, so the present timestamps should be updated
2078 EXPECT_EQ(displayFrame1->getActuals().presentTime, 50);
2079 EXPECT_EQ(displayFrame1->getFramePresentMetadata(), FramePresentMetadata::OnTimePresent);
2080 EXPECT_EQ(displayFrame1->getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
2081 EXPECT_EQ(displayFrame1->getJankType(), JankType::None);
Ying Wei96eb5352023-11-21 17:37:21 +00002082 EXPECT_EQ(displayFrame1->getJankSeverityType(), JankSeverityType::None);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08002083
2084 actuals1 = presentedSurfaceFrame1.getActuals();
2085 EXPECT_EQ(actuals1.presentTime, 50);
2086 EXPECT_EQ(presentedSurfaceFrame1.getFramePresentMetadata(), FramePresentMetadata::EarlyPresent);
2087 EXPECT_EQ(presentedSurfaceFrame1.getFrameReadyMetadata(), FrameReadyMetadata::LateFinish);
2088 EXPECT_EQ(presentedSurfaceFrame1.getJankType(), JankType::Unknown);
Ying Wei96eb5352023-11-21 17:37:21 +00002089 EXPECT_EQ(presentedSurfaceFrame1.getJankSeverityType(), JankSeverityType::Partial);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08002090}
2091
2092TEST_F(FrameTimelineTest, jankClassification_surfaceFrameLateFinishLatePresent) {
Adithya Srinivasan8a945502021-03-19 19:12:32 +00002093 // First frame - DisplayFrame is not janky. This should classify the SurfaceFrame as only
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08002094 // AppDeadlineMissed. Second frame - DisplayFrame is janky. This should propagate DisplayFrame's
Adithya Srinivasan8a945502021-03-19 19:12:32 +00002095 // jank to the SurfaceFrame along with AppDeadlineMissed.
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08002096
Alec Mouri363faf02021-01-29 16:34:55 -08002097 EXPECT_CALL(*mTimeStats, incrementJankyFrames(_)).Times(2);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08002098 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00002099 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({32, 40, 40});
2100 int64_t sfToken2 = mTokenManager->generateTokenForPredictions({42, 50, 50});
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08002101 int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions({5, 16, 30});
2102 int64_t surfaceFrameToken2 = mTokenManager->generateTokenForPredictions({25, 36, 50});
Huihong Luo3bdef862022-03-03 11:57:19 -08002103 FrameTimelineInfo ftInfo;
2104 ftInfo.vsyncId = surfaceFrameToken1;
2105 ftInfo.inputEventId = sInputEventId;
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08002106 auto surfaceFrame1 =
Huihong Luo3bdef862022-03-03 11:57:19 -08002107 mFrameTimeline->createSurfaceFrameForToken(ftInfo, sPidOne, sUidOne, sLayerIdOne,
2108 sLayerNameOne, sLayerNameOne,
2109 /*isBuffer*/ true, sGameMode);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08002110 surfaceFrame1->setAcquireFenceTime(26);
Pascal Muetschardac7bcd92023-10-03 15:05:36 +02002111 mFrameTimeline->setSfWakeUp(sfToken1, 32, RR_11, RR_11);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08002112 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
2113 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
2114 mFrameTimeline->setSfPresent(36, presentFence1);
2115 auto displayFrame1 = getDisplayFrame(0);
2116 auto& presentedSurfaceFrame1 = getSurfaceFrame(0, 0);
2117 presentFence1->signalForTest(40);
2118
2119 // Fences for the first frame haven't been flushed yet, so it should be 0
2120 EXPECT_EQ(displayFrame1->getActuals().presentTime, 0);
2121 auto actuals1 = presentedSurfaceFrame1.getActuals();
2122 EXPECT_EQ(actuals1.presentTime, 0);
2123
2124 // Trigger a flush by finalizing the next DisplayFrame
2125 auto presentFence2 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Huihong Luo3bdef862022-03-03 11:57:19 -08002126 FrameTimelineInfo ftInfo2;
2127 ftInfo2.vsyncId = surfaceFrameToken2;
2128 ftInfo2.inputEventId = sInputEventId;
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08002129 auto surfaceFrame2 =
Huihong Luo3bdef862022-03-03 11:57:19 -08002130 mFrameTimeline->createSurfaceFrameForToken(ftInfo2, sPidOne, sUidOne, sLayerIdOne,
2131 sLayerNameOne, sLayerNameOne,
2132 /*isBuffer*/ true, sGameMode);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08002133 surfaceFrame2->setAcquireFenceTime(40);
Pascal Muetschardac7bcd92023-10-03 15:05:36 +02002134 mFrameTimeline->setSfWakeUp(sfToken2, 43, RR_11, RR_11);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08002135 surfaceFrame2->setPresentState(SurfaceFrame::PresentState::Presented);
2136 mFrameTimeline->addSurfaceFrame(surfaceFrame2);
2137 mFrameTimeline->setSfPresent(56, presentFence2);
2138 auto displayFrame2 = getDisplayFrame(1);
2139 auto& presentedSurfaceFrame2 = getSurfaceFrame(1, 0);
2140
2141 // Fences for the first frame have flushed, so the present timestamps should be updated
2142 EXPECT_EQ(displayFrame1->getActuals().presentTime, 40);
2143 EXPECT_EQ(displayFrame1->getFramePresentMetadata(), FramePresentMetadata::OnTimePresent);
2144 EXPECT_EQ(displayFrame1->getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
2145 EXPECT_EQ(displayFrame1->getJankType(), JankType::None);
Ying Wei96eb5352023-11-21 17:37:21 +00002146 EXPECT_EQ(displayFrame1->getJankSeverityType(), JankSeverityType::None);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08002147
2148 actuals1 = presentedSurfaceFrame1.getActuals();
2149 EXPECT_EQ(actuals1.presentTime, 40);
2150 EXPECT_EQ(presentedSurfaceFrame1.getFramePresentMetadata(), FramePresentMetadata::LatePresent);
2151 EXPECT_EQ(presentedSurfaceFrame1.getFrameReadyMetadata(), FrameReadyMetadata::LateFinish);
2152 EXPECT_EQ(presentedSurfaceFrame1.getJankType(), JankType::AppDeadlineMissed);
Ying Wei96eb5352023-11-21 17:37:21 +00002153 EXPECT_EQ(presentedSurfaceFrame1.getJankSeverityType(), JankSeverityType::Partial);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08002154
2155 // Fences for the second frame haven't been flushed yet, so it should be 0
2156 presentFence2->signalForTest(60);
2157 EXPECT_EQ(displayFrame2->getActuals().presentTime, 0);
2158 auto actuals2 = presentedSurfaceFrame2.getActuals();
2159 EXPECT_EQ(actuals2.presentTime, 0);
2160
2161 addEmptyDisplayFrame();
2162
2163 // Fences for the second frame have flushed, so the present timestamps should be updated
2164 EXPECT_EQ(displayFrame2->getActuals().presentTime, 60);
2165 EXPECT_EQ(displayFrame2->getFramePresentMetadata(), FramePresentMetadata::LatePresent);
2166 EXPECT_EQ(displayFrame2->getFrameReadyMetadata(), FrameReadyMetadata::LateFinish);
2167 EXPECT_EQ(displayFrame2->getJankType(), JankType::SurfaceFlingerCpuDeadlineMissed);
Ying Wei96eb5352023-11-21 17:37:21 +00002168 EXPECT_EQ(displayFrame2->getJankSeverityType(), JankSeverityType::Partial);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08002169
2170 actuals2 = presentedSurfaceFrame2.getActuals();
2171 EXPECT_EQ(actuals2.presentTime, 60);
2172 EXPECT_EQ(presentedSurfaceFrame2.getFramePresentMetadata(), FramePresentMetadata::LatePresent);
2173 EXPECT_EQ(presentedSurfaceFrame2.getFrameReadyMetadata(), FrameReadyMetadata::LateFinish);
Adithya Srinivasan8a945502021-03-19 19:12:32 +00002174 EXPECT_EQ(presentedSurfaceFrame2.getJankType(),
2175 JankType::SurfaceFlingerCpuDeadlineMissed | JankType::AppDeadlineMissed);
Ying Wei96eb5352023-11-21 17:37:21 +00002176 EXPECT_EQ(presentedSurfaceFrame2.getJankSeverityType(), JankSeverityType::Partial);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08002177}
2178
2179TEST_F(FrameTimelineTest, jankClassification_multiJankBufferStuffingAndAppDeadlineMissed) {
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08002180 // Layer specific increment
Alec Mouri363faf02021-01-29 16:34:55 -08002181 EXPECT_CALL(*mTimeStats, incrementJankyFrames(_)).Times(2);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08002182 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
2183 int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions({10, 20, 30});
2184 int64_t surfaceFrameToken2 = mTokenManager->generateTokenForPredictions({40, 50, 60});
2185
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00002186 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({52, 60, 60});
2187 int64_t sfToken2 = mTokenManager->generateTokenForPredictions({112, 120, 120});
Huihong Luo3bdef862022-03-03 11:57:19 -08002188 FrameTimelineInfo ftInfo;
2189 ftInfo.vsyncId = surfaceFrameToken1;
2190 ftInfo.inputEventId = sInputEventId;
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08002191 auto surfaceFrame1 =
Huihong Luo3bdef862022-03-03 11:57:19 -08002192 mFrameTimeline->createSurfaceFrameForToken(ftInfo, sPidOne, sUidOne, sLayerIdOne,
2193 sLayerNameOne, sLayerNameOne,
2194 /*isBuffer*/ true, sGameMode);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08002195 surfaceFrame1->setAcquireFenceTime(50);
Pascal Muetschardac7bcd92023-10-03 15:05:36 +02002196 mFrameTimeline->setSfWakeUp(sfToken1, 52, RR_30, RR_30);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08002197 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
2198 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
2199 mFrameTimeline->setSfPresent(56, presentFence1);
2200 auto displayFrame1 = getDisplayFrame(0);
2201 auto& presentedSurfaceFrame1 = getSurfaceFrame(0, 0);
2202 presentFence1->signalForTest(60);
2203
2204 // Fences for the first frame haven't been flushed yet, so it should be 0
2205 EXPECT_EQ(displayFrame1->getActuals().presentTime, 0);
2206 auto actuals1 = presentedSurfaceFrame1.getActuals();
2207 EXPECT_EQ(actuals1.presentTime, 0);
2208
2209 // Trigger a flush by finalizing the next DisplayFrame
2210 auto presentFence2 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Huihong Luo3bdef862022-03-03 11:57:19 -08002211 FrameTimelineInfo ftInfo2;
2212 ftInfo2.vsyncId = surfaceFrameToken2;
2213 ftInfo2.inputEventId = sInputEventId;
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08002214 auto surfaceFrame2 =
Huihong Luo3bdef862022-03-03 11:57:19 -08002215 mFrameTimeline->createSurfaceFrameForToken(ftInfo2, sPidOne, sUidOne, sLayerIdOne,
2216 sLayerNameOne, sLayerNameOne,
2217 /*isBuffer*/ true, sGameMode);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08002218 surfaceFrame2->setAcquireFenceTime(84);
Pascal Muetschardac7bcd92023-10-03 15:05:36 +02002219 mFrameTimeline->setSfWakeUp(sfToken2, 112, RR_30, RR_30);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08002220 surfaceFrame2->setPresentState(SurfaceFrame::PresentState::Presented, 54);
2221 mFrameTimeline->addSurfaceFrame(surfaceFrame2);
2222 mFrameTimeline->setSfPresent(116, presentFence2);
2223 auto displayFrame2 = getDisplayFrame(1);
2224 auto& presentedSurfaceFrame2 = getSurfaceFrame(1, 0);
2225 presentFence2->signalForTest(120);
2226
2227 // Fences for the first frame have flushed, so the present timestamps should be updated
2228 EXPECT_EQ(displayFrame1->getActuals().presentTime, 60);
2229 actuals1 = presentedSurfaceFrame1.getActuals();
2230 EXPECT_EQ(actuals1.endTime, 50);
2231 EXPECT_EQ(actuals1.presentTime, 60);
2232
2233 EXPECT_EQ(displayFrame1->getFramePresentMetadata(), FramePresentMetadata::OnTimePresent);
2234 EXPECT_EQ(displayFrame1->getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
2235 EXPECT_EQ(displayFrame1->getJankType(), JankType::None);
Ying Wei96eb5352023-11-21 17:37:21 +00002236 EXPECT_EQ(displayFrame1->getJankSeverityType(), JankSeverityType::None);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08002237
2238 EXPECT_EQ(presentedSurfaceFrame1.getFramePresentMetadata(), FramePresentMetadata::LatePresent);
2239 EXPECT_EQ(presentedSurfaceFrame1.getFrameReadyMetadata(), FrameReadyMetadata::LateFinish);
2240 EXPECT_EQ(presentedSurfaceFrame1.getJankType(), JankType::AppDeadlineMissed);
Ying Wei96eb5352023-11-21 17:37:21 +00002241 EXPECT_EQ(presentedSurfaceFrame1.getJankSeverityType(), JankSeverityType::Full);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08002242
2243 // Fences for the second frame haven't been flushed yet, so it should be 0
2244 EXPECT_EQ(displayFrame2->getActuals().presentTime, 0);
2245 auto actuals2 = presentedSurfaceFrame2.getActuals();
2246 EXPECT_EQ(actuals2.presentTime, 0);
2247
2248 addEmptyDisplayFrame();
2249
2250 // Fences for the second frame have flushed, so the present timestamps should be updated
2251 EXPECT_EQ(displayFrame2->getActuals().presentTime, 120);
2252 actuals2 = presentedSurfaceFrame2.getActuals();
2253 EXPECT_EQ(actuals2.presentTime, 120);
2254
2255 EXPECT_EQ(displayFrame2->getFramePresentMetadata(), FramePresentMetadata::OnTimePresent);
2256 EXPECT_EQ(displayFrame2->getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
2257 EXPECT_EQ(displayFrame2->getJankType(), JankType::None);
Ying Wei96eb5352023-11-21 17:37:21 +00002258 EXPECT_EQ(displayFrame2->getJankSeverityType(), JankSeverityType::None);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08002259
2260 EXPECT_EQ(presentedSurfaceFrame2.getFramePresentMetadata(), FramePresentMetadata::LatePresent);
2261 EXPECT_EQ(presentedSurfaceFrame2.getFrameReadyMetadata(), FrameReadyMetadata::LateFinish);
2262 EXPECT_EQ(presentedSurfaceFrame2.getJankType(),
2263 JankType::AppDeadlineMissed | JankType::BufferStuffing);
Ying Wei96eb5352023-11-21 17:37:21 +00002264 EXPECT_EQ(presentedSurfaceFrame2.getJankSeverityType(), JankSeverityType::Full);
Adithya Srinivasan9b2ca3e2020-11-10 10:14:17 -08002265}
Alec Mouriadebf5c2021-01-05 12:57:36 -08002266
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00002267TEST_F(FrameTimelineTest, jankClassification_appDeadlineAdjustedForBufferStuffing) {
2268 // Layer specific increment
2269 EXPECT_CALL(*mTimeStats, incrementJankyFrames(_)).Times(2);
2270 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
2271 int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions({10, 20, 30});
2272 int64_t surfaceFrameToken2 = mTokenManager->generateTokenForPredictions({40, 50, 60});
2273
2274 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({52, 60, 60});
2275 int64_t sfToken2 = mTokenManager->generateTokenForPredictions({82, 90, 90});
Huihong Luo3bdef862022-03-03 11:57:19 -08002276 FrameTimelineInfo ftInfo;
2277 ftInfo.vsyncId = surfaceFrameToken1;
2278 ftInfo.inputEventId = sInputEventId;
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00002279 auto surfaceFrame1 =
Huihong Luo3bdef862022-03-03 11:57:19 -08002280 mFrameTimeline->createSurfaceFrameForToken(ftInfo, sPidOne, sUidOne, sLayerIdOne,
2281 sLayerNameOne, sLayerNameOne,
2282 /*isBuffer*/ true, sGameMode);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00002283 surfaceFrame1->setAcquireFenceTime(50);
Pascal Muetschardac7bcd92023-10-03 15:05:36 +02002284 mFrameTimeline->setSfWakeUp(sfToken1, 52, RR_30, RR_30);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00002285 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
2286 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
2287 mFrameTimeline->setSfPresent(56, presentFence1);
2288 auto displayFrame1 = getDisplayFrame(0);
2289 auto& presentedSurfaceFrame1 = getSurfaceFrame(0, 0);
2290 presentFence1->signalForTest(60);
2291
2292 // Fences for the first frame haven't been flushed yet, so it should be 0
2293 EXPECT_EQ(displayFrame1->getActuals().presentTime, 0);
2294 auto actuals1 = presentedSurfaceFrame1.getActuals();
2295 EXPECT_EQ(actuals1.presentTime, 0);
2296
2297 // Trigger a flush by finalizing the next DisplayFrame
2298 auto presentFence2 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
Huihong Luo3bdef862022-03-03 11:57:19 -08002299 FrameTimelineInfo ftInfo2;
2300 ftInfo2.vsyncId = surfaceFrameToken2;
2301 ftInfo2.inputEventId = sInputEventId;
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00002302 auto surfaceFrame2 =
Huihong Luo3bdef862022-03-03 11:57:19 -08002303 mFrameTimeline->createSurfaceFrameForToken(ftInfo2, sPidOne, sUidOne, sLayerIdOne,
2304 sLayerNameOne, sLayerNameOne,
2305 /*isBuffer*/ true, sGameMode);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00002306 surfaceFrame2->setAcquireFenceTime(80);
Pascal Muetschardac7bcd92023-10-03 15:05:36 +02002307 mFrameTimeline->setSfWakeUp(sfToken2, 82, RR_30, RR_30);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00002308 // Setting previous latch time to 54, adjusted deadline will be 54 + vsyncTime(30) = 84
2309 surfaceFrame2->setPresentState(SurfaceFrame::PresentState::Presented, 54);
2310 mFrameTimeline->addSurfaceFrame(surfaceFrame2);
2311 mFrameTimeline->setSfPresent(86, presentFence2);
2312 auto displayFrame2 = getDisplayFrame(1);
2313 auto& presentedSurfaceFrame2 = getSurfaceFrame(1, 0);
2314 presentFence2->signalForTest(90);
2315
2316 // Fences for the first frame have flushed, so the present timestamps should be updated
2317 EXPECT_EQ(displayFrame1->getActuals().presentTime, 60);
2318 actuals1 = presentedSurfaceFrame1.getActuals();
2319 EXPECT_EQ(actuals1.endTime, 50);
2320 EXPECT_EQ(actuals1.presentTime, 60);
2321
2322 EXPECT_EQ(displayFrame1->getFramePresentMetadata(), FramePresentMetadata::OnTimePresent);
2323 EXPECT_EQ(displayFrame1->getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
2324 EXPECT_EQ(displayFrame1->getJankType(), JankType::None);
Ying Wei96eb5352023-11-21 17:37:21 +00002325 EXPECT_EQ(displayFrame1->getJankSeverityType(), JankSeverityType::None);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00002326
2327 EXPECT_EQ(presentedSurfaceFrame1.getFramePresentMetadata(), FramePresentMetadata::LatePresent);
2328 EXPECT_EQ(presentedSurfaceFrame1.getFrameReadyMetadata(), FrameReadyMetadata::LateFinish);
2329 EXPECT_EQ(presentedSurfaceFrame1.getJankType(), JankType::AppDeadlineMissed);
Ying Wei96eb5352023-11-21 17:37:21 +00002330 EXPECT_EQ(presentedSurfaceFrame1.getJankSeverityType(), JankSeverityType::Full);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00002331
2332 // Fences for the second frame haven't been flushed yet, so it should be 0
2333 EXPECT_EQ(displayFrame2->getActuals().presentTime, 0);
2334 auto actuals2 = presentedSurfaceFrame2.getActuals();
2335 EXPECT_EQ(actuals2.presentTime, 0);
2336
2337 addEmptyDisplayFrame();
2338
2339 // Fences for the second frame have flushed, so the present timestamps should be updated
2340 EXPECT_EQ(displayFrame2->getActuals().presentTime, 90);
2341 actuals2 = presentedSurfaceFrame2.getActuals();
2342 EXPECT_EQ(actuals2.presentTime, 90);
2343
2344 EXPECT_EQ(displayFrame2->getFramePresentMetadata(), FramePresentMetadata::OnTimePresent);
2345 EXPECT_EQ(displayFrame2->getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
2346 EXPECT_EQ(displayFrame2->getJankType(), JankType::None);
Ying Wei96eb5352023-11-21 17:37:21 +00002347 EXPECT_EQ(displayFrame2->getJankSeverityType(), JankSeverityType::None);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00002348
2349 EXPECT_EQ(presentedSurfaceFrame2.getFramePresentMetadata(), FramePresentMetadata::LatePresent);
2350 EXPECT_EQ(presentedSurfaceFrame2.getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
2351 EXPECT_EQ(presentedSurfaceFrame2.getJankType(), JankType::BufferStuffing);
Ying Wei96eb5352023-11-21 17:37:21 +00002352 EXPECT_EQ(presentedSurfaceFrame2.getJankSeverityType(), JankSeverityType::Full);
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00002353}
2354
Rachel Lee94917b32022-03-18 17:52:09 -07002355TEST_F(FrameTimelineTest, jankClassification_displayFrameLateFinishLatePresent_GpuAndCpuMiss) {
2356 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
2357 auto presentFence2 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
2358 auto gpuFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
2359 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({22, 26, 40});
2360 int64_t sfToken2 = mTokenManager->generateTokenForPredictions({52, 60, 60});
2361
2362 // Case 1: cpu time = 33 - 12 = 21, vsync period = 11
Pascal Muetschardac7bcd92023-10-03 15:05:36 +02002363 mFrameTimeline->setSfWakeUp(sfToken1, 12, RR_11, RR_11);
Rachel Lee94917b32022-03-18 17:52:09 -07002364 mFrameTimeline->setSfPresent(33, presentFence1, gpuFence1);
2365 auto displayFrame = getDisplayFrame(0);
2366 gpuFence1->signalForTest(36);
2367 presentFence1->signalForTest(52);
2368
2369 // Fences haven't been flushed yet, so it should be 0
2370 EXPECT_EQ(displayFrame->getActuals().presentTime, 0);
2371
2372 addEmptyDisplayFrame();
2373 displayFrame = getDisplayFrame(0);
2374
2375 // Fences have flushed, so the present timestamps should be updated
2376 EXPECT_EQ(displayFrame->getActuals().presentTime, 52);
2377 EXPECT_EQ(displayFrame->getFramePresentMetadata(), FramePresentMetadata::LatePresent);
2378 EXPECT_EQ(displayFrame->getFrameReadyMetadata(), FrameReadyMetadata::LateFinish);
2379 EXPECT_EQ(displayFrame->getJankType(), JankType::SurfaceFlingerGpuDeadlineMissed);
Ying Wei96eb5352023-11-21 17:37:21 +00002380 EXPECT_EQ(displayFrame->getJankSeverityType(), JankSeverityType::Full);
Rachel Lee94917b32022-03-18 17:52:09 -07002381
2382 // Case 2: No GPU fence so it will not use GPU composition.
Pascal Muetschardac7bcd92023-10-03 15:05:36 +02002383 mFrameTimeline->setSfWakeUp(sfToken2, 52, RR_30, RR_30);
Rachel Lee94917b32022-03-18 17:52:09 -07002384 mFrameTimeline->setSfPresent(66, presentFence2);
2385 auto displayFrame2 = getDisplayFrame(2); // 2 because of previous empty frame
2386 presentFence2->signalForTest(90);
2387
2388 // Fences for the frame haven't been flushed yet, so it should be 0
2389 EXPECT_EQ(displayFrame2->getActuals().presentTime, 0);
2390
2391 addEmptyDisplayFrame();
2392
2393 // Fences have flushed, so the present timestamps should be updated
2394 EXPECT_EQ(displayFrame2->getActuals().presentTime, 90);
2395 EXPECT_EQ(displayFrame2->getFramePresentMetadata(), FramePresentMetadata::LatePresent);
2396 EXPECT_EQ(displayFrame2->getFrameReadyMetadata(), FrameReadyMetadata::LateFinish);
2397 EXPECT_EQ(displayFrame2->getJankType(), JankType::SurfaceFlingerCpuDeadlineMissed);
Ying Wei96eb5352023-11-21 17:37:21 +00002398 EXPECT_EQ(displayFrame2->getJankSeverityType(), JankSeverityType::Full);
Rachel Lee94917b32022-03-18 17:52:09 -07002399}
2400
Ady Abrahamfcb16862022-10-10 14:35:21 -07002401TEST_F(FrameTimelineTest, jankClassification_presentFenceError) {
2402 auto erroneousPresentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
2403 auto erroneousPresentFence2 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
2404 auto validPresentFence = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
2405 int64_t sfToken1 = mTokenManager->generateTokenForPredictions({22, 26, 40});
2406 int64_t sfToken2 = mTokenManager->generateTokenForPredictions({52, 60, 60});
2407 int64_t sfToken3 = mTokenManager->generateTokenForPredictions({72, 80, 80});
2408
Pascal Muetschardac7bcd92023-10-03 15:05:36 +02002409 mFrameTimeline->setSfWakeUp(sfToken1, 22, RR_11, RR_11);
Ady Abrahamfcb16862022-10-10 14:35:21 -07002410 mFrameTimeline->setSfPresent(26, erroneousPresentFence1);
2411
Pascal Muetschardac7bcd92023-10-03 15:05:36 +02002412 mFrameTimeline->setSfWakeUp(sfToken2, 52, RR_11, RR_11);
Ady Abrahamfcb16862022-10-10 14:35:21 -07002413 mFrameTimeline->setSfPresent(60, erroneousPresentFence2);
2414
Pascal Muetschardac7bcd92023-10-03 15:05:36 +02002415 mFrameTimeline->setSfWakeUp(sfToken3, 72, RR_11, RR_11);
Ady Abrahamfcb16862022-10-10 14:35:21 -07002416 mFrameTimeline->setSfPresent(80, validPresentFence);
2417
Ady Abrahamb1e10d12023-03-13 15:23:54 -07002418 erroneousPresentFence2->signalForTest(2);
Ady Abrahamfcb16862022-10-10 14:35:21 -07002419 validPresentFence->signalForTest(80);
2420
2421 addEmptyDisplayFrame();
2422
2423 {
2424 auto displayFrame = getDisplayFrame(0);
2425 EXPECT_EQ(displayFrame->getActuals().presentTime, 26);
2426 EXPECT_EQ(displayFrame->getFramePresentMetadata(), FramePresentMetadata::UnknownPresent);
2427 EXPECT_EQ(displayFrame->getFrameReadyMetadata(), FrameReadyMetadata::UnknownFinish);
Ady Abrahamb1e10d12023-03-13 15:23:54 -07002428 EXPECT_EQ(displayFrame->getJankType(), JankType::Unknown | JankType::DisplayHAL);
Ying Wei96eb5352023-11-21 17:37:21 +00002429 EXPECT_EQ(displayFrame->getJankSeverityType(), JankSeverityType::Unknown);
Ady Abrahamfcb16862022-10-10 14:35:21 -07002430 }
2431 {
2432 auto displayFrame = getDisplayFrame(1);
2433 EXPECT_EQ(displayFrame->getActuals().presentTime, 60);
2434 EXPECT_EQ(displayFrame->getFramePresentMetadata(), FramePresentMetadata::UnknownPresent);
2435 EXPECT_EQ(displayFrame->getFrameReadyMetadata(), FrameReadyMetadata::UnknownFinish);
Ady Abrahamb1e10d12023-03-13 15:23:54 -07002436 EXPECT_EQ(displayFrame->getJankType(), JankType::Unknown | JankType::DisplayHAL);
Ying Wei96eb5352023-11-21 17:37:21 +00002437 EXPECT_EQ(displayFrame->getJankSeverityType(), JankSeverityType::Unknown);
Ady Abrahamfcb16862022-10-10 14:35:21 -07002438 }
2439 {
2440 auto displayFrame = getDisplayFrame(2);
2441 EXPECT_EQ(displayFrame->getActuals().presentTime, 80);
2442 EXPECT_EQ(displayFrame->getFramePresentMetadata(), FramePresentMetadata::OnTimePresent);
2443 EXPECT_EQ(displayFrame->getFrameReadyMetadata(), FrameReadyMetadata::OnTimeFinish);
2444 EXPECT_EQ(displayFrame->getJankType(), JankType::None);
Ying Wei96eb5352023-11-21 17:37:21 +00002445 EXPECT_EQ(displayFrame->getJankSeverityType(), JankSeverityType::None);
Ady Abrahamfcb16862022-10-10 14:35:21 -07002446 }
2447}
2448
Alec Mouriadebf5c2021-01-05 12:57:36 -08002449TEST_F(FrameTimelineTest, computeFps_noLayerIds_returnsZero) {
2450 EXPECT_EQ(mFrameTimeline->computeFps({}), 0.0f);
2451}
2452
2453TEST_F(FrameTimelineTest, computeFps_singleDisplayFrame_returnsZero) {
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00002454 const auto oneHundredMs = std::chrono::nanoseconds(100ms).count();
Alec Mouriadebf5c2021-01-05 12:57:36 -08002455
2456 auto surfaceFrame1 =
2457 mFrameTimeline->createSurfaceFrameForToken(FrameTimelineInfo(), sPidOne, sUidOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +00002458 sLayerIdOne, sLayerNameOne, sLayerNameOne,
Adithya Srinivasan58069dc2021-06-04 20:37:02 +00002459 /*isBuffer*/ true, sGameMode);
Alec Mouriadebf5c2021-01-05 12:57:36 -08002460 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
2461 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
2462 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
2463 presentFence1->signalForTest(oneHundredMs);
2464 mFrameTimeline->setSfPresent(oneHundredMs, presentFence1);
2465
2466 EXPECT_EQ(mFrameTimeline->computeFps({sLayerIdOne}), 0.0f);
2467}
2468
2469TEST_F(FrameTimelineTest, computeFps_twoDisplayFrames_oneLayer) {
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00002470 const auto oneHundredMs = std::chrono::nanoseconds(100ms).count();
2471 const auto twoHundredMs = std::chrono::nanoseconds(200ms).count();
Alec Mouriadebf5c2021-01-05 12:57:36 -08002472 auto surfaceFrame1 =
2473 mFrameTimeline->createSurfaceFrameForToken(FrameTimelineInfo(), sPidOne, sUidOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +00002474 sLayerIdOne, sLayerNameOne, sLayerNameOne,
Adithya Srinivasan58069dc2021-06-04 20:37:02 +00002475 /*isBuffer*/ true, sGameMode);
Alec Mouriadebf5c2021-01-05 12:57:36 -08002476 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
2477 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
2478 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
2479 presentFence1->signalForTest(oneHundredMs);
2480 mFrameTimeline->setSfPresent(oneHundredMs, presentFence1);
2481
2482 auto surfaceFrame2 =
2483 mFrameTimeline->createSurfaceFrameForToken(FrameTimelineInfo(), sPidOne, sUidOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +00002484 sLayerIdOne, sLayerNameOne, sLayerNameOne,
Adithya Srinivasan58069dc2021-06-04 20:37:02 +00002485 /*isBuffer*/ true, sGameMode);
Alec Mouriadebf5c2021-01-05 12:57:36 -08002486 auto presentFence2 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
2487 surfaceFrame2->setPresentState(SurfaceFrame::PresentState::Presented);
2488 mFrameTimeline->addSurfaceFrame(surfaceFrame2);
2489 presentFence2->signalForTest(twoHundredMs);
2490 mFrameTimeline->setSfPresent(twoHundredMs, presentFence2);
2491
2492 EXPECT_EQ(mFrameTimeline->computeFps({sLayerIdOne}), 10.0);
2493}
2494
2495TEST_F(FrameTimelineTest, computeFps_twoDisplayFrames_twoLayers) {
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00002496 const auto oneHundredMs = std::chrono::nanoseconds(100ms).count();
2497 const auto twoHundredMs = std::chrono::nanoseconds(200ms).count();
Alec Mouriadebf5c2021-01-05 12:57:36 -08002498 auto surfaceFrame1 =
2499 mFrameTimeline->createSurfaceFrameForToken(FrameTimelineInfo(), sPidOne, sUidOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +00002500 sLayerIdOne, sLayerNameOne, sLayerNameOne,
Adithya Srinivasan58069dc2021-06-04 20:37:02 +00002501 /*isBuffer*/ true, sGameMode);
Alec Mouriadebf5c2021-01-05 12:57:36 -08002502 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
2503 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
2504 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
2505 presentFence1->signalForTest(oneHundredMs);
2506 mFrameTimeline->setSfPresent(oneHundredMs, presentFence1);
2507
2508 auto surfaceFrame2 =
2509 mFrameTimeline->createSurfaceFrameForToken(FrameTimelineInfo(), sPidOne, sUidOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +00002510 sLayerIdTwo, sLayerNameTwo, sLayerNameTwo,
Adithya Srinivasan58069dc2021-06-04 20:37:02 +00002511 /*isBuffer*/ true, sGameMode);
Alec Mouriadebf5c2021-01-05 12:57:36 -08002512 auto presentFence2 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
2513 surfaceFrame2->setPresentState(SurfaceFrame::PresentState::Presented);
2514 mFrameTimeline->addSurfaceFrame(surfaceFrame2);
2515 presentFence2->signalForTest(twoHundredMs);
2516 mFrameTimeline->setSfPresent(twoHundredMs, presentFence2);
2517
2518 EXPECT_EQ(mFrameTimeline->computeFps({sLayerIdOne, sLayerIdTwo}), 10.0f);
2519}
2520
2521TEST_F(FrameTimelineTest, computeFps_filtersOutLayers) {
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00002522 const auto oneHundredMs = std::chrono::nanoseconds(100ms).count();
2523 const auto twoHundredMs = std::chrono::nanoseconds(200ms).count();
Alec Mouriadebf5c2021-01-05 12:57:36 -08002524 auto surfaceFrame1 =
2525 mFrameTimeline->createSurfaceFrameForToken(FrameTimelineInfo(), sPidOne, sUidOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +00002526 sLayerIdOne, sLayerNameOne, sLayerNameOne,
Adithya Srinivasan58069dc2021-06-04 20:37:02 +00002527 /*isBuffer*/ true, sGameMode);
Alec Mouriadebf5c2021-01-05 12:57:36 -08002528 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
2529 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
2530 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
2531 presentFence1->signalForTest(oneHundredMs);
2532 mFrameTimeline->setSfPresent(oneHundredMs, presentFence1);
2533
2534 auto surfaceFrame2 =
2535 mFrameTimeline->createSurfaceFrameForToken(FrameTimelineInfo(), sPidOne, sUidOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +00002536 sLayerIdTwo, sLayerNameTwo, sLayerNameTwo,
Adithya Srinivasan58069dc2021-06-04 20:37:02 +00002537 /*isBuffer*/ true, sGameMode);
Alec Mouriadebf5c2021-01-05 12:57:36 -08002538 auto presentFence2 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
2539 surfaceFrame2->setPresentState(SurfaceFrame::PresentState::Presented);
2540 mFrameTimeline->addSurfaceFrame(surfaceFrame2);
2541 presentFence2->signalForTest(twoHundredMs);
2542 mFrameTimeline->setSfPresent(twoHundredMs, presentFence2);
2543
2544 EXPECT_EQ(mFrameTimeline->computeFps({sLayerIdOne}), 0.0f);
2545}
2546
2547TEST_F(FrameTimelineTest, computeFps_averagesOverMultipleFrames) {
Adithya Srinivasan939cd4d2021-02-23 06:18:13 +00002548 const auto oneHundredMs = std::chrono::nanoseconds(100ms).count();
2549 const auto twoHundredMs = std::chrono::nanoseconds(200ms).count();
2550 const auto threeHundredMs = std::chrono::nanoseconds(300ms).count();
2551 const auto fiveHundredMs = std::chrono::nanoseconds(500ms).count();
2552 const auto sixHundredMs = std::chrono::nanoseconds(600ms).count();
Alec Mouriadebf5c2021-01-05 12:57:36 -08002553 auto surfaceFrame1 =
2554 mFrameTimeline->createSurfaceFrameForToken(FrameTimelineInfo(), sPidOne, sUidOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +00002555 sLayerIdOne, sLayerNameOne, sLayerNameOne,
Adithya Srinivasan58069dc2021-06-04 20:37:02 +00002556 /*isBuffer*/ true, sGameMode);
Alec Mouriadebf5c2021-01-05 12:57:36 -08002557 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
2558 surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented);
2559 mFrameTimeline->addSurfaceFrame(surfaceFrame1);
2560 presentFence1->signalForTest(oneHundredMs);
2561 mFrameTimeline->setSfPresent(oneHundredMs, presentFence1);
2562
2563 auto surfaceFrame2 =
2564 mFrameTimeline->createSurfaceFrameForToken(FrameTimelineInfo(), sPidOne, sUidOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +00002565 sLayerIdOne, sLayerNameOne, sLayerNameOne,
Adithya Srinivasan58069dc2021-06-04 20:37:02 +00002566 /*isBuffer*/ true, sGameMode);
Alec Mouriadebf5c2021-01-05 12:57:36 -08002567 auto presentFence2 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
2568 surfaceFrame2->setPresentState(SurfaceFrame::PresentState::Presented);
2569 mFrameTimeline->addSurfaceFrame(surfaceFrame2);
2570 presentFence2->signalForTest(twoHundredMs);
2571 mFrameTimeline->setSfPresent(twoHundredMs, presentFence2);
2572
2573 auto surfaceFrame3 =
2574 mFrameTimeline->createSurfaceFrameForToken(FrameTimelineInfo(), sPidOne, sUidOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +00002575 sLayerIdTwo, sLayerNameTwo, sLayerNameTwo,
Adithya Srinivasan58069dc2021-06-04 20:37:02 +00002576 /*isBuffer*/ true, sGameMode);
Alec Mouriadebf5c2021-01-05 12:57:36 -08002577 auto presentFence3 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
2578 surfaceFrame3->setPresentState(SurfaceFrame::PresentState::Presented);
2579 mFrameTimeline->addSurfaceFrame(surfaceFrame3);
2580 presentFence3->signalForTest(threeHundredMs);
2581 mFrameTimeline->setSfPresent(threeHundredMs, presentFence3);
2582
2583 auto surfaceFrame4 =
2584 mFrameTimeline->createSurfaceFrameForToken(FrameTimelineInfo(), sPidOne, sUidOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +00002585 sLayerIdOne, sLayerNameOne, sLayerNameOne,
Adithya Srinivasan58069dc2021-06-04 20:37:02 +00002586 /*isBuffer*/ true, sGameMode);
Alec Mouriadebf5c2021-01-05 12:57:36 -08002587 auto presentFence4 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
2588 surfaceFrame4->setPresentState(SurfaceFrame::PresentState::Presented);
2589 mFrameTimeline->addSurfaceFrame(surfaceFrame4);
2590 presentFence4->signalForTest(fiveHundredMs);
2591 mFrameTimeline->setSfPresent(fiveHundredMs, presentFence4);
2592
2593 auto surfaceFrame5 =
2594 mFrameTimeline->createSurfaceFrameForToken(FrameTimelineInfo(), sPidOne, sUidOne,
Adithya Srinivasan785addd2021-03-09 00:38:00 +00002595 sLayerIdOne, sLayerNameOne, sLayerNameOne,
Adithya Srinivasan58069dc2021-06-04 20:37:02 +00002596 /*isBuffer*/ true, sGameMode);
Alec Mouriadebf5c2021-01-05 12:57:36 -08002597 auto presentFence5 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
2598 // Dropped frames will be excluded from fps computation
2599 surfaceFrame5->setPresentState(SurfaceFrame::PresentState::Dropped);
2600 mFrameTimeline->addSurfaceFrame(surfaceFrame5);
2601 presentFence5->signalForTest(sixHundredMs);
2602 mFrameTimeline->setSfPresent(sixHundredMs, presentFence5);
2603
2604 EXPECT_EQ(mFrameTimeline->computeFps({sLayerIdOne}), 5.0f);
2605}
2606
ramindaniea2bb822022-06-27 19:52:10 +00002607TEST_F(FrameTimelineTest, getMinTime) {
2608 // Use SurfaceFrame::getBaseTime to test the getMinTime.
2609 FrameTimelineInfo ftInfo;
2610
2611 // Valid prediction state test.
2612 ftInfo.vsyncId = 0L;
2613 mTokenManager->generateTokenForPredictions({10});
2614 auto surfaceFrame =
2615 mFrameTimeline->createSurfaceFrameForToken(ftInfo, sPidOne, sUidOne, sLayerIdOne,
2616 sLayerNameOne, sLayerNameOne,
2617 /*isBuffer*/ true, sGameMode);
2618 ASSERT_EQ(surfaceFrame->getBaseTime(), 10);
2619
2620 // Test prediction state which is not valid.
2621 ftInfo.vsyncId = FrameTimelineInfo::INVALID_VSYNC_ID;
2622 surfaceFrame = mFrameTimeline->createSurfaceFrameForToken(ftInfo, sPidOne, sUidOne, sLayerIdOne,
2623 sLayerNameOne, sLayerNameOne,
2624 /*isBuffer*/ true, sGameMode);
2625 // Start time test.
2626 surfaceFrame->setActualStartTime(200);
2627 ASSERT_EQ(surfaceFrame->getBaseTime(), 200);
2628
2629 // End time test.
2630 surfaceFrame->setAcquireFenceTime(100);
2631 ASSERT_EQ(surfaceFrame->getBaseTime(), 100);
2632
2633 // Present time test.
2634 auto presentFence = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
2635 surfaceFrame->setPresentState(SurfaceFrame::PresentState::Presented);
2636 mFrameTimeline->addSurfaceFrame(surfaceFrame);
2637 presentFence->signalForTest(std::chrono::nanoseconds(50ns).count());
2638 mFrameTimeline->setSfPresent(50, presentFence);
2639 ASSERT_EQ(surfaceFrame->getBaseTime(), 50);
2640}
Pascal Muetschardac7bcd92023-10-03 15:05:36 +02002641
2642TEST_F(FrameTimelineTest, surfaceFrameRenderRateUsingDisplayRate) {
2643 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
2644 int64_t token1 = mTokenManager->generateTokenForPredictions({10, 20, 30});
2645 FrameTimelineInfo ftInfo;
2646 ftInfo.vsyncId = token1;
2647 ftInfo.inputEventId = sInputEventId;
2648 auto surfaceFrame =
2649 mFrameTimeline->createSurfaceFrameForToken(ftInfo, sPidOne, sUidOne, sLayerIdOne,
2650 sLayerNameOne, sLayerNameOne,
2651 /*isBuffer*/ true, sGameMode);
2652
2653 mFrameTimeline->setSfWakeUp(token1, 20, RR_30, RR_11);
2654 surfaceFrame->setPresentState(SurfaceFrame::PresentState::Presented);
2655 mFrameTimeline->addSurfaceFrame(surfaceFrame);
2656 presentFence1->signalForTest(std::chrono::nanoseconds(50ns).count());
2657 mFrameTimeline->setSfPresent(50, presentFence1);
2658
2659 EXPECT_EQ(surfaceFrame->getRenderRate().getPeriodNsecs(), 11);
2660}
2661
2662TEST_F(FrameTimelineTest, surfaceFrameRenderRateUsingAppFrameRate) {
2663 auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE);
2664 int64_t token1 = mTokenManager->generateTokenForPredictions({10, 20, 30});
2665 FrameTimelineInfo ftInfo;
2666 ftInfo.vsyncId = token1;
2667 ftInfo.inputEventId = sInputEventId;
2668 auto surfaceFrame =
2669 mFrameTimeline->createSurfaceFrameForToken(ftInfo, sPidOne, sUidOne, sLayerIdOne,
2670 sLayerNameOne, sLayerNameOne,
2671 /*isBuffer*/ true, sGameMode);
2672 surfaceFrame->setRenderRate(RR_30);
2673 mFrameTimeline->setSfWakeUp(token1, 20, RR_11, RR_11);
2674 surfaceFrame->setPresentState(SurfaceFrame::PresentState::Presented);
2675 mFrameTimeline->addSurfaceFrame(surfaceFrame);
2676 presentFence1->signalForTest(std::chrono::nanoseconds(50ns).count());
2677 mFrameTimeline->setSfPresent(50, presentFence1);
2678
2679 EXPECT_EQ(surfaceFrame->getRenderRate().getPeriodNsecs(), 30);
2680}
Adithya Srinivasanf279e042020-08-17 14:56:27 -07002681} // namespace android::frametimeline