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