Loading core/jni/android_view_DisplayEventReceiver.cpp +29 −28 Original line number Diff line number Diff line Loading @@ -49,7 +49,6 @@ public: status_t initialize(); status_t scheduleVsync(); static int handleReceiveCallback(int receiveFd, int events, void* data); protected: virtual ~NativeDisplayEventReceiver(); Loading @@ -59,6 +58,9 @@ private: sp<Looper> mLooper; DisplayEventReceiver mReceiver; bool mWaitingForVsync; static int handleReceiveCallback(int receiveFd, int events, void* data); bool readLastVsyncMessage(nsecs_t* outTimestamp, uint32_t* outCount); }; Loading Loading @@ -100,16 +102,9 @@ status_t NativeDisplayEventReceiver::scheduleVsync() { ALOGV("receiver %p ~ Scheduling vsync.", this); // Drain all pending events. DisplayEventReceiver::Event buf[EVENT_BUFFER_SIZE]; ssize_t n; while ((n = mReceiver.getEvents(buf, EVENT_BUFFER_SIZE)) > 0) { ALOGV("receiver %p ~ Drained %d events.", this, int(n)); } if (n < 0) { ALOGW("Failed to drain events from display event receiver, status=%d", status_t(n)); return status_t(n); } nsecs_t vsyncTimestamp; uint32_t vsyncCount; readLastVsyncMessage(&vsyncTimestamp, &vsyncCount); status_t status = mReceiver.requestNextVsync(); if (status) { Loading Loading @@ -138,23 +133,9 @@ int NativeDisplayEventReceiver::handleReceiveCallback(int receiveFd, int events, } // Drain all pending events, keep the last vsync. nsecs_t vsyncTimestamp = -1; uint32_t vsyncCount = 0; DisplayEventReceiver::Event buf[EVENT_BUFFER_SIZE]; ssize_t n; while ((n = r->mReceiver.getEvents(buf, EVENT_BUFFER_SIZE)) > 0) { ALOGV("receiver %p ~ Read %d events.", data, int(n)); while (n-- > 0) { if (buf[n].header.type == DisplayEventReceiver::DISPLAY_EVENT_VSYNC) { vsyncTimestamp = buf[n].header.timestamp; vsyncCount = buf[n].vsync.count; break; // stop at last vsync in the buffer } } } if (vsyncTimestamp < 0) { nsecs_t vsyncTimestamp; uint32_t vsyncCount; if (!r->readLastVsyncMessage(&vsyncTimestamp, &vsyncCount)) { ALOGV("receiver %p ~ Woke up but there was no vsync pulse!", data); return 1; // keep the callback, did not obtain a vsync pulse } Loading @@ -179,6 +160,26 @@ int NativeDisplayEventReceiver::handleReceiveCallback(int receiveFd, int events, return 1; // keep the callback } bool NativeDisplayEventReceiver::readLastVsyncMessage( nsecs_t* outTimestamp, uint32_t* outCount) { DisplayEventReceiver::Event buf[EVENT_BUFFER_SIZE]; ssize_t n; while ((n = mReceiver.getEvents(buf, EVENT_BUFFER_SIZE)) > 0) { ALOGV("receiver %p ~ Read %d events.", this, int(n)); while (n-- > 0) { if (buf[n].header.type == DisplayEventReceiver::DISPLAY_EVENT_VSYNC) { *outTimestamp = buf[n].header.timestamp; *outCount = buf[n].vsync.count; return true; // stop at last vsync in the buffer } } } if (n < 0) { ALOGW("Failed to get events from display event receiver, status=%d", status_t(n)); } return false; } static jint nativeInit(JNIEnv* env, jclass clazz, jobject receiverObj, jobject messageQueueObj) { Loading Loading
core/jni/android_view_DisplayEventReceiver.cpp +29 −28 Original line number Diff line number Diff line Loading @@ -49,7 +49,6 @@ public: status_t initialize(); status_t scheduleVsync(); static int handleReceiveCallback(int receiveFd, int events, void* data); protected: virtual ~NativeDisplayEventReceiver(); Loading @@ -59,6 +58,9 @@ private: sp<Looper> mLooper; DisplayEventReceiver mReceiver; bool mWaitingForVsync; static int handleReceiveCallback(int receiveFd, int events, void* data); bool readLastVsyncMessage(nsecs_t* outTimestamp, uint32_t* outCount); }; Loading Loading @@ -100,16 +102,9 @@ status_t NativeDisplayEventReceiver::scheduleVsync() { ALOGV("receiver %p ~ Scheduling vsync.", this); // Drain all pending events. DisplayEventReceiver::Event buf[EVENT_BUFFER_SIZE]; ssize_t n; while ((n = mReceiver.getEvents(buf, EVENT_BUFFER_SIZE)) > 0) { ALOGV("receiver %p ~ Drained %d events.", this, int(n)); } if (n < 0) { ALOGW("Failed to drain events from display event receiver, status=%d", status_t(n)); return status_t(n); } nsecs_t vsyncTimestamp; uint32_t vsyncCount; readLastVsyncMessage(&vsyncTimestamp, &vsyncCount); status_t status = mReceiver.requestNextVsync(); if (status) { Loading Loading @@ -138,23 +133,9 @@ int NativeDisplayEventReceiver::handleReceiveCallback(int receiveFd, int events, } // Drain all pending events, keep the last vsync. nsecs_t vsyncTimestamp = -1; uint32_t vsyncCount = 0; DisplayEventReceiver::Event buf[EVENT_BUFFER_SIZE]; ssize_t n; while ((n = r->mReceiver.getEvents(buf, EVENT_BUFFER_SIZE)) > 0) { ALOGV("receiver %p ~ Read %d events.", data, int(n)); while (n-- > 0) { if (buf[n].header.type == DisplayEventReceiver::DISPLAY_EVENT_VSYNC) { vsyncTimestamp = buf[n].header.timestamp; vsyncCount = buf[n].vsync.count; break; // stop at last vsync in the buffer } } } if (vsyncTimestamp < 0) { nsecs_t vsyncTimestamp; uint32_t vsyncCount; if (!r->readLastVsyncMessage(&vsyncTimestamp, &vsyncCount)) { ALOGV("receiver %p ~ Woke up but there was no vsync pulse!", data); return 1; // keep the callback, did not obtain a vsync pulse } Loading @@ -179,6 +160,26 @@ int NativeDisplayEventReceiver::handleReceiveCallback(int receiveFd, int events, return 1; // keep the callback } bool NativeDisplayEventReceiver::readLastVsyncMessage( nsecs_t* outTimestamp, uint32_t* outCount) { DisplayEventReceiver::Event buf[EVENT_BUFFER_SIZE]; ssize_t n; while ((n = mReceiver.getEvents(buf, EVENT_BUFFER_SIZE)) > 0) { ALOGV("receiver %p ~ Read %d events.", this, int(n)); while (n-- > 0) { if (buf[n].header.type == DisplayEventReceiver::DISPLAY_EVENT_VSYNC) { *outTimestamp = buf[n].header.timestamp; *outCount = buf[n].vsync.count; return true; // stop at last vsync in the buffer } } } if (n < 0) { ALOGW("Failed to get events from display event receiver, status=%d", status_t(n)); } return false; } static jint nativeInit(JNIEnv* env, jclass clazz, jobject receiverObj, jobject messageQueueObj) { Loading