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" 23f9e45d1d818ae0956ba77ed598b7040cfecca553Derek Sollenberger#include "CacheManager.h" 24ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck#include "TimeLord.h" 25e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 2698f75d53dbe243b1661c616643698e025d4978f6Derek Sollenberger#include <GrContext.h> 27cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#include <cutils/compiler.h> 287bc3bc6028d0c7b16fec72c3922fc627c8657951Stan Iliev#include <SkBitmap.h> 29b36016c65f1d1b5846dba0349aab491dbd3a746aJohn Reck#include <ui/DisplayInfo.h> 30cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#include <utils/Looper.h> 31cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#include <utils/Thread.h> 32cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 33ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck#include <memory> 34ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck#include <set> 3518f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck 36cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Recknamespace android { 373b20251a355c88193c439f928a84ae69483fb488John Reck 387bc3bc6028d0c7b16fec72c3922fc627c8657951Stan Ilievclass Bitmap; 39e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckclass DisplayEventReceiver; 40e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 41cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Recknamespace uirenderer { 423b20251a355c88193c439f928a84ae69483fb488John Reck 43c4fbada76aa840105553b2c2bce2204e673d2983Derek Sollenbergerclass Readback; 443b20251a355c88193c439f928a84ae69483fb488John Reckclass RenderState; 450a24b146cd3dacf372ce98424044423a5b2fbf2aChris Craikclass TestUtils; 463b20251a355c88193c439f928a84ae69483fb488John Reck 47cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Recknamespace renderthread { 48cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 49443a714fa7c0dd07fee3527cc5bc3d3ca1fb7d44John Reckclass CanvasContext; 50e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckclass DispatchFrameCallbacks; 513b20251a355c88193c439f928a84ae69483fb488John Reckclass EglManager; 523b20251a355c88193c439f928a84ae69483fb488John Reckclass RenderProxy; 530e3cba31460e0698def0310003b7d291f1174afaDerek Sollenbergerclass VulkanManager; 54e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 554f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckclass TaskQueue { 564f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckpublic: 574f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck TaskQueue(); 584f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 594f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck RenderTask* next(); 604f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck void queue(RenderTask* task); 61a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck void queueAtFront(RenderTask* task); 624f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck RenderTask* peek(); 634f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck void remove(RenderTask* task); 644f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 654f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckprivate: 664f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck RenderTask* mHead; 674f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck RenderTask* mTail; 684f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck}; 694f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 70e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck// Mimics android.view.Choreographer.FrameCallback 71e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckclass IFrameCallback { 72e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckpublic: 7318f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck virtual void doFrame() = 0; 74e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 75e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckprotected: 76e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck ~IFrameCallback() {} 77e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck}; 78e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 796b50780363d3bb8db600c770183fa07677509ae8John Reckclass ANDROID_API RenderThread : public Thread { 80df1742ed47da1e9b61afeae16fa448d5302a8aa0John Reck PREVENT_COPY_AND_ASSIGN(RenderThread); 81cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckpublic: 82cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck // RenderThread takes complete ownership of tasks that are queued 83cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck // and will delete them after they are run 84cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck ANDROID_API void queue(RenderTask* task); 850a24b146cd3dacf372ce98424044423a5b2fbf2aChris Craik ANDROID_API void queueAndWait(RenderTask* task); 86a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck ANDROID_API void queueAtFront(RenderTask* task); 87a733f89c05567c97359169832f41389b939baaadJohn Reck void queueAt(RenderTask* task, nsecs_t runAtNs); 884f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck void remove(RenderTask* task); 89cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 90e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck // Mimics android.view.Choreographer 91e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck void postFrameCallback(IFrameCallback* callback); 9201a5ea35fbba4c5bb1d7790ae1677a2fa752e042John Reck bool removeFrameCallback(IFrameCallback* callback); 93a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck // If the callback is currently registered, it will be pushed back until 94a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck // the next vsync. If it is not currently registered this does nothing. 95a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck void pushBackFrameCallback(IFrameCallback* callback); 96e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 9718f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck TimeLord& timeLord() { return mTimeLord; } 98daf7229047c44947b9b02ee187fe5b13f30ebd4bDerek Sollenberger RenderState& renderState() const { return *mRenderState; } 99daf7229047c44947b9b02ee187fe5b13f30ebd4bDerek Sollenberger EglManager& eglManager() const { return *mEglManager; } 10034781b253083703502a7874df3619196bc7106cdJohn Reck ProfileDataContainer& globalProfileData() { return mGlobalProfileData; } 101c4fbada76aa840105553b2c2bce2204e673d2983Derek Sollenberger Readback& readback(); 10218f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck 103b36016c65f1d1b5846dba0349aab491dbd3a746aJohn Reck const DisplayInfo& mainDisplayInfo() { return mDisplayInfo; } 104b36016c65f1d1b5846dba0349aab491dbd3a746aJohn Reck 10598f75d53dbe243b1661c616643698e025d4978f6Derek Sollenberger GrContext* getGrContext() const { return mGrContext.get(); } 106f9e45d1d818ae0956ba77ed598b7040cfecca553Derek Sollenberger void setGrContext(GrContext* cxt); 10798f75d53dbe243b1661c616643698e025d4978f6Derek Sollenberger 108f9e45d1d818ae0956ba77ed598b7040cfecca553Derek Sollenberger CacheManager& cacheManager() { return *mCacheManager; } 1090e3cba31460e0698def0310003b7d291f1174afaDerek Sollenberger VulkanManager& vulkanManager() { return *mVkManager; } 1100e3cba31460e0698def0310003b7d291f1174afaDerek Sollenberger 1117bc3bc6028d0c7b16fec72c3922fc627c8657951Stan Iliev sk_sp<Bitmap> allocateHardwareBitmap(SkBitmap& skBitmap); 112f9e45d1d818ae0956ba77ed598b7040cfecca553Derek Sollenberger void dumpGraphicsMemory(int fd); 1137bc3bc6028d0c7b16fec72c3922fc627c8657951Stan Iliev 114cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckprotected: 115d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik virtual bool threadLoop() override; 116cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 117cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reckprivate: 118e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck friend class DispatchFrameCallbacks; 1193b20251a355c88193c439f928a84ae69483fb488John Reck friend class RenderProxy; 1200a24b146cd3dacf372ce98424044423a5b2fbf2aChris Craik friend class android::uirenderer::TestUtils; 121cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 122cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck RenderThread(); 123cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck virtual ~RenderThread(); 124cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 1256b50780363d3bb8db600c770183fa07677509ae8John Reck static bool hasInstance(); 1266b50780363d3bb8db600c770183fa07677509ae8John Reck static RenderThread& getInstance(); 1276b50780363d3bb8db600c770183fa07677509ae8John Reck 1283b20251a355c88193c439f928a84ae69483fb488John Reck void initThreadLocals(); 129e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck void initializeDisplayEventReceiver(); 130e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck static int displayEventReceiverCallback(int fd, int events, void* data); 131a733f89c05567c97359169832f41389b939baaadJohn Reck void drainDisplayEventQueue(); 132e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck void dispatchFrameCallbacks(); 133a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck void requestVsync(); 134e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 1354f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck // Returns the next task to be run. If this returns NULL nextWakeup is set 1364f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck // to the time to requery for the nextTask to run. mNextWakeup is also 1374f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck // set to this time 1384f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck RenderTask* nextTask(nsecs_t* nextWakeup); 139cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 140cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck sp<Looper> mLooper; 141cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck Mutex mLock; 142cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 1434f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck nsecs_t mNextWakeup; 1444f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck TaskQueue mQueue; 145e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 146b36016c65f1d1b5846dba0349aab491dbd3a746aJohn Reck DisplayInfo mDisplayInfo; 147b36016c65f1d1b5846dba0349aab491dbd3a746aJohn Reck 148e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck DisplayEventReceiver* mDisplayEventReceiver; 149e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck bool mVsyncRequested; 150e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck std::set<IFrameCallback*> mFrameCallbacks; 151a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck // We defer the actual registration of these callbacks until 152a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck // both mQueue *and* mDisplayEventReceiver have been drained off all 153a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck // immediate events. This makes sure that we catch the next vsync, not 154a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck // the previous one 155a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck std::set<IFrameCallback*> mPendingRegistrationFrameCallbacks; 156e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck bool mFrameCallbackTaskPending; 157e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck DispatchFrameCallbacks* mFrameCallbackTask; 15818f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck 15918f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck TimeLord mTimeLord; 1603b20251a355c88193c439f928a84ae69483fb488John Reck RenderState* mRenderState; 1613b20251a355c88193c439f928a84ae69483fb488John Reck EglManager* mEglManager; 162ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck 16334781b253083703502a7874df3619196bc7106cdJohn Reck ProfileDataContainer mGlobalProfileData; 164c4fbada76aa840105553b2c2bce2204e673d2983Derek Sollenberger Readback* mReadback = nullptr; 16598f75d53dbe243b1661c616643698e025d4978f6Derek Sollenberger 16698f75d53dbe243b1661c616643698e025d4978f6Derek Sollenberger sk_sp<GrContext> mGrContext; 167f9e45d1d818ae0956ba77ed598b7040cfecca553Derek Sollenberger CacheManager* mCacheManager; 1680e3cba31460e0698def0310003b7d291f1174afaDerek Sollenberger VulkanManager* mVkManager; 169cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck}; 170cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck 171cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck} /* namespace renderthread */ 172cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck} /* namespace uirenderer */ 173cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck} /* namespace android */ 174cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fcJohn Reck#endif /* RENDERTHREAD_H_ */ 175