CanvasContext.h revision fc53ef27793a39e9effd829e9cae02a9ca14147e
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>
224f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#include <utils/Functor.h>
234f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
244f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#include "RenderTask.h"
254f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
264f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#define FUNCTOR_PROCESS_DELAY 4
2723b797ab5151eb2474f3bdd679f2f07bfd723042John Reck
2823b797ab5151eb2474f3bdd679f2f07bfd723042John Recknamespace android {
2923b797ab5151eb2474f3bdd679f2f07bfd723042John Recknamespace uirenderer {
304f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
314f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckclass DisplayList;
324f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckclass OpenGLRenderer;
334f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckclass Rect;
344f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
3523b797ab5151eb2474f3bdd679f2f07bfd723042John Recknamespace renderthread {
3623b797ab5151eb2474f3bdd679f2f07bfd723042John Reck
3723b797ab5151eb2474f3bdd679f2f07bfd723042John Reckclass GlobalContext;
384f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckclass CanvasContext;
394f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckclass RenderThread;
404f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
414f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckclass InvokeFunctorsTask : public RenderTask {
424f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckpublic:
434f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    InvokeFunctorsTask(CanvasContext* context)
444f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck        : mContext(context) {}
454f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
464f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    virtual void run();
474f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
484f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckprivate:
494f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    CanvasContext* mContext;
504f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck};
5123b797ab5151eb2474f3bdd679f2f07bfd723042John Reck
5223b797ab5151eb2474f3bdd679f2f07bfd723042John Reck// This per-renderer class manages the bridge between the global EGL context
5323b797ab5151eb2474f3bdd679f2f07bfd723042John Reck// and the render surface.
5423b797ab5151eb2474f3bdd679f2f07bfd723042John Reckclass CanvasContext {
5523b797ab5151eb2474f3bdd679f2f07bfd723042John Reckpublic:
564f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    CanvasContext(bool translucent);
574f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    ~CanvasContext();
5823b797ab5151eb2474f3bdd679f2f07bfd723042John Reck
594f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    bool initialize(EGLNativeWindowType window);
604f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    void updateSurface(EGLNativeWindowType window);
614f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    void setup(int width, int height);
624f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    void drawDisplayList(DisplayList* displayList, Rect* dirty);
634f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    void destroyCanvas();
6423b797ab5151eb2474f3bdd679f2f07bfd723042John Reck
654f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    void attachFunctor(Functor* functor);
664f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    void detachFunctor(Functor* functor);
6723b797ab5151eb2474f3bdd679f2f07bfd723042John Reck
68fc53ef27793a39e9effd829e9cae02a9ca14147eJohn Reck    void runWithGlContext(RenderTask* task);
69fc53ef27793a39e9effd829e9cae02a9ca14147eJohn Reck
7023b797ab5151eb2474f3bdd679f2f07bfd723042John Reckprivate:
714f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    void setSurface(EGLNativeWindowType window);
724f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    void swapBuffers();
734f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    void makeCurrent();
744f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
754f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    friend class InvokeFunctorsTask;
764f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    void invokeFunctors();
774f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    void handleFunctorStatus(int status, const Rect& redrawClip);
784f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    void removeFunctorsTask();
794f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    void queueFunctorsTask(int delayMs = FUNCTOR_PROCESS_DELAY);
8023b797ab5151eb2474f3bdd679f2f07bfd723042John Reck
8123b797ab5151eb2474f3bdd679f2f07bfd723042John Reck    GlobalContext* mGlobalContext;
824f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    RenderThread& mRenderThread;
8323b797ab5151eb2474f3bdd679f2f07bfd723042John Reck    EGLSurface mEglSurface;
8423b797ab5151eb2474f3bdd679f2f07bfd723042John Reck    bool mDirtyRegionsEnabled;
854f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
864f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    bool mOpaque;
874f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    OpenGLRenderer* mCanvas;
884f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    bool mHaveNewSurface;
894f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
904f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    bool mInvokeFunctorsPending;
914f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    InvokeFunctorsTask mInvokeFunctorsTask;
924f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
9323b797ab5151eb2474f3bdd679f2f07bfd723042John Reck};
9423b797ab5151eb2474f3bdd679f2f07bfd723042John Reck
9523b797ab5151eb2474f3bdd679f2f07bfd723042John Reck} /* namespace renderthread */
9623b797ab5151eb2474f3bdd679f2f07bfd723042John Reck} /* namespace uirenderer */
9723b797ab5151eb2474f3bdd679f2f07bfd723042John Reck} /* namespace android */
9823b797ab5151eb2474f3bdd679f2f07bfd723042John Reck#endif /* CANVASCONTEXT_H_ */
99