• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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