RenderThread.h revision 18f16e6fba74eda173e1e7c869e6e2e2acc073ff
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 3118f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck#include "TimeLord.h" 3218f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck 33cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Recknamespace android { 34e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckclass DisplayEventReceiver; 35e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 36cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Recknamespace uirenderer { 37cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Recknamespace renderthread { 38cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 39e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckclass DispatchFrameCallbacks; 40e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 414f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckclass TaskQueue { 424f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckpublic: 434f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck TaskQueue(); 444f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 454f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck RenderTask* next(); 464f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck void queue(RenderTask* task); 474f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck RenderTask* peek(); 484f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck void remove(RenderTask* task); 494f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 504f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckprivate: 514f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck RenderTask* mHead; 524f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck RenderTask* mTail; 534f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck}; 544f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 55e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck// Mimics android.view.Choreographer.FrameCallback 56e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckclass IFrameCallback { 57e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckpublic: 5818f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck virtual void doFrame() = 0; 59e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 60e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckprotected: 61e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck ~IFrameCallback() {} 62e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}; 63e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 64cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckclass ANDROID_API RenderThread : public Thread, public Singleton<RenderThread> { 65cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckpublic: 66cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck // RenderThread takes complete ownership of tasks that are queued 67cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck // and will delete them after they are run 68cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck ANDROID_API void queue(RenderTask* task); 694f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck void queueDelayed(RenderTask* task, int delayMs); 704f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck void remove(RenderTask* task); 71cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 72e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck // Mimics android.view.Choreographer 73e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck void postFrameCallback(IFrameCallback* callback); 74e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck void removeFrameCallback(IFrameCallback* callback); 75e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 7618f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck TimeLord& timeLord() { return mTimeLord; } 7718f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck 78cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckprotected: 79cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck virtual bool threadLoop(); 80cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 81cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckprivate: 82cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck friend class Singleton<RenderThread>; 83e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck friend class DispatchFrameCallbacks; 84cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 85cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck RenderThread(); 86cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck virtual ~RenderThread(); 87cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 88e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck void initializeDisplayEventReceiver(); 89e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck static int displayEventReceiverCallback(int fd, int events, void* data); 90e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck void drainDisplayEventQueue(); 91e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck void dispatchFrameCallbacks(); 92e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 934f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck // Returns the next task to be run. If this returns NULL nextWakeup is set 944f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck // to the time to requery for the nextTask to run. mNextWakeup is also 954f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck // set to this time 964f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck RenderTask* nextTask(nsecs_t* nextWakeup); 97cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 98cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck sp<Looper> mLooper; 99cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck Mutex mLock; 100cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 1014f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck nsecs_t mNextWakeup; 1024f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck TaskQueue mQueue; 103e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 104e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck DisplayEventReceiver* mDisplayEventReceiver; 105e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck bool mVsyncRequested; 106e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck std::set<IFrameCallback*> mFrameCallbacks; 107e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck bool mFrameCallbackTaskPending; 108e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck DispatchFrameCallbacks* mFrameCallbackTask; 10918f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck 11018f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck TimeLord mTimeLord; 111cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck}; 112cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 113cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck} /* namespace renderthread */ 114cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck} /* namespace uirenderer */ 115cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck} /* namespace android */ 116cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#endif /* RENDERTHREAD_H_ */ 117