DrawFrameTask.h revision 51f2d606dcbfba3cc5b03dfea37c1304b91c232f
127c174483a8ae9688d5d4897c19074f62c7f1701James Dong/*
227c174483a8ae9688d5d4897c19074f62c7f1701James Dong * Copyright (C) 2014 The Android Open Source Project
327c174483a8ae9688d5d4897c19074f62c7f1701James Dong *
427c174483a8ae9688d5d4897c19074f62c7f1701James Dong * Licensed under the Apache License, Version 2.0 (the "License");
527c174483a8ae9688d5d4897c19074f62c7f1701James Dong * you may not use this file except in compliance with the License.
627c174483a8ae9688d5d4897c19074f62c7f1701James Dong * You may obtain a copy of the License at
727c174483a8ae9688d5d4897c19074f62c7f1701James Dong *
827c174483a8ae9688d5d4897c19074f62c7f1701James Dong *      http://www.apache.org/licenses/LICENSE-2.0
927c174483a8ae9688d5d4897c19074f62c7f1701James Dong *
1027c174483a8ae9688d5d4897c19074f62c7f1701James Dong * Unless required by applicable law or agreed to in writing, software
1127c174483a8ae9688d5d4897c19074f62c7f1701James Dong * distributed under the License is distributed on an "AS IS" BASIS,
1227c174483a8ae9688d5d4897c19074f62c7f1701James Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1327c174483a8ae9688d5d4897c19074f62c7f1701James Dong * See the License for the specific language governing permissions and
1427c174483a8ae9688d5d4897c19074f62c7f1701James Dong * limitations under the License.
1527c174483a8ae9688d5d4897c19074f62c7f1701James Dong */
1627c174483a8ae9688d5d4897c19074f62c7f1701James Dong#ifndef DRAWFRAMETASK_H
17f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#define DRAWFRAMETASK_H
18f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
19f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <vector>
20f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
21f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <utils/Condition.h>
22f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <utils/Mutex.h>
23f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <utils/StrongPointer.h>
24f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
25f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "RenderTask.h"
26f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
27f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "../Rect.h"
28f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "../FrameInfo.h"
297cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden#include "../TreeInfo.h"
30afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber
31f933441648ef6a71dee783d733aac17b9508b452Andreas Hubernamespace android {
321173118eace0e9e347cb007f0da817cee87579edGlenn Kastennamespace uirenderer {
33f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
341065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huberclass DeferredLayerUpdater;
35f933441648ef6a71dee783d733aac17b9508b452Andreas Huberclass DisplayList;
363a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huberclass RenderNode;
373a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber
3897358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryunamespace renderthread {
39f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
4097358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryuclass CanvasContext;
41f933441648ef6a71dee783d733aac17b9508b452Andreas Huberclass RenderThread;
42496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber
43496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huberenum SyncResult {
44f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    kSync_OK = 0,
45f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    kSync_UIRedrawRequired = 1 << 0,
46f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    kSync_LostSurfaceRewardIfFound = 1 << 1,
47f933441648ef6a71dee783d733aac17b9508b452Andreas Huber};
48f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
49f933441648ef6a71dee783d733aac17b9508b452Andreas Huber/*
50f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * This is a special Super Task. It is re-used multiple times by RenderProxy,
51f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * and contains state (such as layer updaters & new DisplayLists) that is
52f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * tracked across many frames not just a single frame.
53f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * It is the sync-state task, and will kick off the post-sync draw
54f933441648ef6a71dee783d733aac17b9508b452Andreas Huber */
55f933441648ef6a71dee783d733aac17b9508b452Andreas Huberclass DrawFrameTask : public RenderTask {
56f933441648ef6a71dee783d733aac17b9508b452Andreas Huberpublic:
57f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    DrawFrameTask();
58f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    virtual ~DrawFrameTask();
59f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
60f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    void setContext(RenderThread* thread, CanvasContext* context, RenderNode* targetNode);
61f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
62f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    void pushLayerUpdate(DeferredLayerUpdater* layer);
63f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    void removeLayerUpdate(DeferredLayerUpdater* layer);
64f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
65f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    int drawFrame(TreeObserver* observer);
66f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
67f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    int64_t* frameInfo() { return mFrameInfo; }
68f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
69f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    virtual void run() override;
70f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
71f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate:
72f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    void postAndWait();
73f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    bool syncFrameState(TreeInfo& info);
74f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    void unblockUiThread();
75f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
76f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    Mutex mLock;
77f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    Condition mSignal;
78f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
79f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    RenderThread* mRenderThread;
80f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CanvasContext* mContext;
81f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    RenderNode* mTargetNode = nullptr;
82f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
83f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    /*********************************************
84f933441648ef6a71dee783d733aac17b9508b452Andreas Huber     *  Single frame data
85f933441648ef6a71dee783d733aac17b9508b452Andreas Huber     *********************************************/
86f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    std::vector< sp<DeferredLayerUpdater> > mLayers;
87f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
88f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    int mSyncResult;
89f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    int64_t mSyncQueued;
90f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    TreeObserver* mObserver;
91f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
92f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    int64_t mFrameInfo[UI_THREAD_FRAME_INFO_SIZE];
93f933441648ef6a71dee783d733aac17b9508b452Andreas Huber};
94f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
95f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} /* namespace renderthread */
96f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} /* namespace uirenderer */
97f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} /* namespace android */
98f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
99f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#endif /* DRAWFRAMETASK_H */
100f933441648ef6a71dee783d733aac17b9508b452Andreas Huber