1 /*
2 * Copyright (c) 2023 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 "core/components_ng/manager/display_sync/ui_display_sync_manager.h"
16
17 namespace OHOS::Ace {
18 const std::vector<int32_t> UIDisplaySyncManager::REFRESH_RATE_LIST = { 30, 60, 72, 90, 120, 144 };
19
DispatchFunc(uint64_t nanoTimestamp)20 void UIDisplaySyncManager::DispatchFunc(uint64_t nanoTimestamp)
21 {
22 CheckSkipEnableProperty();
23 displaySyncRange_->Reset();
24
25 if (uiDisplaySyncMap_.empty()) {
26 return;
27 }
28
29 IdToDisplaySyncMap backupedMap(uiDisplaySyncMap_);
30
31 int32_t VSyncPeriod = GetVsyncPeriod();
32 for (const auto& [Id, weakDisplaySync] : backupedMap) {
33 auto displaySync = weakDisplaySync.Upgrade();
34 if (displaySync) {
35 displaySync->CheckRate(sourceVsyncRate_, refreshRateMode_);
36 displaySync->UpdateData(nanoTimestamp, VSyncPeriod);
37 if (IsAutoRefreshRateMode() ||
38 (IsNonAutoRefreshRateMode() && IsSupportSkip())) {
39 displaySync->JudgeWhetherSkip();
40 }
41 displaySync->OnFrame();
42
43 auto rateRange = displaySync->GetDisplaySyncData()->rateRange_;
44 if (rateRange->IsValid()) {
45 displaySyncRange_->Merge(*rateRange);
46 }
47 } else {
48 uiDisplaySyncMap_.erase(Id);
49 }
50 }
51
52 return;
53 }
54
HasDisplaySync(const RefPtr<UIDisplaySync> & displaySync)55 bool UIDisplaySyncManager::HasDisplaySync(const RefPtr<UIDisplaySync>& displaySync)
56 {
57 if (displaySync && uiDisplaySyncMap_.count(displaySync->GetId())) {
58 return true;
59 }
60 return false;
61 }
62
AddDisplaySync(const RefPtr<UIDisplaySync> & displaySync)63 bool UIDisplaySyncManager::AddDisplaySync(const RefPtr<UIDisplaySync>& displaySync)
64 {
65 if (HasDisplaySync(displaySync)) {
66 return false;
67 }
68 uiDisplaySyncMap_[displaySync->GetId()] = displaySync;
69 displaySync->JudgeWhetherRequestFrame();
70 return true;
71 }
72
RemoveDisplaySync(const RefPtr<UIDisplaySync> & displaySync)73 bool UIDisplaySyncManager::RemoveDisplaySync(const RefPtr<UIDisplaySync>& displaySync)
74 {
75 if (HasDisplaySync(displaySync)) {
76 uiDisplaySyncMap_.erase(displaySync->GetId());
77 return true;
78 }
79 return false;
80 }
81
SetVsyncRate(int32_t vsyncRate)82 bool UIDisplaySyncManager::SetVsyncRate(int32_t vsyncRate)
83 {
84 if (vsyncRate < 0) {
85 return false;
86 }
87
88 if (sourceVsyncRate_ == vsyncRate) {
89 return false;
90 }
91 sourceVsyncRate_ = vsyncRate;
92 return true;
93 }
94
GetVsyncRate() const95 int32_t UIDisplaySyncManager::GetVsyncRate() const
96 {
97 return sourceVsyncRate_;
98 }
99
SetVsyncPeriod(int64_t vsyncPeriod)100 bool UIDisplaySyncManager::SetVsyncPeriod(int64_t vsyncPeriod)
101 {
102 if (vsyncPeriod < 0) {
103 return false;
104 }
105
106 if (vsyncPeriod_ == vsyncPeriod) {
107 return false;
108 }
109 vsyncPeriod_ = vsyncPeriod;
110
111 int32_t rate = static_cast<int32_t>(std::ceil(SECOND_IN_NANO / vsyncPeriod_));
112 for (const auto& refreshRate : REFRESH_RATE_LIST) {
113 if (std::abs(rate - refreshRate) <= ERROR_DELTA) {
114 SetVsyncRate(refreshRate);
115 return true;
116 }
117 }
118
119 return true;
120 }
121
GetVsyncPeriod() const122 int64_t UIDisplaySyncManager::GetVsyncPeriod() const
123 {
124 return vsyncPeriod_;
125 }
126
SetRefreshRateMode(int32_t refreshRateMode)127 bool UIDisplaySyncManager::SetRefreshRateMode(int32_t refreshRateMode)
128 {
129 if (refreshRateMode < -1) {
130 return false;
131 }
132
133 if (refreshRateMode_ == refreshRateMode) {
134 return false;
135 }
136
137 refreshRateMode_ = refreshRateMode;
138 return true;
139 }
140
GetRefreshRateMode() const141 int32_t UIDisplaySyncManager::GetRefreshRateMode() const
142 {
143 return refreshRateMode_;
144 }
145
GetDisplaySyncRate() const146 int32_t UIDisplaySyncManager::GetDisplaySyncRate() const
147 {
148 int32_t displaySyncRate = displaySyncRange_->preferred_;
149 return displaySyncRate;
150 }
151
GetUIDisplaySyncMap() const152 IdToDisplaySyncMap UIDisplaySyncManager::GetUIDisplaySyncMap() const
153 {
154 return uiDisplaySyncMap_;
155 }
156
CheckSkipEnableProperty()157 void UIDisplaySyncManager::CheckSkipEnableProperty()
158 {
159 std::call_once(isEnablePropertyFlag_, [this] () {
160 supportSkipEnabled_ = SystemProperties::GetDisplaySyncSkipEnabled();
161 });
162 }
163
IsSupportSkip() const164 bool UIDisplaySyncManager::IsSupportSkip() const
165 {
166 return supportSkipEnabled_;
167 }
168
IsAutoRefreshRateMode() const169 bool UIDisplaySyncManager::IsAutoRefreshRateMode() const
170 {
171 return refreshRateMode_ == static_cast<int32_t>(RefreshRateMode::REFRESHRATE_MODE_AUTO);
172 }
173
IsNonAutoRefreshRateMode() const174 bool UIDisplaySyncManager::IsNonAutoRefreshRateMode() const
175 {
176 return refreshRateMode_ != static_cast<int32_t>(RefreshRateMode::REFRESHRATE_MODE_AUTO);
177 }
178
UIDisplaySyncManager()179 UIDisplaySyncManager::UIDisplaySyncManager() {}
180
~UIDisplaySyncManager()181 UIDisplaySyncManager::~UIDisplaySyncManager() noexcept
182 {
183 uiDisplaySyncMap_.clear();
184 }
185 } // namespace OHOS::Ace
186