1 /*
2  * Copyright (C) 2024 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #define ATRACE_TAG (ATRACE_TAG_GRAPHICS | ATRACE_TAG_HAL)
18 
19 #include "CombinedRefreshRateCalculator.h"
20 
21 #include <algorithm>
22 
23 #include "../Utils.h"
24 
25 namespace android::hardware::graphics::composer {
26 
CombinedRefreshRateCalculator(std::vector<std::shared_ptr<RefreshRateCalculator>> refreshRateCalculators)27 CombinedRefreshRateCalculator::CombinedRefreshRateCalculator(
28         std::vector<std::shared_ptr<RefreshRateCalculator>> refreshRateCalculators)
29       : CombinedRefreshRateCalculator(std::move(refreshRateCalculators),
30                                       kDefaultMinValidRefreshRate, kDefaultMaxValidRefreshRate) {}
31 
CombinedRefreshRateCalculator(std::vector<std::shared_ptr<RefreshRateCalculator>> refreshRateCalculators,int minValidRefreshRate,int maxValidRefreshRate)32 CombinedRefreshRateCalculator::CombinedRefreshRateCalculator(
33         std::vector<std::shared_ptr<RefreshRateCalculator>> refreshRateCalculators,
34         int minValidRefreshRate, int maxValidRefreshRate)
35       : mRefreshRateCalculators(std::move(refreshRateCalculators)),
36         mMinValidRefreshRate(minValidRefreshRate),
37         mMaxValidRefreshRate(maxValidRefreshRate) {
38     mName = "RefreshRateCalculator-Combined";
39     for (auto& refreshRateCalculator : mRefreshRateCalculators) {
40         refreshRateCalculator->registerRefreshRateChangeCallback(
41                 std::bind(&CombinedRefreshRateCalculator::onRefreshRateChanged, this,
42                           std::placeholders::_1));
43     }
44 }
45 
getRefreshRate() const46 int CombinedRefreshRateCalculator::getRefreshRate() const {
47     return mLastRefreshRate;
48 }
49 
onPowerStateChange(int from,int to)50 void CombinedRefreshRateCalculator::onPowerStateChange(int from, int to) {
51     for (auto& refreshRateCalculator : mRefreshRateCalculators) {
52         refreshRateCalculator->onPowerStateChange(from, to);
53     }
54 }
55 
onPresentInternal(int64_t presentTimeNs,int flag)56 void CombinedRefreshRateCalculator::onPresentInternal(int64_t presentTimeNs, int flag) {
57     mHasRefreshRateChage = false;
58 
59     mIsOnPresent = true;
60     for (auto& refreshRateCalculator : mRefreshRateCalculators) {
61         refreshRateCalculator->onPresentInternal(presentTimeNs, flag);
62     }
63     mIsOnPresent = false;
64 
65     if (mHasRefreshRateChage) {
66         updateRefreshRate();
67     }
68 }
69 
reset()70 void CombinedRefreshRateCalculator::reset() {
71     for (auto& refreshRateCalculator : mRefreshRateCalculators) {
72         refreshRateCalculator->reset();
73     }
74     setNewRefreshRate(kDefaultInvalidRefreshRate);
75     mHasRefreshRateChage = false;
76 }
77 
setEnabled(bool isEnabled)78 void CombinedRefreshRateCalculator::setEnabled(bool isEnabled) {
79     for (auto& refreshRateCalculator : mRefreshRateCalculators) {
80         refreshRateCalculator->setEnabled(isEnabled);
81     }
82 }
83 
setVrrConfigAttributes(int64_t vsyncPeriodNs,int64_t minFrameIntervalNs)84 void CombinedRefreshRateCalculator::setVrrConfigAttributes(int64_t vsyncPeriodNs,
85                                                            int64_t minFrameIntervalNs) {
86     RefreshRateCalculator::setVrrConfigAttributes(vsyncPeriodNs, minFrameIntervalNs);
87 
88     for (auto& refreshRateCalculator : mRefreshRateCalculators) {
89         refreshRateCalculator->setVrrConfigAttributes(vsyncPeriodNs, minFrameIntervalNs);
90     }
91 }
92 
onRefreshRateChanged(int refreshRate)93 void CombinedRefreshRateCalculator::onRefreshRateChanged(int refreshRate) {
94     if (mIsOnPresent) {
95         mHasRefreshRateChage = true;
96     } else {
97         updateRefreshRate();
98     }
99 }
100 
setNewRefreshRate(int newRefreshRate)101 void CombinedRefreshRateCalculator::setNewRefreshRate(int newRefreshRate) {
102     if (newRefreshRate != mLastRefreshRate) {
103         mLastRefreshRate = newRefreshRate;
104         ATRACE_INT(mName.c_str(), newRefreshRate);
105         if (mRefreshRateChangeCallback) {
106             mRefreshRateChangeCallback(newRefreshRate);
107         }
108     }
109 }
110 
updateRefreshRate()111 void CombinedRefreshRateCalculator::updateRefreshRate() {
112     int currentRefreshRate = kDefaultInvalidRefreshRate;
113     for (auto& refreshRateCalculator : mRefreshRateCalculators) {
114         auto refreshRate = refreshRateCalculator->getRefreshRate();
115         if ((refreshRate >= mMinValidRefreshRate) && (refreshRate <= mMaxValidRefreshRate)) {
116             currentRefreshRate = refreshRate;
117             break;
118         }
119     }
120     setNewRefreshRate(currentRefreshRate);
121 }
122 
123 } // namespace android::hardware::graphics::composer
124