3cf199aef6
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
84 lines
2.4 KiB
C++
84 lines
2.4 KiB
C++
/*
|
|
* Copyright (C) 2010 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#include <gui/DisplayEventReceiver.h>
|
|
#include <utils/Looper.h>
|
|
|
|
using namespace android;
|
|
|
|
int receiver(int fd, int events, void* data)
|
|
{
|
|
DisplayEventReceiver* q = (DisplayEventReceiver*)data;
|
|
|
|
ssize_t n;
|
|
DisplayEventReceiver::Event buffer[1];
|
|
|
|
static nsecs_t oldTimeStamp = 0;
|
|
|
|
while ((n = q->getEvents(buffer, 1)) > 0) {
|
|
for (int i=0 ; i<n ; i++) {
|
|
if (buffer[i].header.type == DisplayEventReceiver::DISPLAY_EVENT_VSYNC) {
|
|
printf("event vsync: count=%d\t", buffer[i].vsync.count);
|
|
}
|
|
if (oldTimeStamp) {
|
|
float t = float(buffer[i].header.timestamp - oldTimeStamp) / s2ns(1);
|
|
printf("%f ms (%f Hz)\n", t*1000, 1.0/t);
|
|
}
|
|
oldTimeStamp = buffer[i].header.timestamp;
|
|
}
|
|
}
|
|
if (n<0) {
|
|
printf("error reading events (%s)\n", strerror(-n));
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
int main(int argc, char** argv)
|
|
{
|
|
DisplayEventReceiver myDisplayEvent;
|
|
|
|
|
|
sp<Looper> loop = new Looper(false);
|
|
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);
|
|
switch (ret) {
|
|
case ALOOPER_POLL_WAKE:
|
|
//("ALOOPER_POLL_WAKE\n");
|
|
break;
|
|
case ALOOPER_POLL_CALLBACK:
|
|
//("ALOOPER_POLL_CALLBACK\n");
|
|
break;
|
|
case ALOOPER_POLL_TIMEOUT:
|
|
printf("ALOOPER_POLL_TIMEOUT\n");
|
|
break;
|
|
case ALOOPER_POLL_ERROR:
|
|
printf("ALOOPER_POLL_TIMEOUT\n");
|
|
break;
|
|
default:
|
|
printf("ugh? poll returned %d\n", ret);
|
|
break;
|
|
}
|
|
} while (1);
|
|
|
|
return 0;
|
|
}
|