Include the frame's expected duration in the jank data.
Bug: b/261839034
Test: atest libsurfaceflinger_unittest
Change-Id: I65c85be8825e36671612a47000261c04f0289551
diff --git a/libs/gui/ITransactionCompletedListener.cpp b/libs/gui/ITransactionCompletedListener.cpp
index ffe79a3..29d64af 100644
--- a/libs/gui/ITransactionCompletedListener.cpp
+++ b/libs/gui/ITransactionCompletedListener.cpp
@@ -111,12 +111,14 @@
status_t JankData::writeToParcel(Parcel* output) const {
SAFE_PARCEL(output->writeInt64, frameVsyncId);
SAFE_PARCEL(output->writeInt32, jankType);
+ SAFE_PARCEL(output->writeInt64, frameIntervalNs);
return NO_ERROR;
}
status_t JankData::readFromParcel(const Parcel* input) {
SAFE_PARCEL(input->readInt64, &frameVsyncId);
SAFE_PARCEL(input->readInt32, &jankType);
+ SAFE_PARCEL(input->readInt64, &frameIntervalNs);
return NO_ERROR;
}
diff --git a/libs/gui/include/gui/ITransactionCompletedListener.h b/libs/gui/include/gui/ITransactionCompletedListener.h
index 39bcb4a..364a57b 100644
--- a/libs/gui/include/gui/ITransactionCompletedListener.h
+++ b/libs/gui/include/gui/ITransactionCompletedListener.h
@@ -120,14 +120,17 @@
status_t readFromParcel(const Parcel* input) override;
JankData();
- JankData(int64_t frameVsyncId, int32_t jankType)
- : frameVsyncId(frameVsyncId), jankType(jankType) {}
+ JankData(int64_t frameVsyncId, int32_t jankType, nsecs_t frameIntervalNs)
+ : frameVsyncId(frameVsyncId), jankType(jankType), frameIntervalNs(frameIntervalNs) {}
// Identifier for the frame submitted with Transaction.setFrameTimelineVsyncId
int64_t frameVsyncId;
// Bitmask of janks that occurred
int32_t jankType;
+
+ // Expected duration of the frame
+ nsecs_t frameIntervalNs;
};
class SurfaceStats : public Parcelable {
diff --git a/services/surfaceflinger/FrameTimeline/FrameTimeline.cpp b/services/surfaceflinger/FrameTimeline/FrameTimeline.cpp
index dcc29b9..1b1307b 100644
--- a/services/surfaceflinger/FrameTimeline/FrameTimeline.cpp
+++ b/services/surfaceflinger/FrameTimeline/FrameTimeline.cpp
@@ -366,6 +366,11 @@
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::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 @@
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 @@
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 @@
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 d54d22d..538ea12 100644
--- a/services/surfaceflinger/FrameTimeline/FrameTimeline.h
+++ b/services/surfaceflinger/FrameTimeline/FrameTimeline.h
@@ -183,6 +183,8 @@
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 @@
// 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 @@
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 @@
// 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 @@
// 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 @@
// 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 @@
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 a73c511..5f90a7f 100644
--- a/services/surfaceflinger/Layer.cpp
+++ b/services/surfaceflinger/Layer.cpp
@@ -787,8 +787,9 @@
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 b7d2f9a..2583868 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -2487,7 +2487,8 @@
{
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 8911430..636d852 100644
--- a/services/surfaceflinger/tests/unittests/FrameTimelineTest.cpp
+++ b/services/surfaceflinger/tests/unittests/FrameTimelineTest.cpp
@@ -54,6 +54,8 @@
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 @@
/*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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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, 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 @@
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 @@
// 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 @@
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_reportsLongSfCpu) {
- Fps refreshRate = Fps::fromPeriodNsecs(11);
+ Fps refreshRate = RR_11;
EXPECT_CALL(*mTimeStats,
incrementJankyFrames(
TimeStats::JankyFramesInfo{refreshRate, std::nullopt, sUidOne,
@@ -537,7 +539,7 @@
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_reportsLongSfGpu) {
- Fps refreshRate = Fps::fromPeriodNsecs(11);
+ Fps refreshRate = RR_11;
EXPECT_CALL(*mTimeStats,
incrementJankyFrames(
TimeStats::JankyFramesInfo{refreshRate, std::nullopt, sUidOne,
@@ -566,7 +568,7 @@
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_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 @@
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 @@
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 @@
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 @@
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 @@
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_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 @@
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_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 @@
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 @@
/*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 @@
/*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 @@
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 @@
/*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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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_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 @@
// 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_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 @@
// 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_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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
::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 @@
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 @@
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 @@
::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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 caa265f..5046a86 100644
--- a/services/surfaceflinger/tests/unittests/TransactionSurfaceFrameTest.cpp
+++ b/services/surfaceflinger/tests/unittests/TransactionSurfaceFrameTest.cpp
@@ -347,7 +347,7 @@
// 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 @@
// 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 5dc48c3..3f2a917 100644
--- a/services/surfaceflinger/tests/unittests/mock/MockFrameTimeline.h
+++ b/services/surfaceflinger/tests/unittests/mock/MockFrameTimeline.h
@@ -31,7 +31,7 @@
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>&));