RenderThread.h revision e45b1fd03b524d2b57cc6c222d89076a31a08bea
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
22e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#include <memory>
23e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#include <set>
24e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
25cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#include <cutils/compiler.h>
26cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#include <utils/Looper.h>
27cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#include <utils/Mutex.h>
28cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#include <utils/Singleton.h>
29cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#include <utils/Thread.h>
30cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
31cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Recknamespace android {
32e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckclass DisplayEventReceiver;
33e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
34cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Recknamespace uirenderer {
35cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Recknamespace renderthread {
36cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
37e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckclass DispatchFrameCallbacks;
38e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
394f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckclass TaskQueue {
404f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckpublic:
414f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    TaskQueue();
424f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
434f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    RenderTask* next();
444f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    void queue(RenderTask* task);
454f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    RenderTask* peek();
464f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    void remove(RenderTask* task);
474f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
484f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckprivate:
494f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    RenderTask* mHead;
504f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    RenderTask* mTail;
514f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck};
524f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
53e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck// Mimics android.view.Choreographer.FrameCallback
54e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckclass IFrameCallback {
55e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckpublic:
56e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    virtual void doFrame(nsecs_t frameTimeNanos) = 0;
57e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
58e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckprotected:
59e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    ~IFrameCallback() {}
60e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck};
61e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
62cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckclass ANDROID_API RenderThread : public Thread, public Singleton<RenderThread> {
63cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckpublic:
64cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck    // RenderThread takes complete ownership of tasks that are queued
65cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck    // and will delete them after they are run
66cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck    ANDROID_API void queue(RenderTask* task);
674f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    void queueDelayed(RenderTask* task, int delayMs);
684f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    void remove(RenderTask* task);
69cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
70e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    // Mimics android.view.Choreographer
71e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    void postFrameCallback(IFrameCallback* callback);
72e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    void removeFrameCallback(IFrameCallback* callback);
73e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
74cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckprotected:
75cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck    virtual bool threadLoop();
76cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
77cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckprivate:
78cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck    friend class Singleton<RenderThread>;
79e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    friend class DispatchFrameCallbacks;
80cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
81cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck    RenderThread();
82cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck    virtual ~RenderThread();
83cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
84e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    void initializeDisplayEventReceiver();
85e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    static int displayEventReceiverCallback(int fd, int events, void* data);
86e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    void drainDisplayEventQueue();
87e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    void dispatchFrameCallbacks();
88e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
894f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    // Returns the next task to be run. If this returns NULL nextWakeup is set
904f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    // to the time to requery for the nextTask to run. mNextWakeup is also
914f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    // set to this time
924f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    RenderTask* nextTask(nsecs_t* nextWakeup);
93cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
94cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck    sp<Looper> mLooper;
95cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck    Mutex mLock;
96cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
974f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    nsecs_t mNextWakeup;
984f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    TaskQueue mQueue;
99e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
100e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    DisplayEventReceiver* mDisplayEventReceiver;
101e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    bool mVsyncRequested;
102e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    std::set<IFrameCallback*> mFrameCallbacks;
103e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    bool mFrameCallbackTaskPending;
104e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    DispatchFrameCallbacks* mFrameCallbackTask;
105e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    nsecs_t mFrameTime;
106cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck};
107cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck
108cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck} /* namespace renderthread */
109cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck} /* namespace uirenderer */
110cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck} /* namespace android */
111cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#endif /* RENDERTHREAD_H_ */
112