xref: /aosp_15_r20/frameworks/base/libs/hwui/renderthread/EglManager.h (revision d57664e9bc4670b3ecf6748a746a57c557b6bc9e)
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