1 /* 2 * Copyright 2019 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 #pragma once 18 19 #include <utils/Timers.h> 20 21 #include <scheduler/Fps.h> 22 23 #include "VSyncDispatch.h" 24 25 namespace android::scheduler { 26 /* 27 * VSyncTracker is an interface for providing estimates on future Vsync signal times based on 28 * historical vsync timing data. 29 */ 30 class VSyncTracker { 31 public: 32 virtual ~VSyncTracker(); 33 34 /* 35 * Adds a known timestamp from a vsync timing source (HWVsync signal, present fence) 36 * to the model. 37 * 38 * \param [in] timestamp The timestamp when the vsync signal was. 39 * \return True if the timestamp was consistent with the internal model, 40 * False otherwise 41 */ 42 virtual bool addVsyncTimestamp(nsecs_t timestamp) = 0; 43 44 /* 45 * Access the next anticipated vsync time such that the anticipated time >= timePoint. 46 * This will always give the best accurate at the time of calling; multiple 47 * calls with the same timePoint might give differing values if the internal model 48 * is updated. 49 * 50 * \param [in] timePoint The point in time after which to estimate a vsync event. 51 * \return A prediction of the timestamp of a vsync event. 52 */ 53 virtual nsecs_t nextAnticipatedVSyncTimeFrom(nsecs_t timePoint) const = 0; 54 55 /* 56 * The current period of the vsync signal. 57 * 58 * \return The current period of the vsync signal 59 */ 60 virtual nsecs_t currentPeriod() const = 0; 61 62 /* 63 * Inform the tracker that the period is changing and the tracker needs to recalibrate itself. 64 * 65 * \param [in] period The period that the system is changing into. 66 */ 67 virtual void setPeriod(nsecs_t period) = 0; 68 69 /* Inform the tracker that the samples it has are not accurate for prediction. */ 70 virtual void resetModel() = 0; 71 72 virtual bool needsMoreSamples() const = 0; 73 74 /* 75 * Checks if a vsync timestamp is in phase for a frame rate 76 * 77 * \param [in] timePoint A vsync timestamp 78 * \param [in] frameRate The frame rate to check for 79 */ 80 virtual bool isVSyncInPhase(nsecs_t timePoint, Fps frameRate) const = 0; 81 82 /* 83 * Sets a render rate on the tracker. If the render rate is not a divisor 84 * of the period, the render rate is ignored until the period changes. 85 * The tracker will continue to track the vsync timeline and expect it 86 * to match the current period, however, nextAnticipatedVSyncTimeFrom will 87 * return vsyncs according to the render rate set. Setting a render rate is useful 88 * when a display is running at 120Hz but the render frame rate is 60Hz. 89 * 90 * \param [in] Fps The render rate the tracker should operate at. 91 */ 92 virtual void setRenderRate(Fps) = 0; 93 94 virtual void dump(std::string& result) const = 0; 95 96 protected: 97 VSyncTracker(VSyncTracker const&) = delete; 98 VSyncTracker& operator=(VSyncTracker const&) = delete; 99 VSyncTracker() = default; 100 }; 101 102 } // namespace android::scheduler 103