/* * Copyright (C) 2014 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef EGLMANAGER_H #define EGLMANAGER_H #include <EGL/egl.h> #include <SkRect.h> #include <cutils/compiler.h> #include <ui/GraphicBuffer.h> #include <utils/StrongPointer.h> namespace android { namespace uirenderer { namespace renderthread { class Frame; class RenderThread; // This class contains the shared global EGL objects, such as EGLDisplay // and EGLConfig, which are re-used by CanvasContext class EglManager { public: static const char* eglErrorString(); // Returns true on success, false on failure void initialize(); bool hasEglContext(); EGLSurface createSurface(EGLNativeWindowType window, bool wideColorGamut); void destroySurface(EGLSurface surface); void destroy(); bool isCurrent(EGLSurface surface) { return mCurrentSurface == surface; } // Returns true if the current surface changed, false if it was already current bool makeCurrent(EGLSurface surface, EGLint* errOut = nullptr); Frame beginFrame(EGLSurface surface); void damageFrame(const Frame& frame, const SkRect& dirty); // If this returns true it is mandatory that swapBuffers is called // if damageFrame is called without subsequent calls to damageFrame(). // See EGL_KHR_partial_update for more information bool damageRequiresSwap(); bool swapBuffers(const Frame& frame, const SkRect& screenDirty); // Returns true iff the surface is now preserving buffers. bool setPreserveBuffer(EGLSurface surface, bool preserve); void fence(); private: friend class RenderThread; explicit EglManager(RenderThread& thread); // EglContext is never destroyed, method is purposely not implemented ~EglManager(); void initExtensions(); void createPBufferSurface(); void loadConfigs(); void createContext(); EGLint queryBufferAge(EGLSurface surface); RenderThread& mRenderThread; EGLDisplay mEglDisplay; EGLConfig mEglConfig; EGLConfig mEglConfigWideGamut; EGLContext mEglContext; EGLSurface mPBufferSurface; EGLSurface mCurrentSurface; enum class SwapBehavior { Discard, Preserved, BufferAge, }; SwapBehavior mSwapBehavior = SwapBehavior::Discard; }; } /* namespace renderthread */ } /* namespace uirenderer */ } /* namespace android */ #endif /* EGLMANAGER_H */