1f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian/* 2f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian * Copyright (C) 2009 The Android Open Source Project 3f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian * 4f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian * Licensed under the Apache License, Version 2.0 (the "License"); 5f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian * you may not use this file except in compliance with the License. 6f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian * You may obtain a copy of the License at 7f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian * 8f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian * http://www.apache.org/licenses/LICENSE-2.0 9f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian * 10f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian * Unless required by applicable law or agreed to in writing, software 11f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian * distributed under the License is distributed on an "AS IS" BASIS, 12f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian * See the License for the specific language governing permissions and 14f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian * limitations under the License. 15f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian */ 16f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian 17f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian#include <stdint.h> 18f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian#include <errno.h> 19f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian#include <sys/types.h> 20f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian 218aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian#include <binder/IPCThreadState.h> 228aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian 23f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian#include <utils/threads.h> 24f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian#include <utils/Timers.h> 25f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian#include <utils/Log.h> 268aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian 278aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian#include <gui/IDisplayEventConnection.h> 288aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian#include <gui/BitTube.h> 29f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian 30f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian#include "MessageQueue.h" 318aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian#include "EventThread.h" 3299ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian#include "SurfaceFlinger.h" 33f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian 34f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopiannamespace android { 35f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian 36f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian// --------------------------------------------------------------------------- 37f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian 38f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias AgopianMessageBase::MessageBase() 39f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian : MessageHandler() { 40b6683b58a8cd97e6d527a355bee7ffe9cf8fd6e7Mathias Agopian} 41b6683b58a8cd97e6d527a355bee7ffe9cf8fd6e7Mathias Agopian 42f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias AgopianMessageBase::~MessageBase() { 43b6683b58a8cd97e6d527a355bee7ffe9cf8fd6e7Mathias Agopian} 44b6683b58a8cd97e6d527a355bee7ffe9cf8fd6e7Mathias Agopian 45f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopianvoid MessageBase::handleMessage(const Message&) { 46f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian this->handler(); 47f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian barrier.open(); 48f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian}; 49f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian 50b6683b58a8cd97e6d527a355bee7ffe9cf8fd6e7Mathias Agopian// --------------------------------------------------------------------------- 51b6683b58a8cd97e6d527a355bee7ffe9cf8fd6e7Mathias Agopian 524fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopianvoid MessageQueue::Handler::dispatchRefresh() { 5399ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian if ((android_atomic_or(eventMaskRefresh, &mEventMask) & eventMaskRefresh) == 0) { 5499ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian mQueue.mLooper->sendMessage(this, Message(MessageQueue::REFRESH)); 5599ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian } 5699ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian} 5799ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian 584fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopianvoid MessageQueue::Handler::dispatchInvalidate() { 5999ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian if ((android_atomic_or(eventMaskInvalidate, &mEventMask) & eventMaskInvalidate) == 0) { 6099ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian mQueue.mLooper->sendMessage(this, Message(MessageQueue::INVALIDATE)); 6199ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian } 6299ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian} 6399ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian 6499ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopianvoid MessageQueue::Handler::handleMessage(const Message& message) { 6599ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian switch (message.what) { 6699ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian case INVALIDATE: 6799ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian android_atomic_and(~eventMaskInvalidate, &mEventMask); 6899ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian mQueue.mFlinger->onMessageReceived(message.what); 6999ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian break; 7099ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian case REFRESH: 7199ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian android_atomic_and(~eventMaskRefresh, &mEventMask); 7299ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian mQueue.mFlinger->onMessageReceived(message.what); 7399ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian break; 7499ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian } 7599ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian} 7699ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian 7799ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian// --------------------------------------------------------------------------- 7899ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian 79f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias AgopianMessageQueue::MessageQueue() 80f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian{ 81f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian} 82f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian 83f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias AgopianMessageQueue::~MessageQueue() { 84f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian} 85f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian 8699ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopianvoid MessageQueue::init(const sp<SurfaceFlinger>& flinger) 8799ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian{ 8899ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian mFlinger = flinger; 8999ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian mLooper = new Looper(true); 9099ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian mHandler = new Handler(*this); 9199ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian} 9299ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian 938aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopianvoid MessageQueue::setEventThread(const sp<EventThread>& eventThread) 948aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian{ 958aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian mEventThread = eventThread; 968aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian mEvents = eventThread->createEventConnection(); 978aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian mEventTube = mEvents->getDataChannel(); 988aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian mLooper->addFd(mEventTube->getFd(), 0, ALOOPER_EVENT_INPUT, 998aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian MessageQueue::cb_eventReceiver, this); 1008aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian} 1018aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian 102f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopianvoid MessageQueue::waitMessage() { 103f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian do { 104f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian IPCThreadState::self()->flushCommands(); 105f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian int32_t ret = mLooper->pollOnce(-1); 106f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian switch (ret) { 107f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian case ALOOPER_POLL_WAKE: 108f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian case ALOOPER_POLL_CALLBACK: 109f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian continue; 110f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian case ALOOPER_POLL_ERROR: 111e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("ALOOPER_POLL_ERROR"); 11299ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian case ALOOPER_POLL_TIMEOUT: 11399ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian // timeout (should not happen) 114f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian continue; 115f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian default: 116f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian // should not happen 117e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("Looper::pollOnce() returned unknown status %d", ret); 118f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian continue; 119f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian } 120f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian } while (true); 121f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian} 122f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian 123f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopianstatus_t MessageQueue::postMessage( 124f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian const sp<MessageBase>& messageHandler, nsecs_t relTime) 125f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian{ 126f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian const Message dummyMessage; 127f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian if (relTime > 0) { 128f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian mLooper->sendMessageDelayed(relTime, messageHandler, dummyMessage); 129f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian } else { 130f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian mLooper->sendMessage(messageHandler, dummyMessage); 131f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian } 132f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian return NO_ERROR; 133f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian} 134f61c57fe2e955e1c195bb0ca2dd7bcdaa922d5a9Mathias Agopian 1354fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian/* when INVALIDATE_ON_VSYNC is set SF only processes 1364fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian * buffer updates on VSYNC and performs a refresh immediately 1374fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian * after. 1384fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian * 1394fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian * when INVALIDATE_ON_VSYNC is set to false, SF will instead 1404fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian * perform the buffer updates immediately, but the refresh only 1414fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian * at the next VSYNC. 1424fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian * THIS MODE IS BUGGY ON GALAXY NEXUS AND WILL CAUSE HANGS 1434fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian */ 1444fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian#define INVALIDATE_ON_VSYNC 1 1454fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian 14699ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopianvoid MessageQueue::invalidate() { 1474fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian#if INVALIDATE_ON_VSYNC 14869a655caef30663403802281210363f643ceb946Mathias Agopian mEvents->requestNextVsync(); 1494fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian#else 1504fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian mHandler->dispatchInvalidate(); 1514fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian#endif 1528aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian} 1538aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian 15499ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopianvoid MessageQueue::refresh() { 1554fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian#if INVALIDATE_ON_VSYNC 1564fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian mHandler->dispatchRefresh(); 1574fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian#else 1588aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian mEvents->requestNextVsync(); 1594fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian#endif 160f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian} 161f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian 1628aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopianint MessageQueue::cb_eventReceiver(int fd, int events, void* data) { 1638aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian MessageQueue* queue = reinterpret_cast<MessageQueue *>(data); 1648aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian return queue->eventReceiver(fd, events); 1658aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian} 1668aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian 1678aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopianint MessageQueue::eventReceiver(int fd, int events) { 1688aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian ssize_t n; 1698aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian DisplayEventReceiver::Event buffer[8]; 17099ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian while ((n = DisplayEventReceiver::getEvents(mEventTube, buffer, 8)) > 0) { 1718aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian for (int i=0 ; i<n ; i++) { 1728aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian if (buffer[i].header.type == DisplayEventReceiver::DISPLAY_EVENT_VSYNC) { 1734fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian#if INVALIDATE_ON_VSYNC 1744fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian mHandler->dispatchInvalidate(); 1754fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian#else 1764fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian mHandler->dispatchRefresh(); 1774fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian#endif 1788aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian break; 1798aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian } 1808aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian } 1818aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian } 1828aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian return 1; 1838aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian} 1848aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian 185f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian// --------------------------------------------------------------------------- 186f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian 187f1d8e87b09abf963cd5b6a026194c1940fadb7b4Mathias Agopian}; // namespace android 188