xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/gl/egl/FunctionsEGL.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1 //
2 // Copyright 2016 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6 
7 // FunctionsEGL.h: Defines the FunctionsEGL class to load functions and data from EGL
8 
9 #ifndef LIBANGLE_RENDERER_GL_CROS_FUNCTIONSEGL_H_
10 #define LIBANGLE_RENDERER_GL_CROS_FUNCTIONSEGL_H_
11 
12 #include <EGL/egl.h>
13 #include <EGL/eglext.h>
14 
15 #include <string>
16 #include <vector>
17 
18 #include "libANGLE/Error.h"
19 
20 namespace rx
21 {
22 
23 class FunctionsGL;
24 
25 class FunctionsEGL
26 {
27   public:
28     FunctionsEGL();
29     virtual ~FunctionsEGL();
30 
31     int majorVersion;
32     int minorVersion;
33     std::string vendorString;
34     std::string versionString;
35 
36     egl::Error initialize(EGLAttrib platformType, EGLNativeDisplayType nativeDisplay);
37     egl::Error terminate();
38 
39     virtual void *getProcAddress(const char *name) const = 0;
40 
41     FunctionsGL *makeFunctionsGL() const;
42     bool hasExtension(const char *extension) const;
43     bool hasDmaBufImportModifierFunctions() const;
44     EGLDisplay getDisplay() const;
45     EGLint getError() const;
46 
47     EGLBoolean chooseConfig(EGLint const *attrib_list,
48                             EGLConfig *configs,
49                             EGLint config_size,
50                             EGLint *num_config) const;
51     EGLBoolean getConfigs(EGLConfig *configs, EGLint config_size, EGLint *num_config) const;
52     EGLBoolean getConfigAttrib(EGLConfig config, EGLint attribute, EGLint *value) const;
53     EGLSurface getCurrentSurface(EGLint readdraw) const;
54     EGLContext createContext(EGLConfig config,
55                              EGLContext share_context,
56                              EGLint const *attrib_list) const;
57     EGLSurface createPbufferSurface(EGLConfig config, const EGLint *attrib_list) const;
58     EGLSurface createWindowSurface(EGLConfig config,
59                                    EGLNativeWindowType win,
60                                    const EGLint *attrib_list) const;
61     EGLBoolean destroyContext(EGLContext context) const;
62     EGLBoolean destroySurface(EGLSurface surface) const;
63     EGLBoolean makeCurrent(EGLSurface surface, EGLContext context) const;
64     const char *queryString(EGLint name) const;
65     EGLBoolean querySurface(EGLSurface surface, EGLint attribute, EGLint *value) const;
66     EGLBoolean swapBuffers(EGLSurface surface) const;
67 
68     EGLBoolean bindTexImage(EGLSurface surface, EGLint buffer) const;
69     EGLBoolean releaseTexImage(EGLSurface surface, EGLint buffer) const;
70     EGLBoolean surfaceAttrib(EGLSurface surface, EGLint attribute, EGLint value) const;
71     EGLBoolean swapInterval(EGLint interval) const;
72 
73     EGLContext getCurrentContext() const;
74 
75     EGLImageKHR createImageKHR(EGLContext context,
76                                EGLenum target,
77                                EGLClientBuffer buffer,
78                                const EGLint *attrib_list) const;
79     EGLBoolean destroyImageKHR(EGLImageKHR image) const;
80 
81     EGLSyncKHR createSyncKHR(EGLenum type, const EGLint *attrib_list) const;
82     EGLBoolean destroySyncKHR(EGLSyncKHR sync) const;
83     EGLint clientWaitSyncKHR(EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout) const;
84     EGLBoolean getSyncAttribKHR(EGLSyncKHR sync, EGLint attribute, EGLint *value) const;
85 
86     EGLint waitSyncKHR(EGLSyncKHR sync, EGLint flags) const;
87 
88     EGLBoolean swapBuffersWithDamageKHR(EGLSurface surface,
89                                         const EGLint *rects,
90                                         EGLint n_rects) const;
91 
92     EGLBoolean presentationTimeANDROID(EGLSurface surface, EGLnsecsANDROID time) const;
93 
94     void setBlobCacheFuncsANDROID(EGLSetBlobFuncANDROID set, EGLGetBlobFuncANDROID get) const;
95 
96     EGLBoolean getCompositorTimingSupportedANDROID(EGLSurface surface, EGLint name) const;
97     EGLBoolean getCompositorTimingANDROID(EGLSurface surface,
98                                           EGLint numTimestamps,
99                                           const EGLint *names,
100                                           EGLnsecsANDROID *values) const;
101     EGLBoolean getNextFrameIdANDROID(EGLSurface surface, EGLuint64KHR *frameId) const;
102     EGLBoolean getFrameTimestampSupportedANDROID(EGLSurface surface, EGLint timestamp) const;
103     EGLBoolean getFrameTimestampsANDROID(EGLSurface surface,
104                                          EGLuint64KHR frameId,
105                                          EGLint numTimestamps,
106                                          const EGLint *timestamps,
107                                          EGLnsecsANDROID *values) const;
108 
109     EGLint dupNativeFenceFDANDROID(EGLSync sync) const;
110 
111     EGLint queryDmaBufFormatsEXT(EGLint maxFormats, EGLint *formats, EGLint *numFormats) const;
112 
113     EGLint queryDmaBufModifiersEXT(EGLint format,
114                                    EGLint maxModifiers,
115                                    EGLuint64KHR *modifiers,
116                                    EGLBoolean *externalOnly,
117                                    EGLint *numModifiers) const;
118 
119     EGLBoolean queryDeviceAttribEXT(EGLDisplay dpy, EGLint attribute, EGLAttrib *value) const;
120     const char *queryDeviceStringEXT(EGLDeviceEXT device, EGLint name) const;
121     EGLBoolean queryDisplayAttribEXT(EGLint attribute, EGLAttrib *value) const;
122 
123   private:
124     // So as to isolate from angle we do not include angleutils.h and cannot
125     // use angle::NonCopyable so we replicated it here instead.
126     FunctionsEGL(const FunctionsEGL &)   = delete;
127     void operator=(const FunctionsEGL &) = delete;
128 
129     // Helper mechanism for creating a display for the desired platform type.
130     EGLDisplay getPlatformDisplay(EGLAttrib platformType, EGLNativeDisplayType nativeDisplay);
131 
132     // Helper method to populate EGL extensions. Returns true if extensions are found.
133     bool queryExtensions();
134 
135     // Helper method to query egl for devices.
136     std::vector<EGLDeviceEXT> queryDevices(int *major, int *minor);
137 
138     // Fallback mechanism for creating a display from a native device object.
139     EGLDisplay getNativeDisplay(int *major, int *minor);
140 
141 #if defined(ANGLE_HAS_LIBDRM)
142     // Helper method to select preferred EGL device from queried devices.
143     EGLDeviceEXT getPreferredEGLDevice(const std::vector<EGLDeviceEXT> &devices);
144 
145     // Helper method to get preferred display.
146     EGLDisplay getPreferredDisplay(int *major, int *minor);
147 #endif  // defined(ANGLE_HAS_LIBDRM)
148 
149     struct EGLDispatchTable;
150     EGLDispatchTable *mFnPtrs;
151     EGLDisplay mEGLDisplay;
152     std::vector<std::string> mExtensions;
153 };
154 }  // namespace rx
155 
156 #endif  // LIBANGLE_RENDERER_GL_CROS_FUNCTIONSEGL_H_
157