• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2013 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 
17 #ifndef RENDERPROXY_H_
18 #define RENDERPROXY_H_
19 
20 #include "RenderTask.h"
21 
22 #include <cutils/compiler.h>
23 #include <EGL/egl.h>
24 #include <SkBitmap.h>
25 #include <utils/Condition.h>
26 #include <utils/Functor.h>
27 #include <utils/Mutex.h>
28 #include <utils/Timers.h>
29 #include <utils/StrongPointer.h>
30 
31 #include "../Caches.h"
32 #include "../FrameMetricsObserver.h"
33 #include "../IContextFactory.h"
34 #include "CanvasContext.h"
35 #include "DrawFrameTask.h"
36 
37 namespace android {
38 class GraphicBuffer;
39 
40 namespace uirenderer {
41 
42 class DeferredLayerUpdater;
43 class RenderNode;
44 class DisplayList;
45 class Layer;
46 class Rect;
47 
48 namespace renderthread {
49 
50 class ErrorChannel;
51 class RenderThread;
52 class RenderProxyBridge;
53 
54 namespace DumpFlags {
55     enum {
56         FrameStats = 1 << 0,
57         Reset      = 1 << 1,
58         JankStats  = 1 << 2,
59     };
60 };
61 
62 /*
63  * RenderProxy is strictly single threaded. All methods must be invoked on the owning
64  * thread. It is important to note that RenderProxy may be deleted while it has
65  * tasks post()'d as a result. Therefore any RenderTask that is post()'d must not
66  * reference RenderProxy or any of its fields. The exception here is that postAndWait()
67  * references RenderProxy fields. This is safe as RenderProxy cannot
68  * be deleted if it is blocked inside a call.
69  */
70 class ANDROID_API RenderProxy {
71 public:
72     ANDROID_API RenderProxy(bool opaque, RenderNode* rootNode, IContextFactory* contextFactory);
73     ANDROID_API virtual ~RenderProxy();
74 
75     // Won't take effect until next EGLSurface creation
76     ANDROID_API void setSwapBehavior(SwapBehavior swapBehavior);
77     ANDROID_API bool loadSystemProperties();
78     ANDROID_API void setName(const char* name);
79 
80     ANDROID_API void initialize(const sp<Surface>& surface);
81     ANDROID_API void updateSurface(const sp<Surface>& surface);
82     ANDROID_API bool pauseSurface(const sp<Surface>& surface);
83     ANDROID_API void setStopped(bool stopped);
84     ANDROID_API void setup(float lightRadius,
85             uint8_t ambientShadowAlpha, uint8_t spotShadowAlpha);
86     ANDROID_API void setLightCenter(const Vector3& lightCenter);
87     ANDROID_API void setOpaque(bool opaque);
88     ANDROID_API void setWideGamut(bool wideGamut);
89     ANDROID_API int64_t* frameInfo();
90     ANDROID_API int syncAndDrawFrame();
91     ANDROID_API void destroy();
92 
93     ANDROID_API static void invokeFunctor(Functor* functor, bool waitForCompletion);
94 
95     ANDROID_API DeferredLayerUpdater* createTextureLayer();
96     ANDROID_API void buildLayer(RenderNode* node);
97     ANDROID_API bool copyLayerInto(DeferredLayerUpdater* layer, SkBitmap& bitmap);
98     ANDROID_API void pushLayerUpdate(DeferredLayerUpdater* layer);
99     ANDROID_API void cancelLayerUpdate(DeferredLayerUpdater* layer);
100     ANDROID_API void detachSurfaceTexture(DeferredLayerUpdater* layer);
101 
102     ANDROID_API void destroyHardwareResources();
103     ANDROID_API static void trimMemory(int level);
104     ANDROID_API static void overrideProperty(const char* name, const char* value);
105 
106     ANDROID_API void fence();
107     ANDROID_API static void staticFence();
108     ANDROID_API void stopDrawing();
109     ANDROID_API void notifyFramePending();
110 
111     ANDROID_API void dumpProfileInfo(int fd, int dumpFlags);
112     // Not exported, only used for testing
113     void resetProfileInfo();
114     uint32_t frameTimePercentile(int p);
115     ANDROID_API static void dumpGraphicsMemory(int fd);
116 
117     ANDROID_API static void rotateProcessStatsBuffer();
118     ANDROID_API static void setProcessStatsBuffer(int fd);
119     ANDROID_API int getRenderThreadTid();
120 
121     ANDROID_API void serializeDisplayListTree();
122 
123     ANDROID_API void addRenderNode(RenderNode* node, bool placeFront);
124     ANDROID_API void removeRenderNode(RenderNode* node);
125     ANDROID_API void drawRenderNode(RenderNode* node);
126     ANDROID_API void setContentDrawBounds(int left, int top, int right, int bottom);
127 
128     ANDROID_API void addFrameMetricsObserver(FrameMetricsObserver* observer);
129     ANDROID_API void removeFrameMetricsObserver(FrameMetricsObserver* observer);
130     ANDROID_API long getDroppedFrameReportCount();
131 
132     ANDROID_API static int copySurfaceInto(sp<Surface>& surface,
133             int left, int top, int right, int bottom, SkBitmap* bitmap);
134     ANDROID_API static void prepareToDraw(Bitmap& bitmap);
135 
136     static sk_sp<Bitmap> allocateHardwareBitmap(SkBitmap& bitmap);
137 
138     static int copyGraphicBufferInto(GraphicBuffer* buffer, SkBitmap* bitmap);
139 
140     static void onBitmapDestroyed(uint32_t pixelRefId);
141 
142     ANDROID_API static void disableVsync();
143 
144     static void repackVectorDrawableAtlas();
145 
146 private:
147     RenderThread& mRenderThread;
148     CanvasContext* mContext;
149 
150     DrawFrameTask mDrawFrameTask;
151 
152     Mutex mSyncMutex;
153     Condition mSyncCondition;
154 
155     void destroyContext();
156 
157     void post(RenderTask* task);
158     void* postAndWait(MethodInvokeRenderTask* task);
159 
160     static void* staticPostAndWait(MethodInvokeRenderTask* task);
161 
162     // Friend class to help with bridging
163     friend class RenderProxyBridge;
164 };
165 
166 } /* namespace renderthread */
167 } /* namespace uirenderer */
168 } /* namespace android */
169 #endif /* RENDERPROXY_H_ */
170