From 3cf199aef6250552555344944c3e3a6e4ab05f92 Mon Sep 17 00:00:00 2001 From: Mathias Agopian Date: Tue, 31 Jan 2012 16:42:54 -0800 Subject: [PATCH] fix an issue with vsync event delivery vsync events were sometimes delivered to connected client who didn't request them. this happened if another client requested the delivery and that client was first in the client list. also fix the vsync test which didn't request any events as well as DisplayEventReveiver documentation which was misleading about the necessity to request vsync events. Change-Id: Ie990fda3f337f8f0042745c4b2cde67936c45686 --- include/gui/DisplayEventReceiver.h | 4 +++- services/surfaceflinger/EventThread.cpp | 10 +++------- services/surfaceflinger/tests/vsync/vsync.cpp | 2 ++ 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/include/gui/DisplayEventReceiver.h b/include/gui/DisplayEventReceiver.h index dccc1643c..a28137785 100644 --- a/include/gui/DisplayEventReceiver.h +++ b/include/gui/DisplayEventReceiver.h @@ -63,7 +63,9 @@ public: public: /* * DisplayEventReceiver creates and registers an event connection with - * SurfaceFlinger. Events start being delivered immediately. + * SurfaceFlinger. VSync events are disabled by default. Call setVSyncRate + * or requestNextVsync to receive them. + * Other events start being delivered immediately. */ DisplayEventReceiver(); diff --git a/services/surfaceflinger/EventThread.cpp b/services/surfaceflinger/EventThread.cpp index 92d4266a8..af0da0bdb 100644 --- a/services/surfaceflinger/EventThread.cpp +++ b/services/surfaceflinger/EventThread.cpp @@ -151,9 +151,9 @@ bool EventThread::threadLoop() { mLastVSyncTimestamp = timestamp; // now see if we still need to report this VSYNC event - bool reportVsync = false; - size_t count = mDisplayEventConnections.size(); + const size_t count = mDisplayEventConnections.size(); for (size_t i=0 ; i= 1) { @@ -174,11 +174,7 @@ bool EventThread::threadLoop() { displayEventConnections.add(mDisplayEventConnections.keyAt(i)); } } - - if (reportVsync) { - break; - } - } while (true); + } while (!displayEventConnections.size()); // dispatch vsync events to listeners... vsync.header.type = DisplayEventReceiver::DISPLAY_EVENT_VSYNC; diff --git a/services/surfaceflinger/tests/vsync/vsync.cpp b/services/surfaceflinger/tests/vsync/vsync.cpp index 4f7908025..b0d54c4e0 100644 --- a/services/surfaceflinger/tests/vsync/vsync.cpp +++ b/services/surfaceflinger/tests/vsync/vsync.cpp @@ -55,6 +55,8 @@ int main(int argc, char** argv) loop->addFd(myDisplayEvent.getFd(), 0, ALOOPER_EVENT_INPUT, receiver, &myDisplayEvent); + myDisplayEvent.setVsyncRate(1); + do { //printf("about to poll...\n"); int32_t ret = loop->pollOnce(-1);