@@ -128,6 +128,39 @@ EGL_IMPORT
128128 }
129129#endif // BGFX_USE_GL_DYNAMIC_LIB
130130
131+
132+ #if defined(WL_EGL_PLATFORM)
133+ #define WL_EGL_IMPORT \
134+ WL_EGL_FUNC (struct wl_egl_window *, wl_egl_window_create, (struct wl_surface *, int , int )) \
135+ WL_EGL_FUNC(void , wl_egl_window_destroy, (struct wl_egl_window *)) \
136+ WL_EGL_FUNC(void , wl_egl_window_resize, (struct wl_egl_window *, int , int , int , int )) \
137+ WL_EGL_FUNC(void , wl_egl_window_get_attached_size, (struct wl_egl_window *, int *, int *)) \
138+
139+ #define WL_EGL_FUNC (rt, fname, params ) \
140+ typedef rt (*PFNWLEGL_##fname) params; \
141+ PFNWLEGL_##fname BGFX_WAYLAND_##fname;
142+ WL_EGL_IMPORT
143+ #undef WL_EGL_FUNC
144+
145+ void *waylandEglOpen () {
146+ void *so = bx::dlopen (" libwayland-egl.so.1" );
147+ BGFX_FATAL (so != NULL , Fatal::UnableToInitialize, " Could not dlopen() libwayland-egl.so.1" );
148+
149+ #define WL_EGL_FUNC (rt, fname, params ) BGFX_WAYLAND_##fname = (PFNWLEGL_##fname) bx::dlsym(so, #fname);
150+ WL_EGL_IMPORT
151+ #undef WL_EGL_FUNC
152+
153+ return so;
154+ }
155+
156+ void waylandEglClose (void *so) {
157+ bx::dlclose (so);
158+ #define WL_EGL_FUNC (rt, fname, params ) BGFX_WAYLAND_##fname = NULL ;
159+ WL_EGL_IMPORT
160+ #undef WL_EGL_FUNC
161+ }
162+ #endif
163+
131164# define GL_IMPORT (_optional, _proto, _func, _import ) _proto _func = NULL
132165# include " glimports.h"
133166
@@ -335,9 +368,11 @@ EGL_IMPORT
335368
336369# if BX_PLATFORM_LINUX && defined(WL_EGL_PLATFORM)
337370 if (g_platformData.type == NativeWindowHandleType::Wayland) {
371+ m_waylandEglLibrary = waylandEglOpen ();
372+
338373 // A wl_surface needs to be first wrapped in a wl_egl_window
339374 // before it can be used to create the EGLSurface.
340- m_egl_window = wl_egl_window_create ((wl_surface*)nwh, _width, _height);
375+ m_egl_window = BGFX_WAYLAND_wl_egl_window_create ((wl_surface*)nwh, _width, _height);
341376 nwh = m_egl_window;
342377 }
343378# endif
@@ -444,7 +479,9 @@ EGL_IMPORT
444479 EGL_CHECK (eglDestroySurface (m_display, m_surface) );
445480# if BX_PLATFORM_LINUX && defined(WL_EGL_PLATFORM)
446481 if (m_egl_window) {
447- wl_egl_window_destroy (m_egl_window);
482+ BGFX_WAYLAND_wl_egl_window_destroy (m_egl_window);
483+ waylandEglClose (m_waylandEglLibrary);
484+ m_waylandEglLibrary = NULL ;
448485 }
449486# endif
450487 EGL_CHECK (eglTerminate (m_display) );
@@ -453,6 +490,7 @@ EGL_IMPORT
453490
454491 EGL_CHECK (eglReleaseThread () );
455492 eglClose (m_eglLibrary);
493+ m_eglLibrary = NULL ;
456494
457495# if BX_PLATFORM_RPI
458496 bcm_host_deinit ();
@@ -480,7 +518,7 @@ EGL_IMPORT
480518 EMSCRIPTEN_CHECK (emscripten_set_canvas_element_size (HTML5_TARGET_CANVAS_SELECTOR, _width, _height) );
481519# elif BX_PLATFORM_LINUX && defined(WL_EGL_PLATFORM)
482520 if (NULL != m_egl_window) {
483- wl_egl_window_resize (m_egl_window, _width, _height, 0 , 0 );
521+ BGFX_WAYLAND_wl_egl_window_resize (m_egl_window, _width, _height, 0 , 0 );
484522 }
485523# else
486524 BX_UNUSED (_width, _height);
0 commit comments