GCC Code Coverage Report


Directory: src/gate/
File: src/gate/graphics/platform/opengl_egl_apis.h
Date: 2026-06-21 00:38:37
Exec Total Coverage
Lines: 0 38 0.0%
Functions: 0 2 0.0%
Branches: 0 54 0.0%

Line Branch Exec Source
1 /* GATE PROJECT LICENSE:
2 +----------------------------------------------------------------------------+
3 | Copyright(c) 2018-2026, Stefan Meislinger |
4 | All rights reserved. |
5 | |
6 | Redistribution and use in source and binary forms, with or without |
7 | modification, are permitted provided that the following conditions are met:|
8 | |
9 | 1. Redistributions of source code must retain the above copyright notice, |
10 | this list of conditions and the following disclaimer. |
11 | 2. Redistributions in binary form must reproduce the above copyright |
12 | notice, this list of conditions and the following disclaimer in the |
13 | documentation and/or other materials provided with the distribution. |
14 | |
15 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"|
16 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
17 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
18 | ARE DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
19 | LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
20 | CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
21 | SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
22 | INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
23 | CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
24 | ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF |
25 | THE POSSIBILITY OF SUCH DAMAGE. |
26 +----------------------------------------------------------------------------+
27 */
28 #ifndef GATE_GRAPHICS_PLATFORM_OPENGL_EGL_APIS_H_INCLUDED
29 #define GATE_GRAPHICS_PLATFORM_OPENGL_EGL_APIS_H_INCLUDED
30
31 #include "gate/gatetypes_sys.h"
32
33 #if defined(GATE_SYS_WINCE)
34 typedef ptrdiff_t intptr_t;
35 #endif
36
37 #if defined(GATE_SYS_WASM)
38 # define GATE_OPENGL_EGL_DIRECT_BINDING 1
39 # define GATE_OPENGL_ADD_MISSING_EGL1_ON_EGL2_FUNCS 1
40 #endif
41
42
43 #include "EGL/egl.h"
44 #include "gate/libraries.h"
45 #include "gate/results.h"
46
47 typedef struct gate_egl
48 {
49 EGLBoolean(EGLAPIENTRY* ChooseConfig) (EGLDisplay dpy, const EGLint* attrib_list, EGLConfig* configs, EGLint config_size, EGLint* num_config);
50 EGLBoolean(EGLAPIENTRY* CopyBuffers) (EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target);
51 EGLContext(EGLAPIENTRY* CreateContext) (EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint* attrib_list);
52 EGLSurface(EGLAPIENTRY* CreatePbufferSurface) (EGLDisplay dpy, EGLConfig config, const EGLint* attrib_list);
53 EGLSurface(EGLAPIENTRY* CreatePixmapSurface) (EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint* attrib_list);
54 EGLSurface(EGLAPIENTRY* CreateWindowSurface) (EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win, const EGLint* attrib_list);
55 EGLBoolean(EGLAPIENTRY* DestroyContext) (EGLDisplay dpy, EGLContext ctx);
56 EGLBoolean(EGLAPIENTRY* DestroySurface) (EGLDisplay dpy, EGLSurface surface);
57 EGLBoolean(EGLAPIENTRY* GetConfigAttrib) (EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint* value);
58 EGLBoolean(EGLAPIENTRY* GetConfigs) (EGLDisplay dpy, EGLConfig* configs, EGLint config_size, EGLint* num_config);
59 EGLDisplay(EGLAPIENTRY* GetCurrentDisplay) (void);
60 EGLSurface(EGLAPIENTRY* GetCurrentSurface) (EGLint readdraw);
61 EGLDisplay(EGLAPIENTRY* GetDisplay) (EGLNativeDisplayType display_id);
62 EGLint(EGLAPIENTRY* GetError) (void);
63 __eglMustCastToProperFunctionPointerType(EGLAPIENTRY* GetProcAddress) (const char* procname);
64 EGLBoolean(EGLAPIENTRY* Initialize) (EGLDisplay dpy, EGLint* major, EGLint* minor);
65 EGLBoolean(EGLAPIENTRY* MakeCurrent) (EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx);
66 EGLBoolean(EGLAPIENTRY* QueryContext) (EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint* value);
67 const char* (EGLAPIENTRY* QueryString) (EGLDisplay dpy, EGLint name);
68 EGLBoolean(EGLAPIENTRY* QuerySurface) (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint* value);
69 EGLBoolean(EGLAPIENTRY* SwapBuffers) (EGLDisplay dpy, EGLSurface surface);
70 EGLBoolean(EGLAPIENTRY* Terminate) (EGLDisplay dpy);
71 EGLBoolean(EGLAPIENTRY* WaitGL) (void);
72 EGLBoolean(EGLAPIENTRY* WaitNative) (EGLint engine);
73 } gate_egl_t;
74
75 static gate_egl_t egl = GATE_INIT_EMPTY;
76 static volatile gate_bool_t egl_loaded = false;
77
78
79 #if defined(GATE_OPENGL_EGL_DIRECT_BINDING)
80
81 # define egl_load_lib() GATE_RESULT_OK
82 # define GATE_EGL_LOAD_FUNC_OR_RETURN_ERROR(func_name, func_ptr) *func_ptr = &func_name
83
84 # if defined(GATE_OPENGL_ADD_MISSING_EGL1_ON_EGL2_FUNCS)
85 # if !defined(GATE_GRAPHICS_NO_LEGACY_OPENGL)
86 void glTexEnviv(GLenum target, GLenum pname, const GLint* params)
87 {
88 glTexEnvi(target, pname, *params);
89 }
90 void glMaterialf(GLenum face, GLenum pname, GLfloat param)
91 {
92 glMaterialfv(face, pname, &param);
93 }
94 void glLightf(GLenum light, GLenum pname, GLfloat param)
95 {
96 glLightfv(light, pname, &param);
97 }
98 void glGetMaterialfv(GLenum face, GLenum pname, GLfloat* params)
99 {
100 /* TODO */
101 }
102 void glGetLightfv(GLenum light, GLenum pname, GLfloat* params)
103 {
104 /* TODO */
105 }
106 # endif /* !defined(GATE_GRAPHICS_NO_LEGACY_OPENGL) */
107 EGLBoolean eglCopyBuffers(EGLDisplay display, EGLSurface surface, NativePixmapType native_pixmap)
108 {
109 return 0;
110 }
111 EGLSurface eglCreatePbufferSurface(EGLDisplay display, EGLConfig config, EGLint const* attrib_list)
112 {
113 return EGL_NO_SURFACE;
114 }
115 EGLSurface eglCreatePixmapSurface(EGLDisplay display, EGLConfig config, NativePixmapType native_pixmap, EGLint const * attrib_list)
116 {
117 return EGL_NO_SURFACE;
118 }
119
120 # endif /* defined(GATE_OPENGL_ADD_MISSING_EGL1_ON_EGL2_FUNCS) */
121
122 #else
123
124 # if defined(GATE_SYS_WIN)
125 # define GATE_GL_EGL_LIBNAME "libEGL.dll"
126 # else
127 # define GATE_GL_EGL_LIBNAME "libEGL.so"
128 # endif
129
130 static gate_string_t egl_lib_name = GATE_STRING_INIT_STATIC(GATE_GL_EGL_LIBNAME);
131 static gate_library_t egl_lib = NULL;
132
133
134 static gate_result_t egl_load_lib(void)
135 {
136 gate_result_t ret = GATE_RESULT_OK;
137 if (egl_lib == NULL)
138 {
139 ret = gate_library_open(&egl_lib_name, &egl_lib, GATE_LIBRARY_FLAG_DEFAULT);
140 }
141 return ret;
142 }
143
144 # define GATE_EGL_LOAD_FUNC_OR_RETURN_ERROR(func_name, func_ptr) \
145 do { \
146 const gate_result_t egl_load_result = gate_library_get_function_name(egl_lib, #func_name, func_ptr); \
147 GATE_RETURN_IF_FAILED(egl_load_result); \
148 } while(0)
149
150
151 #endif
152
153
154
155
156 static gate_result_t gate_egl_load_functions(void)
157 {
158 gate_result_t ret = GATE_RESULT_FAILED;
159
160 if (egl_loaded)
161 {
162 return GATE_RESULT_OK;
163 }
164
165 ret = egl_load_lib();
166 if (GATE_FAILED(ret))
167 {
168 return ret;
169 }
170
171 GATE_EGL_LOAD_FUNC_OR_RETURN_ERROR(eglChooseConfig, &egl.ChooseConfig);
172 GATE_EGL_LOAD_FUNC_OR_RETURN_ERROR(eglCopyBuffers, &egl.CopyBuffers);
173 GATE_EGL_LOAD_FUNC_OR_RETURN_ERROR(eglCreateContext, &egl.CreateContext);
174 GATE_EGL_LOAD_FUNC_OR_RETURN_ERROR(eglCreatePbufferSurface, &egl.CreatePbufferSurface);
175 GATE_EGL_LOAD_FUNC_OR_RETURN_ERROR(eglCreatePixmapSurface, &egl.CreatePixmapSurface);
176 GATE_EGL_LOAD_FUNC_OR_RETURN_ERROR(eglCreateWindowSurface, &egl.CreateWindowSurface);
177 GATE_EGL_LOAD_FUNC_OR_RETURN_ERROR(eglDestroyContext, &egl.DestroyContext);
178 GATE_EGL_LOAD_FUNC_OR_RETURN_ERROR(eglDestroySurface, &egl.DestroySurface);
179 GATE_EGL_LOAD_FUNC_OR_RETURN_ERROR(eglGetConfigAttrib, &egl.GetConfigAttrib);
180 GATE_EGL_LOAD_FUNC_OR_RETURN_ERROR(eglGetConfigs, &egl.GetConfigs);
181 GATE_EGL_LOAD_FUNC_OR_RETURN_ERROR(eglGetCurrentDisplay, &egl.GetCurrentDisplay);
182 GATE_EGL_LOAD_FUNC_OR_RETURN_ERROR(eglGetCurrentSurface, &egl.GetCurrentSurface);
183 GATE_EGL_LOAD_FUNC_OR_RETURN_ERROR(eglGetDisplay, &egl.GetDisplay);
184 GATE_EGL_LOAD_FUNC_OR_RETURN_ERROR(eglGetError, &egl.GetError);
185 GATE_EGL_LOAD_FUNC_OR_RETURN_ERROR(eglGetProcAddress, &egl.GetProcAddress);
186 GATE_EGL_LOAD_FUNC_OR_RETURN_ERROR(eglInitialize, &egl.Initialize);
187 GATE_EGL_LOAD_FUNC_OR_RETURN_ERROR(eglMakeCurrent, &egl.MakeCurrent);
188 GATE_EGL_LOAD_FUNC_OR_RETURN_ERROR(eglQueryContext, &egl.QueryContext);
189 GATE_EGL_LOAD_FUNC_OR_RETURN_ERROR(eglQueryString, &egl.QueryString);
190 GATE_EGL_LOAD_FUNC_OR_RETURN_ERROR(eglQuerySurface, &egl.QuerySurface);
191 GATE_EGL_LOAD_FUNC_OR_RETURN_ERROR(eglSwapBuffers, &egl.SwapBuffers);
192 GATE_EGL_LOAD_FUNC_OR_RETURN_ERROR(eglTerminate, &egl.Terminate);
193 GATE_EGL_LOAD_FUNC_OR_RETURN_ERROR(eglWaitGL, &egl.WaitGL);
194 GATE_EGL_LOAD_FUNC_OR_RETURN_ERROR(eglWaitNative, &egl.WaitNative);
195
196 egl_loaded = true;
197 return GATE_RESULT_OK;
198 }
199
200 #endif /* GATE_GRAPHICS_PLATFORM_OPENGL_EGL_APIS_H_INCLUDED */
201