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