From e02f7b3fa88a895ee93030bc7bd2a3fa010c1a8f Mon Sep 17 00:00:00 2001 From: Mathias Agopian Date: Tue, 24 Jan 2012 16:39:14 -0800 Subject: SF now synchronizes to VSYNC Change-Id: Ic5e4f2ea9927ce133eef9499c03161325e9d02c5 --- services/surfaceflinger/MessageQueue.cpp | 61 ++++++++++++++++++++++++++++++-- 1 file changed, 58 insertions(+), 3 deletions(-) (limited to 'services/surfaceflinger/MessageQueue.cpp') diff --git a/services/surfaceflinger/MessageQueue.cpp b/services/surfaceflinger/MessageQueue.cpp index cbd530c822a5..70711e73ee46 100644 --- a/services/surfaceflinger/MessageQueue.cpp +++ b/services/surfaceflinger/MessageQueue.cpp @@ -18,12 +18,17 @@ #include #include +#include + #include #include #include -#include + +#include +#include #include "MessageQueue.h" +#include "EventThread.h" namespace android { @@ -51,6 +56,15 @@ MessageQueue::MessageQueue() MessageQueue::~MessageQueue() { } +void MessageQueue::setEventThread(const sp& eventThread) +{ + mEventThread = eventThread; + mEvents = eventThread->createEventConnection(); + mEventTube = mEvents->getDataChannel(); + mLooper->addFd(mEventTube->getFd(), 0, ALOOPER_EVENT_INPUT, + MessageQueue::cb_eventReceiver, this); +} + void MessageQueue::waitMessage() { do { IPCThreadState::self()->flushCommands(); @@ -93,13 +107,54 @@ status_t MessageQueue::postMessage( return NO_ERROR; } -status_t MessageQueue::invalidate() { +void MessageQueue::scheduleWorkASAP() { if (android_atomic_or(1, &mWorkPending) == 0) { mLooper->wake(); - } + } +} + +status_t MessageQueue::invalidate() { + mEvents->requestNextVsync(); return NO_ERROR; } +int MessageQueue::cb_eventReceiver(int fd, int events, void* data) { + MessageQueue* queue = reinterpret_cast(data); + return queue->eventReceiver(fd, events); +} + +int MessageQueue::eventReceiver(int fd, int events) { + ssize_t n; + DisplayEventReceiver::Event buffer[8]; + while ((n = getEvents(buffer, 8)) > 0) { + for (int i=0 ; iread(events, sizeof(events[0])*count); + ALOGE_IF(size<0, "MessageQueue::getEvents error (%s)", strerror(-size)); + if (size >= 0) { + // Note: if (size % sizeof(events[0])) != 0, we've got a + // partial read. This can happen if the queue filed up (ie: if we + // didn't pull from it fast enough). + // We discard the partial event and rely on the sender to + // re-send the event if appropriate (some events, like VSYNC + // can be lost forever). + // returns number of events read + size /= sizeof(events[0]); + } + return size; +} + // --------------------------------------------------------------------------- }; // namespace android -- cgit v1.2.3-59-g8ed1b