diff options
Diffstat (limited to 'services/surfaceflinger/SurfaceFlinger.cpp')
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 37 |
1 files changed, 30 insertions, 7 deletions
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index bb0e33cb4..4055693e4 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp | |||
@@ -542,7 +542,9 @@ public: | |||
542 | 542 | ||
543 | virtual void onInjectSyncEvent(nsecs_t when) { | 543 | virtual void onInjectSyncEvent(nsecs_t when) { |
544 | std::lock_guard<std::mutex> lock(mCallbackMutex); | 544 | std::lock_guard<std::mutex> lock(mCallbackMutex); |
545 | mCallback->onVSyncEvent(when); | 545 | if (mCallback != nullptr) { |
546 | mCallback->onVSyncEvent(when); | ||
547 | } | ||
546 | } | 548 | } |
547 | 549 | ||
548 | virtual void setVSyncEnabled(bool) {} | 550 | virtual void setVSyncEnabled(bool) {} |
@@ -1037,13 +1039,14 @@ status_t SurfaceFlinger::getHdrCapabilities(const sp<IBinder>& display, | |||
1037 | return NO_ERROR; | 1039 | return NO_ERROR; |
1038 | } | 1040 | } |
1039 | 1041 | ||
1040 | status_t SurfaceFlinger::enableVSyncInjections(bool enable) { | 1042 | void SurfaceFlinger::enableVSyncInjectionsInternal(bool enable) { |
1041 | if (enable == mInjectVSyncs) { | 1043 | Mutex::Autolock _l(mStateLock); |
1042 | return NO_ERROR; | 1044 | |
1045 | if (mInjectVSyncs == enable) { | ||
1046 | return; | ||
1043 | } | 1047 | } |
1044 | 1048 | ||
1045 | if (enable) { | 1049 | if (enable) { |
1046 | mInjectVSyncs = enable; | ||
1047 | ALOGV("VSync Injections enabled"); | 1050 | ALOGV("VSync Injections enabled"); |
1048 | if (mVSyncInjector.get() == nullptr) { | 1051 | if (mVSyncInjector.get() == nullptr) { |
1049 | mVSyncInjector = new InjectVSyncSource(); | 1052 | mVSyncInjector = new InjectVSyncSource(); |
@@ -1051,15 +1054,33 @@ status_t SurfaceFlinger::enableVSyncInjections(bool enable) { | |||
1051 | } | 1054 | } |
1052 | mEventQueue.setEventThread(mInjectorEventThread); | 1055 | mEventQueue.setEventThread(mInjectorEventThread); |
1053 | } else { | 1056 | } else { |
1054 | mInjectVSyncs = enable; | ||
1055 | ALOGV("VSync Injections disabled"); | 1057 | ALOGV("VSync Injections disabled"); |
1056 | mEventQueue.setEventThread(mSFEventThread); | 1058 | mEventQueue.setEventThread(mSFEventThread); |
1057 | mVSyncInjector.clear(); | ||
1058 | } | 1059 | } |
1060 | |||
1061 | mInjectVSyncs = enable; | ||
1062 | } | ||
1063 | |||
1064 | status_t SurfaceFlinger::enableVSyncInjections(bool enable) { | ||
1065 | class MessageEnableVSyncInjections : public MessageBase { | ||
1066 | SurfaceFlinger* mFlinger; | ||
1067 | bool mEnable; | ||
1068 | public: | ||
1069 | MessageEnableVSyncInjections(SurfaceFlinger* flinger, bool enable) | ||
1070 | : mFlinger(flinger), mEnable(enable) { } | ||
1071 | virtual bool handler() { | ||
1072 | mFlinger->enableVSyncInjectionsInternal(mEnable); | ||
1073 | return true; | ||
1074 | } | ||
1075 | }; | ||
1076 | sp<MessageBase> msg = new MessageEnableVSyncInjections(this, enable); | ||
1077 | postMessageSync(msg); | ||
1059 | return NO_ERROR; | 1078 | return NO_ERROR; |
1060 | } | 1079 | } |
1061 | 1080 | ||
1062 | status_t SurfaceFlinger::injectVSync(nsecs_t when) { | 1081 | status_t SurfaceFlinger::injectVSync(nsecs_t when) { |
1082 | Mutex::Autolock _l(mStateLock); | ||
1083 | |||
1063 | if (!mInjectVSyncs) { | 1084 | if (!mInjectVSyncs) { |
1064 | ALOGE("VSync Injections not enabled"); | 1085 | ALOGE("VSync Injections not enabled"); |
1065 | return BAD_VALUE; | 1086 | return BAD_VALUE; |
@@ -3891,6 +3912,8 @@ status_t SurfaceFlinger::CheckTransactCodeCredentials(uint32_t code) { | |||
3891 | case GET_ANIMATION_FRAME_STATS: | 3912 | case GET_ANIMATION_FRAME_STATS: |
3892 | case SET_POWER_MODE: | 3913 | case SET_POWER_MODE: |
3893 | case GET_HDR_CAPABILITIES: | 3914 | case GET_HDR_CAPABILITIES: |
3915 | case ENABLE_VSYNC_INJECTIONS: | ||
3916 | case INJECT_VSYNC: | ||
3894 | { | 3917 | { |
3895 | // codes that require permission check | 3918 | // codes that require permission check |
3896 | IPCThreadState* ipc = IPCThreadState::self(); | 3919 | IPCThreadState* ipc = IPCThreadState::self(); |