CanvasContext.h revision 998a6d81896df8b662cc10ddeb35087b78b38d72
15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/*
25460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * Copyright (C) 2014 The Android Open Source Project
35460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *
45460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * Licensed under the Apache License, Version 2.0 (the "License");
55460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * you may not use this file except in compliance with the License.
65460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * You may obtain a copy of the License at
75460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *
85460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *      http://www.apache.org/licenses/LICENSE-2.0
95460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *
105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * Unless required by applicable law or agreed to in writing, software
115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * distributed under the License is distributed on an "AS IS" BASIS,
125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * See the License for the specific language governing permissions and
145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * limitations under the License.
155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */
165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifndef CANVASCONTEXT_H_
1822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#define CANVASCONTEXT_H_
195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <set>
2122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <cutils/compiler.h>
235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <EGL/egl.h>
245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <SkBitmap.h>
255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <utils/Functor.h>
265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <utils/Vector.h>
275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include "../DamageAccumulator.h"
295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include "../DrawProfiler.h"
305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include "../IContextFactory.h"
315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include "../RenderNode.h"
325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include "RenderTask.h"
335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include "RenderThread.h"
345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#define FUNCTOR_PROCESS_DELAY 4
365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
37affc150dc44fab1911775a49636d0ce85333b634Zonr Changnamespace android {
38affc150dc44fab1911775a49636d0ce85333b634Zonr Changnamespace uirenderer {
39affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass AnimationContext;
415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass DeferredLayerUpdater;
425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass OpenGLRenderer;
435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass Rect;
4422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass Layer;
4522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace renderthread {
475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass EglManager;
495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// This per-renderer class manages the bridge between the global EGL context
515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// and the render surface.
525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// TODO: Rename to Renderer or some other per-window, top-level manager
535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass CanvasContext : public IFrameCallback {
5422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaopublic:
5522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    CanvasContext(RenderThread& thread, bool translucent, RenderNode* rootRenderNode,
5622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao            IContextFactory* contextFactory);
5722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    virtual ~CanvasContext();
5822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    bool initialize(ANativeWindow* window);
605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    void updateSurface(ANativeWindow* window);
615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    void pauseSurface(ANativeWindow* window);
625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    void setup(int width, int height, const Vector3& lightCenter, float lightRadius,
635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao            uint8_t ambientShadowAlpha, uint8_t spotShadowAlpha);
645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    void setOpaque(bool opaque);
655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    void makeCurrent();
665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    void processLayerUpdate(DeferredLayerUpdater* layerUpdater);
675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    void prepareTree(TreeInfo& info);
685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    void draw();
695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    void destroyCanvasAndSurface();
705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    // IFrameCallback, Chroreographer-driven frame callback entry point
725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    virtual void doFrame();
735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    void buildLayer(RenderNode* node);
755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    bool copyLayerInto(DeferredLayerUpdater* layer, SkBitmap* bitmap);
765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    void markLayerInUse(RenderNode* node);
775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    void destroyHardwareResources();
795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    static void trimMemory(RenderThread& thread, int level);
805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    static void invokeFunctor(RenderThread& thread, Functor* functor);
825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    void runWithGlContext(RenderTask* task);
845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    Layer* createRenderLayer(int width, int height);
865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    Layer* createTextureLayer();
875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    ANDROID_API static void setTextureAtlas(RenderThread& thread,
895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao            const sp<GraphicBuffer>& buffer, int64_t* map, size_t mapSize);
905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    void stopDrawing();
925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    void notifyFramePending();
935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    DrawProfiler& profiler() { return mProfiler; }
955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate:
975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    friend class RegisterFrameCallbackTask;
985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    void setSurface(ANativeWindow* window);
1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    void swapBuffers();
1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    void requireSurface();
1025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    void requireGlContext();
1045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    void freePrefetechedLayers();
1065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    RenderThread& mRenderThread;
1085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    EglManager& mEglManager;
1095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    sp<ANativeWindow> mNativeWindow;
1105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    EGLSurface mEglSurface;
111affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    bool mDirtyRegionsEnabled;
112
113    bool mOpaque;
114    OpenGLRenderer* mCanvas;
115    bool mHaveNewSurface;
116    DamageAccumulator mDamageAccumulator;
117    AnimationContext* mAnimationContext;
118
119    const sp<RenderNode> mRootRenderNode;
120
121    DrawProfiler mProfiler;
122
123    std::set<RenderNode*> mPrefetechedLayers;
124};
125
126} /* namespace renderthread */
127} /* namespace uirenderer */
128} /* namespace android */
129#endif /* CANVASCONTEXT_H_ */
130