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