Home | History | Annotate | Download | only in renderthread
      1 /*
      2  * Copyright (C) 2014 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 #ifndef EGLMANAGER_H
     17 #define EGLMANAGER_H
     18 
     19 #include <cutils/compiler.h>
     20 #include <EGL/egl.h>
     21 #include <SkRect.h>
     22 #include <ui/GraphicBuffer.h>
     23 #include <utils/StrongPointer.h>
     24 
     25 namespace android {
     26 namespace uirenderer {
     27 namespace renderthread {
     28 
     29 class RenderThread;
     30 class EglManager;
     31 
     32 class Frame {
     33 public:
     34     EGLint width() const { return mWidth; }
     35     EGLint height() const { return mHeight; }
     36 
     37     // See: https://www.khronos.org/registry/egl/extensions/EXT/EGL_EXT_buffer_age.txt
     38     // for what this means
     39     EGLint bufferAge() const { return mBufferAge; }
     40 
     41 private:
     42     friend class EglManager;
     43 
     44     EGLSurface mSurface;
     45     EGLint mWidth;
     46     EGLint mHeight;
     47     EGLint mBufferAge;
     48 
     49     // Maps from 0,0 in top-left to 0,0 in bottom-left
     50     // If out is not an EGLint[4] you're going to have a bad time
     51     void map(const SkRect& in, EGLint* out) const;
     52 };
     53 
     54 // This class contains the shared global EGL objects, such as EGLDisplay
     55 // and EGLConfig, which are re-used by CanvasContext
     56 class EglManager {
     57 public:
     58     // Returns true on success, false on failure
     59     void initialize();
     60 
     61     bool hasEglContext();
     62 
     63     EGLSurface createSurface(EGLNativeWindowType window);
     64     void destroySurface(EGLSurface surface);
     65 
     66     void destroy();
     67 
     68     bool isCurrent(EGLSurface surface) { return mCurrentSurface == surface; }
     69     // Returns true if the current surface changed, false if it was already current
     70     bool makeCurrent(EGLSurface surface, EGLint* errOut = nullptr);
     71     Frame beginFrame(EGLSurface surface);
     72     void damageFrame(const Frame& frame, const SkRect& dirty);
     73     // If this returns true it is mandatory that swapBuffers is called
     74     // if damageFrame is called without subsequent calls to damageFrame().
     75     // See EGL_KHR_partial_update for more information
     76     bool damageRequiresSwap();
     77     bool swapBuffers(const Frame& frame, const SkRect& screenDirty);
     78 
     79     // Returns true iff the surface is now preserving buffers.
     80     bool setPreserveBuffer(EGLSurface surface, bool preserve);
     81 
     82     void setTextureAtlas(const sp<GraphicBuffer>& buffer, int64_t* map, size_t mapSize);
     83 
     84     void fence();
     85 
     86 private:
     87     friend class RenderThread;
     88 
     89     EglManager(RenderThread& thread);
     90     // EglContext is never destroyed, method is purposely not implemented
     91     ~EglManager();
     92 
     93     void initExtensions();
     94     void createPBufferSurface();
     95     void loadConfig();
     96     void createContext();
     97     void initAtlas();
     98     EGLint queryBufferAge(EGLSurface surface);
     99 
    100     RenderThread& mRenderThread;
    101 
    102     EGLDisplay mEglDisplay;
    103     EGLConfig mEglConfig;
    104     EGLContext mEglContext;
    105     EGLSurface mPBufferSurface;
    106 
    107     EGLSurface mCurrentSurface;
    108 
    109     sp<GraphicBuffer> mAtlasBuffer;
    110     int64_t* mAtlasMap;
    111     size_t mAtlasMapSize;
    112 
    113     enum class SwapBehavior {
    114         Discard,
    115         Preserved,
    116         BufferAge,
    117     };
    118     SwapBehavior mSwapBehavior = SwapBehavior::Discard;
    119 };
    120 
    121 } /* namespace renderthread */
    122 } /* namespace uirenderer */
    123 } /* namespace android */
    124 
    125 #endif /* EGLMANAGER_H */
    126