1 | /* |
2 | Simple DirectMedia Layer |
3 | Copyright (C) 1997-2021 Sam Lantinga <slouken@libsdl.org> |
4 | |
5 | This software is provided 'as-is', without any express or implied |
6 | warranty. In no event will the authors be held liable for any damages |
7 | arising from the use of this software. |
8 | |
9 | Permission is granted to anyone to use this software for any purpose, |
10 | including commercial applications, and to alter it and redistribute it |
11 | freely, subject to the following restrictions: |
12 | |
13 | 1. The origin of this software must not be misrepresented; you must not |
14 | claim that you wrote the original software. If you use this software |
15 | in a product, an acknowledgment in the product documentation would be |
16 | appreciated but is not required. |
17 | 2. Altered source versions must be plainly marked as such, and must not be |
18 | misrepresented as being the original software. |
19 | 3. This notice may not be removed or altered from any source distribution. |
20 | */ |
21 | #include "../SDL_internal.h" |
22 | |
23 | #ifndef SDL_egl_h_ |
24 | #define SDL_egl_h_ |
25 | |
26 | #if SDL_VIDEO_OPENGL_EGL |
27 | |
28 | #include "SDL_egl.h" |
29 | |
30 | #include "SDL_sysvideo.h" |
31 | |
32 | #define SDL_EGL_MAX_DEVICES 8 |
33 | |
34 | typedef struct SDL_EGL_VideoData |
35 | { |
36 | void *egl_dll_handle, *dll_handle; |
37 | EGLDisplay egl_display; |
38 | EGLConfig egl_config; |
39 | int egl_swapinterval; |
40 | int egl_surfacetype; |
41 | int egl_version_major, egl_version_minor; |
42 | EGLint egl_required_visual_id; |
43 | |
44 | EGLDisplay(EGLAPIENTRY *eglGetDisplay) (NativeDisplayType display); |
45 | EGLDisplay(EGLAPIENTRY *eglGetPlatformDisplay) (EGLenum platform, |
46 | void *native_display, |
47 | const EGLint *attrib_list); |
48 | EGLDisplay(EGLAPIENTRY *eglGetPlatformDisplayEXT) (EGLenum platform, |
49 | void *native_display, |
50 | const EGLint *attrib_list); |
51 | EGLBoolean(EGLAPIENTRY *eglInitialize) (EGLDisplay dpy, EGLint * major, |
52 | EGLint * minor); |
53 | EGLBoolean(EGLAPIENTRY *eglTerminate) (EGLDisplay dpy); |
54 | |
55 | void *(EGLAPIENTRY *eglGetProcAddress) (const char * procName); |
56 | |
57 | EGLBoolean(EGLAPIENTRY *eglChooseConfig) (EGLDisplay dpy, |
58 | const EGLint * attrib_list, |
59 | EGLConfig * configs, |
60 | EGLint config_size, EGLint * num_config); |
61 | |
62 | EGLContext(EGLAPIENTRY *eglCreateContext) (EGLDisplay dpy, |
63 | EGLConfig config, |
64 | EGLContext share_list, |
65 | const EGLint * attrib_list); |
66 | |
67 | EGLBoolean(EGLAPIENTRY *eglDestroyContext) (EGLDisplay dpy, EGLContext ctx); |
68 | |
69 | EGLSurface(EGLAPIENTRY *eglCreatePbufferSurface)(EGLDisplay dpy, EGLConfig config, |
70 | EGLint const* attrib_list); |
71 | |
72 | EGLSurface(EGLAPIENTRY *eglCreateWindowSurface) (EGLDisplay dpy, |
73 | EGLConfig config, |
74 | NativeWindowType window, |
75 | const EGLint * attrib_list); |
76 | EGLBoolean(EGLAPIENTRY *eglDestroySurface) (EGLDisplay dpy, EGLSurface surface); |
77 | |
78 | EGLBoolean(EGLAPIENTRY *eglMakeCurrent) (EGLDisplay dpy, EGLSurface draw, |
79 | EGLSurface read, EGLContext ctx); |
80 | |
81 | EGLBoolean(EGLAPIENTRY *eglSwapBuffers) (EGLDisplay dpy, EGLSurface draw); |
82 | |
83 | EGLBoolean(EGLAPIENTRY *eglSwapInterval) (EGLDisplay dpy, EGLint interval); |
84 | |
85 | const char *(EGLAPIENTRY *eglQueryString) (EGLDisplay dpy, EGLint name); |
86 | |
87 | EGLenum(EGLAPIENTRY *eglQueryAPI)(void); |
88 | |
89 | EGLBoolean(EGLAPIENTRY *eglGetConfigAttrib) (EGLDisplay dpy, EGLConfig config, |
90 | EGLint attribute, EGLint * value); |
91 | |
92 | EGLBoolean(EGLAPIENTRY *eglWaitNative) (EGLint engine); |
93 | |
94 | EGLBoolean(EGLAPIENTRY *eglWaitGL)(void); |
95 | |
96 | EGLBoolean(EGLAPIENTRY *eglBindAPI)(EGLenum); |
97 | |
98 | EGLint(EGLAPIENTRY *eglGetError)(void); |
99 | |
100 | EGLBoolean(EGLAPIENTRY *eglQueryDevicesEXT)(EGLint max_devices, |
101 | void **devices, |
102 | EGLint *num_devices); |
103 | |
104 | /* Atomic functions */ |
105 | |
106 | EGLSyncKHR(EGLAPIENTRY *eglCreateSyncKHR)(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list); |
107 | |
108 | EGLBoolean(EGLAPIENTRY *eglDestroySyncKHR)(EGLDisplay dpy, EGLSyncKHR sync); |
109 | |
110 | EGLint(EGLAPIENTRY *eglDupNativeFenceFDANDROID)(EGLDisplay dpy, EGLSyncKHR sync); |
111 | |
112 | EGLint(EGLAPIENTRY *eglWaitSyncKHR)(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags); |
113 | |
114 | EGLint(EGLAPIENTRY *eglClientWaitSyncKHR)(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout); |
115 | |
116 | /* Atomic functions end */ |
117 | |
118 | |
119 | /* whether EGL display was offscreen */ |
120 | int is_offscreen; |
121 | |
122 | } SDL_EGL_VideoData; |
123 | |
124 | /* OpenGLES functions */ |
125 | typedef enum SDL_EGL_ExtensionType { |
126 | SDL_EGL_DISPLAY_EXTENSION, |
127 | SDL_EGL_CLIENT_EXTENSION |
128 | } SDL_EGL_ExtensionType; |
129 | |
130 | extern SDL_bool SDL_EGL_HasExtension(_THIS, SDL_EGL_ExtensionType type, const char *ext); |
131 | |
132 | extern int SDL_EGL_GetAttribute(_THIS, SDL_GLattr attrib, int *value); |
133 | /* SDL_EGL_LoadLibrary can get a display for a specific platform (EGL_PLATFORM_*) |
134 | * or, if 0 is passed, let the implementation decide. |
135 | */ |
136 | extern int SDL_EGL_LoadLibraryOnly(_THIS, const char *path); |
137 | extern int SDL_EGL_LoadLibrary(_THIS, const char *path, NativeDisplayType native_display, EGLenum platform); |
138 | extern void *SDL_EGL_GetProcAddress(_THIS, const char *proc); |
139 | extern void SDL_EGL_UnloadLibrary(_THIS); |
140 | extern void SDL_EGL_SetRequiredVisualId(_THIS, int visual_id); |
141 | extern int SDL_EGL_ChooseConfig(_THIS); |
142 | extern int SDL_EGL_SetSwapInterval(_THIS, int interval); |
143 | extern int SDL_EGL_GetSwapInterval(_THIS); |
144 | extern void SDL_EGL_DeleteContext(_THIS, SDL_GLContext context); |
145 | extern EGLSurface *SDL_EGL_CreateSurface(_THIS, NativeWindowType nw); |
146 | extern void SDL_EGL_DestroySurface(_THIS, EGLSurface egl_surface); |
147 | |
148 | extern EGLSurface SDL_EGL_CreateOffscreenSurface(_THIS, int width, int height); |
149 | /* Assumes that LoadLibraryOnly() has succeeded */ |
150 | extern int SDL_EGL_InitializeOffscreen(_THIS, int device); |
151 | |
152 | /* These need to be wrapped to get the surface for the window by the platform GLES implementation */ |
153 | extern SDL_GLContext SDL_EGL_CreateContext(_THIS, EGLSurface egl_surface); |
154 | extern int SDL_EGL_MakeCurrent(_THIS, EGLSurface egl_surface, SDL_GLContext context); |
155 | extern int SDL_EGL_SwapBuffers(_THIS, EGLSurface egl_surface); |
156 | |
157 | /* SDL Error-reporting */ |
158 | extern int SDL_EGL_SetErrorEx(const char * message, const char * eglFunctionName, EGLint eglErrorCode); |
159 | #define SDL_EGL_SetError(message, eglFunctionName) SDL_EGL_SetErrorEx(message, eglFunctionName, _this->egl_data->eglGetError()) |
160 | |
161 | /* A few of useful macros */ |
162 | |
163 | #define SDL_EGL_SwapWindow_impl(BACKEND) int \ |
164 | BACKEND ## _GLES_SwapWindow(_THIS, SDL_Window * window) \ |
165 | {\ |
166 | return SDL_EGL_SwapBuffers(_this, ((SDL_WindowData *) window->driverdata)->egl_surface);\ |
167 | } |
168 | |
169 | #define SDL_EGL_MakeCurrent_impl(BACKEND) int \ |
170 | BACKEND ## _GLES_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context) \ |
171 | {\ |
172 | return SDL_EGL_MakeCurrent(_this, window ? ((SDL_WindowData *) window->driverdata)->egl_surface : EGL_NO_SURFACE, context);\ |
173 | } |
174 | |
175 | #define SDL_EGL_CreateContext_impl(BACKEND) SDL_GLContext \ |
176 | BACKEND ## _GLES_CreateContext(_THIS, SDL_Window * window) \ |
177 | {\ |
178 | return SDL_EGL_CreateContext(_this, ((SDL_WindowData *) window->driverdata)->egl_surface);\ |
179 | } |
180 | |
181 | #endif /* SDL_VIDEO_OPENGL_EGL */ |
182 | |
183 | #endif /* SDL_egl_h_ */ |
184 | |
185 | /* vi: set ts=4 sw=4 expandtab: */ |
186 | |