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