summaryrefslogtreecommitdiffstats
path: root/core/jni/android_view_DisplayEventReceiver.cpp
diff options
context:
space:
mode:
authorJeff Brown <jeffbrown@google.com>2012-03-29 12:42:31 -0700
committerJeff Brown <jeffbrown@google.com>2012-03-29 13:10:56 -0700
commitbec0a8682c75a40df6d0dca17e23db2103a950f3 (patch)
tree6fedc936e97b0712f8108c199a7f2bbffafdde8c /core/jni/android_view_DisplayEventReceiver.cpp
parentebb2d8d708c5c58c79ae88ac2bd10450a856f702 (diff)
downloadframeworks_base-bec0a8682c75a40df6d0dca17e23db2103a950f3.zip
frameworks_base-bec0a8682c75a40df6d0dca17e23db2103a950f3.tar.gz
frameworks_base-bec0a8682c75a40df6d0dca17e23db2103a950f3.tar.bz2
Refactor DisplayEventReceiver read loop.
Change-Id: I98ef802ec0ca48f768e3b0920e1b4b4f7f141050
Diffstat (limited to 'core/jni/android_view_DisplayEventReceiver.cpp')
-rw-r--r--core/jni/android_view_DisplayEventReceiver.cpp57
1 files changed, 29 insertions, 28 deletions
diff --git a/core/jni/android_view_DisplayEventReceiver.cpp b/core/jni/android_view_DisplayEventReceiver.cpp
index 8a1c4a9..72c171c 100644
--- a/core/jni/android_view_DisplayEventReceiver.cpp
+++ b/core/jni/android_view_DisplayEventReceiver.cpp
@@ -49,7 +49,6 @@ public:
status_t initialize();
status_t scheduleVsync();
- static int handleReceiveCallback(int receiveFd, int events, void* data);
protected:
virtual ~NativeDisplayEventReceiver();
@@ -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);
};
@@ -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) {
@@ -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
}
@@ -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) {