diff options
author | 2018-06-08 15:11:57 -0700 | |
---|---|---|
committer | 2018-06-08 15:11:57 -0700 | |
commit | f11e2bd016d886a333345dea853ebda23a408d5c (patch) | |
tree | 905bd4d25d6ab2b046620ff459777d8dcfa5d7de /services/surfaceflinger/EventThread.h | |
parent | aabd6b7fa343654cd85b3b2da392e424d037d15a (diff) | |
parent | 5c947cdf72270fd1f766b2248d526ebc8c7227f6 (diff) |
Merge pi-dev-plus-aosp-without-vendor into stage-aosp-master
Bug: 79597307
Change-Id: I6d6bee71b9424eb478780bbfc06b830eb8ded342
Diffstat (limited to 'services/surfaceflinger/EventThread.h')
-rw-r--r-- | services/surfaceflinger/EventThread.h | 131 |
1 files changed, 78 insertions, 53 deletions
diff --git a/services/surfaceflinger/EventThread.h b/services/surfaceflinger/EventThread.h index 6a59fbbf42..9c13ed2755 100644 --- a/services/surfaceflinger/EventThread.h +++ b/services/surfaceflinger/EventThread.h @@ -14,36 +14,38 @@ * limitations under the License. */ -#ifndef ANDROID_SURFACE_FLINGER_EVENT_THREAD_H -#define ANDROID_SURFACE_FLINGER_EVENT_THREAD_H +#pragma once #include <stdint.h> #include <sys/types.h> +#include <condition_variable> +#include <mutex> +#include <thread> + +#include <android-base/thread_annotations.h> -#include <private/gui/BitTube.h> #include <gui/DisplayEventReceiver.h> #include <gui/IDisplayEventConnection.h> +#include <private/gui/BitTube.h> #include <utils/Errors.h> -#include <utils/threads.h> #include <utils/SortedVector.h> #include "DisplayDevice.h" -#include "DisplayHardware/PowerHAL.h" // --------------------------------------------------------------------------- namespace android { // --------------------------------------------------------------------------- +class EventThreadTest; class SurfaceFlinger; class String8; // --------------------------------------------------------------------------- - -class VSyncSource : public virtual RefBase { +class VSyncSource { public: - class Callback: public virtual RefBase { + class Callback { public: virtual ~Callback() {} virtual void onVSyncEvent(nsecs_t when) = 0; @@ -51,15 +53,39 @@ public: virtual ~VSyncSource() {} virtual void setVSyncEnabled(bool enable) = 0; - virtual void setCallback(const sp<Callback>& callback) = 0; + virtual void setCallback(Callback* callback) = 0; virtual void setPhaseOffset(nsecs_t phaseOffset) = 0; }; -class EventThread : public Thread, private VSyncSource::Callback { +class EventThread { +public: + virtual ~EventThread(); + + virtual sp<BnDisplayEventConnection> createEventConnection() const = 0; + + // called before the screen is turned off from main thread + virtual void onScreenReleased() = 0; + + // called after the screen is turned on from main thread + virtual void onScreenAcquired() = 0; + + // called when receiving a hotplug event + virtual void onHotplugReceived(int type, bool connected) = 0; + + virtual void dump(String8& result) const = 0; + + virtual void setPhaseOffset(nsecs_t phaseOffset) = 0; +}; + +namespace impl { + +class EventThread : public android::EventThread, private VSyncSource::Callback { class Connection : public BnDisplayEventConnection { public: - explicit Connection(const sp<EventThread>& eventThread); - status_t postEvent(const DisplayEventReceiver::Event& event); + explicit Connection(EventThread* eventThread); + virtual ~Connection(); + + virtual status_t postEvent(const DisplayEventReceiver::Event& event); // count >= 1 : continuous event. count is the vsync rate // count == 0 : one-shot event that has not fired @@ -67,80 +93,79 @@ class EventThread : public Thread, private VSyncSource::Callback { int32_t count; private: - virtual ~Connection(); virtual void onFirstRef(); status_t stealReceiveChannel(gui::BitTube* outChannel) override; status_t setVsyncRate(uint32_t count) override; - void requestNextVsync() override; // asynchronous - sp<EventThread> const mEventThread; + void requestNextVsync() override; // asynchronous + EventThread* const mEventThread; gui::BitTube mChannel; }; public: + using ResyncWithRateLimitCallback = std::function<void()>; + using InterceptVSyncsCallback = std::function<void(nsecs_t)>; - EventThread(const sp<VSyncSource>& src, SurfaceFlinger& flinger, bool interceptVSyncs); + EventThread(VSyncSource* src, ResyncWithRateLimitCallback resyncWithRateLimitCallback, + InterceptVSyncsCallback interceptVSyncsCallback, const char* threadName); + ~EventThread(); - sp<Connection> createEventConnection() const; + sp<BnDisplayEventConnection> createEventConnection() const override; status_t registerDisplayEventConnection(const sp<Connection>& connection); void setVsyncRate(uint32_t count, const sp<Connection>& connection); void requestNextVsync(const sp<Connection>& connection); // called before the screen is turned off from main thread - void onScreenReleased(); + void onScreenReleased() override; // called after the screen is turned on from main thread - void onScreenAcquired(); + void onScreenAcquired() override; // called when receiving a hotplug event - void onHotplugReceived(int type, bool connected); + void onHotplugReceived(int type, bool connected) override; - Vector< sp<EventThread::Connection> > waitForEvent( - DisplayEventReceiver::Event* event); + void dump(String8& result) const override; - void dump(String8& result) const; - void sendVsyncHintOff(); - - void setPhaseOffset(nsecs_t phaseOffset); + void setPhaseOffset(nsecs_t phaseOffset) override; private: - virtual bool threadLoop(); - virtual void onFirstRef(); + friend EventThreadTest; + + void threadMain(); + Vector<sp<EventThread::Connection>> waitForEventLocked(std::unique_lock<std::mutex>* lock, + DisplayEventReceiver::Event* event) + REQUIRES(mMutex); - virtual void onVSyncEvent(nsecs_t timestamp); + void removeDisplayEventConnectionLocked(const wp<Connection>& connection) REQUIRES(mMutex); + void enableVSyncLocked() REQUIRES(mMutex); + void disableVSyncLocked() REQUIRES(mMutex); - void removeDisplayEventConnection(const wp<Connection>& connection); - void enableVSyncLocked(); - void disableVSyncLocked(); - void sendVsyncHintOnLocked(); + // Implements VSyncSource::Callback + void onVSyncEvent(nsecs_t timestamp) override; // constants - sp<VSyncSource> mVSyncSource; - PowerHAL mPowerHAL; - SurfaceFlinger& mFlinger; + VSyncSource* const mVSyncSource GUARDED_BY(mMutex) = nullptr; + const ResyncWithRateLimitCallback mResyncWithRateLimitCallback; + const InterceptVSyncsCallback mInterceptVSyncsCallback; - mutable Mutex mLock; - mutable Condition mCondition; + std::thread mThread; + mutable std::mutex mMutex; + mutable std::condition_variable mCondition; // protected by mLock - SortedVector< wp<Connection> > mDisplayEventConnections; - Vector< DisplayEventReceiver::Event > mPendingEvents; - DisplayEventReceiver::Event mVSyncEvent[DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES]; - bool mUseSoftwareVSync; - bool mVsyncEnabled; + SortedVector<wp<Connection>> mDisplayEventConnections GUARDED_BY(mMutex); + Vector<DisplayEventReceiver::Event> mPendingEvents GUARDED_BY(mMutex); + DisplayEventReceiver::Event mVSyncEvent[DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES] GUARDED_BY( + mMutex); + bool mUseSoftwareVSync GUARDED_BY(mMutex) = false; + bool mVsyncEnabled GUARDED_BY(mMutex) = false; + bool mKeepRunning GUARDED_BY(mMutex) = true; // for debugging - bool mDebugVsyncEnabled; - - bool mVsyncHintSent; - const bool mInterceptVSyncs; - timer_t mTimerId; + bool mDebugVsyncEnabled GUARDED_BY(mMutex) = false; }; // --------------------------------------------------------------------------- -}; // namespace android - -// --------------------------------------------------------------------------- - -#endif /* ANDROID_SURFACE_FLINGER_EVENT_THREAD_H */ +} // namespace impl +} // namespace android |