diff options
author | Jamie Gennis <jgennis@google.com> | 2013-10-14 20:52:46 -0700 |
---|---|---|
committer | Jamie Gennis <jgennis@google.com> | 2013-10-15 14:31:41 -0700 |
commit | 0a645cc5a935e67a8d1effc7679a838160b971d8 (patch) | |
tree | 27fc4db72c107fb58c978e690ae5f843b8d03534 | |
parent | d1700756ec9520c3fba22f9a14fd064a6e288810 (diff) | |
download | native-0a645cc5a935e67a8d1effc7679a838160b971d8.tar.gz |
SurfaceFlinger: give SF its own vsync phase
This change allows SurfaceFlinger to run at a different vsync phase offset from
that used by external listeners.
Bug: 11175503
Change-Id: I561c53a5659fa6dc1e3e4ae30340f3c1a6adceb4
-rw-r--r-- | services/surfaceflinger/Android.mk | 7 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 28 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.h | 1 |
3 files changed, 30 insertions, 6 deletions
diff --git a/services/surfaceflinger/Android.mk b/services/surfaceflinger/Android.mk index 36ad741ea8..c3daa64d9f 100644 --- a/services/surfaceflinger/Android.mk +++ b/services/surfaceflinger/Android.mk @@ -66,6 +66,13 @@ else LOCAL_CFLAGS += -DVSYNC_EVENT_PHASE_OFFSET_NS=0 endif +# See build/target/board/generic/BoardConfig.mk for a description of this setting. +ifneq ($(SF_VSYNC_EVENT_PHASE_OFFSET_NS),) + LOCAL_CFLAGS += -DSF_VSYNC_EVENT_PHASE_OFFSET_NS=$(SF_VSYNC_EVENT_PHASE_OFFSET_NS) +else + LOCAL_CFLAGS += -DSF_VSYNC_EVENT_PHASE_OFFSET_NS=0 +endif + ifneq ($(PRESENT_TIME_OFFSET_FROM_VSYNC_NS),) LOCAL_CFLAGS += -DPRESENT_TIME_OFFSET_FROM_VSYNC_NS=$(PRESENT_TIME_OFFSET_FROM_VSYNC_NS) else diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 8ef4d6f27f..9d94c874fe 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -117,6 +117,9 @@ static const bool runningWithoutSyncFramework = false; // conservatively (or at least with awareness of the trade-off being made). static const int64_t vsyncPhaseOffsetNs = VSYNC_EVENT_PHASE_OFFSET_NS; +// This is the phase offset at which SurfaceFlinger's composition runs. +static const int64_t sfVsyncPhaseOffsetNs = SF_VSYNC_EVENT_PHASE_OFFSET_NS; + // --------------------------------------------------------------------------- const String16 sHardwareTest("android.permission.HARDWARE_TEST"); @@ -439,7 +442,11 @@ status_t SurfaceFlinger::selectEGLConfig(EGLDisplay display, EGLint nativeVisual class DispSyncSource : public VSyncSource, private DispSync::Callback { public: - DispSyncSource(DispSync* dispSync) : mValue(0), mDispSync(dispSync) {} + DispSyncSource(DispSync* dispSync, nsecs_t phaseOffset, bool traceVsync) : + mValue(0), + mPhaseOffset(phaseOffset), + mTraceVsync(traceVsync), + mDispSync(dispSync) {} virtual ~DispSyncSource() {} @@ -447,7 +454,7 @@ public: // Do NOT lock the mutex here so as to avoid any mutex ordering issues // with locking it in the onDispSyncEvent callback. if (enable) { - status_t err = mDispSync->addEventListener(vsyncPhaseOffsetNs, + status_t err = mDispSync->addEventListener(mPhaseOffset, static_cast<DispSync::Callback*>(this)); if (err != NO_ERROR) { ALOGE("error registering vsync callback: %s (%d)", @@ -477,8 +484,10 @@ private: Mutex::Autolock lock(mMutex); callback = mCallback; - mValue = (mValue + 1) % 2; - ATRACE_INT("VSYNC", mValue); + if (mTraceVsync) { + mValue = (mValue + 1) % 2; + ATRACE_INT("VSYNC", mValue); + } } if (callback != NULL) { @@ -488,6 +497,9 @@ private: int mValue; + const nsecs_t mPhaseOffset; + const bool mTraceVsync; + DispSync* mDispSync; sp<VSyncSource::Callback> mCallback; Mutex mMutex; @@ -589,9 +601,13 @@ void SurfaceFlinger::init() { getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext); // start the EventThread - sp<VSyncSource> vsyncSrc = new DispSyncSource(&mPrimaryDispSync); + sp<VSyncSource> vsyncSrc = new DispSyncSource(&mPrimaryDispSync, + vsyncPhaseOffsetNs, true); mEventThread = new EventThread(vsyncSrc); - mEventQueue.setEventThread(mEventThread); + sp<VSyncSource> sfVsyncSrc = new DispSyncSource(&mPrimaryDispSync, + sfVsyncPhaseOffsetNs, false); + mSFEventThread = new EventThread(sfVsyncSrc); + mEventQueue.setEventThread(mSFEventThread); mEventControlThread = new EventControlThread(this); mEventControlThread->run("EventControl", PRIORITY_URGENT_DISPLAY); diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h index 03c4ba36c9..f08e66abcb 100644 --- a/services/surfaceflinger/SurfaceFlinger.h +++ b/services/surfaceflinger/SurfaceFlinger.h @@ -428,6 +428,7 @@ private: nsecs_t mBootTime; bool mGpuToCpuSupported; sp<EventThread> mEventThread; + sp<EventThread> mSFEventThread; sp<EventControlThread> mEventControlThread; EGLContext mEGLContext; EGLConfig mEGLConfig; |