summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/bgfx/examples/common/entry/entry_sdl.cpp
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/bgfx/examples/common/entry/entry_sdl.cpp')
-rw-r--r--3rdparty/bgfx/examples/common/entry/entry_sdl.cpp98
1 files changed, 68 insertions, 30 deletions
diff --git a/3rdparty/bgfx/examples/common/entry/entry_sdl.cpp b/3rdparty/bgfx/examples/common/entry/entry_sdl.cpp
index d582b034e5e..96aa49149f4 100644
--- a/3rdparty/bgfx/examples/common/entry/entry_sdl.cpp
+++ b/3rdparty/bgfx/examples/common/entry/entry_sdl.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright 2011-2018 Branimir Karadzic. All rights reserved.
+ * Copyright 2011-2019 Branimir Karadzic. All rights reserved.
* License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
@@ -7,9 +7,13 @@
#if ENTRY_CONFIG_USE_SDL
-#if BX_PLATFORM_WINDOWS
+#if BX_PLATFORM_LINUX || BX_PLATFORM_BSD
+# if ENTRY_CONFIG_USE_WAYLAND
+# include <wayland-egl.h>
+# endif
+#elif BX_PLATFORM_WINDOWS
# define SDL_MAIN_HANDLED
-#endif // BX_PLATFORM_WINDOWS
+#endif
#include <bx/os.h>
@@ -34,6 +38,42 @@ BX_PRAGMA_DIAGNOSTIC_POP()
namespace entry
{
+ ///
+ static void* sdlNativeWindowHandle(SDL_Window* _window)
+ {
+ SDL_SysWMinfo wmi;
+ SDL_VERSION(&wmi.version);
+ if (!SDL_GetWindowWMInfo(_window, &wmi) )
+ {
+ return NULL;
+ }
+
+# if BX_PLATFORM_LINUX || BX_PLATFORM_BSD
+# if ENTRY_CONFIG_USE_WAYLAND
+ wl_egl_window *win_impl = (wl_egl_window*)SDL_GetWindowData(_window, "wl_egl_window");
+ if(!win_impl)
+ {
+ int width, height;
+ SDL_GetWindowSize(_window, &width, &height);
+ struct wl_surface* surface = wmi.info.wl.surface;
+ if(!surface)
+ return nullptr;
+ win_impl = wl_egl_window_create(surface, width, height);
+ SDL_SetWindowData(_window, "wl_egl_window", win_impl);
+ }
+ return (void*)(uintptr_t)win_impl;
+# else
+ return (void*)wmi.info.x11.window;
+# endif
+# elif BX_PLATFORM_OSX
+ return wmi.info.cocoa.window;
+# elif BX_PLATFORM_WINDOWS
+ return wmi.info.win.window;
+# elif BX_PLATFORM_STEAMLINK
+ return wmi.info.vivante.window;
+# endif // BX_PLATFORM_
+ }
+
inline bool sdlSetWindow(SDL_Window* _window)
{
SDL_SysWMinfo wmi;
@@ -45,18 +85,20 @@ namespace entry
bgfx::PlatformData pd;
# if BX_PLATFORM_LINUX || BX_PLATFORM_BSD
+# if ENTRY_CONFIG_USE_WAYLAND
+ pd.ndt = wmi.info.wl.display;
+# else
pd.ndt = wmi.info.x11.display;
- pd.nwh = (void*)(uintptr_t)wmi.info.x11.window;
+# endif
# elif BX_PLATFORM_OSX
pd.ndt = NULL;
- pd.nwh = wmi.info.cocoa.window;
# elif BX_PLATFORM_WINDOWS
pd.ndt = NULL;
- pd.nwh = wmi.info.win.window;
# elif BX_PLATFORM_STEAMLINK
pd.ndt = wmi.info.vivante.display;
- pd.nwh = wmi.info.vivante.window;
# endif // BX_PLATFORM_
+ pd.nwh = sdlNativeWindowHandle(_window);
+
pd.context = NULL;
pd.backBuffer = NULL;
pd.backBufferDS = NULL;
@@ -65,6 +107,23 @@ namespace entry
return true;
}
+ static void sdlDestroyWindow(SDL_Window* _window)
+ {
+ if(!_window)
+ return;
+# if BX_PLATFORM_LINUX || BX_PLATFORM_BSD
+# if ENTRY_CONFIG_USE_WAYLAND
+ wl_egl_window *win_impl = (wl_egl_window*)SDL_GetWindowData(_window, "wl_egl_window");
+ if(win_impl)
+ {
+ SDL_SetWindowData(_window, "wl_egl_window", nullptr);
+ wl_egl_window_destroy(win_impl);
+ }
+# endif
+# endif
+ SDL_DestroyWindow(_window);
+ }
+
static uint8_t translateKeyModifiers(uint16_t _sdl)
{
uint8_t modifiers = 0;
@@ -252,27 +311,6 @@ namespace entry
static int32_t threadFunc(bx::Thread* _thread, void* _userData);
};
- ///
- static void* sdlNativeWindowHandle(SDL_Window* _window)
- {
- SDL_SysWMinfo wmi;
- SDL_VERSION(&wmi.version);
- if (!SDL_GetWindowWMInfo(_window, &wmi) )
- {
- return NULL;
- }
-
-# if BX_PLATFORM_LINUX || BX_PLATFORM_BSD
- return (void*)wmi.info.x11.window;
-# elif BX_PLATFORM_OSX
- return wmi.info.cocoa.window;
-# elif BX_PLATFORM_WINDOWS
- return wmi.info.win.window;
-# elif BX_PLATFORM_STEAMLINK
- return wmi.info.vivante.window;
-# endif // BX_PLATFORM_
- }
-
struct Msg
{
Msg()
@@ -858,7 +896,7 @@ namespace entry
if (isValid(handle) )
{
m_eventQueue.postWindowEvent(handle);
- SDL_DestroyWindow(m_window[handle.idx]);
+ sdlDestroyWindow(m_window[handle.idx]);
m_window[handle.idx] = NULL;
}
}
@@ -952,7 +990,7 @@ namespace entry
while (bgfx::RenderFrame::NoContext != bgfx::renderFrame() ) {};
m_thread.shutdown();
- SDL_DestroyWindow(m_window[0]);
+ sdlDestroyWindow(m_window[0]);
SDL_Quit();
return m_thread.getExitCode();