DrawFrameTask.h revision d72e0a339b54af0c4e731513bbad120dff694723
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
19d72e0a339b54af0c4e731513bbad120dff694723John Reck#include <vector>
20d72e0a339b54af0c4e731513bbad120dff694723John Reck
21668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck#include <utils/Condition.h>
22668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck#include <utils/Mutex.h>
23087bc0c14bdccf7c258dce0cdef46a69a839b427John Reck#include <utils/StrongPointer.h>
24668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck
25668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck#include "RenderTask.h"
26668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck
27668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck#include "../Rect.h"
28a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck#include "../TreeInfo.h"
29668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck
30668f0e38ef0277d55d3118af37e17b8c435df85cJohn Recknamespace android {
31668f0e38ef0277d55d3118af37e17b8c435df85cJohn Recknamespace uirenderer {
32668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck
33668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reckclass DeferredLayerUpdater;
34668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reckclass DisplayListData;
35668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reckclass RenderNode;
36668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck
37668f0e38ef0277d55d3118af37e17b8c435df85cJohn Recknamespace renderthread {
38668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck
39668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reckclass CanvasContext;
40668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reckclass RenderThread;
41668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck
42f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reckenum SyncResult {
43f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck    kSync_OK = 0,
44f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck    kSync_UIRedrawRequired = 1 << 1,
45f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck};
46f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck
47668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck/*
48668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck * This is a special Super Task. It is re-used multiple times by RenderProxy,
49668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck * and contains state (such as layer updaters & new DisplayListDatas) that is
50668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck * tracked across many frames not just a single frame.
51668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck * It is the sync-state task, and will kick off the post-sync draw
52668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck */
53668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reckclass DrawFrameTask : public RenderTask {
54668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reckpublic:
55668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck    DrawFrameTask();
56668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck    virtual ~DrawFrameTask();
57668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck
5818f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck    void setContext(RenderThread* thread, CanvasContext* context);
59668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck
60d72e0a339b54af0c4e731513bbad120dff694723John Reck    void pushLayerUpdate(DeferredLayerUpdater* layer);
61d72e0a339b54af0c4e731513bbad120dff694723John Reck    void removeLayerUpdate(DeferredLayerUpdater* layer);
62668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck
63668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck    void setDirty(int left, int top, int right, int bottom);
64fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck    void setDensity(float density) { mDensity = density; }
65fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck    int drawFrame(nsecs_t frameTimeNanos, nsecs_t recordDurationNanos);
66668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck
67668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck    virtual void run();
68668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck
69668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reckprivate:
7018f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck    void postAndWait();
71a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck    bool syncFrameState(TreeInfo& info);
72668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck    void unblockUiThread();
73668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck
74668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck    Mutex mLock;
75668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck    Condition mSignal;
76668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck
7718f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck    RenderThread* mRenderThread;
78668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck    CanvasContext* mContext;
79668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck
80668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck    /*********************************************
81668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck     *  Single frame data
82668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck     *********************************************/
83668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck    Rect mDirty;
8418f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck    nsecs_t mFrameTimeNanos;
85fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck    nsecs_t mRecordDurationNanos;
86fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck    float mDensity;
87d72e0a339b54af0c4e731513bbad120dff694723John Reck    std::vector< sp<DeferredLayerUpdater> > mLayers;
88668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck
89f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck    int mSyncResult;
90668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck};
91668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck
92668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck} /* namespace renderthread */
93668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck} /* namespace uirenderer */
94668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck} /* namespace android */
95668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck
96668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck#endif /* DRAWFRAMETASK_H */
97