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