summaryrefslogtreecommitdiff
path: root/services/surfaceflinger/EventThread.h
diff options
context:
space:
mode:
author Xin Li <delphij@google.com> 2018-06-08 15:11:57 -0700
committer Xin Li <delphij@google.com> 2018-06-08 15:11:57 -0700
commitf11e2bd016d886a333345dea853ebda23a408d5c (patch)
tree905bd4d25d6ab2b046620ff459777d8dcfa5d7de /services/surfaceflinger/EventThread.h
parentaabd6b7fa343654cd85b3b2da392e424d037d15a (diff)
parent5c947cdf72270fd1f766b2248d526ebc8c7227f6 (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.h131
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