1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker * Copyright 2023 The Android Open Source Project
3*38e8c45fSAndroid Build Coastguard Worker *
4*38e8c45fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*38e8c45fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*38e8c45fSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*38e8c45fSAndroid Build Coastguard Worker *
8*38e8c45fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*38e8c45fSAndroid Build Coastguard Worker *
10*38e8c45fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*38e8c45fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*38e8c45fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*38e8c45fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*38e8c45fSAndroid Build Coastguard Worker * limitations under the License.
15*38e8c45fSAndroid Build Coastguard Worker */
16*38e8c45fSAndroid Build Coastguard Worker
17*38e8c45fSAndroid Build Coastguard Worker #include <gui/FrameRateUtils.h>
18*38e8c45fSAndroid Build Coastguard Worker #include <system/window.h>
19*38e8c45fSAndroid Build Coastguard Worker #include <utils/Log.h>
20*38e8c45fSAndroid Build Coastguard Worker
21*38e8c45fSAndroid Build Coastguard Worker #include <cmath>
22*38e8c45fSAndroid Build Coastguard Worker
23*38e8c45fSAndroid Build Coastguard Worker #include <com_android_graphics_libgui_flags.h>
24*38e8c45fSAndroid Build Coastguard Worker
25*38e8c45fSAndroid Build Coastguard Worker namespace android {
26*38e8c45fSAndroid Build Coastguard Worker using namespace com::android::graphics::libgui;
27*38e8c45fSAndroid Build Coastguard Worker // Returns true if the frameRate is valid.
28*38e8c45fSAndroid Build Coastguard Worker //
29*38e8c45fSAndroid Build Coastguard Worker // @param frameRate the frame rate in Hz
30*38e8c45fSAndroid Build Coastguard Worker // @param compatibility a ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_*
31*38e8c45fSAndroid Build Coastguard Worker // @param changeFrameRateStrategy a ANATIVEWINDOW_CHANGE_FRAME_RATE_*
32*38e8c45fSAndroid Build Coastguard Worker // @param functionName calling function or nullptr. Used for logging
33*38e8c45fSAndroid Build Coastguard Worker // @param privileged whether caller has unscoped surfaceflinger access
ValidateFrameRate(float frameRate,int8_t compatibility,int8_t changeFrameRateStrategy,const char * inFunctionName,bool privileged)34*38e8c45fSAndroid Build Coastguard Worker bool ValidateFrameRate(float frameRate, int8_t compatibility, int8_t changeFrameRateStrategy,
35*38e8c45fSAndroid Build Coastguard Worker const char* inFunctionName, bool privileged) {
36*38e8c45fSAndroid Build Coastguard Worker const char* functionName = inFunctionName != nullptr ? inFunctionName : "call";
37*38e8c45fSAndroid Build Coastguard Worker int floatClassification = std::fpclassify(frameRate);
38*38e8c45fSAndroid Build Coastguard Worker if (frameRate < 0 || floatClassification == FP_INFINITE || floatClassification == FP_NAN) {
39*38e8c45fSAndroid Build Coastguard Worker ALOGE("%s failed - invalid frame rate %f", functionName, frameRate);
40*38e8c45fSAndroid Build Coastguard Worker return false;
41*38e8c45fSAndroid Build Coastguard Worker }
42*38e8c45fSAndroid Build Coastguard Worker
43*38e8c45fSAndroid Build Coastguard Worker if (compatibility != ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_DEFAULT &&
44*38e8c45fSAndroid Build Coastguard Worker compatibility != ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_FIXED_SOURCE &&
45*38e8c45fSAndroid Build Coastguard Worker compatibility != ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_GTE &&
46*38e8c45fSAndroid Build Coastguard Worker (!privileged ||
47*38e8c45fSAndroid Build Coastguard Worker (compatibility != ANATIVEWINDOW_FRAME_RATE_EXACT &&
48*38e8c45fSAndroid Build Coastguard Worker compatibility != ANATIVEWINDOW_FRAME_RATE_NO_VOTE))) {
49*38e8c45fSAndroid Build Coastguard Worker ALOGE("%s failed - invalid compatibility value %d privileged: %s", functionName,
50*38e8c45fSAndroid Build Coastguard Worker compatibility, privileged ? "yes" : "no");
51*38e8c45fSAndroid Build Coastguard Worker return false;
52*38e8c45fSAndroid Build Coastguard Worker }
53*38e8c45fSAndroid Build Coastguard Worker
54*38e8c45fSAndroid Build Coastguard Worker if (__builtin_available(android 31, *)) {
55*38e8c45fSAndroid Build Coastguard Worker if (changeFrameRateStrategy != ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS &&
56*38e8c45fSAndroid Build Coastguard Worker changeFrameRateStrategy != ANATIVEWINDOW_CHANGE_FRAME_RATE_ALWAYS) {
57*38e8c45fSAndroid Build Coastguard Worker ALOGE("%s failed - invalid change frame rate strategy value %d", functionName,
58*38e8c45fSAndroid Build Coastguard Worker changeFrameRateStrategy);
59*38e8c45fSAndroid Build Coastguard Worker if (flags::bq_setframerate()) {
60*38e8c45fSAndroid Build Coastguard Worker return false;
61*38e8c45fSAndroid Build Coastguard Worker }
62*38e8c45fSAndroid Build Coastguard Worker }
63*38e8c45fSAndroid Build Coastguard Worker }
64*38e8c45fSAndroid Build Coastguard Worker
65*38e8c45fSAndroid Build Coastguard Worker return true;
66*38e8c45fSAndroid Build Coastguard Worker }
67*38e8c45fSAndroid Build Coastguard Worker
68*38e8c45fSAndroid Build Coastguard Worker } // namespace android
69