diff options
Diffstat (limited to 'services/surfaceflinger/SurfaceFlinger.cpp')
| -rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 25 |
1 files changed, 18 insertions, 7 deletions
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index ea9fe214b4..b6c86d309c 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -149,6 +149,7 @@ SurfaceFlinger::SurfaceFlinger() mLastTransactionTime(0), mBootFinished(false), mForceFullDamage(false), + mPrimaryDispSync("PrimaryDispSync"), mPrimaryHWVsyncEnabled(false), mHWVsyncAvailable(false), mDaltonize(false), @@ -331,11 +332,12 @@ void SurfaceFlinger::deleteTextureAsync(uint32_t texture) { class DispSyncSource : public VSyncSource, private DispSync::Callback { public: DispSyncSource(DispSync* dispSync, nsecs_t phaseOffset, bool traceVsync, - const char* label) : + const char* name) : + mName(name), mValue(0), mTraceVsync(traceVsync), - mVsyncOnLabel(String8::format("VsyncOn-%s", label)), - mVsyncEventLabel(String8::format("VSYNC-%s", label)), + mVsyncOnLabel(String8::format("VsyncOn-%s", name)), + mVsyncEventLabel(String8::format("VSYNC-%s", name)), mDispSync(dispSync), mCallbackMutex(), mCallback(), @@ -348,7 +350,7 @@ public: virtual void setVSyncEnabled(bool enable) { Mutex::Autolock lock(mVsyncMutex); if (enable) { - status_t err = mDispSync->addEventListener(mPhaseOffset, + status_t err = mDispSync->addEventListener(mName, mPhaseOffset, static_cast<DispSync::Callback*>(this)); if (err != NO_ERROR) { ALOGE("error registering vsync callback: %s (%d)", @@ -399,7 +401,7 @@ public: } // Add a listener with the new offset - err = mDispSync->addEventListener(mPhaseOffset, + err = mDispSync->addEventListener(mName, mPhaseOffset, static_cast<DispSync::Callback*>(this)); if (err != NO_ERROR) { ALOGE("error registering vsync callback: %s (%d)", @@ -425,6 +427,8 @@ private: } } + const char* const mName; + int mValue; const bool mTraceVsync; @@ -455,10 +459,10 @@ void SurfaceFlinger::init() { // start the EventThread sp<VSyncSource> vsyncSrc = new DispSyncSource(&mPrimaryDispSync, vsyncPhaseOffsetNs, true, "app"); - mEventThread = new EventThread(vsyncSrc); + mEventThread = new EventThread(vsyncSrc, *this); sp<VSyncSource> sfVsyncSrc = new DispSyncSource(&mPrimaryDispSync, sfVsyncPhaseOffsetNs, true, "sf"); - mSFEventThread = new EventThread(sfVsyncSrc); + mSFEventThread = new EventThread(sfVsyncSrc, *this); mEventQueue.setEventThread(mSFEventThread); // Get a RenderEngine for the given display / config (can't fail) @@ -806,6 +810,13 @@ void SurfaceFlinger::disableHardwareVsync(bool makeUnavailable) { } } +void SurfaceFlinger::resyncWithRateLimit() { + static constexpr nsecs_t kIgnoreDelay = ms2ns(500); + if (systemTime() - mLastSwapTime > kIgnoreDelay) { + resyncToHardwareVsync(true); + } +} + void SurfaceFlinger::onVSyncReceived(int32_t type, nsecs_t timestamp) { bool needsHwVsync = false; |