diff options
| -rw-r--r-- | services/surfaceflinger/TimeStats/TimeStats.cpp | 21 | ||||
| -rw-r--r-- | services/surfaceflinger/tests/unittests/TimeStatsTest.cpp | 66 |
2 files changed, 59 insertions, 28 deletions
diff --git a/services/surfaceflinger/TimeStats/TimeStats.cpp b/services/surfaceflinger/TimeStats/TimeStats.cpp index 10d58a6087..d6a0787ddc 100644 --- a/services/surfaceflinger/TimeStats/TimeStats.cpp +++ b/services/surfaceflinger/TimeStats/TimeStats.cpp @@ -351,12 +351,16 @@ void TimeStats::recordDisplayEventConnectionCount(int32_t count) { std::max(mTimeStats.displayEventConnectionsCountLegacy, count); } +static int32_t toMs(nsecs_t nanos) { + int64_t millis = + std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::nanoseconds(nanos)) + .count(); + millis = std::clamp(millis, int64_t(INT32_MIN), int64_t(INT32_MAX)); + return static_cast<int32_t>(millis); +} + static int32_t msBetween(nsecs_t start, nsecs_t end) { - int64_t delta = std::chrono::duration_cast<std::chrono::milliseconds>( - std::chrono::nanoseconds(end - start)) - .count(); - delta = std::clamp(delta, int64_t(INT32_MIN), int64_t(INT32_MAX)); - return static_cast<int32_t>(delta); + return toMs(end - start); } void TimeStats::recordFrameDuration(nsecs_t startTime, nsecs_t endTime) { @@ -829,10 +833,9 @@ void TimeStats::incrementJankyFrames(const JankyFramesInfo& info) { // TimeStats Histograms only retain positive values, so we don't need to check if these // deadlines were really missed if we know that the frame had jank, since deadlines // that were met will be dropped. - timelineStats.displayDeadlineDeltas.insert(static_cast<int32_t>(info.displayDeadlineDelta)); - timelineStats.displayPresentDeltas.insert(static_cast<int32_t>(info.displayPresentJitter)); - timeStatsLayer.deltas["appDeadlineDeltas"].insert( - static_cast<int32_t>(info.appDeadlineDelta)); + timelineStats.displayDeadlineDeltas.insert(toMs(info.displayDeadlineDelta)); + timelineStats.displayPresentDeltas.insert(toMs(info.displayPresentJitter)); + timeStatsLayer.deltas["appDeadlineDeltas"].insert(toMs(info.appDeadlineDelta)); } } diff --git a/services/surfaceflinger/tests/unittests/TimeStatsTest.cpp b/services/surfaceflinger/tests/unittests/TimeStatsTest.cpp index ff53a7b09c..3e4e130a14 100644 --- a/services/surfaceflinger/tests/unittests/TimeStatsTest.cpp +++ b/services/surfaceflinger/tests/unittests/TimeStatsTest.cpp @@ -1011,6 +1011,9 @@ TEST_F(TimeStatsTest, globalStatsCallback) { constexpr size_t MISSED_FRAMES = 4; constexpr size_t CLIENT_COMPOSITION_FRAMES = 3; constexpr size_t DISPLAY_EVENT_CONNECTIONS = 14; + constexpr nsecs_t DISPLAY_DEADLINE_DELTA = 1'000'000; + constexpr nsecs_t DISPLAY_PRESENT_JITTER = 2'000'000; + constexpr nsecs_t APP_DEADLINE_DELTA = 3'000'000; EXPECT_TRUE(inputCommand(InputCommand::ENABLE, FMT_STRING).empty()); @@ -1036,24 +1039,35 @@ TEST_F(TimeStatsTest, globalStatsCallback) { mTimeStats->setPresentFenceGlobal(std::make_shared<FenceTime>(5000000)); mTimeStats->incrementJankyFrames({kRefreshRate0, kRenderRate0, UID_0, genLayerName(LAYER_ID_0), - JankType::SurfaceFlingerCpuDeadlineMissed, 1, 2, 3}); + JankType::SurfaceFlingerCpuDeadlineMissed, + DISPLAY_DEADLINE_DELTA, DISPLAY_PRESENT_JITTER, + APP_DEADLINE_DELTA}); mTimeStats->incrementJankyFrames({kRefreshRate0, kRenderRate0, UID_0, genLayerName(LAYER_ID_0), - JankType::SurfaceFlingerGpuDeadlineMissed, 1, 2, 3}); + JankType::SurfaceFlingerGpuDeadlineMissed, + DISPLAY_DEADLINE_DELTA, DISPLAY_PRESENT_JITTER, + APP_DEADLINE_DELTA}); mTimeStats->incrementJankyFrames({kRefreshRate0, kRenderRate0, UID_0, genLayerName(LAYER_ID_0), - JankType::DisplayHAL, 1, 2, 3}); + JankType::DisplayHAL, DISPLAY_DEADLINE_DELTA, + DISPLAY_PRESENT_JITTER, APP_DEADLINE_DELTA}); mTimeStats->incrementJankyFrames({kRefreshRate0, kRenderRate0, UID_0, genLayerName(LAYER_ID_0), - JankType::AppDeadlineMissed, 1, 2, 3}); + JankType::AppDeadlineMissed, DISPLAY_DEADLINE_DELTA, + DISPLAY_PRESENT_JITTER, APP_DEADLINE_DELTA}); mTimeStats->incrementJankyFrames({kRefreshRate0, kRenderRate0, UID_0, genLayerName(LAYER_ID_0), - JankType::SurfaceFlingerScheduling, 1, 2, 3}); + JankType::SurfaceFlingerScheduling, DISPLAY_DEADLINE_DELTA, + DISPLAY_PRESENT_JITTER, APP_DEADLINE_DELTA}); mTimeStats->incrementJankyFrames({kRefreshRate0, kRenderRate0, UID_0, genLayerName(LAYER_ID_0), - JankType::PredictionError, 1, 2, 3}); + JankType::PredictionError, DISPLAY_DEADLINE_DELTA, + DISPLAY_PRESENT_JITTER, APP_DEADLINE_DELTA}); mTimeStats->incrementJankyFrames({kRefreshRate0, kRenderRate0, UID_0, genLayerName(LAYER_ID_0), - JankType::AppDeadlineMissed | JankType::BufferStuffing, 1, 2, - 3}); + JankType::AppDeadlineMissed | JankType::BufferStuffing, + DISPLAY_DEADLINE_DELTA, DISPLAY_PRESENT_JITTER, + APP_DEADLINE_DELTA}); mTimeStats->incrementJankyFrames({kRefreshRate0, kRenderRate0, UID_0, genLayerName(LAYER_ID_0), - JankType::BufferStuffing, 1, 2, 3}); + JankType::BufferStuffing, DISPLAY_DEADLINE_DELTA, + DISPLAY_PRESENT_JITTER, APP_DEADLINE_DELTA}); mTimeStats->incrementJankyFrames({kRefreshRate0, kRenderRate0, UID_0, genLayerName(LAYER_ID_0), - JankType::None, 1, 2, 3}); + JankType::None, DISPLAY_DEADLINE_DELTA, + DISPLAY_PRESENT_JITTER, APP_DEADLINE_DELTA}); std::string pulledData; EXPECT_TRUE(mTimeStats->onPullAtom(10062 /*SURFACEFLINGER_STATS_GLOBAL_INFO*/, &pulledData)); @@ -1137,6 +1151,10 @@ TEST_F(TimeStatsTest, globalStatsCallback) { TEST_F(TimeStatsTest, layerStatsCallback_pullsAllAndClears) { constexpr size_t LATE_ACQUIRE_FRAMES = 2; constexpr size_t BAD_DESIRED_PRESENT_FRAMES = 3; + constexpr nsecs_t DISPLAY_DEADLINE_DELTA = 1'000'000; + constexpr nsecs_t DISPLAY_PRESENT_JITTER = 2'000'000; + constexpr nsecs_t APP_DEADLINE_DELTA_2MS = 2'000'000; + constexpr nsecs_t APP_DEADLINE_DELTA_3MS = 3'000'000; EXPECT_TRUE(inputCommand(InputCommand::ENABLE, FMT_STRING).empty()); insertTimeRecord(NORMAL_SEQUENCE, LAYER_ID_0, 1, 1000000); @@ -1155,22 +1173,32 @@ TEST_F(TimeStatsTest, layerStatsCallback_pullsAllAndClears) { insertTimeRecord(NORMAL_SEQUENCE, LAYER_ID_0, 2, 2000000, frameRate60); mTimeStats->incrementJankyFrames({kRefreshRate0, kRenderRate0, UID_0, genLayerName(LAYER_ID_0), - JankType::SurfaceFlingerCpuDeadlineMissed, 1, 2, 3}); + JankType::SurfaceFlingerCpuDeadlineMissed, + DISPLAY_DEADLINE_DELTA, DISPLAY_PRESENT_JITTER, + APP_DEADLINE_DELTA_3MS}); mTimeStats->incrementJankyFrames({kRefreshRate0, kRenderRate0, UID_0, genLayerName(LAYER_ID_0), - JankType::SurfaceFlingerGpuDeadlineMissed, 1, 2, 3}); + JankType::SurfaceFlingerGpuDeadlineMissed, + DISPLAY_DEADLINE_DELTA, DISPLAY_PRESENT_JITTER, + APP_DEADLINE_DELTA_3MS}); mTimeStats->incrementJankyFrames({kRefreshRate0, kRenderRate0, UID_0, genLayerName(LAYER_ID_0), - JankType::DisplayHAL, 1, 2, 3}); + JankType::DisplayHAL, DISPLAY_DEADLINE_DELTA, + DISPLAY_PRESENT_JITTER, APP_DEADLINE_DELTA_3MS}); mTimeStats->incrementJankyFrames({kRefreshRate0, kRenderRate0, UID_0, genLayerName(LAYER_ID_0), - JankType::AppDeadlineMissed, 1, 2, 3}); + JankType::AppDeadlineMissed, DISPLAY_DEADLINE_DELTA, + DISPLAY_PRESENT_JITTER, APP_DEADLINE_DELTA_3MS}); mTimeStats->incrementJankyFrames({kRefreshRate0, kRenderRate0, UID_0, genLayerName(LAYER_ID_0), - JankType::SurfaceFlingerScheduling, 1, 2, 2}); + JankType::SurfaceFlingerScheduling, DISPLAY_DEADLINE_DELTA, + DISPLAY_PRESENT_JITTER, APP_DEADLINE_DELTA_2MS}); mTimeStats->incrementJankyFrames({kRefreshRate0, kRenderRate0, UID_0, genLayerName(LAYER_ID_0), - JankType::PredictionError, 1, 2, 2}); + JankType::PredictionError, DISPLAY_DEADLINE_DELTA, + DISPLAY_PRESENT_JITTER, APP_DEADLINE_DELTA_2MS}); mTimeStats->incrementJankyFrames({kRefreshRate0, kRenderRate0, UID_0, genLayerName(LAYER_ID_0), - JankType::AppDeadlineMissed | JankType::BufferStuffing, 1, 2, - 2}); + JankType::AppDeadlineMissed | JankType::BufferStuffing, + DISPLAY_DEADLINE_DELTA, APP_DEADLINE_DELTA_2MS, + APP_DEADLINE_DELTA_2MS}); mTimeStats->incrementJankyFrames({kRefreshRate0, kRenderRate0, UID_0, genLayerName(LAYER_ID_0), - JankType::None, 1, 2, 3}); + JankType::None, DISPLAY_DEADLINE_DELTA, + DISPLAY_PRESENT_JITTER, APP_DEADLINE_DELTA_3MS}); std::string pulledData; EXPECT_TRUE(mTimeStats->onPullAtom(10063 /*SURFACEFLINGER_STATS_LAYER_INFO*/, &pulledData)); |