CanvasContext.h revision 860d155f866cc15a725e7ce03763280987f24901
123b797ab5151eb2474f3bdd679f2f07bfd723042John Reck/*
223b797ab5151eb2474f3bdd679f2f07bfd723042John Reck * Copyright (C) 2014 The Android Open Source Project
323b797ab5151eb2474f3bdd679f2f07bfd723042John Reck *
423b797ab5151eb2474f3bdd679f2f07bfd723042John Reck * Licensed under the Apache License, Version 2.0 (the "License");
523b797ab5151eb2474f3bdd679f2f07bfd723042John Reck * you may not use this file except in compliance with the License.
623b797ab5151eb2474f3bdd679f2f07bfd723042John Reck * You may obtain a copy of the License at
723b797ab5151eb2474f3bdd679f2f07bfd723042John Reck *
823b797ab5151eb2474f3bdd679f2f07bfd723042John Reck *      http://www.apache.org/licenses/LICENSE-2.0
923b797ab5151eb2474f3bdd679f2f07bfd723042John Reck *
1023b797ab5151eb2474f3bdd679f2f07bfd723042John Reck * Unless required by applicable law or agreed to in writing, software
1123b797ab5151eb2474f3bdd679f2f07bfd723042John Reck * distributed under the License is distributed on an "AS IS" BASIS,
1223b797ab5151eb2474f3bdd679f2f07bfd723042John Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1323b797ab5151eb2474f3bdd679f2f07bfd723042John Reck * See the License for the specific language governing permissions and
1423b797ab5151eb2474f3bdd679f2f07bfd723042John Reck * limitations under the License.
1523b797ab5151eb2474f3bdd679f2f07bfd723042John Reck */
1623b797ab5151eb2474f3bdd679f2f07bfd723042John Reck
1723b797ab5151eb2474f3bdd679f2f07bfd723042John Reck#ifndef CANVASCONTEXT_H_
1823b797ab5151eb2474f3bdd679f2f07bfd723042John Reck#define CANVASCONTEXT_H_
1923b797ab5151eb2474f3bdd679f2f07bfd723042John Reck
2023b797ab5151eb2474f3bdd679f2f07bfd723042John Reck#include <cutils/compiler.h>
2123b797ab5151eb2474f3bdd679f2f07bfd723042John Reck#include <EGL/egl.h>
2219b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck#include <SkBitmap.h>
234f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#include <utils/Functor.h>
2419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck#include <utils/Vector.h>
254f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
26860d155f866cc15a725e7ce03763280987f24901John Reck#include "../RenderNode.h"
274f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#include "RenderTask.h"
284f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
294f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#define FUNCTOR_PROCESS_DELAY 4
3023b797ab5151eb2474f3bdd679f2f07bfd723042John Reck
3123b797ab5151eb2474f3bdd679f2f07bfd723042John Recknamespace android {
3223b797ab5151eb2474f3bdd679f2f07bfd723042John Recknamespace uirenderer {
334f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
3419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reckclass DeferredLayerUpdater;
354f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckclass OpenGLRenderer;
364f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckclass Rect;
371949e7928eeec22cd3f74b5f763a4eb433238453John Reckclass Layer;
384f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
3923b797ab5151eb2474f3bdd679f2f07bfd723042John Recknamespace renderthread {
4023b797ab5151eb2474f3bdd679f2f07bfd723042John Reck
4123b797ab5151eb2474f3bdd679f2f07bfd723042John Reckclass GlobalContext;
424f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckclass CanvasContext;
434f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckclass RenderThread;
444f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
4523b797ab5151eb2474f3bdd679f2f07bfd723042John Reck// This per-renderer class manages the bridge between the global EGL context
4623b797ab5151eb2474f3bdd679f2f07bfd723042John Reck// and the render surface.
4723b797ab5151eb2474f3bdd679f2f07bfd723042John Reckclass CanvasContext {
4823b797ab5151eb2474f3bdd679f2f07bfd723042John Reckpublic:
494f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    CanvasContext(bool translucent);
504f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    ~CanvasContext();
5123b797ab5151eb2474f3bdd679f2f07bfd723042John Reck
524f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    bool initialize(EGLNativeWindowType window);
534f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    void updateSurface(EGLNativeWindowType window);
54f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck    void pauseSurface(EGLNativeWindowType window);
554f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    void setup(int width, int height);
56860d155f866cc15a725e7ce03763280987f24901John Reck    void makeCurrent();
57860d155f866cc15a725e7ce03763280987f24901John Reck    void processLayerUpdates(const Vector<DeferredLayerUpdater*>* layerUpdaters, TreeInfo& info);
58e18264b079481a244b30e3f71012c53bbd861f92John Reck    void drawDisplayList(RenderNode* displayList, Rect* dirty);
594f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    void destroyCanvas();
6023b797ab5151eb2474f3bdd679f2f07bfd723042John Reck
6119b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    bool copyLayerInto(DeferredLayerUpdater* layer, SkBitmap* bitmap);
6219b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck
630d1f634f4b5e1bb37aa51777efb6a68619488d01John Reck    void invokeFunctor(Functor* functor);
6423b797ab5151eb2474f3bdd679f2f07bfd723042John Reck
65fc53ef27793a39e9effd829e9cae02a9ca14147eJohn Reck    void runWithGlContext(RenderTask* task);
66fc53ef27793a39e9effd829e9cae02a9ca14147eJohn Reck
671949e7928eeec22cd3f74b5f763a4eb433238453John Reck    Layer* createRenderLayer(int width, int height);
681949e7928eeec22cd3f74b5f763a4eb433238453John Reck    Layer* createTextureLayer();
691949e7928eeec22cd3f74b5f763a4eb433238453John Reck
7023b797ab5151eb2474f3bdd679f2f07bfd723042John Reckprivate:
714f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    void setSurface(EGLNativeWindowType window);
724f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    void swapBuffers();
73f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck    void requireSurface();
744f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
7519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    void requireGlContext();
7619b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck
7723b797ab5151eb2474f3bdd679f2f07bfd723042John Reck    GlobalContext* mGlobalContext;
784f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    RenderThread& mRenderThread;
7923b797ab5151eb2474f3bdd679f2f07bfd723042John Reck    EGLSurface mEglSurface;
8023b797ab5151eb2474f3bdd679f2f07bfd723042John Reck    bool mDirtyRegionsEnabled;
814f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
824f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    bool mOpaque;
834f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    OpenGLRenderer* mCanvas;
844f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    bool mHaveNewSurface;
8523b797ab5151eb2474f3bdd679f2f07bfd723042John Reck};
8623b797ab5151eb2474f3bdd679f2f07bfd723042John Reck
8723b797ab5151eb2474f3bdd679f2f07bfd723042John Reck} /* namespace renderthread */
8823b797ab5151eb2474f3bdd679f2f07bfd723042John Reck} /* namespace uirenderer */
8923b797ab5151eb2474f3bdd679f2f07bfd723042John Reck} /* namespace android */
9023b797ab5151eb2474f3bdd679f2f07bfd723042John Reck#endif /* CANVASCONTEXT_H_ */
91