am 0a645cc5: SurfaceFlinger: give SF its own vsync phase

* commit '0a645cc5a935e67a8d1effc7679a838160b971d8':
  SurfaceFlinger: give SF its own vsync phase
This commit is contained in:
Jamie Gennis 2013-10-15 16:17:18 -07:00 committed by Android Git Automerger
commit bbfbe93c0d
3 changed files with 30 additions and 6 deletions

View File

@ -66,6 +66,13 @@ else
LOCAL_CFLAGS += -DVSYNC_EVENT_PHASE_OFFSET_NS=0 LOCAL_CFLAGS += -DVSYNC_EVENT_PHASE_OFFSET_NS=0
endif 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),) ifneq ($(PRESENT_TIME_OFFSET_FROM_VSYNC_NS),)
LOCAL_CFLAGS += -DPRESENT_TIME_OFFSET_FROM_VSYNC_NS=$(PRESENT_TIME_OFFSET_FROM_VSYNC_NS) LOCAL_CFLAGS += -DPRESENT_TIME_OFFSET_FROM_VSYNC_NS=$(PRESENT_TIME_OFFSET_FROM_VSYNC_NS)
else else

View File

@ -117,6 +117,9 @@ static const bool runningWithoutSyncFramework = false;
// conservatively (or at least with awareness of the trade-off being made). // conservatively (or at least with awareness of the trade-off being made).
static const int64_t vsyncPhaseOffsetNs = VSYNC_EVENT_PHASE_OFFSET_NS; 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"); 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 { class DispSyncSource : public VSyncSource, private DispSync::Callback {
public: 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() {} virtual ~DispSyncSource() {}
@ -447,7 +454,7 @@ public:
// Do NOT lock the mutex here so as to avoid any mutex ordering issues // Do NOT lock the mutex here so as to avoid any mutex ordering issues
// with locking it in the onDispSyncEvent callback. // with locking it in the onDispSyncEvent callback.
if (enable) { if (enable) {
status_t err = mDispSync->addEventListener(vsyncPhaseOffsetNs, status_t err = mDispSync->addEventListener(mPhaseOffset,
static_cast<DispSync::Callback*>(this)); static_cast<DispSync::Callback*>(this));
if (err != NO_ERROR) { if (err != NO_ERROR) {
ALOGE("error registering vsync callback: %s (%d)", ALOGE("error registering vsync callback: %s (%d)",
@ -477,8 +484,10 @@ private:
Mutex::Autolock lock(mMutex); Mutex::Autolock lock(mMutex);
callback = mCallback; callback = mCallback;
mValue = (mValue + 1) % 2; if (mTraceVsync) {
ATRACE_INT("VSYNC", mValue); mValue = (mValue + 1) % 2;
ATRACE_INT("VSYNC", mValue);
}
} }
if (callback != NULL) { if (callback != NULL) {
@ -488,6 +497,9 @@ private:
int mValue; int mValue;
const nsecs_t mPhaseOffset;
const bool mTraceVsync;
DispSync* mDispSync; DispSync* mDispSync;
sp<VSyncSource::Callback> mCallback; sp<VSyncSource::Callback> mCallback;
Mutex mMutex; Mutex mMutex;
@ -589,9 +601,13 @@ void SurfaceFlinger::init() {
getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext); getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext);
// start the EventThread // start the EventThread
sp<VSyncSource> vsyncSrc = new DispSyncSource(&mPrimaryDispSync); sp<VSyncSource> vsyncSrc = new DispSyncSource(&mPrimaryDispSync,
vsyncPhaseOffsetNs, true);
mEventThread = new EventThread(vsyncSrc); 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 = new EventControlThread(this);
mEventControlThread->run("EventControl", PRIORITY_URGENT_DISPLAY); mEventControlThread->run("EventControl", PRIORITY_URGENT_DISPLAY);

View File

@ -428,6 +428,7 @@ private:
nsecs_t mBootTime; nsecs_t mBootTime;
bool mGpuToCpuSupported; bool mGpuToCpuSupported;
sp<EventThread> mEventThread; sp<EventThread> mEventThread;
sp<EventThread> mSFEventThread;
sp<EventControlThread> mEventControlThread; sp<EventControlThread> mEventControlThread;
EGLContext mEGLContext; EGLContext mEGLContext;
EGLConfig mEGLConfig; EGLConfig mEGLConfig;