1 /*
2 * Copyright (c) 2024 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 #include "info_collection/rs_gpu_dirty_region_collection.h"
17
18 namespace OHOS {
19 namespace Rosen {
20 const std::string SELF_DRAWING_NODE_SUFFIX = "-selfDrawing";
GetInstance()21 GpuDirtyRegionCollection& GpuDirtyRegionCollection::GetInstance()
22 {
23 static GpuDirtyRegionCollection instance;
24 return instance;
25 }
26
GpuDirtyRegionCollection()27 GpuDirtyRegionCollection::GpuDirtyRegionCollection()
28 {
29 }
30
~GpuDirtyRegionCollection()31 GpuDirtyRegionCollection::~GpuDirtyRegionCollection() noexcept
32 {
33 }
34
UpdateActiveDirtyInfoForDFX(NodeId id,const std::string & windowName,std::vector<RectI> rectIs)35 void GpuDirtyRegionCollection::UpdateActiveDirtyInfoForDFX(NodeId id, const std::string& windowName,
36 std::vector<RectI> rectIs)
37 {
38 std::lock_guard<std::mutex> lock(activeMtx_);
39 if (rectIs.size() > 0) {
40 ++activeDirtyRegionInfoMap_[id].activeFramesNumber;
41 }
42 for (const auto& rectI : rectIs) {
43 activeDirtyRegionInfoMap_[id].activeDirtyRegionArea += rectI.width_ * rectI.height_;
44 activeDirtyRegionInfoMap_[id].pidOfBelongsApp = ExtractPid(id);
45 activeDirtyRegionInfoMap_[id].windowName = windowName;
46 }
47 }
48
UpdateActiveDirtyInfoForDFX(NodeId id,const std::string & windowName,Rect damage)49 void GpuDirtyRegionCollection::UpdateActiveDirtyInfoForDFX(NodeId id, const std::string& windowName, Rect damage)
50 {
51 std::lock_guard<std::mutex> lock(activeMtx_);
52 ++activeDirtyRegionInfoMap_[id].activeFramesNumber;
53 activeDirtyRegionInfoMap_[id].activeDirtyRegionArea += damage.w * damage.h;
54 activeDirtyRegionInfoMap_[id].pidOfBelongsApp = ExtractPid(id);
55 activeDirtyRegionInfoMap_[id].windowName = windowName + SELF_DRAWING_NODE_SUFFIX;
56 }
57
UpdateGlobalDirtyInfoForDFX(RectI rect)58 void GpuDirtyRegionCollection::UpdateGlobalDirtyInfoForDFX(RectI rect)
59 {
60 std::lock_guard<std::mutex> lock(globalMtx_);
61 ++globalDirtyRegionInfo_.globalFramesNumber;
62 globalDirtyRegionInfo_.globalDirtyRegionAreas += rect.width_ * rect.height_;
63 }
64
AddSkipProcessFramesNumberForDFX(pid_t sendingPid)65 void GpuDirtyRegionCollection::AddSkipProcessFramesNumberForDFX(pid_t sendingPid)
66 {
67 std::lock_guard<std::mutex> lock(globalMtx_);
68 ++globalDirtyRegionInfo_.skipProcessFramesNumber;
69 ++sendingPidWhenDisplayNodeSkipMap_[sendingPid];
70 }
71
GetActiveDirtyRegionInfo() const72 std::vector<ActiveDirtyRegionInfo> GpuDirtyRegionCollection::GetActiveDirtyRegionInfo() const
73 {
74 std::lock_guard<std::mutex> lock(activeMtx_);
75 std::vector<ActiveDirtyRegionInfo> activeDirtyRegionInfos;
76 for (auto activeDirtyRegionInfo : activeDirtyRegionInfoMap_) {
77 if (activeDirtyRegionInfo.second.pidOfBelongsApp && activeDirtyRegionInfo.second.activeFramesNumber > 0) {
78 activeDirtyRegionInfo.second.activeDirtyRegionArea /= activeDirtyRegionInfo.second.activeFramesNumber;
79 activeDirtyRegionInfos.emplace_back(activeDirtyRegionInfo.second);
80 }
81 }
82 return activeDirtyRegionInfos;
83 }
84
GetGlobalDirtyRegionInfo() const85 GlobalDirtyRegionInfo GpuDirtyRegionCollection::GetGlobalDirtyRegionInfo() const
86 {
87 std::lock_guard<std::mutex> lock(globalMtx_);
88 GlobalDirtyRegionInfo globalDirtyRegionInfo;
89 if (globalDirtyRegionInfo_.globalFramesNumber > 0) {
90 globalDirtyRegionInfo.globalDirtyRegionAreas = globalDirtyRegionInfo_.globalDirtyRegionAreas /
91 globalDirtyRegionInfo_.globalFramesNumber;
92 globalDirtyRegionInfo.globalFramesNumber = globalDirtyRegionInfo_.globalFramesNumber;
93 globalDirtyRegionInfo.mostSendingPidWhenDisplayNodeSkip = GetMostSendingPidWhenDisplayNodeSkip();
94 }
95 globalDirtyRegionInfo.skipProcessFramesNumber = globalDirtyRegionInfo_.skipProcessFramesNumber;
96 return globalDirtyRegionInfo;
97 }
98
ResetActiveDirtyRegionInfo()99 void GpuDirtyRegionCollection::ResetActiveDirtyRegionInfo()
100 {
101 std::lock_guard<std::mutex> lock(activeMtx_);
102 activeDirtyRegionInfoMap_.clear();
103 }
104
ResetGlobalDirtyRegionInfo()105 void GpuDirtyRegionCollection::ResetGlobalDirtyRegionInfo()
106 {
107 std::lock_guard<std::mutex> lock(globalMtx_);
108 globalDirtyRegionInfo_ = GlobalDirtyRegionInfo {};
109 sendingPidWhenDisplayNodeSkipMap_.clear();
110 }
111
GetMostSendingPidWhenDisplayNodeSkip() const112 pid_t GpuDirtyRegionCollection::GetMostSendingPidWhenDisplayNodeSkip() const
113 {
114 pid_t mostSendingPidWhenDisplayNodeSkip = 0;
115 int32_t maxCountOfSendingPid = 0;
116 for (const auto& pair : sendingPidWhenDisplayNodeSkipMap_) {
117 if (pair.second > maxCountOfSendingPid) {
118 mostSendingPidWhenDisplayNodeSkip = pair.first;
119 maxCountOfSendingPid = pair.second;
120 }
121 }
122 return mostSendingPidWhenDisplayNodeSkip;
123 }
124 } // namespace Rosen
125 } // namespace OHOS