DrawFrameTask.h revision 668f0e38ef0277d55d3118af37e17b8c435df85c
1668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck/*
2668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck * Copyright (C) 2014 The Android Open Source Project
3668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck *
4668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck * Licensed under the Apache License, Version 2.0 (the "License");
5668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck * you may not use this file except in compliance with the License.
6668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck * You may obtain a copy of the License at
7668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck *
8668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck *      http://www.apache.org/licenses/LICENSE-2.0
9668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck *
10668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck * Unless required by applicable law or agreed to in writing, software
11668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck * distributed under the License is distributed on an "AS IS" BASIS,
12668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck * See the License for the specific language governing permissions and
14668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck * limitations under the License.
15668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck */
16668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck#ifndef DRAWFRAMETASK_H
17668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck#define DRAWFRAMETASK_H
18668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck
19668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck#include <utils/Condition.h>
20668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck#include <utils/Mutex.h>
21668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck#include <utils/Vector.h>
22668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck
23668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck#include "RenderTask.h"
24668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck
25668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck#include "../Rect.h"
26668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck
27668f0e38ef0277d55d3118af37e17b8c435df85cJohn Recknamespace android {
28668f0e38ef0277d55d3118af37e17b8c435df85cJohn Recknamespace uirenderer {
29668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck
30668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reckclass DeferredLayerUpdater;
31668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reckclass DisplayListData;
32668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reckclass RenderNode;
33668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck
34668f0e38ef0277d55d3118af37e17b8c435df85cJohn Recknamespace renderthread {
35668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck
36668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reckclass CanvasContext;
37668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reckclass RenderThread;
38668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck
39668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reckstruct SetDisplayListData {
40668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck    RenderNode* targetNode;
41668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck    DisplayListData* newData;
42668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck};
43668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck
44668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck/*
45668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck * This is a special Super Task. It is re-used multiple times by RenderProxy,
46668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck * and contains state (such as layer updaters & new DisplayListDatas) that is
47668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck * tracked across many frames not just a single frame.
48668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck * It is the sync-state task, and will kick off the post-sync draw
49668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck */
50668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reckclass DrawFrameTask : public RenderTask {
51668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reckpublic:
52668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck    DrawFrameTask();
53668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck    virtual ~DrawFrameTask();
54668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck
55668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck    void setContext(CanvasContext* context);
56668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck
57668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck    void setDisplayListData(RenderNode* renderNode, DisplayListData* newData);
58668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck    void addLayer(DeferredLayerUpdater* layer);
59668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck    void removeLayer(DeferredLayerUpdater* layer);
60668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck
61668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck    void setRenderNode(RenderNode* renderNode);
62668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck    void setDirty(int left, int top, int right, int bottom);
63668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck    void drawFrame(RenderThread* renderThread);
64668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck
65668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck    virtual void run();
66668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck
67668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reckprivate:
68668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck    void syncFrameState();
69668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck    void unblockUiThread();
70668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck    static void drawRenderNode(CanvasContext* context, RenderNode* renderNode, Rect* dirty);
71668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck
72668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck    // This checks to see if there are any drawGlFunctors which would require
73668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck    // a synchronous drawRenderNode()
74668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck    static bool requiresSynchronousDraw(RenderNode* renderNode);
75668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck
76668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck    Mutex mLock;
77668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck    Condition mSignal;
78668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck
79668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck    CanvasContext* mContext;
80668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck
81668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck    /*********************************************
82668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck     *  Single frame data
83668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck     *********************************************/
84668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck    RenderNode* mRenderNode;
85668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck    Rect mDirty;
86668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck    Vector<SetDisplayListData> mDisplayListDataUpdates;
87668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck
88668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck    /*********************************************
89668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck     *  Multi frame data
90668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck     *********************************************/
91668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck    Vector<DeferredLayerUpdater*> mLayers;
92668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck};
93668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck
94668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck} /* namespace renderthread */
95668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck} /* namespace uirenderer */
96668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck} /* namespace android */
97668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck
98668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck#endif /* DRAWFRAMETASK_H */
99