13d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright/* 23d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright * Copyright (C) 2015 The Android Open Source Project 33d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright * 43d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright * Licensed under the Apache License, Version 2.0 (the "License"); 53d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright * you may not use this file except in compliance with the License. 63d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright * You may obtain a copy of the License at 73d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright * 83d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright * http://www.apache.org/licenses/LICENSE-2.0 93d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright * 103d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright * Unless required by applicable law or agreed to in writing, software 113d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright * distributed under the License is distributed on an "AS IS" BASIS, 123d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright * See the License for the specific language governing permissions and 143d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright * limitations under the License. 153d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright */ 163d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright 173d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright#define LOG_TAG "DisplayEventDispatcher" 183d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright 193d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright#include <cinttypes> 203d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright#include <cstdint> 213d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright 223d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright#include <androidfw/DisplayEventDispatcher.h> 233d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright#include <gui/DisplayEventReceiver.h> 243d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright#include <utils/Log.h> 253d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright#include <utils/Looper.h> 263d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright 273d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright#include <utils/Timers.h> 283d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright 293d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wrightnamespace android { 303d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright 313d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright// Number of events to read at a time from the DisplayEventDispatcher pipe. 323d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright// The value should be large enough that we can quickly drain the pipe 333d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright// using just a few large reads. 343d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wrightstatic const size_t EVENT_BUFFER_SIZE = 100; 353d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright 363d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael WrightDisplayEventDispatcher::DisplayEventDispatcher(const sp<Looper>& looper) : 373d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright mLooper(looper), mWaitingForVsync(false) { 383d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright ALOGV("dispatcher %p ~ Initializing display event dispatcher.", this); 393d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright} 403d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright 413d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wrightstatus_t DisplayEventDispatcher::initialize() { 423d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright status_t result = mReceiver.initCheck(); 433d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright if (result) { 443d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright ALOGW("Failed to initialize display event receiver, status=%d", result); 453d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright return result; 463d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright } 473d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright 483d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright int rc = mLooper->addFd(mReceiver.getFd(), 0, Looper::EVENT_INPUT, 493d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright this, NULL); 503d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright if (rc < 0) { 513d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright return UNKNOWN_ERROR; 523d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright } 533d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright return OK; 543d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright} 553d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright 563d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wrightvoid DisplayEventDispatcher::dispose() { 573d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright ALOGV("dispatcher %p ~ Disposing display event dispatcher.", this); 583d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright 593d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright if (!mReceiver.initCheck()) { 603d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright mLooper->removeFd(mReceiver.getFd()); 613d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright } 623d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright} 633d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright 643d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wrightstatus_t DisplayEventDispatcher::scheduleVsync() { 653d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright if (!mWaitingForVsync) { 663d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright ALOGV("dispatcher %p ~ Scheduling vsync.", this); 673d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright 683d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright // Drain all pending events. 693d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright nsecs_t vsyncTimestamp; 703d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright int32_t vsyncDisplayId; 713d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright uint32_t vsyncCount; 723d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright if (processPendingEvents(&vsyncTimestamp, &vsyncDisplayId, &vsyncCount)) { 733d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright ALOGE("dispatcher %p ~ last event processed while scheduling was for %" PRId64 "", 743d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright this, ns2ms(static_cast<nsecs_t>(vsyncTimestamp))); 753d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright } 763d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright 773d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright status_t status = mReceiver.requestNextVsync(); 783d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright if (status) { 793d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright ALOGW("Failed to request next vsync, status=%d", status); 803d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright return status; 813d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright } 823d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright 833d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright mWaitingForVsync = true; 843d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright } 853d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright return OK; 863d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright} 873d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright 883d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wrightint DisplayEventDispatcher::handleEvent(int, int events, void*) { 893d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright if (events & (Looper::EVENT_ERROR | Looper::EVENT_HANGUP)) { 903d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright ALOGE("Display event receiver pipe was closed or an error occurred. " 913d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright "events=0x%x", events); 923d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright return 0; // remove the callback 933d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright } 943d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright 953d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright if (!(events & Looper::EVENT_INPUT)) { 963d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright ALOGW("Received spurious callback for unhandled poll event. " 973d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright "events=0x%x", events); 983d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright return 1; // keep the callback 993d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright } 1003d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright 1013d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright // Drain all pending events, keep the last vsync. 1023d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright nsecs_t vsyncTimestamp; 1033d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright int32_t vsyncDisplayId; 1043d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright uint32_t vsyncCount; 1053d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright if (processPendingEvents(&vsyncTimestamp, &vsyncDisplayId, &vsyncCount)) { 1061a2d84acbd125db65b9baa781ee05fb50a0aca1aJohn Reck ALOGV("dispatcher %p ~ Vsync pulse: timestamp=%" PRId64 ", id=%d, count=%d", 1073d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright this, ns2ms(vsyncTimestamp), vsyncDisplayId, vsyncCount); 1083d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright mWaitingForVsync = false; 1093d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright dispatchVsync(vsyncTimestamp, vsyncDisplayId, vsyncCount); 1103d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright } 1113d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright 1123d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright return 1; // keep the callback 1133d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright} 1143d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright 1153d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wrightbool DisplayEventDispatcher::processPendingEvents( 1163d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright nsecs_t* outTimestamp, int32_t* outId, uint32_t* outCount) { 1173d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright bool gotVsync = false; 1183d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright DisplayEventReceiver::Event buf[EVENT_BUFFER_SIZE]; 1193d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright ssize_t n; 1203d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright while ((n = mReceiver.getEvents(buf, EVENT_BUFFER_SIZE)) > 0) { 1213d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright ALOGV("dispatcher %p ~ Read %d events.", this, int(n)); 1223d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright for (ssize_t i = 0; i < n; i++) { 1233d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright const DisplayEventReceiver::Event& ev = buf[i]; 1243d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright switch (ev.header.type) { 1253d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright case DisplayEventReceiver::DISPLAY_EVENT_VSYNC: 1263d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright // Later vsync events will just overwrite the info from earlier 1273d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright // ones. That's fine, we only care about the most recent. 1283d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright gotVsync = true; 1293d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright *outTimestamp = ev.header.timestamp; 1303d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright *outId = ev.header.id; 1313d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright *outCount = ev.vsync.count; 1323d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright break; 1333d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright case DisplayEventReceiver::DISPLAY_EVENT_HOTPLUG: 1343d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright dispatchHotplug(ev.header.timestamp, ev.header.id, ev.hotplug.connected); 1353d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright break; 1363d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright default: 1373d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright ALOGW("dispatcher %p ~ ignoring unknown event type %#x", this, ev.header.type); 1383d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright break; 1393d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright } 1403d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright } 1413d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright } 1423d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright if (n < 0) { 1433d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright ALOGW("Failed to get events from display event dispatcher, status=%d", status_t(n)); 1443d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright } 1453d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright return gotVsync; 1463d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright} 1473d3fe5026a6a3e951ef56ad16a100b8d5ae84574Michael Wright} 148