// 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");
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() {}
// 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)",
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) {
int mValue;
+ const nsecs_t mPhaseOffset;
+ const bool mTraceVsync;
+
DispSync* mDispSync;
sp<VSyncSource::Callback> mCallback;
Mutex mMutex;
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);