• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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