Loading services/surfaceflinger/FrameTimeline/FrameTimeline.cpp +3 −7 Original line number Original line Diff line number Diff line Loading @@ -575,16 +575,12 @@ void SurfaceFrame::classifyJankLocked(int32_t displayFrameJankType, const Fps& r } } } else if (mFrameReadyMetadata == FrameReadyMetadata::LateFinish) { } else if (mFrameReadyMetadata == FrameReadyMetadata::LateFinish) { // Finish late, Present late // Finish late, Present late if (displayFrameJankType == JankType::None) { // Display frame is not janky, so purely app's fault mJankType |= JankType::AppDeadlineMissed; mJankType |= JankType::AppDeadlineMissed; } else { // Propagate DisplayFrame's jankType if it is janky // Propagate DisplayFrame's jankType if it is janky mJankType |= displayFrameJankType; mJankType |= displayFrameJankType; } } } } } } } void SurfaceFrame::onPresent(nsecs_t presentTime, int32_t displayFrameJankType, Fps refreshRate, void SurfaceFrame::onPresent(nsecs_t presentTime, int32_t displayFrameJankType, Fps refreshRate, nsecs_t displayDeadlineDelta, nsecs_t displayPresentDelta) { nsecs_t displayDeadlineDelta, nsecs_t displayPresentDelta) { Loading services/surfaceflinger/tests/unittests/FrameTimelineTest.cpp +9 −7 Original line number Original line Diff line number Diff line Loading @@ -668,8 +668,9 @@ TEST_F(FrameTimelineTest, presentFenceSignaled_displayFramePredictionExpiredPres Fps renderRate = Fps::fromPeriodNsecs(30); Fps renderRate = Fps::fromPeriodNsecs(30); EXPECT_CALL(*mTimeStats, EXPECT_CALL(*mTimeStats, incrementJankyFrames(TimeStats::JankyFramesInfo{refreshRate, renderRate, sUidOne, incrementJankyFrames( sLayerNameOne, JankType::Unknown, TimeStats::JankyFramesInfo{refreshRate, renderRate, sUidOne, sLayerNameOne, JankType::Unknown | JankType::AppDeadlineMissed, -1, -1, 25})); -1, -1, 25})); auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE); auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE); int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions({10, 20, 60}); int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions({10, 20, 60}); Loading Loading @@ -697,7 +698,7 @@ TEST_F(FrameTimelineTest, presentFenceSignaled_displayFramePredictionExpiredPres EXPECT_EQ(displayFrame->getFramePresentMetadata(), FramePresentMetadata::UnknownPresent); EXPECT_EQ(displayFrame->getFramePresentMetadata(), FramePresentMetadata::UnknownPresent); EXPECT_EQ(surfaceFrame1->getActuals().presentTime, 90); EXPECT_EQ(surfaceFrame1->getActuals().presentTime, 90); EXPECT_EQ(surfaceFrame1->getJankType(), JankType::Unknown); EXPECT_EQ(surfaceFrame1->getJankType(), JankType::Unknown | JankType::AppDeadlineMissed); } } /* /* Loading Loading @@ -1699,9 +1700,9 @@ TEST_F(FrameTimelineTest, jankClassification_surfaceFrameLateFinishEarlyPresent) } } TEST_F(FrameTimelineTest, jankClassification_surfaceFrameLateFinishLatePresent) { TEST_F(FrameTimelineTest, jankClassification_surfaceFrameLateFinishLatePresent) { // First frame - DisplayFrame is not janky. This should classify the SurfaceFrame as // First frame - DisplayFrame is not janky. This should classify the SurfaceFrame as only // AppDeadlineMissed. Second frame - DisplayFrame is janky. This should propagate DisplayFrame's // AppDeadlineMissed. Second frame - DisplayFrame is janky. This should propagate DisplayFrame's // jank to the SurfaceFrame. // jank to the SurfaceFrame along with AppDeadlineMissed. EXPECT_CALL(*mTimeStats, incrementJankyFrames(_)).Times(2); EXPECT_CALL(*mTimeStats, incrementJankyFrames(_)).Times(2); auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE); auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE); Loading Loading @@ -1771,7 +1772,8 @@ TEST_F(FrameTimelineTest, jankClassification_surfaceFrameLateFinishLatePresent) EXPECT_EQ(actuals2.presentTime, 60); EXPECT_EQ(actuals2.presentTime, 60); EXPECT_EQ(presentedSurfaceFrame2.getFramePresentMetadata(), FramePresentMetadata::LatePresent); EXPECT_EQ(presentedSurfaceFrame2.getFramePresentMetadata(), FramePresentMetadata::LatePresent); EXPECT_EQ(presentedSurfaceFrame2.getFrameReadyMetadata(), FrameReadyMetadata::LateFinish); EXPECT_EQ(presentedSurfaceFrame2.getFrameReadyMetadata(), FrameReadyMetadata::LateFinish); EXPECT_EQ(presentedSurfaceFrame2.getJankType(), JankType::SurfaceFlingerCpuDeadlineMissed); EXPECT_EQ(presentedSurfaceFrame2.getJankType(), JankType::SurfaceFlingerCpuDeadlineMissed | JankType::AppDeadlineMissed); } } TEST_F(FrameTimelineTest, jankClassification_multiJankBufferStuffingAndAppDeadlineMissed) { TEST_F(FrameTimelineTest, jankClassification_multiJankBufferStuffingAndAppDeadlineMissed) { Loading Loading
services/surfaceflinger/FrameTimeline/FrameTimeline.cpp +3 −7 Original line number Original line Diff line number Diff line Loading @@ -575,16 +575,12 @@ void SurfaceFrame::classifyJankLocked(int32_t displayFrameJankType, const Fps& r } } } else if (mFrameReadyMetadata == FrameReadyMetadata::LateFinish) { } else if (mFrameReadyMetadata == FrameReadyMetadata::LateFinish) { // Finish late, Present late // Finish late, Present late if (displayFrameJankType == JankType::None) { // Display frame is not janky, so purely app's fault mJankType |= JankType::AppDeadlineMissed; mJankType |= JankType::AppDeadlineMissed; } else { // Propagate DisplayFrame's jankType if it is janky // Propagate DisplayFrame's jankType if it is janky mJankType |= displayFrameJankType; mJankType |= displayFrameJankType; } } } } } } } void SurfaceFrame::onPresent(nsecs_t presentTime, int32_t displayFrameJankType, Fps refreshRate, void SurfaceFrame::onPresent(nsecs_t presentTime, int32_t displayFrameJankType, Fps refreshRate, nsecs_t displayDeadlineDelta, nsecs_t displayPresentDelta) { nsecs_t displayDeadlineDelta, nsecs_t displayPresentDelta) { Loading
services/surfaceflinger/tests/unittests/FrameTimelineTest.cpp +9 −7 Original line number Original line Diff line number Diff line Loading @@ -668,8 +668,9 @@ TEST_F(FrameTimelineTest, presentFenceSignaled_displayFramePredictionExpiredPres Fps renderRate = Fps::fromPeriodNsecs(30); Fps renderRate = Fps::fromPeriodNsecs(30); EXPECT_CALL(*mTimeStats, EXPECT_CALL(*mTimeStats, incrementJankyFrames(TimeStats::JankyFramesInfo{refreshRate, renderRate, sUidOne, incrementJankyFrames( sLayerNameOne, JankType::Unknown, TimeStats::JankyFramesInfo{refreshRate, renderRate, sUidOne, sLayerNameOne, JankType::Unknown | JankType::AppDeadlineMissed, -1, -1, 25})); -1, -1, 25})); auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE); auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE); int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions({10, 20, 60}); int64_t surfaceFrameToken1 = mTokenManager->generateTokenForPredictions({10, 20, 60}); Loading Loading @@ -697,7 +698,7 @@ TEST_F(FrameTimelineTest, presentFenceSignaled_displayFramePredictionExpiredPres EXPECT_EQ(displayFrame->getFramePresentMetadata(), FramePresentMetadata::UnknownPresent); EXPECT_EQ(displayFrame->getFramePresentMetadata(), FramePresentMetadata::UnknownPresent); EXPECT_EQ(surfaceFrame1->getActuals().presentTime, 90); EXPECT_EQ(surfaceFrame1->getActuals().presentTime, 90); EXPECT_EQ(surfaceFrame1->getJankType(), JankType::Unknown); EXPECT_EQ(surfaceFrame1->getJankType(), JankType::Unknown | JankType::AppDeadlineMissed); } } /* /* Loading Loading @@ -1699,9 +1700,9 @@ TEST_F(FrameTimelineTest, jankClassification_surfaceFrameLateFinishEarlyPresent) } } TEST_F(FrameTimelineTest, jankClassification_surfaceFrameLateFinishLatePresent) { TEST_F(FrameTimelineTest, jankClassification_surfaceFrameLateFinishLatePresent) { // First frame - DisplayFrame is not janky. This should classify the SurfaceFrame as // First frame - DisplayFrame is not janky. This should classify the SurfaceFrame as only // AppDeadlineMissed. Second frame - DisplayFrame is janky. This should propagate DisplayFrame's // AppDeadlineMissed. Second frame - DisplayFrame is janky. This should propagate DisplayFrame's // jank to the SurfaceFrame. // jank to the SurfaceFrame along with AppDeadlineMissed. EXPECT_CALL(*mTimeStats, incrementJankyFrames(_)).Times(2); EXPECT_CALL(*mTimeStats, incrementJankyFrames(_)).Times(2); auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE); auto presentFence1 = fenceFactory.createFenceTimeForTest(Fence::NO_FENCE); Loading Loading @@ -1771,7 +1772,8 @@ TEST_F(FrameTimelineTest, jankClassification_surfaceFrameLateFinishLatePresent) EXPECT_EQ(actuals2.presentTime, 60); EXPECT_EQ(actuals2.presentTime, 60); EXPECT_EQ(presentedSurfaceFrame2.getFramePresentMetadata(), FramePresentMetadata::LatePresent); EXPECT_EQ(presentedSurfaceFrame2.getFramePresentMetadata(), FramePresentMetadata::LatePresent); EXPECT_EQ(presentedSurfaceFrame2.getFrameReadyMetadata(), FrameReadyMetadata::LateFinish); EXPECT_EQ(presentedSurfaceFrame2.getFrameReadyMetadata(), FrameReadyMetadata::LateFinish); EXPECT_EQ(presentedSurfaceFrame2.getJankType(), JankType::SurfaceFlingerCpuDeadlineMissed); EXPECT_EQ(presentedSurfaceFrame2.getJankType(), JankType::SurfaceFlingerCpuDeadlineMissed | JankType::AppDeadlineMissed); } } TEST_F(FrameTimelineTest, jankClassification_multiJankBufferStuffingAndAppDeadlineMissed) { TEST_F(FrameTimelineTest, jankClassification_multiJankBufferStuffingAndAppDeadlineMissed) { Loading