Loading services/surfaceflinger/FrameTimeline/FrameTimeline.cpp +13 −7 Original line number Original line Diff line number Diff line Loading @@ -543,12 +543,14 @@ std::string SurfaceFrame::miniDump() const { } } void SurfaceFrame::classifyJankLocked(int32_t displayFrameJankType, const Fps& refreshRate, void SurfaceFrame::classifyJankLocked(int32_t displayFrameJankType, const Fps& refreshRate, Fps displayFrameRenderRate, nsecs_t& deadlineDelta) { Fps displayFrameRenderRate, nsecs_t* outDeadlineDelta) { if (mActuals.presentTime == Fence::SIGNAL_TIME_INVALID) { if (mActuals.presentTime == Fence::SIGNAL_TIME_INVALID) { // Cannot do any classification for invalid present time. // Cannot do any classification for invalid present time. mJankType = JankType::Unknown; mJankType = JankType::Unknown; mJankSeverityType = JankSeverityType::Unknown; mJankSeverityType = JankSeverityType::Unknown; deadlineDelta = -1; if (outDeadlineDelta) { *outDeadlineDelta = -1; } return; return; } } Loading @@ -559,7 +561,9 @@ void SurfaceFrame::classifyJankLocked(int32_t displayFrameJankType, const Fps& r mJankType = mPresentState != PresentState::Presented ? JankType::Dropped mJankType = mPresentState != PresentState::Presented ? JankType::Dropped : JankType::AppDeadlineMissed; : JankType::AppDeadlineMissed; mJankSeverityType = JankSeverityType::Unknown; mJankSeverityType = JankSeverityType::Unknown; deadlineDelta = -1; if (outDeadlineDelta) { *outDeadlineDelta = -1; } return; return; } } Loading @@ -568,11 +572,14 @@ void SurfaceFrame::classifyJankLocked(int32_t displayFrameJankType, const Fps& r return; return; } } deadlineDelta = mActuals.endTime - mPredictions.endTime; const nsecs_t presentDelta = mActuals.presentTime - mPredictions.presentTime; const nsecs_t presentDelta = mActuals.presentTime - mPredictions.presentTime; const nsecs_t deltaToVsync = refreshRate.getPeriodNsecs() > 0 const nsecs_t deltaToVsync = refreshRate.getPeriodNsecs() > 0 ? std::abs(presentDelta) % refreshRate.getPeriodNsecs() ? std::abs(presentDelta) % refreshRate.getPeriodNsecs() : 0; : 0; const nsecs_t deadlineDelta = mActuals.endTime - mPredictions.endTime; if (outDeadlineDelta) { *outDeadlineDelta = deadlineDelta; } if (deadlineDelta > mJankClassificationThresholds.deadlineThreshold) { if (deadlineDelta > mJankClassificationThresholds.deadlineThreshold) { mFrameReadyMetadata = FrameReadyMetadata::LateFinish; mFrameReadyMetadata = FrameReadyMetadata::LateFinish; Loading Loading @@ -671,7 +678,7 @@ void SurfaceFrame::onPresent(nsecs_t presentTime, int32_t displayFrameJankType, mActuals.presentTime = presentTime; mActuals.presentTime = presentTime; nsecs_t deadlineDelta = 0; nsecs_t deadlineDelta = 0; classifyJankLocked(displayFrameJankType, refreshRate, displayFrameRenderRate, deadlineDelta); classifyJankLocked(displayFrameJankType, refreshRate, displayFrameRenderRate, &deadlineDelta); if (mPredictionState != PredictionState::None) { if (mPredictionState != PredictionState::None) { // Only update janky frames if the app used vsync predictions // Only update janky frames if the app used vsync predictions Loading @@ -686,8 +693,7 @@ void SurfaceFrame::onCommitNotComposited(Fps refreshRate, Fps displayFrameRender mDisplayFrameRenderRate = displayFrameRenderRate; mDisplayFrameRenderRate = displayFrameRenderRate; mActuals.presentTime = mPredictions.presentTime; mActuals.presentTime = mPredictions.presentTime; nsecs_t deadlineDelta = 0; classifyJankLocked(JankType::None, refreshRate, displayFrameRenderRate, nullptr); classifyJankLocked(JankType::None, refreshRate, displayFrameRenderRate, deadlineDelta); } } void SurfaceFrame::tracePredictions(int64_t displayFrameToken, nsecs_t monoBootOffset) const { void SurfaceFrame::tracePredictions(int64_t displayFrameToken, nsecs_t monoBootOffset) const { Loading services/surfaceflinger/FrameTimeline/FrameTimeline.h +1 −1 Original line number Original line Diff line number Diff line Loading @@ -237,7 +237,7 @@ private: void tracePredictions(int64_t displayFrameToken, nsecs_t monoBootOffset) const; void tracePredictions(int64_t displayFrameToken, nsecs_t monoBootOffset) const; void traceActuals(int64_t displayFrameToken, nsecs_t monoBootOffset) const; void traceActuals(int64_t displayFrameToken, nsecs_t monoBootOffset) const; void classifyJankLocked(int32_t displayFrameJankType, const Fps& refreshRate, void classifyJankLocked(int32_t displayFrameJankType, const Fps& refreshRate, Fps displayFrameRenderRate, nsecs_t& deadlineDelta) REQUIRES(mMutex); Fps displayFrameRenderRate, nsecs_t* outDeadlineDelta) REQUIRES(mMutex); const int64_t mToken; const int64_t mToken; const int32_t mInputEventId; const int32_t mInputEventId; Loading Loading
services/surfaceflinger/FrameTimeline/FrameTimeline.cpp +13 −7 Original line number Original line Diff line number Diff line Loading @@ -543,12 +543,14 @@ std::string SurfaceFrame::miniDump() const { } } void SurfaceFrame::classifyJankLocked(int32_t displayFrameJankType, const Fps& refreshRate, void SurfaceFrame::classifyJankLocked(int32_t displayFrameJankType, const Fps& refreshRate, Fps displayFrameRenderRate, nsecs_t& deadlineDelta) { Fps displayFrameRenderRate, nsecs_t* outDeadlineDelta) { if (mActuals.presentTime == Fence::SIGNAL_TIME_INVALID) { if (mActuals.presentTime == Fence::SIGNAL_TIME_INVALID) { // Cannot do any classification for invalid present time. // Cannot do any classification for invalid present time. mJankType = JankType::Unknown; mJankType = JankType::Unknown; mJankSeverityType = JankSeverityType::Unknown; mJankSeverityType = JankSeverityType::Unknown; deadlineDelta = -1; if (outDeadlineDelta) { *outDeadlineDelta = -1; } return; return; } } Loading @@ -559,7 +561,9 @@ void SurfaceFrame::classifyJankLocked(int32_t displayFrameJankType, const Fps& r mJankType = mPresentState != PresentState::Presented ? JankType::Dropped mJankType = mPresentState != PresentState::Presented ? JankType::Dropped : JankType::AppDeadlineMissed; : JankType::AppDeadlineMissed; mJankSeverityType = JankSeverityType::Unknown; mJankSeverityType = JankSeverityType::Unknown; deadlineDelta = -1; if (outDeadlineDelta) { *outDeadlineDelta = -1; } return; return; } } Loading @@ -568,11 +572,14 @@ void SurfaceFrame::classifyJankLocked(int32_t displayFrameJankType, const Fps& r return; return; } } deadlineDelta = mActuals.endTime - mPredictions.endTime; const nsecs_t presentDelta = mActuals.presentTime - mPredictions.presentTime; const nsecs_t presentDelta = mActuals.presentTime - mPredictions.presentTime; const nsecs_t deltaToVsync = refreshRate.getPeriodNsecs() > 0 const nsecs_t deltaToVsync = refreshRate.getPeriodNsecs() > 0 ? std::abs(presentDelta) % refreshRate.getPeriodNsecs() ? std::abs(presentDelta) % refreshRate.getPeriodNsecs() : 0; : 0; const nsecs_t deadlineDelta = mActuals.endTime - mPredictions.endTime; if (outDeadlineDelta) { *outDeadlineDelta = deadlineDelta; } if (deadlineDelta > mJankClassificationThresholds.deadlineThreshold) { if (deadlineDelta > mJankClassificationThresholds.deadlineThreshold) { mFrameReadyMetadata = FrameReadyMetadata::LateFinish; mFrameReadyMetadata = FrameReadyMetadata::LateFinish; Loading Loading @@ -671,7 +678,7 @@ void SurfaceFrame::onPresent(nsecs_t presentTime, int32_t displayFrameJankType, mActuals.presentTime = presentTime; mActuals.presentTime = presentTime; nsecs_t deadlineDelta = 0; nsecs_t deadlineDelta = 0; classifyJankLocked(displayFrameJankType, refreshRate, displayFrameRenderRate, deadlineDelta); classifyJankLocked(displayFrameJankType, refreshRate, displayFrameRenderRate, &deadlineDelta); if (mPredictionState != PredictionState::None) { if (mPredictionState != PredictionState::None) { // Only update janky frames if the app used vsync predictions // Only update janky frames if the app used vsync predictions Loading @@ -686,8 +693,7 @@ void SurfaceFrame::onCommitNotComposited(Fps refreshRate, Fps displayFrameRender mDisplayFrameRenderRate = displayFrameRenderRate; mDisplayFrameRenderRate = displayFrameRenderRate; mActuals.presentTime = mPredictions.presentTime; mActuals.presentTime = mPredictions.presentTime; nsecs_t deadlineDelta = 0; classifyJankLocked(JankType::None, refreshRate, displayFrameRenderRate, nullptr); classifyJankLocked(JankType::None, refreshRate, displayFrameRenderRate, deadlineDelta); } } void SurfaceFrame::tracePredictions(int64_t displayFrameToken, nsecs_t monoBootOffset) const { void SurfaceFrame::tracePredictions(int64_t displayFrameToken, nsecs_t monoBootOffset) const { Loading
services/surfaceflinger/FrameTimeline/FrameTimeline.h +1 −1 Original line number Original line Diff line number Diff line Loading @@ -237,7 +237,7 @@ private: void tracePredictions(int64_t displayFrameToken, nsecs_t monoBootOffset) const; void tracePredictions(int64_t displayFrameToken, nsecs_t monoBootOffset) const; void traceActuals(int64_t displayFrameToken, nsecs_t monoBootOffset) const; void traceActuals(int64_t displayFrameToken, nsecs_t monoBootOffset) const; void classifyJankLocked(int32_t displayFrameJankType, const Fps& refreshRate, void classifyJankLocked(int32_t displayFrameJankType, const Fps& refreshRate, Fps displayFrameRenderRate, nsecs_t& deadlineDelta) REQUIRES(mMutex); Fps displayFrameRenderRate, nsecs_t* outDeadlineDelta) REQUIRES(mMutex); const int64_t mToken; const int64_t mToken; const int32_t mInputEventId; const int32_t mInputEventId; Loading