1*d57664e9SAndroid Build Coastguard Worker /* 2*d57664e9SAndroid Build Coastguard Worker * Copyright (C) 2014 The Android Open Source Project 3*d57664e9SAndroid Build Coastguard Worker * 4*d57664e9SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*d57664e9SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*d57664e9SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*d57664e9SAndroid Build Coastguard Worker * 8*d57664e9SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*d57664e9SAndroid Build Coastguard Worker * 10*d57664e9SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*d57664e9SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*d57664e9SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*d57664e9SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*d57664e9SAndroid Build Coastguard Worker * limitations under the License. 15*d57664e9SAndroid Build Coastguard Worker */ 16*d57664e9SAndroid Build Coastguard Worker #ifndef EGLMANAGER_H 17*d57664e9SAndroid Build Coastguard Worker #define EGLMANAGER_H 18*d57664e9SAndroid Build Coastguard Worker 19*d57664e9SAndroid Build Coastguard Worker #include <EGL/egl.h> 20*d57664e9SAndroid Build Coastguard Worker #include <EGL/eglext.h> 21*d57664e9SAndroid Build Coastguard Worker #include <SkColorSpace.h> 22*d57664e9SAndroid Build Coastguard Worker #include <SkImageInfo.h> 23*d57664e9SAndroid Build Coastguard Worker #include <SkRect.h> 24*d57664e9SAndroid Build Coastguard Worker #include <cutils/compiler.h> 25*d57664e9SAndroid Build Coastguard Worker #include <utils/StrongPointer.h> 26*d57664e9SAndroid Build Coastguard Worker 27*d57664e9SAndroid Build Coastguard Worker #include "IRenderPipeline.h" 28*d57664e9SAndroid Build Coastguard Worker #include "utils/Result.h" 29*d57664e9SAndroid Build Coastguard Worker 30*d57664e9SAndroid Build Coastguard Worker namespace android { 31*d57664e9SAndroid Build Coastguard Worker namespace uirenderer { 32*d57664e9SAndroid Build Coastguard Worker namespace renderthread { 33*d57664e9SAndroid Build Coastguard Worker 34*d57664e9SAndroid Build Coastguard Worker class Frame; 35*d57664e9SAndroid Build Coastguard Worker class RenderThread; 36*d57664e9SAndroid Build Coastguard Worker 37*d57664e9SAndroid Build Coastguard Worker // This class contains the shared global EGL objects, such as EGLDisplay 38*d57664e9SAndroid Build Coastguard Worker // and EGLConfig, which are re-used by CanvasContext 39*d57664e9SAndroid Build Coastguard Worker class EglManager { 40*d57664e9SAndroid Build Coastguard Worker public: 41*d57664e9SAndroid Build Coastguard Worker explicit EglManager(); 42*d57664e9SAndroid Build Coastguard Worker 43*d57664e9SAndroid Build Coastguard Worker ~EglManager(); 44*d57664e9SAndroid Build Coastguard Worker 45*d57664e9SAndroid Build Coastguard Worker static const char* eglErrorString(); 46*d57664e9SAndroid Build Coastguard Worker 47*d57664e9SAndroid Build Coastguard Worker void initialize(); 48*d57664e9SAndroid Build Coastguard Worker 49*d57664e9SAndroid Build Coastguard Worker bool hasEglContext(); 50*d57664e9SAndroid Build Coastguard Worker 51*d57664e9SAndroid Build Coastguard Worker Result<EGLSurface, EGLint> createSurface(EGLNativeWindowType window, ColorMode colorMode, 52*d57664e9SAndroid Build Coastguard Worker sk_sp<SkColorSpace> colorSpace); 53*d57664e9SAndroid Build Coastguard Worker void destroySurface(EGLSurface surface); 54*d57664e9SAndroid Build Coastguard Worker 55*d57664e9SAndroid Build Coastguard Worker void destroy(); 56*d57664e9SAndroid Build Coastguard Worker isCurrent(EGLSurface surface)57*d57664e9SAndroid Build Coastguard Worker bool isCurrent(EGLSurface surface) { return mCurrentSurface == surface; } 58*d57664e9SAndroid Build Coastguard Worker // Returns true if the current surface changed, false if it was already current 59*d57664e9SAndroid Build Coastguard Worker bool makeCurrent(EGLSurface surface, EGLint* errOut = nullptr, bool force = false); 60*d57664e9SAndroid Build Coastguard Worker Frame beginFrame(EGLSurface surface); 61*d57664e9SAndroid Build Coastguard Worker void damageFrame(const Frame& frame, const SkRect& dirty); 62*d57664e9SAndroid Build Coastguard Worker // If this returns true it is mandatory that swapBuffers is called 63*d57664e9SAndroid Build Coastguard Worker // if damageFrame is called without subsequent calls to damageFrame(). 64*d57664e9SAndroid Build Coastguard Worker // See EGL_KHR_partial_update for more information 65*d57664e9SAndroid Build Coastguard Worker bool damageRequiresSwap(); 66*d57664e9SAndroid Build Coastguard Worker bool swapBuffers(const Frame& frame, const SkRect& screenDirty); 67*d57664e9SAndroid Build Coastguard Worker 68*d57664e9SAndroid Build Coastguard Worker // Returns true iff the surface is now preserving buffers. 69*d57664e9SAndroid Build Coastguard Worker bool setPreserveBuffer(EGLSurface surface, bool preserve); 70*d57664e9SAndroid Build Coastguard Worker 71*d57664e9SAndroid Build Coastguard Worker void fence(); 72*d57664e9SAndroid Build Coastguard Worker eglDisplay()73*d57664e9SAndroid Build Coastguard Worker EGLDisplay eglDisplay() const { return mEglDisplay; } 74*d57664e9SAndroid Build Coastguard Worker 75*d57664e9SAndroid Build Coastguard Worker // Inserts a wait on fence command into the OpenGL ES command stream. If EGL extension 76*d57664e9SAndroid Build Coastguard Worker // support is missing, block the CPU on the fence. 77*d57664e9SAndroid Build Coastguard Worker status_t fenceWait(int fence); 78*d57664e9SAndroid Build Coastguard Worker 79*d57664e9SAndroid Build Coastguard Worker // Creates a fence that is signaled, when all the pending GL commands are flushed. 80*d57664e9SAndroid Build Coastguard Worker // Depending on installed extensions, the result is either Android native fence or EGL fence. 81*d57664e9SAndroid Build Coastguard Worker status_t createReleaseFence(bool useFenceSync, EGLSyncKHR* eglFence, int* nativeFence); 82*d57664e9SAndroid Build Coastguard Worker 83*d57664e9SAndroid Build Coastguard Worker private: 84*d57664e9SAndroid Build Coastguard Worker enum class SwapBehavior { 85*d57664e9SAndroid Build Coastguard Worker Discard, 86*d57664e9SAndroid Build Coastguard Worker Preserved, 87*d57664e9SAndroid Build Coastguard Worker BufferAge, 88*d57664e9SAndroid Build Coastguard Worker }; 89*d57664e9SAndroid Build Coastguard Worker 90*d57664e9SAndroid Build Coastguard Worker static EGLConfig load8BitsConfig(EGLDisplay display, SwapBehavior swapBehavior); 91*d57664e9SAndroid Build Coastguard Worker static EGLConfig loadFP16Config(EGLDisplay display, SwapBehavior swapBehavior); 92*d57664e9SAndroid Build Coastguard Worker static EGLConfig load1010102Config(EGLDisplay display, SwapBehavior swapBehavior); 93*d57664e9SAndroid Build Coastguard Worker static EGLConfig loadA8Config(EGLDisplay display, SwapBehavior swapBehavior); 94*d57664e9SAndroid Build Coastguard Worker 95*d57664e9SAndroid Build Coastguard Worker void initExtensions(); 96*d57664e9SAndroid Build Coastguard Worker void createPBufferSurface(); 97*d57664e9SAndroid Build Coastguard Worker void loadConfigs(); 98*d57664e9SAndroid Build Coastguard Worker void createContext(); 99*d57664e9SAndroid Build Coastguard Worker EGLint queryBufferAge(EGLSurface surface); 100*d57664e9SAndroid Build Coastguard Worker 101*d57664e9SAndroid Build Coastguard Worker EGLDisplay mEglDisplay; 102*d57664e9SAndroid Build Coastguard Worker EGLConfig mEglConfig; 103*d57664e9SAndroid Build Coastguard Worker EGLConfig mEglConfigF16; 104*d57664e9SAndroid Build Coastguard Worker EGLConfig mEglConfig1010102; 105*d57664e9SAndroid Build Coastguard Worker EGLConfig mEglConfigA8; 106*d57664e9SAndroid Build Coastguard Worker EGLContext mEglContext; 107*d57664e9SAndroid Build Coastguard Worker EGLSurface mPBufferSurface; 108*d57664e9SAndroid Build Coastguard Worker EGLSurface mCurrentSurface; 109*d57664e9SAndroid Build Coastguard Worker bool mHasWideColorGamutSupport; 110*d57664e9SAndroid Build Coastguard Worker SwapBehavior mSwapBehavior = SwapBehavior::Discard; 111*d57664e9SAndroid Build Coastguard Worker }; 112*d57664e9SAndroid Build Coastguard Worker 113*d57664e9SAndroid Build Coastguard Worker } /* namespace renderthread */ 114*d57664e9SAndroid Build Coastguard Worker } /* namespace uirenderer */ 115*d57664e9SAndroid Build Coastguard Worker } /* namespace android */ 116*d57664e9SAndroid Build Coastguard Worker 117*d57664e9SAndroid Build Coastguard Worker #endif /* EGLMANAGER_H */ 118