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