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