• 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 #include <utils/Vector.h>
31 
32 #include "../Caches.h"
33 #include "../IContextFactory.h"
34 #include "CanvasContext.h"
35 #include "DrawFrameTask.h"
36 
37 namespace android {
38 namespace uirenderer {
39 
40 class DeferredLayerUpdater;
41 class RenderNode;
42 class DisplayListData;
43 class Layer;
44 class Rect;
45 
46 namespace renderthread {
47 
48 class ErrorChannel;
49 class RenderThread;
50 class RenderProxyBridge;
51 
52 /*
53  * RenderProxy is strictly single threaded. All methods must be invoked on the owning
54  * thread. It is important to note that RenderProxy may be deleted while it has
55  * tasks post()'d as a result. Therefore any RenderTask that is post()'d must not
56  * reference RenderProxy or any of its fields. The exception here is that postAndWait()
57  * references RenderProxy fields. This is safe as RenderProxy cannot
58  * be deleted if it is blocked inside a call.
59  */
60 class ANDROID_API RenderProxy {
61 public:
62     ANDROID_API RenderProxy(bool translucent, RenderNode* rootNode, IContextFactory* contextFactory);
63     ANDROID_API virtual ~RenderProxy();
64 
65     ANDROID_API void setFrameInterval(nsecs_t frameIntervalNanos);
66     // Won't take effect until next EGLSurface creation
67     ANDROID_API void setSwapBehavior(SwapBehavior swapBehavior);
68     ANDROID_API bool loadSystemProperties();
69 
70     ANDROID_API bool initialize(const sp<ANativeWindow>& window);
71     ANDROID_API void updateSurface(const sp<ANativeWindow>& window);
72     ANDROID_API bool pauseSurface(const sp<ANativeWindow>& window);
73     ANDROID_API void setup(int width, int height, const Vector3& lightCenter, float lightRadius,
74             uint8_t ambientShadowAlpha, uint8_t spotShadowAlpha);
75     ANDROID_API void setOpaque(bool opaque);
76     ANDROID_API int syncAndDrawFrame(nsecs_t frameTimeNanos, nsecs_t recordDurationNanos,
77             float density);
78     ANDROID_API void destroy();
79 
80     ANDROID_API static void invokeFunctor(Functor* functor, bool waitForCompletion);
81 
82     ANDROID_API void runWithGlContext(RenderTask* task);
83 
84     ANDROID_API DeferredLayerUpdater* createTextureLayer();
85     ANDROID_API void buildLayer(RenderNode* node);
86     ANDROID_API bool copyLayerInto(DeferredLayerUpdater* layer, SkBitmap* bitmap);
87     ANDROID_API void pushLayerUpdate(DeferredLayerUpdater* layer);
88     ANDROID_API void cancelLayerUpdate(DeferredLayerUpdater* layer);
89     ANDROID_API void detachSurfaceTexture(DeferredLayerUpdater* layer);
90 
91     ANDROID_API void destroyHardwareResources();
92     ANDROID_API static void trimMemory(int level);
93 
94     ANDROID_API void fence();
95     ANDROID_API void stopDrawing();
96     ANDROID_API void notifyFramePending();
97 
98     ANDROID_API void dumpProfileInfo(int fd);
99     ANDROID_API static void outputLogBuffer(int fd);
100 
101     ANDROID_API void setTextureAtlas(const sp<GraphicBuffer>& buffer, int64_t* map, size_t size);
102 
103 private:
104     RenderThread& mRenderThread;
105     CanvasContext* mContext;
106 
107     DrawFrameTask mDrawFrameTask;
108 
109     Mutex mSyncMutex;
110     Condition mSyncCondition;
111 
112     void destroyContext();
113 
114     void post(RenderTask* task);
115     void* postAndWait(MethodInvokeRenderTask* task);
116 
117     static void* staticPostAndWait(MethodInvokeRenderTask* task);
118 
119     // Friend class to help with bridging
120     friend class RenderProxyBridge;
121 };
122 
123 } /* namespace renderthread */
124 } /* namespace uirenderer */
125 } /* namespace android */
126 #endif /* RENDERPROXY_H_ */
127