CanvasContext.h revision 0b7e8245db728d127ada698be63d78b33fc6e4da
157456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang/* 257456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang * Copyright (C) 2014 The Android Open Source Project 357456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang * 457456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang * Licensed under the Apache License, Version 2.0 (the "License"); 557456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang * you may not use this file except in compliance with the License. 657456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang * You may obtain a copy of the License at 757456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang * 857456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang * http://www.apache.org/licenses/LICENSE-2.0 957456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang * 1057456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang * Unless required by applicable law or agreed to in writing, software 1157456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang * distributed under the License is distributed on an "AS IS" BASIS, 1257456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1357456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang * See the License for the specific language governing permissions and 1457456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang * limitations under the License. 1557456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang */ 1657456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang 1757456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang#ifndef CANVASCONTEXT_H_ 1857456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang#define CANVASCONTEXT_H_ 1957456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang 2057456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang#include "DamageAccumulator.h" 2157456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang#include "FrameInfo.h" 2257456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang#include "FrameInfoVisualizer.h" 2357456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang#include "IContextFactory.h" 2457456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang#include "LayerUpdateQueue.h" 2557456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang#include "RenderNode.h" 2657456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang#include "utils/RingBuffer.h" 2757456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang#include "renderthread/RenderTask.h" 2857456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang#include "renderthread/RenderThread.h" 2957456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang 3057456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang#include <cutils/compiler.h> 3157456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang#include <EGL/egl.h> 3257456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang#include <SkBitmap.h> 3357456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang#include <SkRect.h> 3457456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang#include <utils/Functor.h> 3557456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang 3657456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang#include <set> 3757456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang#include <string> 3857456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang#include <vector> 3957456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang 4057456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhangnamespace android { 4157456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhangnamespace uirenderer { 4257456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang 4357456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhangclass AnimationContext; 4457456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhangclass DeferredLayerUpdater; 4557456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhangclass OpenGLRenderer; 4657456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhangclass Rect; 4757456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhangclass Layer; 4857456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhangclass RenderState; 4957456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang 5057456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhangnamespace renderthread { 5157456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang 5257456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhangclass EglManager; 5357456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang 5457456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhangenum SwapBehavior { 5557456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang kSwap_default, 5657456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang kSwap_discardBuffer, 5757456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang}; 5857456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang 5957456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang// This per-renderer class manages the bridge between the global EGL context 6057456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang// and the render surface. 6157456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang// TODO: Rename to Renderer or some other per-window, top-level manager 6257456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhangclass CanvasContext : public IFrameCallback { 6357456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhangpublic: 6457456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang CanvasContext(RenderThread& thread, bool translucent, RenderNode* rootRenderNode, 6557456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang IContextFactory* contextFactory); 6657456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang virtual ~CanvasContext(); 6757456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang 6857456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang // Won't take effect until next EGLSurface creation 6957456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang void setSwapBehavior(SwapBehavior swapBehavior); 7057456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang 7157456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang bool initialize(ANativeWindow* window); 7257456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang void updateSurface(ANativeWindow* window); 7357456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang bool pauseSurface(ANativeWindow* window); 7457456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang bool hasSurface() { return mNativeWindow.get(); } 7557456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang 7657456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang void setup(int width, int height, float lightRadius, 7757456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang uint8_t ambientShadowAlpha, uint8_t spotShadowAlpha); 7857456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang void setLightCenter(const Vector3& lightCenter); 7957456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang void setOpaque(bool opaque); 8057456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang void makeCurrent(); 8157456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang void processLayerUpdate(DeferredLayerUpdater* layerUpdater); 8257456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang void prepareTree(TreeInfo& info, int64_t* uiFrameInfo, 8357456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang int64_t syncQueued, RenderNode* target); 8457456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang void draw(); 8557456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang void destroy(); 8657456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang 8757456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang // IFrameCallback, Choreographer-driven frame callback entry point 8857456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang virtual void doFrame() override; 8957456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang void prepareAndDraw(RenderNode* node); 9057456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang 9157456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang void buildLayer(RenderNode* node); 9257456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang bool copyLayerInto(DeferredLayerUpdater* layer, SkBitmap* bitmap); 9357456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang void markLayerInUse(RenderNode* node); 9457456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang 9557456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang void destroyHardwareResources(); 9657456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang static void trimMemory(RenderThread& thread, int level); 9757456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang 9857456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang static void invokeFunctor(RenderThread& thread, Functor* functor); 9957456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang 10057456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang void runWithGlContext(RenderTask* task); 10157456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang 10257456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang Layer* createTextureLayer(); 10357456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang 10457456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang ANDROID_API static void setTextureAtlas(RenderThread& thread, 10557456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang const sp<GraphicBuffer>& buffer, int64_t* map, size_t mapSize); 10657456222f52fbfc1dcfb1b99030aad6acc02ad23Chong Zhang 107 void stopDrawing(); 108 void notifyFramePending(); 109 110 FrameInfoVisualizer& profiler() { return mProfiler; } 111 112 void dumpFrames(int fd); 113 void resetFrameStats(); 114 115 void setName(const std::string&& name) { mName = name; } 116 const std::string& name() { return mName; } 117 118 void serializeDisplayListTree(); 119 120 void addRenderNode(RenderNode* node, bool placeFront) { 121 int pos = placeFront ? 0 : static_cast<int>(mRenderNodes.size()); 122 mRenderNodes.emplace(mRenderNodes.begin() + pos, node); 123 } 124 125 void removeRenderNode(RenderNode* node) { 126 mRenderNodes.erase(std::remove(mRenderNodes.begin(), mRenderNodes.end(), node), 127 mRenderNodes.end()); 128 } 129 130 void setContentDrawBounds(int left, int top, int right, int bottom) { 131 mContentDrawBounds.set(left, top, right, bottom); 132 } 133 134 RenderState& getRenderState() { 135 return mRenderThread.renderState(); 136 } 137 138private: 139 friend class RegisterFrameCallbackTask; 140 // TODO: Replace with something better for layer & other GL object 141 // lifecycle tracking 142 friend class android::uirenderer::RenderState; 143 144 void setSurface(ANativeWindow* window); 145 void requireSurface(); 146 147 void freePrefetechedLayers(); 148 149 EGLint mLastFrameWidth = 0; 150 EGLint mLastFrameHeight = 0; 151 152 RenderThread& mRenderThread; 153 EglManager& mEglManager; 154 sp<ANativeWindow> mNativeWindow; 155 EGLSurface mEglSurface = EGL_NO_SURFACE; 156 bool mBufferPreserved = false; 157 SwapBehavior mSwapBehavior = kSwap_default; 158 struct SwapHistory { 159 SkRect damage; 160 nsecs_t vsyncTime; 161 nsecs_t swapTime; 162 }; 163 164 RingBuffer<SwapHistory, 3> mSwapHistory; 165 166 bool mOpaque; 167 OpenGLRenderer* mCanvas = nullptr; 168 bool mHaveNewSurface = false; 169 DamageAccumulator mDamageAccumulator; 170 LayerUpdateQueue mLayerUpdateQueue; 171 std::unique_ptr<AnimationContext> mAnimationContext; 172 173 std::vector< sp<RenderNode> > mRenderNodes; 174 175 FrameInfo* mCurrentFrameInfo = nullptr; 176 // Ring buffer large enough for 2 seconds worth of frames 177 RingBuffer<FrameInfo, 120> mFrames; 178 std::string mName; 179 JankTracker mJankTracker; 180 FrameInfoVisualizer mProfiler; 181 182 std::set<RenderNode*> mPrefetechedLayers; 183 184 // Stores the bounds of the main content. 185 Rect mContentDrawBounds; 186}; 187 188} /* namespace renderthread */ 189} /* namespace uirenderer */ 190} /* namespace android */ 191#endif /* CANVASCONTEXT_H_ */ 192