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 #include "RefreshRateCalculatorFactory.h"
18 
19 namespace android::hardware::graphics::composer {
20 
21 // Build InstantRefreshRateCalculator.
BuildRefreshRateCalculator(EventQueue * eventQueue,int64_t maxValidPeriodNs)22 std::shared_ptr<RefreshRateCalculator> RefreshRateCalculatorFactory::BuildRefreshRateCalculator(
23         EventQueue* eventQueue, int64_t maxValidPeriodNs) {
24     return std::make_shared<InstantRefreshRateCalculator>(eventQueue, maxValidPeriodNs);
25 }
26 
27 // Build ExitIdleRefreshRateCalculator.
BuildRefreshRateCalculator(EventQueue * eventQueue,const ExitIdleRefreshRateCalculatorParameters & params)28 std::unique_ptr<RefreshRateCalculator> RefreshRateCalculatorFactory::BuildRefreshRateCalculator(
29         EventQueue* eventQueue, const ExitIdleRefreshRateCalculatorParameters& params) {
30     return std::make_unique<ExitIdleRefreshRateCalculator>(eventQueue, params);
31 }
32 
33 // Build VideoFrameRateCalculator
BuildRefreshRateCalculator(EventQueue * eventQueue,const VideoFrameRateCalculatorParameters & params)34 std::shared_ptr<RefreshRateCalculator> RefreshRateCalculatorFactory::BuildRefreshRateCalculator(
35         EventQueue* eventQueue, const VideoFrameRateCalculatorParameters& params) {
36     return std::make_shared<VideoFrameRateCalculator>(eventQueue, params);
37 }
38 
39 // Build PeriodRefreshRateCalculator.
BuildRefreshRateCalculator(EventQueue * eventQueue,const PeriodRefreshRateCalculatorParameters & params)40 std::shared_ptr<RefreshRateCalculator> RefreshRateCalculatorFactory::BuildRefreshRateCalculator(
41         EventQueue* eventQueue, const PeriodRefreshRateCalculatorParameters& params) {
42     return std::make_shared<PeriodRefreshRateCalculator>(eventQueue, params);
43 }
44 
45 // Build CombinedRefreshRateCalculator.
BuildRefreshRateCalculator(EventQueue * eventQueue,const std::vector<RefreshRateCalculatorType> & types)46 std::shared_ptr<RefreshRateCalculator> RefreshRateCalculatorFactory::BuildRefreshRateCalculator(
47         EventQueue* eventQueue, const std::vector<RefreshRateCalculatorType>& types) {
48     std::vector<std::shared_ptr<RefreshRateCalculator>> refreshRateCalculators;
49     for (const auto& type : types) {
50         refreshRateCalculators.emplace_back(BuildRefreshRateCalculator(eventQueue, type));
51     }
52     return std::make_shared<CombinedRefreshRateCalculator>(std::move(refreshRateCalculators));
53 }
54 
55 // Build CombinedRefreshRateCalculator.
BuildRefreshRateCalculator(std::vector<std::shared_ptr<RefreshRateCalculator>> refreshRateCalculators,int minValidRefreshRate,int maxValidRefreshRate)56 std::shared_ptr<RefreshRateCalculator> RefreshRateCalculatorFactory::BuildRefreshRateCalculator(
57         std::vector<std::shared_ptr<RefreshRateCalculator>> refreshRateCalculators,
58         int minValidRefreshRate, int maxValidRefreshRate) {
59     return std::make_shared<CombinedRefreshRateCalculator>(std::move(refreshRateCalculators),
60                                                            minValidRefreshRate,
61                                                            maxValidRefreshRate);
62 }
63 
64 // Build various RefreshRateCalculator with default settings.
BuildRefreshRateCalculator(EventQueue * eventQueue,RefreshRateCalculatorType type)65 std::shared_ptr<RefreshRateCalculator> RefreshRateCalculatorFactory::BuildRefreshRateCalculator(
66         EventQueue* eventQueue, RefreshRateCalculatorType type) {
67     switch (type) {
68         case RefreshRateCalculatorType::kAod: {
69             return std::make_shared<AODRefreshRateCalculator>(eventQueue);
70         }
71         case RefreshRateCalculatorType::kInstant: {
72             return std::make_shared<InstantRefreshRateCalculator>(eventQueue);
73         }
74         case RefreshRateCalculatorType::kExitIdle: {
75             return std::make_unique<ExitIdleRefreshRateCalculator>(eventQueue);
76         }
77         case RefreshRateCalculatorType::kPeriodical: {
78             return std::make_shared<PeriodRefreshRateCalculator>(eventQueue);
79         }
80         case RefreshRateCalculatorType::kVideoPlayback: {
81             return std::make_shared<VideoFrameRateCalculator>(eventQueue);
82         }
83         case RefreshRateCalculatorType::kCombined: {
84             std::vector<RefreshRateCalculatorType> types{RefreshRateCalculatorType::kVideoPlayback,
85                                                          RefreshRateCalculatorType::kPeriodical};
86             return BuildRefreshRateCalculator(eventQueue, types);
87         }
88         default:
89             return nullptr;
90     };
91 }
92 
93 } // namespace android::hardware::graphics::composer
94