summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorandroid-build-team Robot <android-build-team-robot@google.com>2017-11-28 03:35:57 +0000
committerandroid-build-team Robot <android-build-team-robot@google.com>2017-11-28 03:35:57 +0000
commitfe29ba7a9c86bf37b24f9dcf6e765978bc5a9dd0 (patch)
treefb5418f4470abed437b67a63b41221d1353dc330
parentf2b791587c15ec5028d0b266d415c631a4078916 (diff)
parent16392a119661fd1da750d4d4e8e03442578bc543 (diff)
downloadnative-oreo-mr1-cuttlefish-testing.tar.gz
Merge cherrypicks of [3276508, 3277765, 3277766, 3277904, 3276473, 3278009, 3278010, 3277767, 3277768, 3277769, 3277770, 3276509, 3276510, 3278011, 3278012, 3278013, 3278014, 3278099, 3278100, 3278101, 3278102, 3278103, 3278104, 3278105, 3278106, 3277800, 3276474, 3278015, 3278016, 3278017, 3278118, 3278119, 3278120, 3278121, 3278122, 3277946, 3277905, 3277947, 3277906, 3277751, 3278123, 3277752, 3278110, 3277771, 3277907, 3278095, 3277908, 3278111, 3277772, 3276475, 3276476] into oc-mr1-releaseandroid-wear-8.1.0_r1android-8.1.0_r6android-8.1.0_r5android-8.1.0_r4android-8.1.0_r3android-8.1.0_r19android-8.1.0_r16android-8.1.0_r15android-8.1.0_r12android-8.1.0_r11android-8.1.0_r10oreo-mr1-wear-releaseoreo-mr1-s1-releaseoreo-mr1-releaseoreo-mr1-cuttlefish-testing
Change-Id: Ife900dfa51f88db5508d790a3db28251a7038f23
-rw-r--r--services/surfaceflinger/MessageQueue.cpp8
-rw-r--r--services/surfaceflinger/SurfaceFlinger.cpp37
-rw-r--r--services/surfaceflinger/SurfaceFlinger.h3
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();