CanvasContext.h revision 19b6bcfd83eb7fb92ebd06d2fec89e308311f1d0
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;
344f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckclass DisplayList;
354f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckclass OpenGLRenderer;
364f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckclass Rect;
374f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
3823b797ab5151eb2474f3bdd679f2f07bfd723042John Recknamespace renderthread {
3923b797ab5151eb2474f3bdd679f2f07bfd723042John Reck
4023b797ab5151eb2474f3bdd679f2f07bfd723042John Reckclass GlobalContext;
414f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckclass CanvasContext;
424f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckclass RenderThread;
434f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
444f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckclass InvokeFunctorsTask : public RenderTask {
454f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckpublic:
464f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    InvokeFunctorsTask(CanvasContext* context)
474f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck        : mContext(context) {}
484f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
494f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    virtual void run();
504f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
514f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckprivate:
524f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    CanvasContext* mContext;
534f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck};
5423b797ab5151eb2474f3bdd679f2f07bfd723042John Reck
5523b797ab5151eb2474f3bdd679f2f07bfd723042John Reck// This per-renderer class manages the bridge between the global EGL context
5623b797ab5151eb2474f3bdd679f2f07bfd723042John Reck// and the render surface.
5723b797ab5151eb2474f3bdd679f2f07bfd723042John Reckclass CanvasContext {
5823b797ab5151eb2474f3bdd679f2f07bfd723042John Reckpublic:
594f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    CanvasContext(bool translucent);
604f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    ~CanvasContext();
6123b797ab5151eb2474f3bdd679f2f07bfd723042John Reck
624f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    bool initialize(EGLNativeWindowType window);
634f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    void updateSurface(EGLNativeWindowType window);
644f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    void setup(int width, int height);
6519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    void processLayerUpdates(const Vector<DeferredLayerUpdater*>* layerUpdaters);
664f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    void drawDisplayList(DisplayList* displayList, Rect* dirty);
674f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    void destroyCanvas();
6823b797ab5151eb2474f3bdd679f2f07bfd723042John Reck
6919b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    bool copyLayerInto(DeferredLayerUpdater* layer, SkBitmap* bitmap);
7019b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck
714f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    void attachFunctor(Functor* functor);
724f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    void detachFunctor(Functor* functor);
7323b797ab5151eb2474f3bdd679f2f07bfd723042John Reck
74fc53ef27793a39e9effd829e9cae02a9ca14147eJohn Reck    void runWithGlContext(RenderTask* task);
75fc53ef27793a39e9effd829e9cae02a9ca14147eJohn Reck
7623b797ab5151eb2474f3bdd679f2f07bfd723042John Reckprivate:
774f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    void setSurface(EGLNativeWindowType window);
784f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    void swapBuffers();
794f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    void makeCurrent();
804f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
814f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    friend class InvokeFunctorsTask;
824f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    void invokeFunctors();
834f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    void handleFunctorStatus(int status, const Rect& redrawClip);
844f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    void removeFunctorsTask();
854f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    void queueFunctorsTask(int delayMs = FUNCTOR_PROCESS_DELAY);
8623b797ab5151eb2474f3bdd679f2f07bfd723042John Reck
8719b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    void requireGlContext();
8819b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck
8923b797ab5151eb2474f3bdd679f2f07bfd723042John Reck    GlobalContext* mGlobalContext;
904f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    RenderThread& mRenderThread;
9123b797ab5151eb2474f3bdd679f2f07bfd723042John Reck    EGLSurface mEglSurface;
9223b797ab5151eb2474f3bdd679f2f07bfd723042John Reck    bool mDirtyRegionsEnabled;
934f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
944f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    bool mOpaque;
954f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    OpenGLRenderer* mCanvas;
964f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    bool mHaveNewSurface;
974f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
984f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    bool mInvokeFunctorsPending;
994f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    InvokeFunctorsTask mInvokeFunctorsTask;
1004f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
10123b797ab5151eb2474f3bdd679f2f07bfd723042John Reck};
10223b797ab5151eb2474f3bdd679f2f07bfd723042John Reck
10323b797ab5151eb2474f3bdd679f2f07bfd723042John Reck} /* namespace renderthread */
10423b797ab5151eb2474f3bdd679f2f07bfd723042John Reck} /* namespace uirenderer */
10523b797ab5151eb2474f3bdd679f2f07bfd723042John Reck} /* namespace android */
10623b797ab5151eb2474f3bdd679f2f07bfd723042John Reck#endif /* CANVASCONTEXT_H_ */
107