• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2024 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #pragma once
18 
19 namespace aidl {
20 namespace google {
21 namespace hardware {
22 namespace power {
23 namespace impl {
24 namespace pixel {
25 
26 /**
27  * Put jank frames into buckets. The "jank" evaluation is reusing the session records jank
28  * evaluation logic while here only counts the frames over 17ms. Though the current jank
29  * evaluation is not exactly right for every frame at the moment, it can still provide a
30  * a good sense of session's jank status. When we have more precise timeline from platform side
31  * the jank evaluation logic could be updated.
32  */
33 struct FrameBuckets {
34   public:
35     int64_t totalNumOfFrames{0};      // This includes jank frames and normal frames.
36     int64_t numOfFrames17to25ms{0};   // Jank frames over 1 120Hz Vsync interval(8.333ms)
37     int64_t numOfFrames25to34ms{0};   // Jank frames over 2 120Hz Vsync interval(16.667ms)
38     int64_t numOfFrames34to67ms{0};   // Jank frames over 3 to 6 120Hz Vsync intervals.
39     int64_t numOfFrames67to100ms{0};  // Jank frames between 10 Hz and 15 Hz
40     int64_t numOfFramesOver100ms{0};  // Jank frames below 10 Hz.
41 
toStringFrameBuckets42     std::string toString() const {
43         std::stringstream ss;
44         ss << "JankFramesInBuckets: ";
45         if (totalNumOfFrames <= 0) {
46             ss << "0%-0%-0%-0%-0%-0";
47             return ss.str();
48         }
49 
50         ss << (numOfFrames17to25ms * 10000 / totalNumOfFrames / 100.0) << "%";
51         if (numOfFrames17to25ms > 0) {
52             ss << "(" << numOfFrames17to25ms << ")";
53         }
54 
55         appendSingleBucketStr(numOfFrames25to34ms, totalNumOfFrames, ss);
56         appendSingleBucketStr(numOfFrames34to67ms, totalNumOfFrames, ss);
57         appendSingleBucketStr(numOfFrames67to100ms, totalNumOfFrames, ss);
58         appendSingleBucketStr(numOfFramesOver100ms, totalNumOfFrames, ss);
59 
60         ss << "-" << totalNumOfFrames;
61         return ss.str();
62     }
63 
addUpNewFramesFrameBuckets64     void addUpNewFrames(const FrameBuckets &newFrames) {
65         totalNumOfFrames += newFrames.totalNumOfFrames;
66         numOfFrames17to25ms += newFrames.numOfFrames17to25ms;
67         numOfFrames25to34ms += newFrames.numOfFrames25to34ms;
68         numOfFrames34to67ms += newFrames.numOfFrames34to67ms;
69         numOfFrames67to100ms += newFrames.numOfFrames67to100ms;
70         numOfFramesOver100ms += newFrames.numOfFramesOver100ms;
71     }
72 
73   private:
appendSingleBucketStrFrameBuckets74     void appendSingleBucketStr(int64_t singleBucketFrames, int64_t totalFrames,
75                                std::stringstream &ss) const {
76         ss << "-" << (singleBucketFrames * 10000 / totalFrames / 100.0) << "%";
77         if (singleBucketFrames > 0) {
78             ss << "(" << singleBucketFrames << ")";
79         }
80     }
81 };
82 
83 enum class ScenarioType : int32_t { DEFAULT = 0, GAME };
84 
toString(ScenarioType scenType)85 constexpr const char *toString(ScenarioType scenType) {
86     switch (scenType) {
87         case ScenarioType::DEFAULT:
88             return "DEFAULT";
89         case ScenarioType::GAME:
90             return "GAME";
91         default:
92             return "INVALID_SCENARIO_TYPE";
93     }
94 }
95 
96 enum class FrameTimelineType : int32_t { SURFACEFLINGER = 0, APP };
97 
toString(FrameTimelineType timelineType)98 constexpr const char *toString(FrameTimelineType timelineType) {
99     switch (timelineType) {
100         case FrameTimelineType::APP:
101             return "APP";
102         case FrameTimelineType::SURFACEFLINGER:
103             return "SURFACEFLINGER";
104         default:
105             return "INVALID_FRAME_TIMELINE_TYPE";
106     }
107 }
108 
109 struct SessionJankStatsWithThermal {
110     std::optional<int32_t> uid;
111     ScenarioType scenarioType;
112     FrameTimelineType frameTimelineType;
113     // TODO(guibing) add more detailed definition of the jank metrics.
114 };
115 
116 }  // namespace pixel
117 }  // namespace impl
118 }  // namespace power
119 }  // namespace hardware
120 }  // namespace google
121 }  // namespace aidl
122