• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2014 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 #ifndef DRAWFRAMETASK_H
17 #define DRAWFRAMETASK_H
18 
19 #include <vector>
20 
21 #include <utils/Condition.h>
22 #include <utils/Mutex.h>
23 #include <utils/StrongPointer.h>
24 
25 #include "RenderTask.h"
26 
27 #include "../Rect.h"
28 #include "../TreeInfo.h"
29 
30 namespace android {
31 namespace uirenderer {
32 
33 class DeferredLayerUpdater;
34 class DisplayListData;
35 class RenderNode;
36 
37 namespace renderthread {
38 
39 class CanvasContext;
40 class RenderThread;
41 
42 enum SyncResult {
43     kSync_OK = 0,
44     kSync_UIRedrawRequired = 1 << 0,
45 };
46 
47 /*
48  * This is a special Super Task. It is re-used multiple times by RenderProxy,
49  * and contains state (such as layer updaters & new DisplayListDatas) that is
50  * tracked across many frames not just a single frame.
51  * It is the sync-state task, and will kick off the post-sync draw
52  */
53 class DrawFrameTask : public RenderTask {
54 public:
55     DrawFrameTask();
56     virtual ~DrawFrameTask();
57 
58     void setContext(RenderThread* thread, CanvasContext* context);
59 
60     void pushLayerUpdate(DeferredLayerUpdater* layer);
61     void removeLayerUpdate(DeferredLayerUpdater* layer);
62 
setDensity(float density)63     void setDensity(float density) { mDensity = density; }
64     int drawFrame(nsecs_t frameTimeNanos, nsecs_t recordDurationNanos);
65 
66     virtual void run();
67 
68 private:
69     void postAndWait();
70     bool syncFrameState(TreeInfo& info);
71     void unblockUiThread();
72 
73     Mutex mLock;
74     Condition mSignal;
75 
76     RenderThread* mRenderThread;
77     CanvasContext* mContext;
78 
79     /*********************************************
80      *  Single frame data
81      *********************************************/
82     nsecs_t mFrameTimeNanos;
83     nsecs_t mRecordDurationNanos;
84     float mDensity;
85     std::vector< sp<DeferredLayerUpdater> > mLayers;
86 
87     int mSyncResult;
88 };
89 
90 } /* namespace renderthread */
91 } /* namespace uirenderer */
92 } /* namespace android */
93 
94 #endif /* DRAWFRAMETASK_H */
95