diff options
author | 2018-01-22 17:14:00 -0800 | |
---|---|---|
committer | 2018-03-19 17:52:43 -0700 | |
commit | 3fcdef18f41330b4f1e3f1e2b9a33c544e8803b0 (patch) | |
tree | 482818b88bf899ef13e6f7f50cb02f666b863f7d | |
parent | ac648ee7ead13b4c23fb0d12e00b7f15f844f04f (diff) |
SF: Separate MessageQueue into interface and impl
Test: Builds
Bug: 74827900
Change-Id: I906892c00b6cb9adca3fbdd72a03001c2d72cbfc
-rw-r--r-- | services/surfaceflinger/MessageQueue.cpp | 16 | ||||
-rw-r--r-- | services/surfaceflinger/MessageQueue.h | 49 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 21 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.h | 2 |
4 files changed, 54 insertions, 34 deletions
diff --git a/services/surfaceflinger/MessageQueue.cpp b/services/surfaceflinger/MessageQueue.cpp index 5a6ff4dd98..056d381eb9 100644 --- a/services/surfaceflinger/MessageQueue.cpp +++ b/services/surfaceflinger/MessageQueue.cpp @@ -24,6 +24,7 @@ #include <utils/Timers.h> #include <utils/threads.h> +#include <gui/DisplayEventReceiver.h> #include <gui/IDisplayEventConnection.h> #include "EventThread.h" @@ -45,6 +46,12 @@ void MessageBase::handleMessage(const Message&) { // --------------------------------------------------------------------------- +MessageQueue::~MessageQueue() = default; + +// --------------------------------------------------------------------------- + +namespace impl { + void MessageQueue::Handler::dispatchRefresh() { if ((android_atomic_or(eventMaskRefresh, &mEventMask) & eventMaskRefresh) == 0) { mQueue.mLooper->sendMessage(this, Message(MessageQueue::REFRESH)); @@ -72,17 +79,13 @@ void MessageQueue::Handler::handleMessage(const Message& message) { // --------------------------------------------------------------------------- -MessageQueue::MessageQueue() {} - -MessageQueue::~MessageQueue() {} - void MessageQueue::init(const sp<SurfaceFlinger>& flinger) { mFlinger = flinger; mLooper = new Looper(true); mHandler = new Handler(*this); } -void MessageQueue::setEventThread(EventThread* eventThread) { +void MessageQueue::setEventThread(android::EventThread* eventThread) { if (mEventThread == eventThread) { return; } @@ -159,4 +162,5 @@ int MessageQueue::eventReceiver(int /*fd*/, int /*events*/) { // --------------------------------------------------------------------------- -}; // namespace android +} // namespace impl +} // namespace android diff --git a/services/surfaceflinger/MessageQueue.h b/services/surfaceflinger/MessageQueue.h index dcfc716524..90d1c72450 100644 --- a/services/surfaceflinger/MessageQueue.h +++ b/services/surfaceflinger/MessageQueue.h @@ -25,7 +25,7 @@ #include <utils/Timers.h> #include <utils/threads.h> -#include <gui/DisplayEventReceiver.h> +#include <gui/IDisplayEventConnection.h> #include <private/gui/BitTube.h> #include "Barrier.h" @@ -34,7 +34,6 @@ namespace android { -class IDisplayEventConnection; class EventThread; class SurfaceFlinger; @@ -77,6 +76,27 @@ private: // --------------------------------------------------------------------------- class MessageQueue { +public: + enum { + INVALIDATE = 0, + REFRESH = 1, + }; + + virtual ~MessageQueue(); + + virtual void init(const sp<SurfaceFlinger>& flinger) = 0; + virtual void setEventThread(EventThread* events) = 0; + virtual void waitMessage() = 0; + virtual status_t postMessage(const sp<MessageBase>& message, nsecs_t reltime = 0) = 0; + virtual void invalidate() = 0; + virtual void refresh() = 0; +}; + +// --------------------------------------------------------------------------- + +namespace impl { + +class MessageQueue final : public android::MessageQueue { class Handler : public MessageHandler { enum { eventMaskInvalidate = 0x1, eventMaskRefresh = 0x2, eventMaskTransaction = 0x4 }; MessageQueue& mQueue; @@ -93,7 +113,7 @@ class MessageQueue { sp<SurfaceFlinger> mFlinger; sp<Looper> mLooper; - EventThread* mEventThread; + android::EventThread* mEventThread; sp<IDisplayEventConnection> mEvents; gui::BitTube mEventTube; sp<Handler> mHandler; @@ -102,27 +122,22 @@ class MessageQueue { int eventReceiver(int fd, int events); public: - enum { - INVALIDATE = 0, - REFRESH = 1, - }; - - MessageQueue(); - ~MessageQueue(); - void init(const sp<SurfaceFlinger>& flinger); - void setEventThread(EventThread* events); + ~MessageQueue() override = default; + void init(const sp<SurfaceFlinger>& flinger) override; + void setEventThread(android::EventThread* events) override; - void waitMessage(); - status_t postMessage(const sp<MessageBase>& message, nsecs_t reltime = 0); + void waitMessage() override; + status_t postMessage(const sp<MessageBase>& message, nsecs_t reltime = 0) override; // sends INVALIDATE message at next VSYNC - void invalidate(); + void invalidate() override; // sends REFRESH message at next VSYNC - void refresh(); + void refresh() override; }; // --------------------------------------------------------------------------- -}; // namespace android +} // namespace impl +} // namespace android #endif /* ANDROID_MESSAGE_QUEUE_H */ diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index db472a7396..5cd975f08e 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -278,7 +278,7 @@ SurfaceFlinger::SurfaceFlinger() : SurfaceFlinger(SkipInitialization) { void SurfaceFlinger::onFirstRef() { - mEventQueue.init(this); + mEventQueue->init(this); } SurfaceFlinger::~SurfaceFlinger() @@ -584,9 +584,10 @@ void SurfaceFlinger::init() { mSfEventThreadSource = std::make_unique<DispSyncSource>(&mPrimaryDispSync, SurfaceFlinger::sfVsyncPhaseOffsetNs, true, "sf"); + mSFEventThread = std::make_unique<impl::EventThread>(mSfEventThreadSource.get(), *this, true, "sfEventThread"); - mEventQueue.setEventThread(mSFEventThread.get()); + mEventQueue->setEventThread(mSFEventThread.get()); // Get a RenderEngine for the given display / config (can't fail) getBE().mRenderEngine = @@ -1075,10 +1076,10 @@ status_t SurfaceFlinger::enableVSyncInjections(bool enable) { std::make_unique<impl::EventThread>(mVSyncInjector.get(), *this, false, "injEventThread"); } - mEventQueue.setEventThread(mInjectorEventThread.get()); + mEventQueue->setEventThread(mInjectorEventThread.get()); } else { ALOGV("VSync Injections disabled"); - mEventQueue.setEventThread(mSFEventThread.get()); + mEventQueue->setEventThread(mSFEventThread.get()); } mInjectVSyncs = enable; @@ -1143,30 +1144,30 @@ sp<IDisplayEventConnection> SurfaceFlinger::createDisplayEventConnection( // ---------------------------------------------------------------------------- void SurfaceFlinger::waitForEvent() { - mEventQueue.waitMessage(); + mEventQueue->waitMessage(); } void SurfaceFlinger::signalTransaction() { - mEventQueue.invalidate(); + mEventQueue->invalidate(); } void SurfaceFlinger::signalLayerUpdate() { - mEventQueue.invalidate(); + mEventQueue->invalidate(); } void SurfaceFlinger::signalRefresh() { mRefreshPending = true; - mEventQueue.refresh(); + mEventQueue->refresh(); } status_t SurfaceFlinger::postMessageAsync(const sp<MessageBase>& msg, nsecs_t reltime, uint32_t /* flags */) { - return mEventQueue.postMessage(msg, reltime); + return mEventQueue->postMessage(msg, reltime); } status_t SurfaceFlinger::postMessageSync(const sp<MessageBase>& msg, nsecs_t reltime, uint32_t /* flags */) { - status_t res = mEventQueue.postMessage(msg, reltime); + status_t res = mEventQueue->postMessage(msg, reltime); if (res == NO_ERROR) { msg->wait(); } diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h index db541fe747..19fec0ba9f 100644 --- a/services/surfaceflinger/SurfaceFlinger.h +++ b/services/surfaceflinger/SurfaceFlinger.h @@ -784,7 +784,7 @@ private: bool mLayerTripleBufferingDisabled = false; // these are thread safe - mutable MessageQueue mEventQueue; + mutable std::unique_ptr<MessageQueue> mEventQueue{std::make_unique<impl::MessageQueue>()}; FrameTracker mAnimFrameTracker; DispSync mPrimaryDispSync; |