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 | #if SDL_VIDEO_DRIVER_X11 && SDL_VIDEO_OPENGL_EGL |
24 | |
25 | #include "SDL_hints.h" |
26 | #include "SDL_x11video.h" |
27 | #include "SDL_x11opengles.h" |
28 | #include "SDL_x11opengl.h" |
29 | |
30 | /* EGL implementation of SDL OpenGL support */ |
31 | |
32 | int |
33 | X11_GLES_LoadLibrary(_THIS, const char *path) |
34 | { |
35 | SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; |
36 | |
37 | /* If the profile requested is not GL ES, switch over to X11_GL functions */ |
38 | if ((_this->gl_config.profile_mask != SDL_GL_CONTEXT_PROFILE_ES) && |
39 | !SDL_GetHintBoolean(SDL_HINT_VIDEO_X11_FORCE_EGL, SDL_FALSE)) { |
40 | #if SDL_VIDEO_OPENGL_GLX |
41 | X11_GLES_UnloadLibrary(_this); |
42 | _this->GL_LoadLibrary = X11_GL_LoadLibrary; |
43 | _this->GL_GetProcAddress = X11_GL_GetProcAddress; |
44 | _this->GL_UnloadLibrary = X11_GL_UnloadLibrary; |
45 | _this->GL_CreateContext = X11_GL_CreateContext; |
46 | _this->GL_MakeCurrent = X11_GL_MakeCurrent; |
47 | _this->GL_SetSwapInterval = X11_GL_SetSwapInterval; |
48 | _this->GL_GetSwapInterval = X11_GL_GetSwapInterval; |
49 | _this->GL_SwapWindow = X11_GL_SwapWindow; |
50 | _this->GL_DeleteContext = X11_GL_DeleteContext; |
51 | return X11_GL_LoadLibrary(_this, path); |
52 | #else |
53 | return SDL_SetError("SDL not configured with OpenGL/GLX support" ); |
54 | #endif |
55 | } |
56 | |
57 | return SDL_EGL_LoadLibrary(_this, path, (NativeDisplayType) data->display, 0); |
58 | } |
59 | |
60 | XVisualInfo * |
61 | X11_GLES_GetVisual(_THIS, Display * display, int screen) |
62 | { |
63 | |
64 | XVisualInfo *egl_visualinfo = NULL; |
65 | EGLint visual_id; |
66 | XVisualInfo vi_in; |
67 | int out_count; |
68 | |
69 | if (!_this->egl_data) { |
70 | /* The EGL library wasn't loaded, SDL_GetError() should have info */ |
71 | return NULL; |
72 | } |
73 | |
74 | if (_this->egl_data->eglGetConfigAttrib(_this->egl_data->egl_display, |
75 | _this->egl_data->egl_config, |
76 | EGL_NATIVE_VISUAL_ID, |
77 | &visual_id) == EGL_FALSE || !visual_id) { |
78 | /* Use the default visual when all else fails */ |
79 | vi_in.screen = screen; |
80 | egl_visualinfo = X11_XGetVisualInfo(display, |
81 | VisualScreenMask, |
82 | &vi_in, &out_count); |
83 | } else { |
84 | vi_in.screen = screen; |
85 | vi_in.visualid = visual_id; |
86 | egl_visualinfo = X11_XGetVisualInfo(display, VisualScreenMask | VisualIDMask, &vi_in, &out_count); |
87 | } |
88 | |
89 | return egl_visualinfo; |
90 | } |
91 | |
92 | SDL_GLContext |
93 | X11_GLES_CreateContext(_THIS, SDL_Window * window) |
94 | { |
95 | SDL_GLContext context; |
96 | SDL_WindowData *data = (SDL_WindowData *) window->driverdata; |
97 | Display *display = data->videodata->display; |
98 | |
99 | X11_XSync(display, False); |
100 | context = SDL_EGL_CreateContext(_this, data->egl_surface); |
101 | X11_XSync(display, False); |
102 | |
103 | return context; |
104 | } |
105 | |
106 | SDL_EGL_SwapWindow_impl(X11) |
107 | SDL_EGL_MakeCurrent_impl(X11) |
108 | |
109 | #endif /* SDL_VIDEO_DRIVER_X11 && SDL_VIDEO_OPENGL_EGL */ |
110 | |
111 | /* vi: set ts=4 sw=4 expandtab: */ |
112 | |