diff options
author | android-build-prod (mdb) <android-build-team-robot@google.com> | 2018-01-08 22:47:52 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2018-01-08 22:47:52 +0000 |
commit | b22671fded90f93c6ce66268a0997064f22d9551 (patch) | |
tree | fb5418f4470abed437b67a63b41221d1353dc330 | |
parent | f2b791587c15ec5028d0b266d415c631a4078916 (diff) | |
parent | 804617d5075eefa84860f8ba3881d6cd4aad64a4 (diff) | |
download | native-b22671fded90f93c6ce66268a0997064f22d9551.tar.gz |
Merge "Snap for 4526935 from fe29ba7a9c86bf37b24f9dcf6e765978bc5a9dd0 to oreo-mr1-cts-release" into oreo-mr1-cts-releaseandroid-cts-8.1_r9android-cts-8.1_r8android-cts-8.1_r7android-cts-8.1_r6android-cts-8.1_r5android-cts-8.1_r4android-cts-8.1_r3android-cts-8.1_r25android-cts-8.1_r24android-cts-8.1_r23android-cts-8.1_r22android-cts-8.1_r21android-cts-8.1_r20android-cts-8.1_r2android-cts-8.1_r19android-cts-8.1_r18android-cts-8.1_r17android-cts-8.1_r16android-cts-8.1_r15android-cts-8.1_r14android-cts-8.1_r13android-cts-8.1_r12android-cts-8.1_r11android-cts-8.1_r10oreo-mr1-cts-release
-rw-r--r-- | services/surfaceflinger/MessageQueue.cpp | 8 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 37 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.h | 3 |
3 files changed, 41 insertions, 7 deletions
diff --git a/services/surfaceflinger/MessageQueue.cpp b/services/surfaceflinger/MessageQueue.cpp index bca3430794..0b1199c2d0 100644 --- a/services/surfaceflinger/MessageQueue.cpp +++ b/services/surfaceflinger/MessageQueue.cpp @@ -91,6 +91,14 @@ void MessageQueue::init(const sp<SurfaceFlinger>& flinger) void MessageQueue::setEventThread(const sp<EventThread>& eventThread) { + if (mEventThread == eventThread) { + return; + } + + if (mEventTube.getFd() >= 0) { + mLooper->removeFd(mEventTube.getFd()); + } + mEventThread = eventThread; mEvents = eventThread->createEventConnection(); mEvents->stealReceiveChannel(&mEventTube); diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index bb0e33cb45..4055693e45 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -542,7 +542,9 @@ public: virtual void onInjectSyncEvent(nsecs_t when) { std::lock_guard<std::mutex> lock(mCallbackMutex); - mCallback->onVSyncEvent(when); + if (mCallback != nullptr) { + mCallback->onVSyncEvent(when); + } } virtual void setVSyncEnabled(bool) {} @@ -1037,13 +1039,14 @@ status_t SurfaceFlinger::getHdrCapabilities(const sp<IBinder>& display, return NO_ERROR; } -status_t SurfaceFlinger::enableVSyncInjections(bool enable) { - if (enable == mInjectVSyncs) { - return NO_ERROR; +void SurfaceFlinger::enableVSyncInjectionsInternal(bool enable) { + Mutex::Autolock _l(mStateLock); + + if (mInjectVSyncs == enable) { + return; } if (enable) { - mInjectVSyncs = enable; ALOGV("VSync Injections enabled"); if (mVSyncInjector.get() == nullptr) { mVSyncInjector = new InjectVSyncSource(); @@ -1051,15 +1054,33 @@ status_t SurfaceFlinger::enableVSyncInjections(bool enable) { } mEventQueue.setEventThread(mInjectorEventThread); } else { - mInjectVSyncs = enable; ALOGV("VSync Injections disabled"); mEventQueue.setEventThread(mSFEventThread); - mVSyncInjector.clear(); } + + mInjectVSyncs = enable; +} + +status_t SurfaceFlinger::enableVSyncInjections(bool enable) { + class MessageEnableVSyncInjections : public MessageBase { + SurfaceFlinger* mFlinger; + bool mEnable; + public: + MessageEnableVSyncInjections(SurfaceFlinger* flinger, bool enable) + : mFlinger(flinger), mEnable(enable) { } + virtual bool handler() { + mFlinger->enableVSyncInjectionsInternal(mEnable); + return true; + } + }; + sp<MessageBase> msg = new MessageEnableVSyncInjections(this, enable); + postMessageSync(msg); return NO_ERROR; } status_t SurfaceFlinger::injectVSync(nsecs_t when) { + Mutex::Autolock _l(mStateLock); + if (!mInjectVSyncs) { ALOGE("VSync Injections not enabled"); return BAD_VALUE; @@ -3891,6 +3912,8 @@ status_t SurfaceFlinger::CheckTransactCodeCredentials(uint32_t code) { case GET_ANIMATION_FRAME_STATS: case SET_POWER_MODE: case GET_HDR_CAPABILITIES: + case ENABLE_VSYNC_INJECTIONS: + case INJECT_VSYNC: { // codes that require permission check IPCThreadState* ipc = IPCThreadState::self(); diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h index 7606e10a62..99d4a1a636 100644 --- a/services/surfaceflinger/SurfaceFlinger.h +++ b/services/surfaceflinger/SurfaceFlinger.h @@ -366,6 +366,9 @@ private: // Called on the main thread in response to setActiveColorMode() void setActiveColorModeInternal(const sp<DisplayDevice>& hw, android_color_mode_t colorMode); + // Called on the main thread in response to enableVSyncInjections() + void enableVSyncInjectionsInternal(bool enable); + // Returns whether the transaction actually modified any state bool handleMessageTransaction(); |