1d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian/* 2d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian * Copyright (C) 2011 The Android Open Source Project 3d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian * 4d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian * Licensed under the Apache License, Version 2.0 (the "License"); 5d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian * you may not use this file except in compliance with the License. 6d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian * You may obtain a copy of the License at 7d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian * 8d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian * http://www.apache.org/licenses/LICENSE-2.0 9d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian * 10d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian * Unless required by applicable law or agreed to in writing, software 11d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian * distributed under the License is distributed on an "AS IS" BASIS, 12d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian * See the License for the specific language governing permissions and 14d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian * limitations under the License. 15d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian */ 16d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian 17d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian#ifndef ANDROID_SURFACE_FLINGER_EVENT_THREAD_H 18d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian#define ANDROID_SURFACE_FLINGER_EVENT_THREAD_H 19d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian 20d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian#include <stdint.h> 21d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian#include <sys/types.h> 22d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian 23cb9732a951d20cacb7ebe2dab132b5738226b1b6Mathias Agopian#include <gui/DisplayEventReceiver.h> 24d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian#include <gui/IDisplayEventConnection.h> 25d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian 26d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian#include <utils/Errors.h> 27d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian#include <utils/threads.h> 28cb9732a951d20cacb7ebe2dab132b5738226b1b6Mathias Agopian#include <utils/SortedVector.h> 29d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian 309e663de4fe1dcc872373ee530c60a375624671c3Jesse Hall#include "DisplayDevice.h" 318630320433bd15aca239522e54e711ef6372ab07Mathias Agopian#include "DisplayHardware/PowerHAL.h" 323eb38cb33e41ce40dd1094bdec850f0fca9f8a53Mathias Agopian 33d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian// --------------------------------------------------------------------------- 34d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopiannamespace android { 35d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian// --------------------------------------------------------------------------- 36d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian 37d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopianclass SurfaceFlinger; 38921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopianclass String8; 39d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian 40d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian// --------------------------------------------------------------------------- 41d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian 42faf77cce9d9ec0238d6999b3bd0d40c71ff403c5Jamie Gennis 43faf77cce9d9ec0238d6999b3bd0d40c71ff403c5Jamie Gennisclass VSyncSource : public virtual RefBase { 44faf77cce9d9ec0238d6999b3bd0d40c71ff403c5Jamie Gennispublic: 45faf77cce9d9ec0238d6999b3bd0d40c71ff403c5Jamie Gennis class Callback: public virtual RefBase { 46faf77cce9d9ec0238d6999b3bd0d40c71ff403c5Jamie Gennis public: 47faf77cce9d9ec0238d6999b3bd0d40c71ff403c5Jamie Gennis virtual ~Callback() {} 48faf77cce9d9ec0238d6999b3bd0d40c71ff403c5Jamie Gennis virtual void onVSyncEvent(nsecs_t when) = 0; 49faf77cce9d9ec0238d6999b3bd0d40c71ff403c5Jamie Gennis }; 50faf77cce9d9ec0238d6999b3bd0d40c71ff403c5Jamie Gennis 51faf77cce9d9ec0238d6999b3bd0d40c71ff403c5Jamie Gennis virtual ~VSyncSource() {} 52faf77cce9d9ec0238d6999b3bd0d40c71ff403c5Jamie Gennis virtual void setVSyncEnabled(bool enable) = 0; 53faf77cce9d9ec0238d6999b3bd0d40c71ff403c5Jamie Gennis virtual void setCallback(const sp<Callback>& callback) = 0; 54faf77cce9d9ec0238d6999b3bd0d40c71ff403c5Jamie Gennis}; 55faf77cce9d9ec0238d6999b3bd0d40c71ff403c5Jamie Gennis 56faf77cce9d9ec0238d6999b3bd0d40c71ff403c5Jamie Gennisclass EventThread : public Thread, private VSyncSource::Callback { 57cb9732a951d20cacb7ebe2dab132b5738226b1b6Mathias Agopian class Connection : public BnDisplayEventConnection { 58cb9732a951d20cacb7ebe2dab132b5738226b1b6Mathias Agopian public: 59cb9732a951d20cacb7ebe2dab132b5738226b1b6Mathias Agopian Connection(const sp<EventThread>& eventThread); 60cb9732a951d20cacb7ebe2dab132b5738226b1b6Mathias Agopian status_t postEvent(const DisplayEventReceiver::Event& event); 61d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian 62cb9732a951d20cacb7ebe2dab132b5738226b1b6Mathias Agopian // count >= 1 : continuous event. count is the vsync rate 63cb9732a951d20cacb7ebe2dab132b5738226b1b6Mathias Agopian // count == 0 : one-shot event that has not fired 64cb9732a951d20cacb7ebe2dab132b5738226b1b6Mathias Agopian // count ==-1 : one-shot event that fired this round / disabled 65cb9732a951d20cacb7ebe2dab132b5738226b1b6Mathias Agopian int32_t count; 66d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian 67cb9732a951d20cacb7ebe2dab132b5738226b1b6Mathias Agopian private: 68cb9732a951d20cacb7ebe2dab132b5738226b1b6Mathias Agopian virtual ~Connection(); 69cb9732a951d20cacb7ebe2dab132b5738226b1b6Mathias Agopian virtual void onFirstRef(); 70cb9732a951d20cacb7ebe2dab132b5738226b1b6Mathias Agopian virtual sp<BitTube> getDataChannel() const; 71cb9732a951d20cacb7ebe2dab132b5738226b1b6Mathias Agopian virtual void setVsyncRate(uint32_t count); 72cb9732a951d20cacb7ebe2dab132b5738226b1b6Mathias Agopian virtual void requestNextVsync(); // asynchronous 73cb9732a951d20cacb7ebe2dab132b5738226b1b6Mathias Agopian sp<EventThread> const mEventThread; 74cb9732a951d20cacb7ebe2dab132b5738226b1b6Mathias Agopian sp<BitTube> const mChannel; 75cb9732a951d20cacb7ebe2dab132b5738226b1b6Mathias Agopian }; 768aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian 77cb9732a951d20cacb7ebe2dab132b5738226b1b6Mathias Agopianpublic: 78d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian 79faf77cce9d9ec0238d6999b3bd0d40c71ff403c5Jamie Gennis EventThread(const sp<VSyncSource>& src); 80d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian 81cb9732a951d20cacb7ebe2dab132b5738226b1b6Mathias Agopian sp<Connection> createEventConnection() const; 82cb9732a951d20cacb7ebe2dab132b5738226b1b6Mathias Agopian status_t registerDisplayEventConnection(const sp<Connection>& connection); 83478ae5eb5a0047e1b2988c896cff6363b455ee50Mathias Agopian 84cb9732a951d20cacb7ebe2dab132b5738226b1b6Mathias Agopian void setVsyncRate(uint32_t count, const sp<Connection>& connection); 85cb9732a951d20cacb7ebe2dab132b5738226b1b6Mathias Agopian void requestNextVsync(const sp<Connection>& connection); 86478ae5eb5a0047e1b2988c896cff6363b455ee50Mathias Agopian 8722ffb117b0c2a906bd04aef9738a52223cdd1dceMathias Agopian // called before the screen is turned off from main thread 8822ffb117b0c2a906bd04aef9738a52223cdd1dceMathias Agopian void onScreenReleased(); 8922ffb117b0c2a906bd04aef9738a52223cdd1dceMathias Agopian 9022ffb117b0c2a906bd04aef9738a52223cdd1dceMathias Agopian // called after the screen is turned on from main thread 9122ffb117b0c2a906bd04aef9738a52223cdd1dceMathias Agopian void onScreenAcquired(); 928aedd4737d6ce8548d2fd5def65b1e1737283821Mathias Agopian 93faf77cce9d9ec0238d6999b3bd0d40c71ff403c5Jamie Gennis // called when receiving a hotplug event 94148994e5f33ce240ff24ceb5bc0500b7f2001959Mathias Agopian void onHotplugReceived(int type, bool connected); 958630320433bd15aca239522e54e711ef6372ab07Mathias Agopian 96f6bbd44a23c2791277db7814a894633de04cd460Mathias Agopian Vector< sp<EventThread::Connection> > waitForEvent( 97f6bbd44a23c2791277db7814a894633de04cd460Mathias Agopian DisplayEventReceiver::Event* event); 98f6bbd44a23c2791277db7814a894633de04cd460Mathias Agopian 9974d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopian void dump(String8& result) const; 100ef472ec40a0fbb0ef96b79bef846f20b73da4971Ruchi Kandoi void sendVsyncHintOff(); 101d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian 102d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopianprivate: 103d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian virtual bool threadLoop(); 104d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian virtual void onFirstRef(); 105d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian 106faf77cce9d9ec0238d6999b3bd0d40c71ff403c5Jamie Gennis virtual void onVSyncEvent(nsecs_t timestamp); 107faf77cce9d9ec0238d6999b3bd0d40c71ff403c5Jamie Gennis 108cb9732a951d20cacb7ebe2dab132b5738226b1b6Mathias Agopian void removeDisplayEventConnection(const wp<Connection>& connection); 10922ffb117b0c2a906bd04aef9738a52223cdd1dceMathias Agopian void enableVSyncLocked(); 11022ffb117b0c2a906bd04aef9738a52223cdd1dceMathias Agopian void disableVSyncLocked(); 111ef472ec40a0fbb0ef96b79bef846f20b73da4971Ruchi Kandoi void sendVsyncHintOnLocked(); 11223748668d33ac850e64d87e25ac4cc78679c9384Mathias Agopian 113d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian // constants 114faf77cce9d9ec0238d6999b3bd0d40c71ff403c5Jamie Gennis sp<VSyncSource> mVSyncSource; 1158630320433bd15aca239522e54e711ef6372ab07Mathias Agopian PowerHAL mPowerHAL; 116d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian 117d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian mutable Mutex mLock; 118d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian mutable Condition mCondition; 119d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian 120d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian // protected by mLock 121cb9732a951d20cacb7ebe2dab132b5738226b1b6Mathias Agopian SortedVector< wp<Connection> > mDisplayEventConnections; 122148994e5f33ce240ff24ceb5bc0500b7f2001959Mathias Agopian Vector< DisplayEventReceiver::Event > mPendingEvents; 1239e663de4fe1dcc872373ee530c60a375624671c3Jesse Hall DisplayEventReceiver::Event mVSyncEvent[DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES]; 12422ffb117b0c2a906bd04aef9738a52223cdd1dceMathias Agopian bool mUseSoftwareVSync; 125faf77cce9d9ec0238d6999b3bd0d40c71ff403c5Jamie Gennis bool mVsyncEnabled; 126e2c4f4ec23b735dd2a03f4ea8b08b288a1bb04e8Mathias Agopian 127e2c4f4ec23b735dd2a03f4ea8b08b288a1bb04e8Mathias Agopian // for debugging 128e2c4f4ec23b735dd2a03f4ea8b08b288a1bb04e8Mathias Agopian bool mDebugVsyncEnabled; 129ef472ec40a0fbb0ef96b79bef846f20b73da4971Ruchi Kandoi 130ef472ec40a0fbb0ef96b79bef846f20b73da4971Ruchi Kandoi bool mVsyncHintSent; 131ef472ec40a0fbb0ef96b79bef846f20b73da4971Ruchi Kandoi timer_t mTimerId; 132d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian}; 133d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian 134d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian// --------------------------------------------------------------------------- 135d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian 136d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian}; // namespace android 137d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian 138d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian// --------------------------------------------------------------------------- 139d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian 140d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian#endif /* ANDROID_SURFACE_FLINGER_EVENT_THREAD_H */ 141