xref: /aosp_15_r20/frameworks/native/libs/gui/FrameRateUtils.cpp (revision 38e8c45f13ce32b0dcecb25141ffecaf386fa17f)
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