• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023-2025 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 #include "feature/single_frame_composer/rs_single_frame_composer.h"
16 
17 #include "rs_trace.h"
18 
19 #include "platform/common/rs_system_properties.h"
20 
21 namespace OHOS {
22 namespace Rosen {
23 std::map<std::thread::id, uint64_t> RSSingleFrameComposer::ipcThreadIdMap_;
24 std::mutex RSSingleFrameComposer::ipcThreadIdMapMutex_;
25 std::map<pid_t, uint64_t> RSSingleFrameComposer::appPidMap_;
26 std::mutex RSSingleFrameComposer::appPidMapMutex_;
FindSingleFrameModifierNG(const std::vector<std::shared_ptr<ModifierNG::RSRenderModifier>> & modifierList)27 bool RSSingleFrameComposer::FindSingleFrameModifierNG(
28     const std::vector<std::shared_ptr<ModifierNG::RSRenderModifier>>& modifierList)
29 {
30     for (auto iter = modifierList.begin(); iter != modifierList.end(); ++iter) {
31         if ((*iter)->GetSingleFrameModifier()) {
32             return true;
33         }
34     }
35     return false;
36 }
37 
EraseSingleFrameModifierNG(std::vector<std::shared_ptr<ModifierNG::RSRenderModifier>> & modifierList)38 void RSSingleFrameComposer::EraseSingleFrameModifierNG(
39     std::vector<std::shared_ptr<ModifierNG::RSRenderModifier>>& modifierList)
40 {
41     for (auto iter = modifierList.begin(); iter != modifierList.end();) {
42         if ((*iter)->GetSingleFrameModifier()) {
43             iter = modifierList.erase(iter);
44         } else {
45             ++iter;
46         }
47     }
48 }
49 
SingleFrameModifierAddNG(std::vector<std::shared_ptr<ModifierNG::RSRenderModifier>> & singleFrameModifierList,std::vector<std::shared_ptr<ModifierNG::RSRenderModifier>> & modifierList)50 void RSSingleFrameComposer::SingleFrameModifierAddNG(
51     std::vector<std::shared_ptr<ModifierNG::RSRenderModifier>>& singleFrameModifierList,
52     std::vector<std::shared_ptr<ModifierNG::RSRenderModifier>>& modifierList)
53 {
54     for (auto iter = singleFrameModifierList.begin(); iter != singleFrameModifierList.end(); ++iter) {
55         RS_TRACE_NAME("Add SingleFrame DrawCmdModifier, modifierId: " + std::to_string((*iter)->GetId()));
56         modifierList.emplace_back(*iter);
57     }
58 }
59 
SingleFrameModifierAddToListNG(ModifierNG::RSModifierType type,std::vector<std::shared_ptr<ModifierNG::RSRenderModifier>> & modifierList)60 bool RSSingleFrameComposer::SingleFrameModifierAddToListNG(
61     ModifierNG::RSModifierType type, std::vector<std::shared_ptr<ModifierNG::RSRenderModifier>>& modifierList)
62 {
63     bool needSkip = false;
64     EraseSingleFrameModifierNG(modifierList);
65     {
66         std::lock_guard<std::mutex> lock(singleFrameDrawMutex_);
67         auto iter = singleFrameDrawCmdModifiersNG_.find(type);
68         if (iter != singleFrameDrawCmdModifiersNG_.end() && !iter->second.empty()) {
69             SingleFrameModifierAddNG(iter->second, modifierList);
70             singleFrameDrawCmdModifiersNG_.erase(type);
71         }
72     }
73     if (modifierList.size() > 1 && FindSingleFrameModifierNG(modifierList)) {
74         needSkip = true;
75     }
76 
77     return needSkip;
78 }
79 
SetSingleFrameFlag(const std::thread::id ipcThreadId)80 void RSSingleFrameComposer::SetSingleFrameFlag(const std::thread::id ipcThreadId)
81 {
82     std::lock_guard<std::mutex> lock(ipcThreadIdMapMutex_);
83     if (ipcThreadIdMap_.find(ipcThreadId) == ipcThreadIdMap_.end()) {
84         ipcThreadIdMap_[ipcThreadId] = 1;
85     } else {
86         ipcThreadIdMap_[ipcThreadId]++;
87     }
88 }
89 
IsShouldSingleFrameComposer()90 bool RSSingleFrameComposer::IsShouldSingleFrameComposer()
91 {
92     std::lock_guard<std::mutex> lock(ipcThreadIdMapMutex_);
93     std::thread::id ipcThreadId = std::this_thread::get_id();
94     if (ipcThreadIdMap_.find(ipcThreadId) == ipcThreadIdMap_.end()) {
95         return false;
96     } else {
97         ipcThreadIdMap_[ipcThreadId]--;
98         if (ipcThreadIdMap_[ipcThreadId] == 0) {
99             ipcThreadIdMap_.erase(ipcThreadId);
100         }
101         return true;
102     }
103 }
104 
SingleFrameIsNeedSkipNG(bool needSkip,const std::shared_ptr<ModifierNG::RSRenderModifier> & modifier)105 bool RSSingleFrameComposer::SingleFrameIsNeedSkipNG(
106     bool needSkip, const std::shared_ptr<ModifierNG::RSRenderModifier>& modifier)
107 {
108     return needSkip && !modifier->GetSingleFrameModifier();
109 }
110 
SingleFrameAddModifierNG(const std::shared_ptr<ModifierNG::RSRenderModifier> & modifier)111 void RSSingleFrameComposer::SingleFrameAddModifierNG(const std::shared_ptr<ModifierNG::RSRenderModifier>& modifier)
112 {
113     if (modifier->IsCustom()) {
114         modifier->SetSingleFrameModifier(true);
115         RS_TRACE_NAME("Add modifier, modifierId: " + std::to_string(modifier->GetId()));
116         {
117             std::lock_guard<std::mutex> lock(singleFrameDrawMutex_);
118             singleFrameDrawCmdModifiersNG_.clear();
119             singleFrameDrawCmdModifiersNG_[modifier->GetType()].emplace_back(modifier);
120         }
121     }
122 }
123 
AddOrRemoveAppPidToMap(bool isNodeSingleFrameComposer,pid_t pid)124 void RSSingleFrameComposer::AddOrRemoveAppPidToMap(bool isNodeSingleFrameComposer, pid_t pid)
125 {
126     std::lock_guard<std::mutex> lock(appPidMapMutex_);
127     if (isNodeSingleFrameComposer) {
128         appPidMap_[pid] = 1;
129     } else {
130         appPidMap_.erase(pid);
131     }
132 }
133 
IsShouldProcessByIpcThread(pid_t pid)134 bool RSSingleFrameComposer::IsShouldProcessByIpcThread(pid_t pid)
135 {
136     std::lock_guard<std::mutex> lock(appPidMapMutex_);
137     if ((appPidMap_.find(pid) != appPidMap_.end() && appPidMap_[pid] != 0) ||
138         RSSystemProperties::GetSingleFrameComposerCanvasNodeEnabled()) {
139         return true;
140     }
141     return false;
142 }
143 } // namespace Rosen
144 } // namespace OHOS