CanvasContext.h revision 1949e7928eeec22cd3f74b5f763a4eb433238453
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
264f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#include "RenderTask.h"
274f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
284f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#define FUNCTOR_PROCESS_DELAY 4
2923b797ab5151eb2474f3bdd679f2f07bfd723042John Reck
3023b797ab5151eb2474f3bdd679f2f07bfd723042John Recknamespace android {
3123b797ab5151eb2474f3bdd679f2f07bfd723042John Recknamespace uirenderer {
324f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
3319b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reckclass DeferredLayerUpdater;
34e18264b079481a244b30e3f71012c53bbd861f92John Reckclass RenderNode;
3544fd8d24f761f82d21e9b00932648a1b6bf91449John Reckclass DisplayListData;
364f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckclass OpenGLRenderer;
374f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckclass Rect;
381949e7928eeec22cd3f74b5f763a4eb433238453John Reckclass Layer;
394f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
4023b797ab5151eb2474f3bdd679f2f07bfd723042John Recknamespace renderthread {
4123b797ab5151eb2474f3bdd679f2f07bfd723042John Reck
4223b797ab5151eb2474f3bdd679f2f07bfd723042John Reckclass GlobalContext;
434f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckclass CanvasContext;
444f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckclass RenderThread;
454f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
464f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckclass InvokeFunctorsTask : public RenderTask {
474f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckpublic:
484f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    InvokeFunctorsTask(CanvasContext* context)
494f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck        : mContext(context) {}
504f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
514f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    virtual void run();
524f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
534f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckprivate:
544f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    CanvasContext* mContext;
554f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck};
5623b797ab5151eb2474f3bdd679f2f07bfd723042John Reck
5723b797ab5151eb2474f3bdd679f2f07bfd723042John Reck// This per-renderer class manages the bridge between the global EGL context
5823b797ab5151eb2474f3bdd679f2f07bfd723042John Reck// and the render surface.
5923b797ab5151eb2474f3bdd679f2f07bfd723042John Reckclass CanvasContext {
6023b797ab5151eb2474f3bdd679f2f07bfd723042John Reckpublic:
614f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    CanvasContext(bool translucent);
624f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    ~CanvasContext();
6323b797ab5151eb2474f3bdd679f2f07bfd723042John Reck
644f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    bool initialize(EGLNativeWindowType window);
654f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    void updateSurface(EGLNativeWindowType window);
664f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    void setup(int width, int height);
67e18264b079481a244b30e3f71012c53bbd861f92John Reck    void setDisplayListData(RenderNode* displayList, DisplayListData* newData);
6819b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    void processLayerUpdates(const Vector<DeferredLayerUpdater*>* layerUpdaters);
69e18264b079481a244b30e3f71012c53bbd861f92John Reck    void drawDisplayList(RenderNode* displayList, Rect* dirty);
704f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    void destroyCanvas();
7123b797ab5151eb2474f3bdd679f2f07bfd723042John Reck
7219b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    bool copyLayerInto(DeferredLayerUpdater* layer, SkBitmap* bitmap);
7319b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck
744f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    void attachFunctor(Functor* functor);
754f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    void detachFunctor(Functor* functor);
760d1f634f4b5e1bb37aa51777efb6a68619488d01John Reck    void invokeFunctor(Functor* functor);
7723b797ab5151eb2474f3bdd679f2f07bfd723042John Reck
78fc53ef27793a39e9effd829e9cae02a9ca14147eJohn Reck    void runWithGlContext(RenderTask* task);
79fc53ef27793a39e9effd829e9cae02a9ca14147eJohn Reck
801949e7928eeec22cd3f74b5f763a4eb433238453John Reck    Layer* createRenderLayer(int width, int height);
811949e7928eeec22cd3f74b5f763a4eb433238453John Reck    Layer* createTextureLayer();
821949e7928eeec22cd3f74b5f763a4eb433238453John Reck
8323b797ab5151eb2474f3bdd679f2f07bfd723042John Reckprivate:
844f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    void setSurface(EGLNativeWindowType window);
854f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    void swapBuffers();
864f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    void makeCurrent();
874f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
884f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    friend class InvokeFunctorsTask;
894f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    void invokeFunctors();
904f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    void removeFunctorsTask();
914f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    void queueFunctorsTask(int delayMs = FUNCTOR_PROCESS_DELAY);
9223b797ab5151eb2474f3bdd679f2f07bfd723042John Reck
9319b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    void requireGlContext();
9419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck
9523b797ab5151eb2474f3bdd679f2f07bfd723042John Reck    GlobalContext* mGlobalContext;
964f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    RenderThread& mRenderThread;
9723b797ab5151eb2474f3bdd679f2f07bfd723042John Reck    EGLSurface mEglSurface;
9823b797ab5151eb2474f3bdd679f2f07bfd723042John Reck    bool mDirtyRegionsEnabled;
994f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
1004f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    bool mOpaque;
1014f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    OpenGLRenderer* mCanvas;
1024f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    bool mHaveNewSurface;
1034f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
1044f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    bool mInvokeFunctorsPending;
1054f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    InvokeFunctorsTask mInvokeFunctorsTask;
1064f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
10723b797ab5151eb2474f3bdd679f2f07bfd723042John Reck};
10823b797ab5151eb2474f3bdd679f2f07bfd723042John Reck
10923b797ab5151eb2474f3bdd679f2f07bfd723042John Reck} /* namespace renderthread */
11023b797ab5151eb2474f3bdd679f2f07bfd723042John Reck} /* namespace uirenderer */
11123b797ab5151eb2474f3bdd679f2f07bfd723042John Reck} /* namespace android */
11223b797ab5151eb2474f3bdd679f2f07bfd723042John Reck#endif /* CANVASCONTEXT_H_ */
113