RenderThread.h revision b36016c65f1d1b5846dba0349aab491dbd3a746a
1cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck/*
2cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * Copyright (C) 2013 The Android Open Source Project
3cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck *
4cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * Licensed under the Apache License, Version 2.0 (the "License");
5cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * you may not use this file except in compliance with the License.
6cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * You may obtain a copy of the License at
7cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck *
8cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck *      http://www.apache.org/licenses/LICENSE-2.0
9cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck *
10cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * Unless required by applicable law or agreed to in writing, software
11cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * distributed under the License is distributed on an "AS IS" BASIS,
12cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * See the License for the specific language governing permissions and
14cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck * limitations under the License.
15cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck */
16cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
17cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#ifndef RENDERTHREAD_H_
18cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#define RENDERTHREAD_H_
19cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
20cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#include "RenderTask.h"
21e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
22ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck#include "../JankTracker.h"
23ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck#include "TimeLord.h"
24e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
25cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#include <cutils/compiler.h>
26b36016c65f1d1b5846dba0349aab491dbd3a746aJohn Reck#include <ui/DisplayInfo.h>
27cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#include <utils/Looper.h>
28cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#include <utils/Mutex.h>
29cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#include <utils/Singleton.h>
30cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#include <utils/Thread.h>
31cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
32ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck#include <memory>
33ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck#include <set>
3418f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck
35cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Recknamespace android {
363b20251a355c88193c439f928a84ae69483fb488John Reck
37e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckclass DisplayEventReceiver;
38e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
39cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Recknamespace uirenderer {
403b20251a355c88193c439f928a84ae69483fb488John Reck
413b20251a355c88193c439f928a84ae69483fb488John Reckclass RenderState;
423b20251a355c88193c439f928a84ae69483fb488John Reck
43cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Recknamespace renderthread {
44cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
45443a714fa7c0dd07fee3527cc5bc3d3ca1fb7d44John Reckclass CanvasContext;
46e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckclass DispatchFrameCallbacks;
473b20251a355c88193c439f928a84ae69483fb488John Reckclass EglManager;
483b20251a355c88193c439f928a84ae69483fb488John Reckclass RenderProxy;
49e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
504f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckclass TaskQueue {
514f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckpublic:
524f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    TaskQueue();
534f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
544f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    RenderTask* next();
554f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    void queue(RenderTask* task);
56a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck    void queueAtFront(RenderTask* task);
574f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    RenderTask* peek();
584f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    void remove(RenderTask* task);
594f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
604f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckprivate:
614f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    RenderTask* mHead;
624f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    RenderTask* mTail;
634f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck};
644f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
65e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck// Mimics android.view.Choreographer.FrameCallback
66e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckclass IFrameCallback {
67e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckpublic:
6818f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck    virtual void doFrame() = 0;
69e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
70e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckprotected:
71e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    ~IFrameCallback() {}
72e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck};
73e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
743b20251a355c88193c439f928a84ae69483fb488John Reckclass ANDROID_API RenderThread : public Thread, protected Singleton<RenderThread> {
75cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckpublic:
76cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck    // RenderThread takes complete ownership of tasks that are queued
77cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck    // and will delete them after they are run
78cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck    ANDROID_API void queue(RenderTask* task);
79a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck    ANDROID_API void queueAtFront(RenderTask* task);
80a733f89c05567c97359169832f41389b939baaadJohn Reck    void queueAt(RenderTask* task, nsecs_t runAtNs);
814f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    void remove(RenderTask* task);
82cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
83e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    // Mimics android.view.Choreographer
84e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    void postFrameCallback(IFrameCallback* callback);
8501a5ea35fbba4c5bb1d7790ae1677a2fa752e042John Reck    bool removeFrameCallback(IFrameCallback* callback);
86a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck    // If the callback is currently registered, it will be pushed back until
87a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck    // the next vsync. If it is not currently registered this does nothing.
88a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck    void pushBackFrameCallback(IFrameCallback* callback);
89e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
9018f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck    TimeLord& timeLord() { return mTimeLord; }
913b20251a355c88193c439f928a84ae69483fb488John Reck    RenderState& renderState() { return *mRenderState; }
923b20251a355c88193c439f928a84ae69483fb488John Reck    EglManager& eglManager() { return *mEglManager; }
93ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck    JankTracker& jankTracker() { return *mJankTracker; }
9418f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck
95b36016c65f1d1b5846dba0349aab491dbd3a746aJohn Reck    const DisplayInfo& mainDisplayInfo() { return mDisplayInfo; }
96b36016c65f1d1b5846dba0349aab491dbd3a746aJohn Reck
97cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckprotected:
98d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik    virtual bool threadLoop() override;
99cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
100cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckprivate:
101cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck    friend class Singleton<RenderThread>;
102e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    friend class DispatchFrameCallbacks;
1033b20251a355c88193c439f928a84ae69483fb488John Reck    friend class RenderProxy;
104cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
105cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck    RenderThread();
106cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck    virtual ~RenderThread();
107cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
1083b20251a355c88193c439f928a84ae69483fb488John Reck    void initThreadLocals();
109e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    void initializeDisplayEventReceiver();
110e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    static int displayEventReceiverCallback(int fd, int events, void* data);
111a733f89c05567c97359169832f41389b939baaadJohn Reck    void drainDisplayEventQueue();
112e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    void dispatchFrameCallbacks();
113a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck    void requestVsync();
114e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
1154f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    // Returns the next task to be run. If this returns NULL nextWakeup is set
1164f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    // to the time to requery for the nextTask to run. mNextWakeup is also
1174f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    // set to this time
1184f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    RenderTask* nextTask(nsecs_t* nextWakeup);
119cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
120cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck    sp<Looper> mLooper;
121cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck    Mutex mLock;
122cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
1234f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    nsecs_t mNextWakeup;
1244f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    TaskQueue mQueue;
125e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
126b36016c65f1d1b5846dba0349aab491dbd3a746aJohn Reck    DisplayInfo mDisplayInfo;
127b36016c65f1d1b5846dba0349aab491dbd3a746aJohn Reck
128e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    DisplayEventReceiver* mDisplayEventReceiver;
129e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    bool mVsyncRequested;
130e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    std::set<IFrameCallback*> mFrameCallbacks;
131a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck    // We defer the actual registration of these callbacks until
132a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck    // both mQueue *and* mDisplayEventReceiver have been drained off all
133a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck    // immediate events. This makes sure that we catch the next vsync, not
134a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck    // the previous one
135a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck    std::set<IFrameCallback*> mPendingRegistrationFrameCallbacks;
136e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    bool mFrameCallbackTaskPending;
137e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    DispatchFrameCallbacks* mFrameCallbackTask;
13818f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck
13918f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck    TimeLord mTimeLord;
1403b20251a355c88193c439f928a84ae69483fb488John Reck    RenderState* mRenderState;
1413b20251a355c88193c439f928a84ae69483fb488John Reck    EglManager* mEglManager;
142ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck
143ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck    JankTracker* mJankTracker = nullptr;
144cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck};
145cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
146cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck} /* namespace renderthread */
147cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck} /* namespace uirenderer */
148cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck} /* namespace android */
149cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#endif /* RENDERTHREAD_H_ */
150