xref: /aosp_15_r20/frameworks/native/services/surfaceflinger/Scheduler/EventThread.h (revision 38e8c45f13ce32b0dcecb25141ffecaf386fa17f)
1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker  * Copyright (C) 2011 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 #pragma once
18*38e8c45fSAndroid Build Coastguard Worker 
19*38e8c45fSAndroid Build Coastguard Worker #include <android-base/thread_annotations.h>
20*38e8c45fSAndroid Build Coastguard Worker #include <android/gui/BnDisplayEventConnection.h>
21*38e8c45fSAndroid Build Coastguard Worker #include <gui/DisplayEventReceiver.h>
22*38e8c45fSAndroid Build Coastguard Worker #include <private/gui/BitTube.h>
23*38e8c45fSAndroid Build Coastguard Worker #include <sys/types.h>
24*38e8c45fSAndroid Build Coastguard Worker #include <ui/DisplayId.h>
25*38e8c45fSAndroid Build Coastguard Worker #include <utils/Errors.h>
26*38e8c45fSAndroid Build Coastguard Worker 
27*38e8c45fSAndroid Build Coastguard Worker #include <scheduler/FrameRateMode.h>
28*38e8c45fSAndroid Build Coastguard Worker #include <condition_variable>
29*38e8c45fSAndroid Build Coastguard Worker #include <cstdint>
30*38e8c45fSAndroid Build Coastguard Worker #include <deque>
31*38e8c45fSAndroid Build Coastguard Worker #include <mutex>
32*38e8c45fSAndroid Build Coastguard Worker #include <optional>
33*38e8c45fSAndroid Build Coastguard Worker #include <thread>
34*38e8c45fSAndroid Build Coastguard Worker #include <vector>
35*38e8c45fSAndroid Build Coastguard Worker 
36*38e8c45fSAndroid Build Coastguard Worker #include "DisplayHardware/DisplayMode.h"
37*38e8c45fSAndroid Build Coastguard Worker #include "TracedOrdinal.h"
38*38e8c45fSAndroid Build Coastguard Worker #include "VSyncDispatch.h"
39*38e8c45fSAndroid Build Coastguard Worker #include "VsyncSchedule.h"
40*38e8c45fSAndroid Build Coastguard Worker 
41*38e8c45fSAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
42*38e8c45fSAndroid Build Coastguard Worker namespace android {
43*38e8c45fSAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
44*38e8c45fSAndroid Build Coastguard Worker 
45*38e8c45fSAndroid Build Coastguard Worker class EventThread;
46*38e8c45fSAndroid Build Coastguard Worker class EventThreadTest;
47*38e8c45fSAndroid Build Coastguard Worker class SurfaceFlinger;
48*38e8c45fSAndroid Build Coastguard Worker 
49*38e8c45fSAndroid Build Coastguard Worker namespace frametimeline {
50*38e8c45fSAndroid Build Coastguard Worker class TokenManager;
51*38e8c45fSAndroid Build Coastguard Worker } // namespace frametimeline
52*38e8c45fSAndroid Build Coastguard Worker 
53*38e8c45fSAndroid Build Coastguard Worker using gui::ParcelableVsyncEventData;
54*38e8c45fSAndroid Build Coastguard Worker using gui::VsyncEventData;
55*38e8c45fSAndroid Build Coastguard Worker 
56*38e8c45fSAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
57*38e8c45fSAndroid Build Coastguard Worker 
58*38e8c45fSAndroid Build Coastguard Worker using FrameRateOverride = DisplayEventReceiver::Event::FrameRateOverride;
59*38e8c45fSAndroid Build Coastguard Worker using BufferStuffingMap = ftl::SmallMap<uid_t, uint32_t, 10>;
60*38e8c45fSAndroid Build Coastguard Worker 
61*38e8c45fSAndroid Build Coastguard Worker enum class VSyncRequest {
62*38e8c45fSAndroid Build Coastguard Worker     None = -2,
63*38e8c45fSAndroid Build Coastguard Worker     // Single wakes up for the next two frames to avoid scheduler overhead
64*38e8c45fSAndroid Build Coastguard Worker     Single = -1,
65*38e8c45fSAndroid Build Coastguard Worker     // SingleSuppressCallback only wakes up for the next frame
66*38e8c45fSAndroid Build Coastguard Worker     SingleSuppressCallback = 0,
67*38e8c45fSAndroid Build Coastguard Worker     Periodic = 1,
68*38e8c45fSAndroid Build Coastguard Worker     // Subsequent values are periods.
69*38e8c45fSAndroid Build Coastguard Worker };
70*38e8c45fSAndroid Build Coastguard Worker 
71*38e8c45fSAndroid Build Coastguard Worker class EventThreadConnection : public gui::BnDisplayEventConnection {
72*38e8c45fSAndroid Build Coastguard Worker public:
73*38e8c45fSAndroid Build Coastguard Worker     EventThreadConnection(EventThread*, uid_t callingUid,
74*38e8c45fSAndroid Build Coastguard Worker                           EventRegistrationFlags eventRegistration = {});
75*38e8c45fSAndroid Build Coastguard Worker     virtual ~EventThreadConnection();
76*38e8c45fSAndroid Build Coastguard Worker 
77*38e8c45fSAndroid Build Coastguard Worker     virtual status_t postEvent(const DisplayEventReceiver::Event& event);
78*38e8c45fSAndroid Build Coastguard Worker 
79*38e8c45fSAndroid Build Coastguard Worker     binder::Status stealReceiveChannel(gui::BitTube* outChannel) override;
80*38e8c45fSAndroid Build Coastguard Worker     binder::Status setVsyncRate(int rate) override;
81*38e8c45fSAndroid Build Coastguard Worker     binder::Status requestNextVsync() override; // asynchronous
82*38e8c45fSAndroid Build Coastguard Worker     binder::Status getLatestVsyncEventData(ParcelableVsyncEventData* outVsyncEventData) override;
83*38e8c45fSAndroid Build Coastguard Worker     binder::Status getSchedulingPolicy(gui::SchedulingPolicy* outPolicy) override;
84*38e8c45fSAndroid Build Coastguard Worker 
85*38e8c45fSAndroid Build Coastguard Worker     VSyncRequest vsyncRequest = VSyncRequest::None;
86*38e8c45fSAndroid Build Coastguard Worker     const uid_t mOwnerUid;
87*38e8c45fSAndroid Build Coastguard Worker     const EventRegistrationFlags mEventRegistration;
88*38e8c45fSAndroid Build Coastguard Worker 
89*38e8c45fSAndroid Build Coastguard Worker     /** The frame rate set to the attached choreographer. */
90*38e8c45fSAndroid Build Coastguard Worker     Fps frameRate;
91*38e8c45fSAndroid Build Coastguard Worker 
92*38e8c45fSAndroid Build Coastguard Worker private:
93*38e8c45fSAndroid Build Coastguard Worker     virtual void onFirstRef();
94*38e8c45fSAndroid Build Coastguard Worker     EventThread* const mEventThread;
95*38e8c45fSAndroid Build Coastguard Worker     std::mutex mLock;
96*38e8c45fSAndroid Build Coastguard Worker     gui::BitTube mChannel GUARDED_BY(mLock);
97*38e8c45fSAndroid Build Coastguard Worker 
98*38e8c45fSAndroid Build Coastguard Worker     std::vector<DisplayEventReceiver::Event> mPendingEvents;
99*38e8c45fSAndroid Build Coastguard Worker };
100*38e8c45fSAndroid Build Coastguard Worker 
101*38e8c45fSAndroid Build Coastguard Worker class EventThread {
102*38e8c45fSAndroid Build Coastguard Worker public:
103*38e8c45fSAndroid Build Coastguard Worker     virtual ~EventThread();
104*38e8c45fSAndroid Build Coastguard Worker 
105*38e8c45fSAndroid Build Coastguard Worker     virtual sp<EventThreadConnection> createEventConnection(
106*38e8c45fSAndroid Build Coastguard Worker             EventRegistrationFlags eventRegistration = {}) const = 0;
107*38e8c45fSAndroid Build Coastguard Worker 
108*38e8c45fSAndroid Build Coastguard Worker     // Feed clients with fake VSYNC, e.g. while the display is off.
109*38e8c45fSAndroid Build Coastguard Worker     virtual void enableSyntheticVsync(bool) = 0;
110*38e8c45fSAndroid Build Coastguard Worker 
111*38e8c45fSAndroid Build Coastguard Worker     virtual void omitVsyncDispatching(bool) = 0;
112*38e8c45fSAndroid Build Coastguard Worker 
113*38e8c45fSAndroid Build Coastguard Worker     virtual void onHotplugReceived(PhysicalDisplayId displayId, bool connected) = 0;
114*38e8c45fSAndroid Build Coastguard Worker 
115*38e8c45fSAndroid Build Coastguard Worker     virtual void onHotplugConnectionError(int32_t connectionError) = 0;
116*38e8c45fSAndroid Build Coastguard Worker 
117*38e8c45fSAndroid Build Coastguard Worker     // called when SF changes the active mode and apps needs to be notified about the change
118*38e8c45fSAndroid Build Coastguard Worker     virtual void onModeChanged(const scheduler::FrameRateMode&) = 0;
119*38e8c45fSAndroid Build Coastguard Worker 
120*38e8c45fSAndroid Build Coastguard Worker     // called when SF rejects the mode change request
121*38e8c45fSAndroid Build Coastguard Worker     virtual void onModeRejected(PhysicalDisplayId displayId, DisplayModeId modeId) = 0;
122*38e8c45fSAndroid Build Coastguard Worker 
123*38e8c45fSAndroid Build Coastguard Worker     // called when SF updates the Frame Rate Override list
124*38e8c45fSAndroid Build Coastguard Worker     virtual void onFrameRateOverridesChanged(PhysicalDisplayId displayId,
125*38e8c45fSAndroid Build Coastguard Worker                                              std::vector<FrameRateOverride> overrides) = 0;
126*38e8c45fSAndroid Build Coastguard Worker 
127*38e8c45fSAndroid Build Coastguard Worker     virtual void dump(std::string& result) const = 0;
128*38e8c45fSAndroid Build Coastguard Worker 
129*38e8c45fSAndroid Build Coastguard Worker     virtual void setDuration(std::chrono::nanoseconds workDuration,
130*38e8c45fSAndroid Build Coastguard Worker                              std::chrono::nanoseconds readyDuration) = 0;
131*38e8c45fSAndroid Build Coastguard Worker 
132*38e8c45fSAndroid Build Coastguard Worker     virtual status_t registerDisplayEventConnection(
133*38e8c45fSAndroid Build Coastguard Worker             const sp<EventThreadConnection>& connection) = 0;
134*38e8c45fSAndroid Build Coastguard Worker     virtual void setVsyncRate(uint32_t rate, const sp<EventThreadConnection>& connection) = 0;
135*38e8c45fSAndroid Build Coastguard Worker     // Requests the next vsync. If resetIdleTimer is set to true, it resets the idle timer.
136*38e8c45fSAndroid Build Coastguard Worker     virtual void requestNextVsync(const sp<EventThreadConnection>& connection) = 0;
137*38e8c45fSAndroid Build Coastguard Worker     virtual VsyncEventData getLatestVsyncEventData(const sp<EventThreadConnection>& connection,
138*38e8c45fSAndroid Build Coastguard Worker                                                    nsecs_t now) const = 0;
139*38e8c45fSAndroid Build Coastguard Worker 
140*38e8c45fSAndroid Build Coastguard Worker     virtual void onNewVsyncSchedule(std::shared_ptr<scheduler::VsyncSchedule>) = 0;
141*38e8c45fSAndroid Build Coastguard Worker 
142*38e8c45fSAndroid Build Coastguard Worker     virtual void onHdcpLevelsChanged(PhysicalDisplayId displayId, int32_t connectedLevel,
143*38e8c45fSAndroid Build Coastguard Worker                                      int32_t maxLevel) = 0;
144*38e8c45fSAndroid Build Coastguard Worker 
145*38e8c45fSAndroid Build Coastguard Worker     // An elevated number of queued buffers in the server is detected. This propagates a
146*38e8c45fSAndroid Build Coastguard Worker     // flag to Choreographer indicating that buffer stuffing recovery should begin.
147*38e8c45fSAndroid Build Coastguard Worker     virtual void addBufferStuffedUids(BufferStuffingMap bufferStuffedUids);
148*38e8c45fSAndroid Build Coastguard Worker };
149*38e8c45fSAndroid Build Coastguard Worker 
150*38e8c45fSAndroid Build Coastguard Worker struct IEventThreadCallback {
151*38e8c45fSAndroid Build Coastguard Worker     virtual ~IEventThreadCallback() = default;
152*38e8c45fSAndroid Build Coastguard Worker 
153*38e8c45fSAndroid Build Coastguard Worker     virtual bool throttleVsync(TimePoint, uid_t) = 0;
154*38e8c45fSAndroid Build Coastguard Worker     virtual Period getVsyncPeriod(uid_t) = 0;
155*38e8c45fSAndroid Build Coastguard Worker     virtual void resync() = 0;
156*38e8c45fSAndroid Build Coastguard Worker     virtual void onExpectedPresentTimePosted(TimePoint) = 0;
157*38e8c45fSAndroid Build Coastguard Worker };
158*38e8c45fSAndroid Build Coastguard Worker 
159*38e8c45fSAndroid Build Coastguard Worker namespace impl {
160*38e8c45fSAndroid Build Coastguard Worker 
161*38e8c45fSAndroid Build Coastguard Worker class EventThread : public android::EventThread {
162*38e8c45fSAndroid Build Coastguard Worker public:
163*38e8c45fSAndroid Build Coastguard Worker     EventThread(const char* name, std::shared_ptr<scheduler::VsyncSchedule>,
164*38e8c45fSAndroid Build Coastguard Worker                 frametimeline::TokenManager*, IEventThreadCallback& callback,
165*38e8c45fSAndroid Build Coastguard Worker                 std::chrono::nanoseconds workDuration, std::chrono::nanoseconds readyDuration);
166*38e8c45fSAndroid Build Coastguard Worker     ~EventThread();
167*38e8c45fSAndroid Build Coastguard Worker 
168*38e8c45fSAndroid Build Coastguard Worker     sp<EventThreadConnection> createEventConnection(
169*38e8c45fSAndroid Build Coastguard Worker             EventRegistrationFlags eventRegistration = {}) const override;
170*38e8c45fSAndroid Build Coastguard Worker 
171*38e8c45fSAndroid Build Coastguard Worker     status_t registerDisplayEventConnection(const sp<EventThreadConnection>& connection) override;
172*38e8c45fSAndroid Build Coastguard Worker     void setVsyncRate(uint32_t rate, const sp<EventThreadConnection>& connection) override;
173*38e8c45fSAndroid Build Coastguard Worker     void requestNextVsync(const sp<EventThreadConnection>& connection) override;
174*38e8c45fSAndroid Build Coastguard Worker     VsyncEventData getLatestVsyncEventData(const sp<EventThreadConnection>& connection,
175*38e8c45fSAndroid Build Coastguard Worker                                            nsecs_t now) const override;
176*38e8c45fSAndroid Build Coastguard Worker 
177*38e8c45fSAndroid Build Coastguard Worker     void enableSyntheticVsync(bool) override;
178*38e8c45fSAndroid Build Coastguard Worker 
179*38e8c45fSAndroid Build Coastguard Worker     void omitVsyncDispatching(bool) override;
180*38e8c45fSAndroid Build Coastguard Worker 
181*38e8c45fSAndroid Build Coastguard Worker     void onHotplugReceived(PhysicalDisplayId displayId, bool connected) override;
182*38e8c45fSAndroid Build Coastguard Worker 
183*38e8c45fSAndroid Build Coastguard Worker     void onHotplugConnectionError(int32_t connectionError) override;
184*38e8c45fSAndroid Build Coastguard Worker 
185*38e8c45fSAndroid Build Coastguard Worker     void onModeChanged(const scheduler::FrameRateMode&) override;
186*38e8c45fSAndroid Build Coastguard Worker 
187*38e8c45fSAndroid Build Coastguard Worker     void onModeRejected(PhysicalDisplayId displayId, DisplayModeId modeId) override;
188*38e8c45fSAndroid Build Coastguard Worker 
189*38e8c45fSAndroid Build Coastguard Worker     void onFrameRateOverridesChanged(PhysicalDisplayId displayId,
190*38e8c45fSAndroid Build Coastguard Worker                                      std::vector<FrameRateOverride> overrides) override;
191*38e8c45fSAndroid Build Coastguard Worker 
192*38e8c45fSAndroid Build Coastguard Worker     void dump(std::string& result) const override;
193*38e8c45fSAndroid Build Coastguard Worker 
194*38e8c45fSAndroid Build Coastguard Worker     void setDuration(std::chrono::nanoseconds workDuration,
195*38e8c45fSAndroid Build Coastguard Worker                      std::chrono::nanoseconds readyDuration) override;
196*38e8c45fSAndroid Build Coastguard Worker 
197*38e8c45fSAndroid Build Coastguard Worker     void onNewVsyncSchedule(std::shared_ptr<scheduler::VsyncSchedule>) override EXCLUDES(mMutex);
198*38e8c45fSAndroid Build Coastguard Worker 
199*38e8c45fSAndroid Build Coastguard Worker     void onHdcpLevelsChanged(PhysicalDisplayId displayId, int32_t connectedLevel,
200*38e8c45fSAndroid Build Coastguard Worker                              int32_t maxLevel) override;
201*38e8c45fSAndroid Build Coastguard Worker 
202*38e8c45fSAndroid Build Coastguard Worker     void addBufferStuffedUids(BufferStuffingMap bufferStuffedUids) override;
203*38e8c45fSAndroid Build Coastguard Worker 
204*38e8c45fSAndroid Build Coastguard Worker private:
205*38e8c45fSAndroid Build Coastguard Worker     friend EventThreadTest;
206*38e8c45fSAndroid Build Coastguard Worker 
207*38e8c45fSAndroid Build Coastguard Worker     using DisplayEventConsumers = std::vector<sp<EventThreadConnection>>;
208*38e8c45fSAndroid Build Coastguard Worker 
209*38e8c45fSAndroid Build Coastguard Worker     void threadMain(std::unique_lock<std::mutex>& lock) REQUIRES(mMutex);
210*38e8c45fSAndroid Build Coastguard Worker 
211*38e8c45fSAndroid Build Coastguard Worker     bool shouldConsumeEvent(const DisplayEventReceiver::Event& event,
212*38e8c45fSAndroid Build Coastguard Worker                             const sp<EventThreadConnection>& connection) const REQUIRES(mMutex);
213*38e8c45fSAndroid Build Coastguard Worker     void dispatchEvent(const DisplayEventReceiver::Event& event,
214*38e8c45fSAndroid Build Coastguard Worker                        const DisplayEventConsumers& consumers) REQUIRES(mMutex);
215*38e8c45fSAndroid Build Coastguard Worker 
216*38e8c45fSAndroid Build Coastguard Worker     void removeDisplayEventConnectionLocked(const wp<EventThreadConnection>& connection)
217*38e8c45fSAndroid Build Coastguard Worker             REQUIRES(mMutex);
218*38e8c45fSAndroid Build Coastguard Worker 
219*38e8c45fSAndroid Build Coastguard Worker     void onVsync(nsecs_t vsyncTime, nsecs_t wakeupTime, nsecs_t readyTime);
220*38e8c45fSAndroid Build Coastguard Worker 
221*38e8c45fSAndroid Build Coastguard Worker     int64_t generateToken(nsecs_t timestamp, nsecs_t deadlineTimestamp,
222*38e8c45fSAndroid Build Coastguard Worker                           nsecs_t expectedPresentationTime) const;
223*38e8c45fSAndroid Build Coastguard Worker     void generateFrameTimeline(VsyncEventData& outVsyncEventData, nsecs_t frameInterval,
224*38e8c45fSAndroid Build Coastguard Worker                                nsecs_t timestamp, nsecs_t preferredExpectedPresentationTime,
225*38e8c45fSAndroid Build Coastguard Worker                                nsecs_t preferredDeadlineTimestamp) const;
226*38e8c45fSAndroid Build Coastguard Worker 
227*38e8c45fSAndroid Build Coastguard Worker     scheduler::VSyncDispatch::Callback createDispatchCallback();
228*38e8c45fSAndroid Build Coastguard Worker 
229*38e8c45fSAndroid Build Coastguard Worker     // Returns the old registration so it can be destructed outside the lock to
230*38e8c45fSAndroid Build Coastguard Worker     // avoid deadlock.
231*38e8c45fSAndroid Build Coastguard Worker     scheduler::VSyncCallbackRegistration onNewVsyncScheduleInternal(
232*38e8c45fSAndroid Build Coastguard Worker             std::shared_ptr<scheduler::VsyncSchedule>) EXCLUDES(mMutex);
233*38e8c45fSAndroid Build Coastguard Worker 
234*38e8c45fSAndroid Build Coastguard Worker     const char* const mThreadName;
235*38e8c45fSAndroid Build Coastguard Worker     TracedOrdinal<int> mVsyncTracer;
236*38e8c45fSAndroid Build Coastguard Worker     TracedOrdinal<std::chrono::nanoseconds> mWorkDuration GUARDED_BY(mMutex);
237*38e8c45fSAndroid Build Coastguard Worker     std::chrono::nanoseconds mReadyDuration GUARDED_BY(mMutex);
238*38e8c45fSAndroid Build Coastguard Worker     std::shared_ptr<scheduler::VsyncSchedule> mVsyncSchedule GUARDED_BY(mMutex);
239*38e8c45fSAndroid Build Coastguard Worker     TimePoint mLastVsyncCallbackTime GUARDED_BY(mMutex) = TimePoint::now();
240*38e8c45fSAndroid Build Coastguard Worker     TimePoint mLastCommittedVsyncTime GUARDED_BY(mMutex) = TimePoint::now();
241*38e8c45fSAndroid Build Coastguard Worker     scheduler::VSyncCallbackRegistration mVsyncRegistration GUARDED_BY(mMutex);
242*38e8c45fSAndroid Build Coastguard Worker     frametimeline::TokenManager* const mTokenManager;
243*38e8c45fSAndroid Build Coastguard Worker 
244*38e8c45fSAndroid Build Coastguard Worker     // All consumers that need to recover from buffer stuffing and the number
245*38e8c45fSAndroid Build Coastguard Worker     // of their queued buffers.
246*38e8c45fSAndroid Build Coastguard Worker     BufferStuffingMap mBufferStuffedUids GUARDED_BY(mMutex);
247*38e8c45fSAndroid Build Coastguard Worker 
248*38e8c45fSAndroid Build Coastguard Worker     IEventThreadCallback& mCallback;
249*38e8c45fSAndroid Build Coastguard Worker 
250*38e8c45fSAndroid Build Coastguard Worker     std::thread mThread;
251*38e8c45fSAndroid Build Coastguard Worker     mutable std::mutex mMutex;
252*38e8c45fSAndroid Build Coastguard Worker     mutable std::condition_variable mCondition;
253*38e8c45fSAndroid Build Coastguard Worker 
254*38e8c45fSAndroid Build Coastguard Worker     std::vector<wp<EventThreadConnection>> mDisplayEventConnections GUARDED_BY(mMutex);
255*38e8c45fSAndroid Build Coastguard Worker     std::deque<DisplayEventReceiver::Event> mPendingEvents GUARDED_BY(mMutex);
256*38e8c45fSAndroid Build Coastguard Worker 
257*38e8c45fSAndroid Build Coastguard Worker     // VSYNC state of connected display.
258*38e8c45fSAndroid Build Coastguard Worker     struct VSyncState {
259*38e8c45fSAndroid Build Coastguard Worker         // Number of VSYNC events since display was connected.
260*38e8c45fSAndroid Build Coastguard Worker         uint32_t count = 0;
261*38e8c45fSAndroid Build Coastguard Worker 
262*38e8c45fSAndroid Build Coastguard Worker         // True if VSYNC should be faked, e.g. when display is off.
263*38e8c45fSAndroid Build Coastguard Worker         bool synthetic = false;
264*38e8c45fSAndroid Build Coastguard Worker 
265*38e8c45fSAndroid Build Coastguard Worker         // True if VSYNC should not be delivered to apps. Used when the display is off.
266*38e8c45fSAndroid Build Coastguard Worker         bool omitted = false;
267*38e8c45fSAndroid Build Coastguard Worker     };
268*38e8c45fSAndroid Build Coastguard Worker 
269*38e8c45fSAndroid Build Coastguard Worker     // TODO(b/74619554): Create per-display threads waiting on respective VSYNC signals,
270*38e8c45fSAndroid Build Coastguard Worker     // and support headless mode by injecting a fake display with synthetic VSYNC.
271*38e8c45fSAndroid Build Coastguard Worker     std::optional<VSyncState> mVSyncState GUARDED_BY(mMutex);
272*38e8c45fSAndroid Build Coastguard Worker 
273*38e8c45fSAndroid Build Coastguard Worker     // State machine for event loop.
274*38e8c45fSAndroid Build Coastguard Worker     enum class State {
275*38e8c45fSAndroid Build Coastguard Worker         Idle,
276*38e8c45fSAndroid Build Coastguard Worker         Quit,
277*38e8c45fSAndroid Build Coastguard Worker         SyntheticVSync,
278*38e8c45fSAndroid Build Coastguard Worker         VSync,
279*38e8c45fSAndroid Build Coastguard Worker     };
280*38e8c45fSAndroid Build Coastguard Worker 
281*38e8c45fSAndroid Build Coastguard Worker     State mState GUARDED_BY(mMutex) = State::Idle;
282*38e8c45fSAndroid Build Coastguard Worker 
283*38e8c45fSAndroid Build Coastguard Worker     static const char* toCString(State);
284*38e8c45fSAndroid Build Coastguard Worker };
285*38e8c45fSAndroid Build Coastguard Worker 
286*38e8c45fSAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
287*38e8c45fSAndroid Build Coastguard Worker 
288*38e8c45fSAndroid Build Coastguard Worker } // namespace impl
289*38e8c45fSAndroid Build Coastguard Worker } // namespace android
290