Home | History | Annotate | Download | only in renderthread
      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