diff options
| author | 2023-10-03 15:05:36 +0200 | |
|---|---|---|
| committer | 2023-10-17 14:21:56 +0200 | |
| commit | ac7bcd98bd331eca678ffc21188dd78c63aabbdd (patch) | |
| tree | 184f453f90b52d0427ce1761826781ea2f709abb /services/surfaceflinger | |
| parent | 102d39dbad6c568fc4daa17493b53380dcb8f0a0 (diff) | |
Include the frame's expected duration in the jank data.
Bug: b/261839034
Test: atest libsurfaceflinger_unittest
Change-Id: I65c85be8825e36671612a47000261c04f0289551
Diffstat (limited to 'services/surfaceflinger')
7 files changed, 151 insertions, 89 deletions
diff --git a/services/surfaceflinger/FrameTimeline/FrameTimeline.cpp b/services/surfaceflinger/FrameTimeline/FrameTimeline.cpp index dcc29b9913..1b1307b13a 100644 --- a/services/surfaceflinger/FrameTimeline/FrameTimeline.cpp +++ b/services/surfaceflinger/FrameTimeline/FrameTimeline.cpp @@ -366,6 +366,11 @@ void SurfaceFrame::setRenderRate(Fps renderRate) { mRenderRate = renderRate; } +Fps SurfaceFrame::getRenderRate() const { + std::lock_guard<std::mutex> lock(mMutex); + return mRenderRate ? *mRenderRate : mDisplayFrameRenderRate; +} + void SurfaceFrame::setGpuComposition() { std::scoped_lock lock(mMutex); mGpuComposition = true; @@ -611,9 +616,11 @@ void SurfaceFrame::classifyJankLocked(int32_t displayFrameJankType, const Fps& r } void SurfaceFrame::onPresent(nsecs_t presentTime, int32_t displayFrameJankType, Fps refreshRate, - nsecs_t displayDeadlineDelta, nsecs_t displayPresentDelta) { + Fps displayFrameRenderRate, nsecs_t displayDeadlineDelta, + nsecs_t displayPresentDelta) { std::scoped_lock lock(mMutex); + mDisplayFrameRenderRate = displayFrameRenderRate; mActuals.presentTime = presentTime; nsecs_t deadlineDelta = 0; @@ -837,10 +844,11 @@ void FrameTimeline::addSurfaceFrame(std::shared_ptr<SurfaceFrame> surfaceFrame) mCurrentDisplayFrame->addSurfaceFrame(surfaceFrame); } -void FrameTimeline::setSfWakeUp(int64_t token, nsecs_t wakeUpTime, Fps refreshRate) { +void FrameTimeline::setSfWakeUp(int64_t token, nsecs_t wakeUpTime, Fps refreshRate, + Fps renderRate) { ATRACE_CALL(); std::scoped_lock lock(mMutex); - mCurrentDisplayFrame->onSfWakeUp(token, refreshRate, + mCurrentDisplayFrame->onSfWakeUp(token, refreshRate, renderRate, mTokenManager.getPredictionsForToken(token), wakeUpTime); } @@ -860,11 +868,12 @@ void FrameTimeline::DisplayFrame::addSurfaceFrame(std::shared_ptr<SurfaceFrame> mSurfaceFrames.push_back(surfaceFrame); } -void FrameTimeline::DisplayFrame::onSfWakeUp(int64_t token, Fps refreshRate, +void FrameTimeline::DisplayFrame::onSfWakeUp(int64_t token, Fps refreshRate, Fps renderRate, std::optional<TimelineItem> predictions, nsecs_t wakeUpTime) { mToken = token; mRefreshRate = refreshRate; + mRenderRate = renderRate; if (!predictions) { mPredictionState = PredictionState::Expired; } else { @@ -1026,7 +1035,8 @@ void FrameTimeline::DisplayFrame::onPresent(nsecs_t signalTime, nsecs_t previous classifyJank(deadlineDelta, deltaToVsync, previousPresentTime); for (auto& surfaceFrame : mSurfaceFrames) { - surfaceFrame->onPresent(signalTime, mJankType, mRefreshRate, deadlineDelta, deltaToVsync); + surfaceFrame->onPresent(signalTime, mJankType, mRefreshRate, mRenderRate, deadlineDelta, + deltaToVsync); } } diff --git a/services/surfaceflinger/FrameTimeline/FrameTimeline.h b/services/surfaceflinger/FrameTimeline/FrameTimeline.h index d54d22d53b..538ea1288b 100644 --- a/services/surfaceflinger/FrameTimeline/FrameTimeline.h +++ b/services/surfaceflinger/FrameTimeline/FrameTimeline.h @@ -183,6 +183,8 @@ public: void setDropTime(nsecs_t dropTime); void setPresentState(PresentState presentState, nsecs_t lastLatchTime = 0); void setRenderRate(Fps renderRate); + // Return the render rate if it exists, otherwise returns the DisplayFrame's render rate. + Fps getRenderRate() const; void setGpuComposition(); // When a bufferless SurfaceFrame is promoted to a buffer SurfaceFrame, we also have to update @@ -197,7 +199,8 @@ public: // displayRefreshRate, displayDeadlineDelta, and displayPresentDelta are propagated from the // display frame. void onPresent(nsecs_t presentTime, int32_t displayFrameJankType, Fps refreshRate, - nsecs_t displayDeadlineDelta, nsecs_t displayPresentDelta); + Fps displayFrameRenderRate, nsecs_t displayDeadlineDelta, + nsecs_t displayPresentDelta); // All the timestamps are dumped relative to the baseTime void dump(std::string& result, const std::string& indent, nsecs_t baseTime) const; // Dumps only the layer, token, is buffer, jank metadata, prediction and present states. @@ -251,6 +254,8 @@ private: int32_t mJankType GUARDED_BY(mMutex) = JankType::None; // Indicates if this frame was composited by the GPU or not bool mGpuComposition GUARDED_BY(mMutex) = false; + // Refresh rate for this frame. + Fps mDisplayFrameRenderRate GUARDED_BY(mMutex); // Rendering rate for this frame. std::optional<Fps> mRenderRate GUARDED_BY(mMutex); // Enum for the type of present @@ -298,7 +303,8 @@ public: // The first function called by SF for the current DisplayFrame. Fetches SF predictions based on // the token and sets the actualSfWakeTime for the current DisplayFrame. - virtual void setSfWakeUp(int64_t token, nsecs_t wakeupTime, Fps refreshRate) = 0; + virtual void setSfWakeUp(int64_t token, nsecs_t wakeupTime, Fps refreshRate, + Fps renderRate) = 0; // Sets the sfPresentTime and finalizes the current DisplayFrame. Tracks the // given present fence until it's signaled, and updates the present timestamps of all presented @@ -374,8 +380,8 @@ public: // and SYSTEM_TIME_MONOTONIC. void trace(pid_t surfaceFlingerPid, nsecs_t monoBootOffset) const; // Sets the token, vsyncPeriod, predictions and SF start time. - void onSfWakeUp(int64_t token, Fps refreshRate, std::optional<TimelineItem> predictions, - nsecs_t wakeUpTime); + void onSfWakeUp(int64_t token, Fps refreshRate, Fps renderRate, + std::optional<TimelineItem> predictions, nsecs_t wakeUpTime); // Sets the appropriate metadata and classifies the jank. void onPresent(nsecs_t signalTime, nsecs_t previousPresentTime); // Adds the provided SurfaceFrame to the current display frame. @@ -437,6 +443,8 @@ public: // The refresh rate (vsync period) in nanoseconds as seen by SF during this DisplayFrame's // timeline Fps mRefreshRate; + // The current render rate for this DisplayFrame. + Fps mRenderRate; // TraceCookieCounter is used to obtain the cookie for sendig trace packets to perfetto. // Using a reference here because the counter is owned by FrameTimeline, which outlives // DisplayFrame. @@ -453,7 +461,7 @@ public: int32_t layerId, std::string layerName, std::string debugName, bool isBuffer, GameMode) override; void addSurfaceFrame(std::shared_ptr<frametimeline::SurfaceFrame> surfaceFrame) override; - void setSfWakeUp(int64_t token, nsecs_t wakeupTime, Fps refreshRate) override; + void setSfWakeUp(int64_t token, nsecs_t wakeupTime, Fps refreshRate, Fps renderRate) override; void setSfPresent(nsecs_t sfPresentTime, const std::shared_ptr<FenceTime>& presentFence, const std::shared_ptr<FenceTime>& gpuFence = FenceTime::NO_FENCE) override; void parseArgs(const Vector<String16>& args, std::string& result) override; diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index a73c5115b1..5f90a7f82d 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -787,8 +787,9 @@ void Layer::transferAvailableJankData(const std::deque<sp<CallbackHandle>>& hand if (includeJankData) { std::shared_ptr<frametimeline::SurfaceFrame> surfaceFrame = mPendingJankClassifications.front(); - jankData.emplace_back( - JankData(surfaceFrame->getToken(), surfaceFrame->getJankType().value())); + jankData.emplace_back(JankData(surfaceFrame->getToken(), + surfaceFrame->getJankType().value(), + surfaceFrame->getRenderRate().getPeriodNsecs())); } mPendingJankClassifications.pop_front(); } diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index b7d2f9a053..2583868c6e 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -2487,7 +2487,8 @@ bool SurfaceFlinger::commit(PhysicalDisplayId pacesetterId, { mFrameTimeline->setSfWakeUp(ftl::to_underlying(vsyncId), pacesetterFrameTarget.frameBeginTime().ns(), - Fps::fromPeriodNsecs(vsyncPeriod.ns())); + Fps::fromPeriodNsecs(vsyncPeriod.ns()), + mScheduler->getPacesetterRefreshRate()); const bool flushTransactions = clearTransactionFlags(eTransactionFlushNeeded); bool transactionsAreEmpty; diff --git a/services/surfaceflinger/tests/unittests/FrameTimelineTest.cpp b/services/surfaceflinger/tests/unittests/FrameTimelineTest.cpp index 8911430790..636d852651 100644 --- a/services/surfaceflinger/tests/unittests/FrameTimelineTest.cpp +++ b/services/surfaceflinger/tests/unittests/FrameTimelineTest.cpp @@ -54,6 +54,8 @@ constexpr int32_t sInputEventId = 5; constexpr int32_t sLayerIdOne = 1; constexpr int32_t sLayerIdTwo = 2; constexpr GameMode sGameMode = GameMode::Unsupported; +constexpr Fps RR_11 = Fps::fromPeriodNsecs(11); +constexpr Fps RR_30 = Fps::fromPeriodNsecs(30); class FrameTimelineTest : public testing::Test { public: @@ -276,7 +278,7 @@ TEST_F(FrameTimelineTest, presentFenceSignaled_droppedFramesNotUpdated) { /*isBuffer*/ true, sGameMode); // Set up the display frame - mFrameTimeline->setSfWakeUp(token1, 20, Fps::fromPeriodNsecs(11)); + mFrameTimeline->setSfWakeUp(token1, 20, RR_11, RR_11); surfaceFrame1->setDropTime(12); surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Dropped); mFrameTimeline->addSurfaceFrame(surfaceFrame1); @@ -309,7 +311,7 @@ TEST_F(FrameTimelineTest, presentFenceSignaled_presentedFramesUpdated) { mFrameTimeline->createSurfaceFrameForToken(ftInfo, sPidOne, sUidOne, sLayerIdTwo, sLayerNameTwo, sLayerNameTwo, /*isBuffer*/ true, sGameMode); - mFrameTimeline->setSfWakeUp(sfToken1, 22, Fps::fromPeriodNsecs(11)); + mFrameTimeline->setSfWakeUp(sfToken1, 22, RR_11, RR_11); surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented); mFrameTimeline->addSurfaceFrame(surfaceFrame1); surfaceFrame2->setPresentState(SurfaceFrame::PresentState::Presented); @@ -354,7 +356,7 @@ TEST_F(FrameTimelineTest, displayFramesSlidingWindowMovesAfterLimit) { mFrameTimeline->createSurfaceFrameForToken(ftInfo, sPidOne, sUidOne, sLayerIdOne, sLayerNameOne, sLayerNameOne, /*isBuffer*/ true, sGameMode); - mFrameTimeline->setSfWakeUp(sfToken, 22 + frameTimeFactor, Fps::fromPeriodNsecs(11)); + mFrameTimeline->setSfWakeUp(sfToken, 22 + frameTimeFactor, RR_11, RR_11); surfaceFrame->setPresentState(SurfaceFrame::PresentState::Presented); mFrameTimeline->addSurfaceFrame(surfaceFrame); mFrameTimeline->setSfPresent(27 + frameTimeFactor, presentFence); @@ -379,7 +381,7 @@ TEST_F(FrameTimelineTest, displayFramesSlidingWindowMovesAfterLimit) { mFrameTimeline->createSurfaceFrameForToken(ftInfo, sPidOne, sUidOne, sLayerIdOne, sLayerNameOne, sLayerNameOne, /*isBuffer*/ true, sGameMode); - mFrameTimeline->setSfWakeUp(sfToken, 22 + frameTimeFactor, Fps::fromPeriodNsecs(11)); + mFrameTimeline->setSfWakeUp(sfToken, 22 + frameTimeFactor, RR_11, RR_11); surfaceFrame->setPresentState(SurfaceFrame::PresentState::Presented); mFrameTimeline->addSurfaceFrame(surfaceFrame); mFrameTimeline->setSfPresent(27 + frameTimeFactor, presentFence); @@ -422,7 +424,7 @@ TEST_F(FrameTimelineTest, setMaxDisplayFramesSetsSizeProperly) { sLayerNameOne, sLayerNameOne, /*isBuffer*/ true, sGameMode); int64_t sfToken = mTokenManager->generateTokenForPredictions({22, 26, 30}); - mFrameTimeline->setSfWakeUp(sfToken, 22, Fps::fromPeriodNsecs(11)); + mFrameTimeline->setSfWakeUp(sfToken, 22, RR_11, RR_11); surfaceFrame->setPresentState(SurfaceFrame::PresentState::Presented); mFrameTimeline->addSurfaceFrame(surfaceFrame); mFrameTimeline->setSfPresent(27, presentFence); @@ -439,7 +441,7 @@ TEST_F(FrameTimelineTest, setMaxDisplayFramesSetsSizeProperly) { sLayerNameOne, sLayerNameOne, /*isBuffer*/ true, sGameMode); int64_t sfToken = mTokenManager->generateTokenForPredictions({22, 26, 30}); - mFrameTimeline->setSfWakeUp(sfToken, 22, Fps::fromPeriodNsecs(11)); + mFrameTimeline->setSfWakeUp(sfToken, 22, RR_11, RR_11); surfaceFrame->setPresentState(SurfaceFrame::PresentState::Presented); mFrameTimeline->addSurfaceFrame(surfaceFrame); mFrameTimeline->setSfPresent(27, presentFence); @@ -456,7 +458,7 @@ TEST_F(FrameTimelineTest, setMaxDisplayFramesSetsSizeProperly) { sLayerNameOne, sLayerNameOne, /*isBuffer*/ true, sGameMode); int64_t sfToken = mTokenManager->generateTokenForPredictions({22, 26, 30}); - mFrameTimeline->setSfWakeUp(sfToken, 22, Fps::fromPeriodNsecs(11)); + mFrameTimeline->setSfWakeUp(sfToken, 22, RR_11, RR_11); surfaceFrame->setPresentState(SurfaceFrame::PresentState::Presented); mFrameTimeline->addSurfaceFrame(surfaceFrame); mFrameTimeline->setSfPresent(27, presentFence); @@ -465,7 +467,7 @@ TEST_F(FrameTimelineTest, setMaxDisplayFramesSetsSizeProperly) { } TEST_F(FrameTimelineTest, presentFenceSignaled_invalidSignalTime) { - Fps refreshRate = Fps::fromPeriodNsecs(11); + Fps refreshRate = RR_11; auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE); int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions({10, 20, 60}); @@ -478,7 +480,7 @@ TEST_F(FrameTimelineTest, presentFenceSignaled_invalidSignalTime) { mFrameTimeline->createSurfaceFrameForToken(ftInfo, sPidOne, sUidOne, sLayerIdOne, sLayerNameOne, sLayerNameOne, /*isBuffer*/ true, sGameMode); - mFrameTimeline->setSfWakeUp(sfToken1, 52, refreshRate); + mFrameTimeline->setSfWakeUp(sfToken1, 52, refreshRate, refreshRate); surfaceFrame1->setAcquireFenceTime(20); surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented); mFrameTimeline->addSurfaceFrame(surfaceFrame1); @@ -496,7 +498,7 @@ TEST_F(FrameTimelineTest, presentFenceSignaled_invalidSignalTime) { // Tests related to TimeStats TEST_F(FrameTimelineTest, presentFenceSignaled_doesNotReportForInvalidTokens) { - Fps refreshRate = Fps::fromPeriodNsecs(11); + Fps refreshRate = RR_11; EXPECT_CALL(*mTimeStats, incrementJankyFrames(_)).Times(0); auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE); int64_t surfaceFrameToken1 = -1; @@ -509,7 +511,7 @@ TEST_F(FrameTimelineTest, presentFenceSignaled_doesNotReportForInvalidTokens) { mFrameTimeline->createSurfaceFrameForToken(ftInfo, sPidOne, sUidOne, sLayerIdOne, sLayerNameOne, sLayerNameOne, /*isBuffer*/ true, sGameMode); - mFrameTimeline->setSfWakeUp(sfToken1, 52, refreshRate); + mFrameTimeline->setSfWakeUp(sfToken1, 52, refreshRate, refreshRate); surfaceFrame1->setAcquireFenceTime(20); surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented); mFrameTimeline->addSurfaceFrame(surfaceFrame1); @@ -519,7 +521,7 @@ TEST_F(FrameTimelineTest, presentFenceSignaled_doesNotReportForInvalidTokens) { } TEST_F(FrameTimelineTest, presentFenceSignaled_reportsLongSfCpu) { - Fps refreshRate = Fps::fromPeriodNsecs(11); + Fps refreshRate = RR_11; EXPECT_CALL(*mTimeStats, incrementJankyFrames( TimeStats::JankyFramesInfo{refreshRate, std::nullopt, sUidOne, @@ -537,7 +539,7 @@ TEST_F(FrameTimelineTest, presentFenceSignaled_reportsLongSfCpu) { mFrameTimeline->createSurfaceFrameForToken(ftInfo, sPidOne, sUidOne, sLayerIdOne, sLayerNameOne, sLayerNameOne, /*isBuffer*/ true, sGameMode); - mFrameTimeline->setSfWakeUp(sfToken1, 52, refreshRate); + mFrameTimeline->setSfWakeUp(sfToken1, 52, refreshRate, refreshRate); surfaceFrame1->setAcquireFenceTime(20); surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented); mFrameTimeline->addSurfaceFrame(surfaceFrame1); @@ -547,7 +549,7 @@ TEST_F(FrameTimelineTest, presentFenceSignaled_reportsLongSfCpu) { } TEST_F(FrameTimelineTest, presentFenceSignaled_reportsLongSfGpu) { - Fps refreshRate = Fps::fromPeriodNsecs(11); + Fps refreshRate = RR_11; EXPECT_CALL(*mTimeStats, incrementJankyFrames( TimeStats::JankyFramesInfo{refreshRate, std::nullopt, sUidOne, @@ -566,7 +568,7 @@ TEST_F(FrameTimelineTest, presentFenceSignaled_reportsLongSfGpu) { mFrameTimeline->createSurfaceFrameForToken(ftInfo, sPidOne, sUidOne, sLayerIdOne, sLayerNameOne, sLayerNameOne, /*isBuffer*/ true, sGameMode); - mFrameTimeline->setSfWakeUp(sfToken1, 52, refreshRate); + mFrameTimeline->setSfWakeUp(sfToken1, 52, refreshRate, refreshRate); surfaceFrame1->setAcquireFenceTime(20); surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented); mFrameTimeline->addSurfaceFrame(surfaceFrame1); @@ -577,7 +579,7 @@ TEST_F(FrameTimelineTest, presentFenceSignaled_reportsLongSfGpu) { } TEST_F(FrameTimelineTest, presentFenceSignaled_reportsDisplayMiss) { - Fps refreshRate = Fps::fromPeriodNsecs(30); + Fps refreshRate = RR_30; EXPECT_CALL(*mTimeStats, incrementJankyFrames(TimeStats::JankyFramesInfo{refreshRate, std::nullopt, sUidOne, sLayerNameOne, sGameMode, @@ -594,7 +596,7 @@ TEST_F(FrameTimelineTest, presentFenceSignaled_reportsDisplayMiss) { mFrameTimeline->createSurfaceFrameForToken(ftInfo, sPidOne, sUidOne, sLayerIdOne, sLayerNameOne, sLayerNameOne, /*isBuffer*/ true, sGameMode); - mFrameTimeline->setSfWakeUp(sfToken1, 52, refreshRate); + mFrameTimeline->setSfWakeUp(sfToken1, 52, refreshRate, refreshRate); surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented); surfaceFrame1->setAcquireFenceTime(20); mFrameTimeline->addSurfaceFrame(surfaceFrame1); @@ -622,7 +624,7 @@ TEST_F(FrameTimelineTest, presentFenceSignaled_reportsAppMiss) { sLayerNameOne, sLayerNameOne, /*isBuffer*/ true, sGameMode); surfaceFrame1->setAcquireFenceTime(45); - mFrameTimeline->setSfWakeUp(sfToken1, 52, refreshRate); + mFrameTimeline->setSfWakeUp(sfToken1, 52, refreshRate, refreshRate); surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented); mFrameTimeline->addSurfaceFrame(surfaceFrame1); @@ -651,7 +653,7 @@ TEST_F(FrameTimelineTest, presentFenceSignaled_reportsSfScheduling) { sLayerNameOne, sLayerNameOne, /*isBuffer*/ true, sGameMode); surfaceFrame1->setAcquireFenceTime(50); - mFrameTimeline->setSfWakeUp(sfToken1, 52, refreshRate); + mFrameTimeline->setSfWakeUp(sfToken1, 52, refreshRate, refreshRate); surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented); mFrameTimeline->addSurfaceFrame(surfaceFrame1); @@ -680,7 +682,7 @@ TEST_F(FrameTimelineTest, presentFenceSignaled_reportsSfPredictionError) { sLayerNameOne, sLayerNameOne, /*isBuffer*/ true, sGameMode); surfaceFrame1->setAcquireFenceTime(40); - mFrameTimeline->setSfWakeUp(sfToken1, 52, refreshRate); + mFrameTimeline->setSfWakeUp(sfToken1, 52, refreshRate, refreshRate); surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented); mFrameTimeline->addSurfaceFrame(surfaceFrame1); @@ -709,7 +711,7 @@ TEST_F(FrameTimelineTest, presentFenceSignaled_reportsAppBufferStuffing) { sLayerNameOne, sLayerNameOne, /*isBuffer*/ true, sGameMode); surfaceFrame1->setAcquireFenceTime(40); - mFrameTimeline->setSfWakeUp(sfToken1, 82, refreshRate); + mFrameTimeline->setSfWakeUp(sfToken1, 82, refreshRate, refreshRate); surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented, /*previousLatchTime*/ 56); @@ -721,8 +723,8 @@ TEST_F(FrameTimelineTest, presentFenceSignaled_reportsAppBufferStuffing) { } TEST_F(FrameTimelineTest, presentFenceSignaled_reportsAppMissWithRenderRate) { - Fps refreshRate = Fps::fromPeriodNsecs(11); - Fps renderRate = Fps::fromPeriodNsecs(30); + Fps refreshRate = RR_11; + Fps renderRate = RR_30; EXPECT_CALL(*mTimeStats, incrementJankyFrames(TimeStats::JankyFramesInfo{refreshRate, renderRate, sUidOne, sLayerNameOne, sGameMode, @@ -740,7 +742,7 @@ TEST_F(FrameTimelineTest, presentFenceSignaled_reportsAppMissWithRenderRate) { sLayerNameOne, sLayerNameOne, /*isBuffer*/ true, sGameMode); surfaceFrame1->setAcquireFenceTime(45); - mFrameTimeline->setSfWakeUp(sfToken1, 52, refreshRate); + mFrameTimeline->setSfWakeUp(sfToken1, 52, refreshRate, refreshRate); surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented); surfaceFrame1->setRenderRate(renderRate); @@ -752,8 +754,8 @@ TEST_F(FrameTimelineTest, presentFenceSignaled_reportsAppMissWithRenderRate) { } TEST_F(FrameTimelineTest, presentFenceSignaled_displayFramePredictionExpiredPresentsSurfaceFrame) { - Fps refreshRate = Fps::fromPeriodNsecs(11); - Fps renderRate = Fps::fromPeriodNsecs(30); + Fps refreshRate = RR_11; + Fps renderRate = RR_30; EXPECT_CALL(*mTimeStats, incrementJankyFrames( @@ -775,7 +777,7 @@ TEST_F(FrameTimelineTest, presentFenceSignaled_displayFramePredictionExpiredPres surfaceFrame1->setAcquireFenceTime(45); // Trigger a prediction expiry flushTokens(); - mFrameTimeline->setSfWakeUp(sfToken1, 52, refreshRate); + mFrameTimeline->setSfWakeUp(sfToken1, 52, refreshRate, refreshRate); surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented); surfaceFrame1->setRenderRate(renderRate); @@ -814,7 +816,7 @@ TEST_F(FrameTimelineTest, tracing_noPacketsSentWithoutTraceStart) { /*isBuffer*/ true, sGameMode); // Set up the display frame - mFrameTimeline->setSfWakeUp(token1, 20, Fps::fromPeriodNsecs(11)); + mFrameTimeline->setSfWakeUp(token1, 20, RR_11, RR_11); surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Dropped); mFrameTimeline->addSurfaceFrame(surfaceFrame1); mFrameTimeline->setSfPresent(25, presentFence1); @@ -844,7 +846,7 @@ TEST_F(FrameTimelineTest, tracing_sanityTest) { /*isBuffer*/ true, sGameMode); // Set up the display frame - mFrameTimeline->setSfWakeUp(token2, 20, Fps::fromPeriodNsecs(11)); + mFrameTimeline->setSfWakeUp(token2, 20, RR_11, RR_11); surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented); mFrameTimeline->addSurfaceFrame(surfaceFrame1); mFrameTimeline->setSfPresent(25, presentFence1); @@ -866,7 +868,7 @@ TEST_F(FrameTimelineTest, traceDisplayFrame_invalidTokenDoesNotEmitTracePacket) tracingSession->StartBlocking(); // Set up the display frame - mFrameTimeline->setSfWakeUp(-1, 20, Fps::fromPeriodNsecs(11)); + mFrameTimeline->setSfWakeUp(-1, 20, RR_11, RR_11); mFrameTimeline->setSfPresent(25, presentFence1); presentFence1->signalForTest(30); @@ -890,7 +892,7 @@ TEST_F(FrameTimelineTest, traceSurfaceFrame_invalidTokenDoesNotEmitTracePacket) /*isBuffer*/ true, sGameMode); // Set up the display frame - mFrameTimeline->setSfWakeUp(token1, 20, Fps::fromPeriodNsecs(11)); + mFrameTimeline->setSfWakeUp(token1, 20, RR_11, RR_11); surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Dropped); mFrameTimeline->addSurfaceFrame(surfaceFrame1); mFrameTimeline->setSfPresent(25, presentFence1); @@ -1068,7 +1070,7 @@ TEST_F(FrameTimelineTest, traceDisplayFrame_emitsValidTracePacket) { int64_t displayFrameToken1 = mTokenManager->generateTokenForPredictions({10, 30, 30}); // Set up the display frame - mFrameTimeline->setSfWakeUp(displayFrameToken1, 20, Fps::fromPeriodNsecs(11)); + mFrameTimeline->setSfWakeUp(displayFrameToken1, 20, RR_11, RR_11); mFrameTimeline->setSfPresent(26, presentFence1); presentFence1->signalForTest(31); @@ -1150,7 +1152,7 @@ TEST_F(FrameTimelineTest, traceDisplayFrame_predictionExpiredDoesNotTraceExpecte addEmptySurfaceFrame(); // Set up the display frame - mFrameTimeline->setSfWakeUp(displayFrameToken1, 20, Fps::fromPeriodNsecs(11)); + mFrameTimeline->setSfWakeUp(displayFrameToken1, 20, RR_11, RR_11); mFrameTimeline->setSfPresent(26, presentFence1); presentFence1->signalForTest(31); @@ -1252,7 +1254,7 @@ TEST_F(FrameTimelineTest, traceSurfaceFrame_emitsValidTracePacket) { auto protoPresentedSurfaceFrameActualEnd = createProtoFrameEnd(traceCookie + 4); // Set up the display frame - mFrameTimeline->setSfWakeUp(displayFrameToken1, 20, Fps::fromPeriodNsecs(11)); + mFrameTimeline->setSfWakeUp(displayFrameToken1, 20, RR_11, RR_11); surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Dropped); surfaceFrame2->setPresentState(SurfaceFrame::PresentState::Presented); mFrameTimeline->addSurfaceFrame(surfaceFrame1); @@ -1398,7 +1400,7 @@ TEST_F(FrameTimelineTest, traceSurfaceFrame_predictionExpiredIsAppMissedDeadline auto protoActualSurfaceFrameEnd = createProtoFrameEnd(traceCookie + 1); // Set up the display frame - mFrameTimeline->setSfWakeUp(displayFrameToken, sfStartTime, Fps::fromPeriodNsecs(11)); + mFrameTimeline->setSfWakeUp(displayFrameToken, sfStartTime, RR_11, RR_11); surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented); mFrameTimeline->addSurfaceFrame(surfaceFrame1); mFrameTimeline->setSfPresent(sfEndTime, presentFence1); @@ -1475,7 +1477,7 @@ TEST_F(FrameTimelineTest, traceSurfaceFrame_predictionExpiredDroppedFramesTraced auto protoActualSurfaceFrameEnd = createProtoFrameEnd(traceCookie + 1); // Set up the display frame - mFrameTimeline->setSfWakeUp(displayFrameToken, sfStartTime, Fps::fromPeriodNsecs(11)); + mFrameTimeline->setSfWakeUp(displayFrameToken, sfStartTime, RR_11, RR_11); surfaceFrame1->setDropTime(sfStartTime); surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Dropped); mFrameTimeline->addSurfaceFrame(surfaceFrame1); @@ -1528,7 +1530,7 @@ TEST_F(FrameTimelineTest, jankClassification_presentOnTimeDoesNotClassify) { mFrameTimeline->createSurfaceFrameForToken(ftInfo, sPidOne, sUidOne, sLayerIdOne, sLayerNameOne, sLayerNameOne, /*isBuffer*/ true, sGameMode); - mFrameTimeline->setSfWakeUp(sfToken1, 22, Fps::fromPeriodNsecs(11)); + mFrameTimeline->setSfWakeUp(sfToken1, 22, RR_11, RR_11); surfaceFrame->setPresentState(SurfaceFrame::PresentState::Presented); mFrameTimeline->addSurfaceFrame(surfaceFrame); mFrameTimeline->setSfPresent(26, presentFence1); @@ -1552,11 +1554,11 @@ TEST_F(FrameTimelineTest, jankClassification_presentOnTimeDoesNotClassify) { } TEST_F(FrameTimelineTest, jankClassification_displayFrameOnTimeFinishEarlyPresent) { - Fps vsyncRate = Fps::fromPeriodNsecs(11); + Fps vsyncRate = RR_11; auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE); int64_t sfToken1 = mTokenManager->generateTokenForPredictions({22, 30, 40}); int64_t sfToken2 = mTokenManager->generateTokenForPredictions({52, 60, 70}); - mFrameTimeline->setSfWakeUp(sfToken1, 22, vsyncRate); + mFrameTimeline->setSfWakeUp(sfToken1, 22, vsyncRate, vsyncRate); mFrameTimeline->setSfPresent(26, presentFence1); auto displayFrame = getDisplayFrame(0); presentFence1->signalForTest(30); @@ -1566,7 +1568,7 @@ TEST_F(FrameTimelineTest, jankClassification_displayFrameOnTimeFinishEarlyPresen // Trigger a flush by finalizing the next DisplayFrame auto presentFence2 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE); - mFrameTimeline->setSfWakeUp(sfToken2, 52, vsyncRate); + mFrameTimeline->setSfWakeUp(sfToken2, 52, vsyncRate, vsyncRate); mFrameTimeline->setSfPresent(56, presentFence2); displayFrame = getDisplayFrame(0); @@ -1591,11 +1593,11 @@ TEST_F(FrameTimelineTest, jankClassification_displayFrameOnTimeFinishEarlyPresen } TEST_F(FrameTimelineTest, jankClassification_displayFrameOnTimeFinishLatePresent) { - Fps vsyncRate = Fps::fromPeriodNsecs(11); + Fps vsyncRate = RR_11; auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE); int64_t sfToken1 = mTokenManager->generateTokenForPredictions({22, 30, 40}); int64_t sfToken2 = mTokenManager->generateTokenForPredictions({52, 60, 70}); - mFrameTimeline->setSfWakeUp(sfToken1, 22, vsyncRate); + mFrameTimeline->setSfWakeUp(sfToken1, 22, vsyncRate, vsyncRate); mFrameTimeline->setSfPresent(26, presentFence1); auto displayFrame = getDisplayFrame(0); presentFence1->signalForTest(50); @@ -1605,7 +1607,7 @@ TEST_F(FrameTimelineTest, jankClassification_displayFrameOnTimeFinishLatePresent // Trigger a flush by finalizing the next DisplayFrame auto presentFence2 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE); - mFrameTimeline->setSfWakeUp(sfToken2, 52, vsyncRate); + mFrameTimeline->setSfWakeUp(sfToken2, 52, vsyncRate, vsyncRate); mFrameTimeline->setSfPresent(56, presentFence2); displayFrame = getDisplayFrame(0); @@ -1633,7 +1635,7 @@ TEST_F(FrameTimelineTest, jankClassification_displayFrameOnTimeFinishLatePresent TEST_F(FrameTimelineTest, jankClassification_displayFrameLateFinishEarlyPresent) { auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE); int64_t sfToken1 = mTokenManager->generateTokenForPredictions({12, 18, 40}); - mFrameTimeline->setSfWakeUp(sfToken1, 12, Fps::fromPeriodNsecs(11)); + mFrameTimeline->setSfWakeUp(sfToken1, 12, RR_11, RR_11); mFrameTimeline->setSfPresent(22, presentFence1); auto displayFrame = getDisplayFrame(0); @@ -1673,7 +1675,7 @@ TEST_F(FrameTimelineTest, jankClassification_displayFrameLateFinishLatePresent) int64_t sfToken4 = mTokenManager->generateTokenForPredictions({112, 120, 120}); // case 1 - cpu time = 33 - 12 = 21, vsync period = 11 - mFrameTimeline->setSfWakeUp(sfToken1, 12, Fps::fromPeriodNsecs(11)); + mFrameTimeline->setSfWakeUp(sfToken1, 12, RR_11, RR_11); mFrameTimeline->setSfPresent(33, presentFence1, gpuFence1); auto displayFrame0 = getDisplayFrame(0); gpuFence1->signalForTest(36); @@ -1683,7 +1685,7 @@ TEST_F(FrameTimelineTest, jankClassification_displayFrameLateFinishLatePresent) EXPECT_EQ(displayFrame0->getActuals().presentTime, 0); // case 2 - cpu time = 56 - 52 = 4, vsync period = 30 - mFrameTimeline->setSfWakeUp(sfToken2, 52, Fps::fromPeriodNsecs(30)); + mFrameTimeline->setSfWakeUp(sfToken2, 52, RR_30, RR_30); mFrameTimeline->setSfPresent(56, presentFence2, gpuFence2); auto displayFrame1 = getDisplayFrame(1); gpuFence2->signalForTest(76); @@ -1697,7 +1699,7 @@ TEST_F(FrameTimelineTest, jankClassification_displayFrameLateFinishLatePresent) EXPECT_EQ(displayFrame0->getJankType(), JankType::SurfaceFlingerGpuDeadlineMissed); // case 3 - cpu time = 86 - 82 = 4, vsync period = 30 - mFrameTimeline->setSfWakeUp(sfToken3, 106, Fps::fromPeriodNsecs(30)); + mFrameTimeline->setSfWakeUp(sfToken3, 106, RR_30, RR_30); mFrameTimeline->setSfPresent(112, presentFence3, gpuFence3); auto displayFrame2 = getDisplayFrame(2); gpuFence3->signalForTest(116); @@ -1711,7 +1713,7 @@ TEST_F(FrameTimelineTest, jankClassification_displayFrameLateFinishLatePresent) EXPECT_EQ(displayFrame1->getJankType(), JankType::SurfaceFlingerGpuDeadlineMissed); // case 4 - cpu time = 86 - 82 = 4, vsync period = 30 - mFrameTimeline->setSfWakeUp(sfToken4, 120, Fps::fromPeriodNsecs(30)); + mFrameTimeline->setSfWakeUp(sfToken4, 120, RR_30, RR_30); mFrameTimeline->setSfPresent(140, presentFence4, gpuFence4); auto displayFrame3 = getDisplayFrame(3); gpuFence4->signalForTest(156); @@ -1748,7 +1750,7 @@ TEST_F(FrameTimelineTest, jankClassification_surfaceFrameOnTimeFinishEarlyPresen sLayerNameOne, sLayerNameOne, /*isBuffer*/ true, sGameMode); surfaceFrame1->setAcquireFenceTime(16); - mFrameTimeline->setSfWakeUp(sfToken1, 22, Fps::fromPeriodNsecs(11)); + mFrameTimeline->setSfWakeUp(sfToken1, 22, RR_11, RR_11); surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented); mFrameTimeline->addSurfaceFrame(surfaceFrame1); mFrameTimeline->setSfPresent(27, presentFence1); @@ -1771,7 +1773,7 @@ TEST_F(FrameTimelineTest, jankClassification_surfaceFrameOnTimeFinishEarlyPresen sLayerNameOne, sLayerNameOne, /*isBuffer*/ true, sGameMode); surfaceFrame2->setAcquireFenceTime(36); - mFrameTimeline->setSfWakeUp(sfToken2, 52, Fps::fromPeriodNsecs(11)); + mFrameTimeline->setSfWakeUp(sfToken2, 52, RR_11, RR_11); surfaceFrame2->setPresentState(SurfaceFrame::PresentState::Presented); mFrameTimeline->addSurfaceFrame(surfaceFrame2); mFrameTimeline->setSfPresent(57, presentFence2); @@ -1799,10 +1801,10 @@ TEST_F(FrameTimelineTest, jankClassification_surfaceFrameOnTimeFinishEarlyPresen ::testing::Mock::VerifyAndClearExpectations(mTimeStats.get()); EXPECT_CALL(*mTimeStats, - incrementJankyFrames( - TimeStats::JankyFramesInfo{Fps::fromPeriodNsecs(11), std::nullopt, sUidOne, - sLayerNameOne, sGameMode, - JankType::PredictionError, -3, 5, 0})); + incrementJankyFrames(TimeStats::JankyFramesInfo{RR_11, std::nullopt, sUidOne, + sLayerNameOne, sGameMode, + JankType::PredictionError, -3, 5, + 0})); addEmptyDisplayFrame(); @@ -1834,7 +1836,7 @@ TEST_F(FrameTimelineTest, jankClassification_surfaceFrameOnTimeFinishLatePresent sLayerNameOne, sLayerNameOne, /*isBuffer*/ true, sGameMode); surfaceFrame1->setAcquireFenceTime(16); - mFrameTimeline->setSfWakeUp(sfToken1, 22, Fps::fromPeriodNsecs(11)); + mFrameTimeline->setSfWakeUp(sfToken1, 22, RR_11, RR_11); surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented); mFrameTimeline->addSurfaceFrame(surfaceFrame1); mFrameTimeline->setSfPresent(26, presentFence1); @@ -1857,7 +1859,7 @@ TEST_F(FrameTimelineTest, jankClassification_surfaceFrameOnTimeFinishLatePresent sLayerNameOne, sLayerNameOne, /*isBuffer*/ true, sGameMode); surfaceFrame2->setAcquireFenceTime(36); - mFrameTimeline->setSfWakeUp(sfToken2, 52, Fps::fromPeriodNsecs(11)); + mFrameTimeline->setSfWakeUp(sfToken2, 52, RR_11, RR_11); surfaceFrame2->setPresentState(SurfaceFrame::PresentState::Presented); mFrameTimeline->addSurfaceFrame(surfaceFrame2); mFrameTimeline->setSfPresent(57, presentFence2); @@ -1885,10 +1887,10 @@ TEST_F(FrameTimelineTest, jankClassification_surfaceFrameOnTimeFinishLatePresent ::testing::Mock::VerifyAndClearExpectations(mTimeStats.get()); EXPECT_CALL(*mTimeStats, - incrementJankyFrames( - TimeStats::JankyFramesInfo{Fps::fromPeriodNsecs(11), std::nullopt, sUidOne, - sLayerNameOne, sGameMode, - JankType::PredictionError, -3, 5, 0})); + incrementJankyFrames(TimeStats::JankyFramesInfo{RR_11, std::nullopt, sUidOne, + sLayerNameOne, sGameMode, + JankType::PredictionError, -3, 5, + 0})); addEmptyDisplayFrame(); @@ -1919,7 +1921,7 @@ TEST_F(FrameTimelineTest, jankClassification_surfaceFrameLateFinishEarlyPresent) sLayerNameOne, sLayerNameOne, /*isBuffer*/ true, sGameMode); surfaceFrame1->setAcquireFenceTime(40); - mFrameTimeline->setSfWakeUp(sfToken1, 42, Fps::fromPeriodNsecs(11)); + mFrameTimeline->setSfWakeUp(sfToken1, 42, RR_11, RR_11); surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented); mFrameTimeline->addSurfaceFrame(surfaceFrame1); mFrameTimeline->setSfPresent(46, presentFence1); @@ -1966,7 +1968,7 @@ TEST_F(FrameTimelineTest, jankClassification_surfaceFrameLateFinishLatePresent) sLayerNameOne, sLayerNameOne, /*isBuffer*/ true, sGameMode); surfaceFrame1->setAcquireFenceTime(26); - mFrameTimeline->setSfWakeUp(sfToken1, 32, Fps::fromPeriodNsecs(11)); + mFrameTimeline->setSfWakeUp(sfToken1, 32, RR_11, RR_11); surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented); mFrameTimeline->addSurfaceFrame(surfaceFrame1); mFrameTimeline->setSfPresent(36, presentFence1); @@ -1989,7 +1991,7 @@ TEST_F(FrameTimelineTest, jankClassification_surfaceFrameLateFinishLatePresent) sLayerNameOne, sLayerNameOne, /*isBuffer*/ true, sGameMode); surfaceFrame2->setAcquireFenceTime(40); - mFrameTimeline->setSfWakeUp(sfToken2, 43, Fps::fromPeriodNsecs(11)); + mFrameTimeline->setSfWakeUp(sfToken2, 43, RR_11, RR_11); surfaceFrame2->setPresentState(SurfaceFrame::PresentState::Presented); mFrameTimeline->addSurfaceFrame(surfaceFrame2); mFrameTimeline->setSfPresent(56, presentFence2); @@ -2047,7 +2049,7 @@ TEST_F(FrameTimelineTest, jankClassification_multiJankBufferStuffingAndAppDeadli sLayerNameOne, sLayerNameOne, /*isBuffer*/ true, sGameMode); surfaceFrame1->setAcquireFenceTime(50); - mFrameTimeline->setSfWakeUp(sfToken1, 52, Fps::fromPeriodNsecs(30)); + mFrameTimeline->setSfWakeUp(sfToken1, 52, RR_30, RR_30); surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented); mFrameTimeline->addSurfaceFrame(surfaceFrame1); mFrameTimeline->setSfPresent(56, presentFence1); @@ -2070,7 +2072,7 @@ TEST_F(FrameTimelineTest, jankClassification_multiJankBufferStuffingAndAppDeadli sLayerNameOne, sLayerNameOne, /*isBuffer*/ true, sGameMode); surfaceFrame2->setAcquireFenceTime(84); - mFrameTimeline->setSfWakeUp(sfToken2, 112, Fps::fromPeriodNsecs(30)); + mFrameTimeline->setSfWakeUp(sfToken2, 112, RR_30, RR_30); surfaceFrame2->setPresentState(SurfaceFrame::PresentState::Presented, 54); mFrameTimeline->addSurfaceFrame(surfaceFrame2); mFrameTimeline->setSfPresent(116, presentFence2); @@ -2131,7 +2133,7 @@ TEST_F(FrameTimelineTest, jankClassification_appDeadlineAdjustedForBufferStuffin sLayerNameOne, sLayerNameOne, /*isBuffer*/ true, sGameMode); surfaceFrame1->setAcquireFenceTime(50); - mFrameTimeline->setSfWakeUp(sfToken1, 52, Fps::fromPeriodNsecs(30)); + mFrameTimeline->setSfWakeUp(sfToken1, 52, RR_30, RR_30); surfaceFrame1->setPresentState(SurfaceFrame::PresentState::Presented); mFrameTimeline->addSurfaceFrame(surfaceFrame1); mFrameTimeline->setSfPresent(56, presentFence1); @@ -2154,7 +2156,7 @@ TEST_F(FrameTimelineTest, jankClassification_appDeadlineAdjustedForBufferStuffin sLayerNameOne, sLayerNameOne, /*isBuffer*/ true, sGameMode); surfaceFrame2->setAcquireFenceTime(80); - mFrameTimeline->setSfWakeUp(sfToken2, 82, Fps::fromPeriodNsecs(30)); + mFrameTimeline->setSfWakeUp(sfToken2, 82, RR_30, RR_30); // Setting previous latch time to 54, adjusted deadline will be 54 + vsyncTime(30) = 84 surfaceFrame2->setPresentState(SurfaceFrame::PresentState::Presented, 54); mFrameTimeline->addSurfaceFrame(surfaceFrame2); @@ -2206,7 +2208,7 @@ TEST_F(FrameTimelineTest, jankClassification_displayFrameLateFinishLatePresent_G int64_t sfToken2 = mTokenManager->generateTokenForPredictions({52, 60, 60}); // Case 1: cpu time = 33 - 12 = 21, vsync period = 11 - mFrameTimeline->setSfWakeUp(sfToken1, 12, Fps::fromPeriodNsecs(11)); + mFrameTimeline->setSfWakeUp(sfToken1, 12, RR_11, RR_11); mFrameTimeline->setSfPresent(33, presentFence1, gpuFence1); auto displayFrame = getDisplayFrame(0); gpuFence1->signalForTest(36); @@ -2225,7 +2227,7 @@ TEST_F(FrameTimelineTest, jankClassification_displayFrameLateFinishLatePresent_G EXPECT_EQ(displayFrame->getJankType(), JankType::SurfaceFlingerGpuDeadlineMissed); // Case 2: No GPU fence so it will not use GPU composition. - mFrameTimeline->setSfWakeUp(sfToken2, 52, Fps::fromPeriodNsecs(30)); + mFrameTimeline->setSfWakeUp(sfToken2, 52, RR_30, RR_30); mFrameTimeline->setSfPresent(66, presentFence2); auto displayFrame2 = getDisplayFrame(2); // 2 because of previous empty frame presentFence2->signalForTest(90); @@ -2250,13 +2252,13 @@ TEST_F(FrameTimelineTest, jankClassification_presentFenceError) { int64_t sfToken2 = mTokenManager->generateTokenForPredictions({52, 60, 60}); int64_t sfToken3 = mTokenManager->generateTokenForPredictions({72, 80, 80}); - mFrameTimeline->setSfWakeUp(sfToken1, 22, Fps::fromPeriodNsecs(11)); + mFrameTimeline->setSfWakeUp(sfToken1, 22, RR_11, RR_11); mFrameTimeline->setSfPresent(26, erroneousPresentFence1); - mFrameTimeline->setSfWakeUp(sfToken2, 52, Fps::fromPeriodNsecs(11)); + mFrameTimeline->setSfWakeUp(sfToken2, 52, RR_11, RR_11); mFrameTimeline->setSfPresent(60, erroneousPresentFence2); - mFrameTimeline->setSfWakeUp(sfToken3, 72, Fps::fromPeriodNsecs(11)); + mFrameTimeline->setSfWakeUp(sfToken3, 72, RR_11, RR_11); mFrameTimeline->setSfPresent(80, validPresentFence); erroneousPresentFence2->signalForTest(2); @@ -2479,4 +2481,44 @@ TEST_F(FrameTimelineTest, getMinTime) { mFrameTimeline->setSfPresent(50, presentFence); ASSERT_EQ(surfaceFrame->getBaseTime(), 50); } + +TEST_F(FrameTimelineTest, surfaceFrameRenderRateUsingDisplayRate) { + auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE); + int64_t token1 = mTokenManager->generateTokenForPredictions({10, 20, 30}); + FrameTimelineInfo ftInfo; + ftInfo.vsyncId = token1; + ftInfo.inputEventId = sInputEventId; + auto surfaceFrame = + mFrameTimeline->createSurfaceFrameForToken(ftInfo, sPidOne, sUidOne, sLayerIdOne, + sLayerNameOne, sLayerNameOne, + /*isBuffer*/ true, sGameMode); + + mFrameTimeline->setSfWakeUp(token1, 20, RR_30, RR_11); + surfaceFrame->setPresentState(SurfaceFrame::PresentState::Presented); + mFrameTimeline->addSurfaceFrame(surfaceFrame); + presentFence1->signalForTest(std::chrono::nanoseconds(50ns).count()); + mFrameTimeline->setSfPresent(50, presentFence1); + + EXPECT_EQ(surfaceFrame->getRenderRate().getPeriodNsecs(), 11); +} + +TEST_F(FrameTimelineTest, surfaceFrameRenderRateUsingAppFrameRate) { + auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE); + int64_t token1 = mTokenManager->generateTokenForPredictions({10, 20, 30}); + FrameTimelineInfo ftInfo; + ftInfo.vsyncId = token1; + ftInfo.inputEventId = sInputEventId; + auto surfaceFrame = + mFrameTimeline->createSurfaceFrameForToken(ftInfo, sPidOne, sUidOne, sLayerIdOne, + sLayerNameOne, sLayerNameOne, + /*isBuffer*/ true, sGameMode); + surfaceFrame->setRenderRate(RR_30); + mFrameTimeline->setSfWakeUp(token1, 20, RR_11, RR_11); + surfaceFrame->setPresentState(SurfaceFrame::PresentState::Presented); + mFrameTimeline->addSurfaceFrame(surfaceFrame); + presentFence1->signalForTest(std::chrono::nanoseconds(50ns).count()); + mFrameTimeline->setSfPresent(50, presentFence1); + + EXPECT_EQ(surfaceFrame->getRenderRate().getPeriodNsecs(), 30); +} } // namespace android::frametimeline diff --git a/services/surfaceflinger/tests/unittests/TransactionSurfaceFrameTest.cpp b/services/surfaceflinger/tests/unittests/TransactionSurfaceFrameTest.cpp index caa265fcd9..5046a86304 100644 --- a/services/surfaceflinger/tests/unittests/TransactionSurfaceFrameTest.cpp +++ b/services/surfaceflinger/tests/unittests/TransactionSurfaceFrameTest.cpp @@ -347,7 +347,7 @@ public: // Both the droppedSurfaceFrame and presentedSurfaceFrame should be in // pendingJankClassifications. EXPECT_EQ(2u, layer->mPendingJankClassifications.size()); - presentedSurfaceFrame->onPresent(20, JankType::None, 90_Hz, + presentedSurfaceFrame->onPresent(20, JankType::None, 90_Hz, 90_Hz, /*displayDeadlineDelta*/ 0, /*displayPresentDelta*/ 0); layer->releasePendingBuffer(25); @@ -484,10 +484,10 @@ public: // BufferlessSurfaceFrames are immediately set to presented and added to the DisplayFrame. // Since we don't have access to DisplayFrame here, trigger an onPresent directly. for (auto& surfaceFrame : bufferlessSurfaceFrames) { - surfaceFrame->onPresent(20, JankType::None, 90_Hz, + surfaceFrame->onPresent(20, JankType::None, 90_Hz, 90_Hz, /*displayDeadlineDelta*/ 0, /*displayPresentDelta*/ 0); } - presentedBufferSurfaceFrame->onPresent(20, JankType::None, 90_Hz, + presentedBufferSurfaceFrame->onPresent(20, JankType::None, 90_Hz, 90_Hz, /*displayDeadlineDelta*/ 0, /*displayPresentDelta*/ 0); diff --git a/services/surfaceflinger/tests/unittests/mock/MockFrameTimeline.h b/services/surfaceflinger/tests/unittests/mock/MockFrameTimeline.h index 5dc48c3703..3f2a917ddc 100644 --- a/services/surfaceflinger/tests/unittests/mock/MockFrameTimeline.h +++ b/services/surfaceflinger/tests/unittests/mock/MockFrameTimeline.h @@ -31,7 +31,7 @@ public: MOCK_METHOD0(onBootFinished, void()); MOCK_METHOD1(addSurfaceFrame, void(std::shared_ptr<frametimeline::SurfaceFrame>)); - MOCK_METHOD3(setSfWakeUp, void(int64_t, nsecs_t, Fps)); + MOCK_METHOD4(setSfWakeUp, void(int64_t, nsecs_t, Fps, Fps)); MOCK_METHOD3(setSfPresent, void(nsecs_t, const std::shared_ptr<FenceTime>&, const std::shared_ptr<FenceTime>&)); |