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