1 /* 2 * Copyright (c) 2021 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 17 #ifndef VSYNC_VSYNC_GENERATOR_H 18 #define VSYNC_VSYNC_GENERATOR_H 19 20 #include <cstdint> 21 #include <refbase.h> 22 #include "graphic_common.h" 23 24 #include <mutex> 25 #include <vector> 26 #include <thread> 27 #include <condition_variable> 28 #include "vsync_type.h" 29 30 namespace OHOS { 31 namespace Rosen { 32 class VSyncGenerator : public RefBase { 33 public: 34 class Callback : public RefBase { 35 public: 36 virtual void OnVSyncEvent(int64_t now, int64_t period, uint32_t refreshRate, VSyncMode vsyncMode) = 0; 37 virtual void OnPhaseOffsetChanged(int64_t phaseOffset) = 0; 38 /* std::pair<id, refresh rate> */ 39 virtual void OnConnsRefreshRateChanged(const std::vector<std::pair<uint64_t, uint32_t>> &refreshRates) = 0; 40 }; 41 struct ListenerRefreshRateData { 42 sptr<OHOS::Rosen::VSyncGenerator::Callback> cb = nullptr; 43 // id, refreshRate 44 std::vector<std::pair<uint64_t, uint32_t>> refreshRates; 45 }; 46 struct ListenerPhaseOffsetData { 47 sptr<OHOS::Rosen::VSyncGenerator::Callback> cb = nullptr; 48 int32_t phaseByPulseNum = 0; 49 }; 50 VSyncGenerator() = default; 51 virtual ~VSyncGenerator() noexcept = default; 52 virtual VsyncError UpdateMode(int64_t period, int64_t phase, int64_t referenceTime) = 0; 53 virtual VsyncError AddListener(int64_t phase, const sptr<Callback>& cb) = 0; 54 virtual VsyncError RemoveListener(const sptr<Callback>& cb) = 0; 55 virtual VsyncError ChangePhaseOffset(const sptr<Callback>& cb, int64_t offset) = 0; 56 virtual bool IsEnable() = 0; 57 virtual VsyncError ChangeGeneratorRefreshRateModel(const ListenerRefreshRateData &listenerRefreshRates, 58 const ListenerPhaseOffsetData &listenerPhaseOffset, 59 uint32_t generatorRefreshRate) = 0; 60 virtual int64_t GetVSyncPulse() = 0; 61 virtual VsyncError SetVSyncMode(VSyncMode vsyncMode) = 0; 62 virtual VSyncMode GetVSyncMode() = 0; 63 virtual VsyncError SetVSyncPhaseByPulseNum(int32_t phaseByPulseNum) = 0; 64 virtual void Dump(std::string &result) = 0; 65 virtual bool GetFrameRateChaingStatus() = 0; 66 virtual VsyncError SetReferenceTimeOffset(int32_t phaseByPulseNum) = 0; 67 virtual VsyncError CheckAndUpdateRefereceTime(int64_t hardwareVsyncInterval, int64_t referenceTime) = 0; 68 virtual void SetPendingMode(int64_t period, int64_t timestamp) = 0; 69 virtual VsyncError StartRefresh() = 0; 70 }; 71 72 sptr<VSyncGenerator> CreateVSyncGenerator(); 73 void DestroyVSyncGenerator(); 74 75 namespace impl { 76 class VSyncGenerator : public OHOS::Rosen::VSyncGenerator { 77 public: 78 static sptr<OHOS::Rosen::VSyncGenerator> GetInstance() noexcept; 79 static void DeleteInstance() noexcept; 80 81 // nocopyable 82 VSyncGenerator(const VSyncGenerator &) = delete; 83 VSyncGenerator &operator=(const VSyncGenerator &) = delete; 84 VsyncError UpdateMode(int64_t period, int64_t phase, int64_t referenceTime) override; 85 VsyncError AddListener(int64_t phase, const sptr<OHOS::Rosen::VSyncGenerator::Callback>& cb) override; 86 VsyncError RemoveListener(const sptr<OHOS::Rosen::VSyncGenerator::Callback>& cb) override; 87 VsyncError ChangePhaseOffset(const sptr<OHOS::Rosen::VSyncGenerator::Callback>& cb, int64_t offset) override; 88 bool IsEnable() override; 89 VsyncError ChangeGeneratorRefreshRateModel(const ListenerRefreshRateData &listenerRefreshRates, 90 const ListenerPhaseOffsetData &listenerPhaseOffset, 91 uint32_t generatorRefreshRate) override; 92 int64_t GetVSyncPulse() override; 93 VsyncError SetVSyncMode(VSyncMode vsyncMode) override; 94 VSyncMode GetVSyncMode() override; 95 VsyncError SetVSyncPhaseByPulseNum(int32_t phaseByPulseNum) override; 96 void Dump(std::string &result) override; 97 bool GetFrameRateChaingStatus() override; 98 VsyncError SetReferenceTimeOffset(int32_t phaseByPulseNum) override; 99 VsyncError CheckAndUpdateRefereceTime(int64_t hardwareVsyncInterval, int64_t referenceTime) override; 100 void SetPendingMode(int64_t period, int64_t timestamp) override; 101 VsyncError StartRefresh() override; 102 103 private: 104 friend class OHOS::Rosen::VSyncGenerator; 105 106 struct Listener { 107 int64_t phase_; 108 sptr<OHOS::Rosen::VSyncGenerator::Callback> callback_; 109 int64_t lastTime_; 110 int64_t lastTimeRecord_; 111 }; 112 113 VSyncGenerator(); 114 ~VSyncGenerator() noexcept override; 115 116 int64_t ComputeNextVSyncTimeStamp(int64_t now, int64_t referenceTime); 117 std::vector<Listener> GetListenerTimeouted(int64_t now, int64_t occurTimestamp, int64_t referenceTime); 118 int64_t ComputeListenerNextVSyncTimeStamp(const Listener &listen, int64_t now, int64_t referenceTime); 119 void ThreadLoop(); 120 void UpdateWakeupDelay(int64_t occurTimestamp, int64_t nextTimeStamp); 121 bool ChangeListenerOffsetInternal(); 122 bool ChangeListenerRefreshRatesInternal(); 123 uint32_t JudgeRefreshRateLocked(int64_t period); 124 bool CheckTimingCorrect(int64_t now, int64_t referenceTime, int64_t nextVSyncTime); 125 bool UpdateChangeDataLocked(int64_t now, int64_t referenceTime, int64_t nextVSyncTime); 126 void UpdateVSyncModeLocked(); 127 std::vector<Listener> GetListenerTimeoutedLTPO(int64_t now, int64_t referenceTime); 128 void ListenerVsyncEventCB(int64_t occurTimestamp, int64_t nextTimeStamp, 129 int64_t occurReferenceTime, bool isWakeup); 130 VsyncError UpdatePeriodLocked(int64_t period); 131 VsyncError UpdateReferenceTimeLocked(int64_t referenceTime); 132 133 int64_t period_; 134 int64_t phase_; 135 int64_t referenceTime_; 136 int64_t wakeupDelay_; 137 138 std::vector<Listener> listeners_; 139 140 std::mutex mutex_; 141 std::condition_variable con_; 142 std::mutex waitForTimeoutMtx_; 143 std::condition_variable waitForTimeoutCon_; 144 std::thread thread_; 145 bool vsyncThreadRunning_; 146 static std::once_flag createFlag_; 147 static sptr<OHOS::Rosen::VSyncGenerator> instance_; 148 int64_t pulse_; // by ns 149 uint32_t currRefreshRate_; // by Hz 150 int32_t referenceTimeOffsetPulseNum_; 151 int32_t defaultReferenceTimeOffsetPulseNum_; 152 ListenerRefreshRateData changingRefreshRates_ = {}; 153 ListenerPhaseOffsetData changingPhaseOffset_ = {}; 154 uint32_t changingGeneratorRefreshRate_ = 0; 155 bool needChangeRefreshRates_ = false; 156 bool needChangePhaseOffset_ = false; 157 bool needChangeGeneratorRefreshRate_ = false; 158 VSyncMode vsyncMode_ = VSYNC_MODE_LTPS; //default LTPS 159 VSyncMode pendingVsyncMode_ = VSYNC_MODE_INVALID; 160 std::vector<Listener> listenersRecord_; 161 bool refreshRateIsChanged_ = false; 162 bool frameRateChanging_ = false; 163 int64_t pendingPeriod_ = 0; 164 int64_t pendingReferenceTime_ = 0; 165 bool startRefresh_ = false; 166 int64_t phaseRecord_ = 0; 167 int64_t periodRecord_ = 0; 168 }; 169 } // impl 170 } // namespace Rosen 171 } // namespace OHOS 172 173 #endif 174