• 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     kSync_LostSurfaceRewardIfFound = 1 << 1,
46 };
47 
48 /*
49  * This is a special Super Task. It is re-used multiple times by RenderProxy,
50  * and contains state (such as layer updaters & new DisplayListDatas) that is
51  * tracked across many frames not just a single frame.
52  * It is the sync-state task, and will kick off the post-sync draw
53  */
54 class DrawFrameTask : public RenderTask {
55 public:
56     DrawFrameTask();
57     virtual ~DrawFrameTask();
58 
59     void setContext(RenderThread* thread, CanvasContext* context);
60 
61     void pushLayerUpdate(DeferredLayerUpdater* layer);
62     void removeLayerUpdate(DeferredLayerUpdater* layer);
63 
setDensity(float density)64     void setDensity(float density) { mDensity = density; }
65     int drawFrame(nsecs_t frameTimeNanos, nsecs_t recordDurationNanos);
66 
67     virtual void run();
68 
69 private:
70     void postAndWait();
71     bool syncFrameState(TreeInfo& info);
72     void unblockUiThread();
73 
74     Mutex mLock;
75     Condition mSignal;
76 
77     RenderThread* mRenderThread;
78     CanvasContext* mContext;
79 
80     /*********************************************
81      *  Single frame data
82      *********************************************/
83     nsecs_t mFrameTimeNanos;
84     nsecs_t mRecordDurationNanos;
85     float mDensity;
86     std::vector< sp<DeferredLayerUpdater> > mLayers;
87 
88     int mSyncResult;
89 };
90 
91 } /* namespace renderthread */
92 } /* namespace uirenderer */
93 } /* namespace android */
94 
95 #endif /* DRAWFRAMETASK_H */
96