1*d57664e9SAndroid Build Coastguard Worker /* 2*d57664e9SAndroid Build Coastguard Worker * Copyright (C) 2013 The Android Open Source Project 3*d57664e9SAndroid Build Coastguard Worker * 4*d57664e9SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*d57664e9SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*d57664e9SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*d57664e9SAndroid Build Coastguard Worker * 8*d57664e9SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*d57664e9SAndroid Build Coastguard Worker * 10*d57664e9SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*d57664e9SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*d57664e9SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*d57664e9SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*d57664e9SAndroid Build Coastguard Worker * limitations under the License. 15*d57664e9SAndroid Build Coastguard Worker */ 16*d57664e9SAndroid Build Coastguard Worker 17*d57664e9SAndroid Build Coastguard Worker #ifndef RENDERPROXY_H_ 18*d57664e9SAndroid Build Coastguard Worker #define RENDERPROXY_H_ 19*d57664e9SAndroid Build Coastguard Worker 20*d57664e9SAndroid Build Coastguard Worker #include <SkRefCnt.h> 21*d57664e9SAndroid Build Coastguard Worker #include <android/hardware_buffer.h> 22*d57664e9SAndroid Build Coastguard Worker #include <android/native_window.h> 23*d57664e9SAndroid Build Coastguard Worker #include <android/surface_control.h> 24*d57664e9SAndroid Build Coastguard Worker #include <cutils/compiler.h> 25*d57664e9SAndroid Build Coastguard Worker #include <utils/Functor.h> 26*d57664e9SAndroid Build Coastguard Worker 27*d57664e9SAndroid Build Coastguard Worker #include "../FrameMetricsObserver.h" 28*d57664e9SAndroid Build Coastguard Worker #include "../IContextFactory.h" 29*d57664e9SAndroid Build Coastguard Worker #include "ColorMode.h" 30*d57664e9SAndroid Build Coastguard Worker #include "CopyRequest.h" 31*d57664e9SAndroid Build Coastguard Worker #include "DrawFrameTask.h" 32*d57664e9SAndroid Build Coastguard Worker #include "SwapBehavior.h" 33*d57664e9SAndroid Build Coastguard Worker #include "hwui/Bitmap.h" 34*d57664e9SAndroid Build Coastguard Worker #include "utils/ForceDark.h" 35*d57664e9SAndroid Build Coastguard Worker 36*d57664e9SAndroid Build Coastguard Worker class SkBitmap; 37*d57664e9SAndroid Build Coastguard Worker class SkPicture; 38*d57664e9SAndroid Build Coastguard Worker class SkImage; 39*d57664e9SAndroid Build Coastguard Worker 40*d57664e9SAndroid Build Coastguard Worker namespace android { 41*d57664e9SAndroid Build Coastguard Worker class GraphicBuffer; 42*d57664e9SAndroid Build Coastguard Worker class Surface; 43*d57664e9SAndroid Build Coastguard Worker 44*d57664e9SAndroid Build Coastguard Worker namespace uirenderer { 45*d57664e9SAndroid Build Coastguard Worker 46*d57664e9SAndroid Build Coastguard Worker class DeferredLayerUpdater; 47*d57664e9SAndroid Build Coastguard Worker class RenderNode; 48*d57664e9SAndroid Build Coastguard Worker class Rect; 49*d57664e9SAndroid Build Coastguard Worker 50*d57664e9SAndroid Build Coastguard Worker namespace renderthread { 51*d57664e9SAndroid Build Coastguard Worker 52*d57664e9SAndroid Build Coastguard Worker class CanvasContext; 53*d57664e9SAndroid Build Coastguard Worker class RenderThread; 54*d57664e9SAndroid Build Coastguard Worker class RenderProxyBridge; 55*d57664e9SAndroid Build Coastguard Worker 56*d57664e9SAndroid Build Coastguard Worker namespace DumpFlags { 57*d57664e9SAndroid Build Coastguard Worker enum { 58*d57664e9SAndroid Build Coastguard Worker FrameStats = 1 << 0, 59*d57664e9SAndroid Build Coastguard Worker Reset = 1 << 1, 60*d57664e9SAndroid Build Coastguard Worker JankStats = 1 << 2, 61*d57664e9SAndroid Build Coastguard Worker }; 62*d57664e9SAndroid Build Coastguard Worker } 63*d57664e9SAndroid Build Coastguard Worker 64*d57664e9SAndroid Build Coastguard Worker /* 65*d57664e9SAndroid Build Coastguard Worker * RenderProxy is strictly single threaded. All methods must be invoked on the owning 66*d57664e9SAndroid Build Coastguard Worker * thread. It is important to note that RenderProxy may be deleted while it has 67*d57664e9SAndroid Build Coastguard Worker * tasks post()'d as a result. Therefore any RenderTask that is post()'d must not 68*d57664e9SAndroid Build Coastguard Worker * reference RenderProxy or any of its fields. The exception here is that postAndWait() 69*d57664e9SAndroid Build Coastguard Worker * references RenderProxy fields. This is safe as RenderProxy cannot 70*d57664e9SAndroid Build Coastguard Worker * be deleted if it is blocked inside a call. 71*d57664e9SAndroid Build Coastguard Worker */ 72*d57664e9SAndroid Build Coastguard Worker class RenderProxy { 73*d57664e9SAndroid Build Coastguard Worker public: 74*d57664e9SAndroid Build Coastguard Worker RenderProxy(bool opaque, RenderNode* rootNode, IContextFactory* contextFactory); 75*d57664e9SAndroid Build Coastguard Worker virtual ~RenderProxy(); 76*d57664e9SAndroid Build Coastguard Worker 77*d57664e9SAndroid Build Coastguard Worker // Won't take effect until next EGLSurface creation 78*d57664e9SAndroid Build Coastguard Worker void setSwapBehavior(SwapBehavior swapBehavior); 79*d57664e9SAndroid Build Coastguard Worker bool loadSystemProperties(); 80*d57664e9SAndroid Build Coastguard Worker void setName(const char* name); 81*d57664e9SAndroid Build Coastguard Worker void setHardwareBuffer(AHardwareBuffer* buffer); 82*d57664e9SAndroid Build Coastguard Worker void setSurface(ANativeWindow* window, bool enableTimeout = true); 83*d57664e9SAndroid Build Coastguard Worker void setSurfaceControl(ASurfaceControl* surfaceControl); 84*d57664e9SAndroid Build Coastguard Worker void allocateBuffers(); 85*d57664e9SAndroid Build Coastguard Worker bool pause(); 86*d57664e9SAndroid Build Coastguard Worker void setStopped(bool stopped); 87*d57664e9SAndroid Build Coastguard Worker void setLightAlpha(uint8_t ambientShadowAlpha, uint8_t spotShadowAlpha); 88*d57664e9SAndroid Build Coastguard Worker void setLightGeometry(const Vector3& lightCenter, float lightRadius); 89*d57664e9SAndroid Build Coastguard Worker void setHardwareBufferRenderParams(const HardwareBufferRenderParams& params); 90*d57664e9SAndroid Build Coastguard Worker void setOpaque(bool opaque); 91*d57664e9SAndroid Build Coastguard Worker float setColorMode(ColorMode mode); 92*d57664e9SAndroid Build Coastguard Worker void setRenderSdrHdrRatio(float ratio); 93*d57664e9SAndroid Build Coastguard Worker int64_t* frameInfo(); 94*d57664e9SAndroid Build Coastguard Worker void forceDrawNextFrame(); 95*d57664e9SAndroid Build Coastguard Worker int syncAndDrawFrame(); 96*d57664e9SAndroid Build Coastguard Worker void destroy(); 97*d57664e9SAndroid Build Coastguard Worker 98*d57664e9SAndroid Build Coastguard Worker static void destroyFunctor(int functor); 99*d57664e9SAndroid Build Coastguard Worker 100*d57664e9SAndroid Build Coastguard Worker DeferredLayerUpdater* createTextureLayer(); 101*d57664e9SAndroid Build Coastguard Worker void buildLayer(RenderNode* node); 102*d57664e9SAndroid Build Coastguard Worker bool copyLayerInto(DeferredLayerUpdater* layer, SkBitmap& bitmap); 103*d57664e9SAndroid Build Coastguard Worker void pushLayerUpdate(DeferredLayerUpdater* layer); 104*d57664e9SAndroid Build Coastguard Worker void cancelLayerUpdate(DeferredLayerUpdater* layer); 105*d57664e9SAndroid Build Coastguard Worker void detachSurfaceTexture(DeferredLayerUpdater* layer); 106*d57664e9SAndroid Build Coastguard Worker 107*d57664e9SAndroid Build Coastguard Worker void destroyHardwareResources(); 108*d57664e9SAndroid Build Coastguard Worker static void trimMemory(int level); 109*d57664e9SAndroid Build Coastguard Worker static void trimCaches(int level); 110*d57664e9SAndroid Build Coastguard Worker static void purgeCaches(); 111*d57664e9SAndroid Build Coastguard Worker static void overrideProperty(const char* name, const char* value); 112*d57664e9SAndroid Build Coastguard Worker 113*d57664e9SAndroid Build Coastguard Worker void fence(); 114*d57664e9SAndroid Build Coastguard Worker static int maxTextureSize(); 115*d57664e9SAndroid Build Coastguard Worker void stopDrawing(); 116*d57664e9SAndroid Build Coastguard Worker void notifyFramePending(); 117*d57664e9SAndroid Build Coastguard Worker void notifyCallbackPending(); 118*d57664e9SAndroid Build Coastguard Worker void notifyExpensiveFrame(); 119*d57664e9SAndroid Build Coastguard Worker 120*d57664e9SAndroid Build Coastguard Worker void dumpProfileInfo(int fd, int dumpFlags); 121*d57664e9SAndroid Build Coastguard Worker // Not exported, only used for testing 122*d57664e9SAndroid Build Coastguard Worker void resetProfileInfo(); 123*d57664e9SAndroid Build Coastguard Worker uint32_t frameTimePercentile(int p); 124*d57664e9SAndroid Build Coastguard Worker static void dumpGraphicsMemory(int fd, bool includeProfileData = true, 125*d57664e9SAndroid Build Coastguard Worker bool resetProfile = false); 126*d57664e9SAndroid Build Coastguard Worker static void getMemoryUsage(size_t* cpuUsage, size_t* gpuUsage); 127*d57664e9SAndroid Build Coastguard Worker 128*d57664e9SAndroid Build Coastguard Worker static void rotateProcessStatsBuffer(); 129*d57664e9SAndroid Build Coastguard Worker static void setProcessStatsBuffer(int fd); 130*d57664e9SAndroid Build Coastguard Worker int getRenderThreadTid(); 131*d57664e9SAndroid Build Coastguard Worker 132*d57664e9SAndroid Build Coastguard Worker void addRenderNode(RenderNode* node, bool placeFront); 133*d57664e9SAndroid Build Coastguard Worker void removeRenderNode(RenderNode* node); 134*d57664e9SAndroid Build Coastguard Worker void drawRenderNode(RenderNode* node); 135*d57664e9SAndroid Build Coastguard Worker void setContentDrawBounds(int left, int top, int right, int bottom); 136*d57664e9SAndroid Build Coastguard Worker void setPictureCapturedCallback(const std::function<void(sk_sp<SkPicture>&&)>& callback); 137*d57664e9SAndroid Build Coastguard Worker void setASurfaceTransactionCallback( 138*d57664e9SAndroid Build Coastguard Worker const std::function<bool(int64_t, int64_t, int64_t)>& callback); 139*d57664e9SAndroid Build Coastguard Worker void setPrepareSurfaceControlForWebviewCallback(const std::function<void()>& callback); 140*d57664e9SAndroid Build Coastguard Worker void setFrameCallback(std::function<std::function<void(bool)>(int32_t, int64_t)>&& callback); 141*d57664e9SAndroid Build Coastguard Worker void setFrameCommitCallback(std::function<void(bool)>&& callback); 142*d57664e9SAndroid Build Coastguard Worker void setFrameCompleteCallback(std::function<void()>&& callback); 143*d57664e9SAndroid Build Coastguard Worker 144*d57664e9SAndroid Build Coastguard Worker void addFrameMetricsObserver(FrameMetricsObserver* observer); 145*d57664e9SAndroid Build Coastguard Worker void removeFrameMetricsObserver(FrameMetricsObserver* observer); 146*d57664e9SAndroid Build Coastguard Worker void setForceDark(ForceDarkType type); 147*d57664e9SAndroid Build Coastguard Worker 148*d57664e9SAndroid Build Coastguard Worker static void copySurfaceInto(ANativeWindow* window, std::shared_ptr<CopyRequest>&& request); 149*d57664e9SAndroid Build Coastguard Worker static void prepareToDraw(Bitmap& bitmap); 150*d57664e9SAndroid Build Coastguard Worker 151*d57664e9SAndroid Build Coastguard Worker static int copyHWBitmapInto(Bitmap* hwBitmap, SkBitmap* bitmap); 152*d57664e9SAndroid Build Coastguard Worker static int copyImageInto(const sk_sp<SkImage>& image, SkBitmap* bitmap); 153*d57664e9SAndroid Build Coastguard Worker 154*d57664e9SAndroid Build Coastguard Worker static void disableVsync(); 155*d57664e9SAndroid Build Coastguard Worker 156*d57664e9SAndroid Build Coastguard Worker static void preload(); 157*d57664e9SAndroid Build Coastguard Worker 158*d57664e9SAndroid Build Coastguard Worker static void setRtAnimationsEnabled(bool enabled); 159*d57664e9SAndroid Build Coastguard Worker 160*d57664e9SAndroid Build Coastguard Worker private: 161*d57664e9SAndroid Build Coastguard Worker RenderThread& mRenderThread; 162*d57664e9SAndroid Build Coastguard Worker CanvasContext* mContext; 163*d57664e9SAndroid Build Coastguard Worker 164*d57664e9SAndroid Build Coastguard Worker DrawFrameTask mDrawFrameTask; 165*d57664e9SAndroid Build Coastguard Worker 166*d57664e9SAndroid Build Coastguard Worker void destroyContext(); 167*d57664e9SAndroid Build Coastguard Worker 168*d57664e9SAndroid Build Coastguard Worker // Friend class to help with bridging 169*d57664e9SAndroid Build Coastguard Worker friend class RenderProxyBridge; 170*d57664e9SAndroid Build Coastguard Worker }; 171*d57664e9SAndroid Build Coastguard Worker 172*d57664e9SAndroid Build Coastguard Worker } /* namespace renderthread */ 173*d57664e9SAndroid Build Coastguard Worker } /* namespace uirenderer */ 174*d57664e9SAndroid Build Coastguard Worker } /* namespace android */ 175*d57664e9SAndroid Build Coastguard Worker #endif /* RENDERPROXY_H_ */ 176