14f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck/*
24f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck * Copyright (C) 2013 The Android Open Source Project
34f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck *
44f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck * Licensed under the Apache License, Version 2.0 (the "License");
54f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck * you may not use this file except in compliance with the License.
64f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck * You may obtain a copy of the License at
74f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck *
84f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck *      http://www.apache.org/licenses/LICENSE-2.0
94f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck *
104f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck * Unless required by applicable law or agreed to in writing, software
114f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck * distributed under the License is distributed on an "AS IS" BASIS,
124f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck * See the License for the specific language governing permissions and
144f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck * limitations under the License.
154f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck */
164f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
174f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#ifndef RENDERPROXY_H_
184f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#define RENDERPROXY_H_
194f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
204f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#include "RenderTask.h"
214f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
224f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#include <cutils/compiler.h>
234f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#include <EGL/egl.h>
2419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck#include <SkBitmap.h>
254f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#include <utils/Condition.h>
264f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#include <utils/Functor.h>
274f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#include <utils/Mutex.h>
2818f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck#include <utils/Timers.h>
294f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#include <utils/StrongPointer.h>
304f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
31e1628b7c6fc3822fa83cf02028ce8ad67abb0afeJohn Reck#include "../Caches.h"
32910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales#include "../FrameMetricsObserver.h"
33119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck#include "../IContextFactory.h"
341125d1fa92ab9f3b8315bbfb72e038b62dfd454bJohn Reck#include "CanvasContext.h"
35668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck#include "DrawFrameTask.h"
36668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck
374f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Recknamespace android {
384f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Recknamespace uirenderer {
394f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
4019b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reckclass DeferredLayerUpdater;
41e18264b079481a244b30e3f71012c53bbd861f92John Reckclass RenderNode;
42003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craikclass DisplayList;
4319b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reckclass Layer;
444f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckclass Rect;
4551f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reckclass TreeObserver;
464f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
474f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Recknamespace renderthread {
484f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
494f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckclass ErrorChannel;
504f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckclass RenderThread;
514f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckclass RenderProxyBridge;
524f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
53a41f2445156fe0bcfde6bd4d813dfc43796a526dJohn Recknamespace DumpFlags {
54a41f2445156fe0bcfde6bd4d813dfc43796a526dJohn Reck    enum {
55a41f2445156fe0bcfde6bd4d813dfc43796a526dJohn Reck        FrameStats = 1 << 0,
56a41f2445156fe0bcfde6bd4d813dfc43796a526dJohn Reck        Reset      = 1 << 1,
57a41f2445156fe0bcfde6bd4d813dfc43796a526dJohn Reck        JankStats  = 1 << 2,
58a41f2445156fe0bcfde6bd4d813dfc43796a526dJohn Reck    };
59a41f2445156fe0bcfde6bd4d813dfc43796a526dJohn Reck};
60a41f2445156fe0bcfde6bd4d813dfc43796a526dJohn Reck
614f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck/*
624f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck * RenderProxy is strictly single threaded. All methods must be invoked on the owning
634f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck * thread. It is important to note that RenderProxy may be deleted while it has
644f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck * tasks post()'d as a result. Therefore any RenderTask that is post()'d must not
654f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck * reference RenderProxy or any of its fields. The exception here is that postAndWait()
664f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck * references RenderProxy fields. This is safe as RenderProxy cannot
674f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck * be deleted if it is blocked inside a call.
684f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck */
694f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckclass ANDROID_API RenderProxy {
704f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckpublic:
71119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    ANDROID_API RenderProxy(bool translucent, RenderNode* rootNode, IContextFactory* contextFactory);
724f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    ANDROID_API virtual ~RenderProxy();
734f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
741125d1fa92ab9f3b8315bbfb72e038b62dfd454bJohn Reck    // Won't take effect until next EGLSurface creation
751125d1fa92ab9f3b8315bbfb72e038b62dfd454bJohn Reck    ANDROID_API void setSwapBehavior(SwapBehavior swapBehavior);
76e4280baaa709c74d86cf6a389a4674ca665f5af6John Reck    ANDROID_API bool loadSystemProperties();
77b36016c65f1d1b5846dba0349aab491dbd3a746aJohn Reck    ANDROID_API void setName(const char* name);
7818f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck
79f648108f83d4e74811919e9811efb8fcc184b8a3John Reck    ANDROID_API void initialize(const sp<Surface>& surface);
80f648108f83d4e74811919e9811efb8fcc184b8a3John Reck    ANDROID_API void updateSurface(const sp<Surface>& surface);
81f648108f83d4e74811919e9811efb8fcc184b8a3John Reck    ANDROID_API bool pauseSurface(const sp<Surface>& surface);
828afcc76920499d0a384dba1470c5a377f80ed768John Reck    ANDROID_API void setStopped(bool stopped);
8350210d912925aef14e4ce69be82e4949122a3cd9Alan Viverette    ANDROID_API void setup(int width, int height, float lightRadius,
84b36016c65f1d1b5846dba0349aab491dbd3a746aJohn Reck            uint8_t ambientShadowAlpha, uint8_t spotShadowAlpha);
8550210d912925aef14e4ce69be82e4949122a3cd9Alan Viverette    ANDROID_API void setLightCenter(const Vector3& lightCenter);
8663a06673253914510bbeebd500655008682dade1John Reck    ANDROID_API void setOpaque(bool opaque);
87ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck    ANDROID_API int64_t* frameInfo();
8851f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reck    ANDROID_API int syncAndDrawFrame(TreeObserver* observer);
8951f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reck    ANDROID_API void destroy(TreeObserver* observer);
904f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
913b20251a355c88193c439f928a84ae69483fb488John Reck    ANDROID_API static void invokeFunctor(Functor* functor, bool waitForCompletion);
924f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
93fc53ef27793a39e9effd829e9cae02a9ca14147eJohn Reck    ANDROID_API void runWithGlContext(RenderTask* task);
94fc53ef27793a39e9effd829e9cae02a9ca14147eJohn Reck
9519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    ANDROID_API DeferredLayerUpdater* createTextureLayer();
9651f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reck    ANDROID_API void buildLayer(RenderNode* node, TreeObserver* observer);
973731dc220ed457e0f1e99d7ec2589e0a43872b59John Reck    ANDROID_API bool copyLayerInto(DeferredLayerUpdater* layer, SkBitmap& bitmap);
98d72e0a339b54af0c4e731513bbad120dff694723John Reck    ANDROID_API void pushLayerUpdate(DeferredLayerUpdater* layer);
99d72e0a339b54af0c4e731513bbad120dff694723John Reck    ANDROID_API void cancelLayerUpdate(DeferredLayerUpdater* layer);
100918ad523b2780e0c893f3d2a32d4ec13f2a7e921John Reck    ANDROID_API void detachSurfaceTexture(DeferredLayerUpdater* layer);
10119b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck
10251f2d606dcbfba3cc5b03dfea37c1304b91c232fJohn Reck    ANDROID_API void destroyHardwareResources(TreeObserver* observer);
103f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck    ANDROID_API static void trimMemory(int level);
1042507c34d91bb0d722b6012e85cb47387b2aa6873Chris Craik    ANDROID_API static void overrideProperty(const char* name, const char* value);
105e1628b7c6fc3822fa83cf02028ce8ad67abb0afeJohn Reck
10628ad7b52e038ef0cdd89f753d9839444a434b299John Reck    ANDROID_API void fence();
107c0a0e1a66da20a18045d59451b59ec32685bcf18Thomas Buhot    ANDROID_API static void staticFence();
108f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck    ANDROID_API void stopDrawing();
109a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck    ANDROID_API void notifyFramePending();
11028ad7b52e038ef0cdd89f753d9839444a434b299John Reck
111ba6adf66d3c44c0aa2fd8a224862ff1901d64300John Reck    ANDROID_API void dumpProfileInfo(int fd, int dumpFlags);
1127f2e5e3cea6af1f1dff35842aa13d46c47315b91John Reck    // Not exported, only used for testing
1137f2e5e3cea6af1f1dff35842aa13d46c47315b91John Reck    void resetProfileInfo();
1142ae07339824efc50468f971ff8920ff0b894cad4Chris Craik    ANDROID_API static void dumpGraphicsMemory(int fd);
115fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck
1163b20251a355c88193c439f928a84ae69483fb488John Reck    ANDROID_API void setTextureAtlas(const sp<GraphicBuffer>& buffer, int64_t* map, size_t size);
117edc524c90506d80e0fc5fb67e8de7b8f3ef53439John Reck    ANDROID_API void setProcessStatsBuffer(int fd);
1183b20251a355c88193c439f928a84ae69483fb488John Reck
119e248bd1b2c3fcf8088429507e73b31f45ee2544bJohn Reck    ANDROID_API void serializeDisplayListTree();
120e248bd1b2c3fcf8088429507e73b31f45ee2544bJohn Reck
121ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne    ANDROID_API void addRenderNode(RenderNode* node, bool placeFront);
122ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne    ANDROID_API void removeRenderNode(RenderNode* node);
123ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne    ANDROID_API void drawRenderNode(RenderNode* node);
124b816087962aba0019b022303330f03b897b580edSkuhne    ANDROID_API void setContentDrawBounds(int left, int top, int right, int bottom);
125ea7a7fb75acb7305eb774ca7bc7e96103bd49323Skuhne
126910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales    ANDROID_API void addFrameMetricsObserver(FrameMetricsObserver* observer);
127910beb8f5d9042163e2ad0dbb744d9f147db9604Andres Morales    ANDROID_API void removeFrameMetricsObserver(FrameMetricsObserver* observer);
12806f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales    ANDROID_API long getDroppedFrameReportCount();
12906f5bc70a667a02b14e31d3f53f91d3661e30666Andres Morales
130e94cbc76d560a157c0a0d47181b4ed2a0aadbeb1John Reck    ANDROID_API static int copySurfaceInto(sp<Surface>& surface, SkBitmap* bitmap);
13110dd0585c11dcedb5a271d54e645594f1d215d5cJohn Reck
1324f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckprivate:
1334f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    RenderThread& mRenderThread;
1344f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    CanvasContext* mContext;
1354f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
136668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck    DrawFrameTask mDrawFrameTask;
137668f0e38ef0277d55d3118af37e17b8c435df85cJohn Reck
138cba287b9716155183faf21865a6c28ba49ffe486John Reck    Mutex mSyncMutex;
139cba287b9716155183faf21865a6c28ba49ffe486John Reck    Condition mSyncCondition;
140cba287b9716155183faf21865a6c28ba49ffe486John Reck
1414f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    void destroyContext();
1424f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
1434f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    void post(RenderTask* task);
1444f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    void* postAndWait(MethodInvokeRenderTask* task);
1454f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
1460e89e2b7bcb2c035e8cee77f93120e7c5617f8d2John Reck    static void* staticPostAndWait(MethodInvokeRenderTask* task);
1470e89e2b7bcb2c035e8cee77f93120e7c5617f8d2John Reck
1484f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    // Friend class to help with bridging
1494f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    friend class RenderProxyBridge;
1504f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck};
1514f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
1524f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} /* namespace renderthread */
1534f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} /* namespace uirenderer */
1544f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck} /* namespace android */
1554f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#endif /* RENDERPROXY_H_ */
156