1 /*
2  * Copyright (c) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef ROSEN_MODULE_FRAME_ANALYZER_EXPORT_FRAME_INFO_H
17 #define ROSEN_MODULE_FRAME_ANALYZER_EXPORT_FRAME_INFO_H
18 
19 #include <array>
20 #include <cstdint>
21 #include <map>
22 
23 #include "ring_queue.h"
24 
25 namespace OHOS {
26 namespace Rosen {
27 /*
28  * Event ids must be continuous, and special
29  * enumerations can be defined after Max.
30  * The ID of the start event must be odd,
31  * and the ID of the end event must be even.
32  */
33 enum class FrameEventType : int32_t {
34     // UI Event
35     HandleInputStart = 0,
36     HandleInputEnd,
37     AnimateStart,
38     AnimateEnd,
39     BuildStart,
40     BuildEnd,
41     UploadStart,
42     UploadEnd,
43     LayoutStart,
44     LayoutEnd,
45     DrawStart,
46     DrawEnd,
47 
48     // RS Event
49     WaitVsyncStart,
50     WaitVsyncEnd,
51     ReleaseStart,
52     ReleaseEnd,
53     FlushStart,
54     FlushEnd,
55 
56     // static define
57     Max,
58 
59     // ui marks range
60     UIMarksStart = HandleInputStart,
61     UIMarksEnd = DrawEnd + 1,
62     UIMarksLen = UIMarksEnd - UIMarksStart,
63 
64     // total range
65     LoopStart = HandleInputStart,
66     LoopEnd = Max,
67     LoopLen = LoopEnd - LoopStart,
68 };
69 
70 /*
71  * Alpha will be determinated by runtime code.
72  * If event doesn't exist, it won't draw.
73  */
74 static const std::map<FrameEventType, uint32_t> frameEventColorMap = {
75     // FrameEventType::HandleInputStart
76     {FrameEventType::AnimateStart,     0x0000cc00}, // mid green
77     {FrameEventType::BuildStart,       0x0000ffff}, // cyan
78     // FrameEventType::UploadStart
79     {FrameEventType::LayoutStart,      0x0000ff00}, // green
80     {FrameEventType::DrawStart,        0x000000ff}, // blue
81     {FrameEventType::WaitVsyncStart,   0x00006600}, // old green
82     {FrameEventType::ReleaseStart,     0x00ffff00}, // yellow
83     {FrameEventType::FlushStart,       0x00ff0000}, // red
84 };
85 
86 static const std::map<FrameEventType, std::string> frameEventTypeStringMap = {
87     {FrameEventType::HandleInputStart, "HandleInput"},
88     {FrameEventType::AnimateStart,     "Animate"},
89     {FrameEventType::BuildStart,       "Build"},
90     {FrameEventType::UploadStart,      "Upload"},
91     {FrameEventType::LayoutStart,      "Layout"},
92     {FrameEventType::DrawStart,        "Draw"},
93     {FrameEventType::WaitVsyncStart,   "WaitVsync"},
94     {FrameEventType::ReleaseStart,     "Release"},
95     {FrameEventType::FlushStart,       "Flush"},
96 };
97 
IsStartFrameEventType(int index)98 static inline bool IsStartFrameEventType(int index)
99 {
100     // even is start event, 0x2 for test even
101     return (index % 0x2) == 0;
102 }
103 
GetAsyncNameByFrameEventType(int index)104 static inline std::string GetAsyncNameByFrameEventType(int index)
105 {
106     // 0x2 for get event id
107     return std::string("Frame.") + std::to_string(index / 0x2) + "." +
108         frameEventTypeStringMap.at(static_cast<FrameEventType>(index &~ 1));
109 }
110 
GetNameByFrameEventType(FrameEventType type)111 static inline std::string GetNameByFrameEventType(FrameEventType type)
112 {
113     if (IsStartFrameEventType(static_cast<int>(type))) {
114         return frameEventTypeStringMap.at(type) + "Start";
115     } else {
116         // end type - 1 => start type
117         auto index = static_cast<FrameEventType>(static_cast<int>(type) - 1);
118         return frameEventTypeStringMap.at(index) + "End";
119     }
120 }
121 
122 struct UIMarks {
123     int32_t frameNumber = 0;
124     std::array<int64_t, static_cast<size_t>(FrameEventType::UIMarksLen)> times = {};
125 };
126 
127 struct FrameInfo {
128     int32_t frameNumber = 0;
129     bool skiped = false;
130     std::array<int64_t, static_cast<size_t>(FrameEventType::LoopLen)> times = {};
131 };
132 
133 static constexpr int32_t frameQueueMaxSize = 60;
134 static constexpr double frameTotalMs = 160;
135 static constexpr const char *switchRenderingText = "debug.graphic.frame";
136 static constexpr const char *switchRenderingPaintText = "paint";
137 static constexpr const char *switchRenderingSaverText = "saver";
138 static constexpr const char *switchRenderingDisableText = "disable";
139 static constexpr const char *saveDirectory = "/data/frame_render";
140 
141 using FrameInfoQueue = RingQueue<struct FrameInfo, frameQueueMaxSize>;
142 } // namespace Rosen
143 } // namespace OHOS
144 
145 #endif // ROSEN_MODULE_FRAME_ANALYZER_EXPORT_FRAME_INFO_H
146