From f4d463990a4ea3fe56a95ba641a70bfbc34f891c Mon Sep 17 00:00:00 2001 From: Julian Sikorski Date: Thu, 17 Aug 2023 16:54:31 +0200 Subject: [PATCH] Allow simultaneous X11 and Wayland support (#3152) * Allow simultaneous X11 and Wayland support * Add NativeWindowHandleType * Set default value for g_platformData.type * Use g_platformData.type to check for a native Wayland window * Stub getNativeWindowHandleType on platform where Wayland is not an option * Implement getNativeWindowHandleType for GLFW * Add getNativeWindowHandleType to the remaining C++ examples * Add getNativeWindowHandleType to the C example --- examples/00-helloworld/helloworld.cpp | 1 + examples/01-cubes/cubes.cpp | 1 + examples/02-metaballs/metaballs.cpp | 1 + examples/03-raymarch/raymarch.cpp | 1 + examples/04-mesh/mesh.cpp | 1 + examples/05-instancing/instancing.cpp | 1 + examples/06-bump/bump.cpp | 1 + examples/07-callback/callback.cpp | 1 + examples/08-update/update.cpp | 1 + examples/09-hdr/hdr.cpp | 1 + examples/10-font/font.cpp | 1 + examples/11-fontsdf/fontsdf.cpp | 1 + examples/12-lod/lod.cpp | 1 + examples/13-stencil/stencil.cpp | 1 + examples/14-shadowvolumes/shadowvolumes.cpp | 1 + .../shadowmaps_simple.cpp | 1 + examples/16-shadowmaps/shadowmaps.cpp | 1 + examples/17-drawstress/drawstress.cpp | 1 + examples/18-ibl/ibl.cpp | 1 + examples/19-oit/oit.cpp | 1 + examples/20-nanovg/nanovg.cpp | 1 + examples/21-deferred/deferred.cpp | 1 + examples/22-windows/windows.cpp | 1 + examples/24-nbody/nbody.cpp | 1 + examples/25-c99/helloworld.c | 2 + examples/26-occlusion/occlusion.cpp | 1 + examples/27-terrain/terrain.cpp | 1 + examples/28-wireframe/wireframe.cpp | 1 + examples/29-debugdraw/debugdraw.cpp | 1 + examples/30-picking/picking.cpp | 1 + examples/31-rsm/reflectiveshadowmap.cpp | 1 + examples/32-particles/particles.cpp | 1 + examples/33-pom/pom.cpp | 1 + examples/34-mvs/mvs.cpp | 1 + examples/35-dynamic/dynamic.cpp | 1 + examples/36-sky/sky.cpp | 1 + .../gpudrivenrendering.cpp | 1 + examples/38-bloom/bloom.cpp | 1 + examples/39-assao/assao.cpp | 1 + examples/40-svt/svt.cpp | 1 + examples/41-tess/tess.cpp | 1 + examples/42-bunnylod/bunnylod.cpp | 1 + examples/43-denoise/denoise.cpp | 1 + examples/44-sss/screen_space_shadows.cpp | 1 + examples/45-bokeh/bokeh.cpp | 1 + examples/47-pixelformats/pixelformats.cpp | 1 + examples/48-drawindirect/drawindirect.cpp | 1 + examples/49-hextile/hextile.cpp | 1 + examples/common/entry/entry.cpp | 5 ++ examples/common/entry/entry.h | 4 ++ examples/common/entry/entry_android.cpp | 5 ++ examples/common/entry/entry_glfw.cpp | 13 ++++ examples/common/entry/entry_html5.cpp | 5 ++ examples/common/entry/entry_ios.mm | 5 ++ examples/common/entry/entry_noop.cpp | 5 ++ examples/common/entry/entry_osx.mm | 5 ++ examples/common/entry/entry_sdl.cpp | 61 +++++++++++----- examples/common/entry/entry_windows.cpp | 5 ++ examples/common/entry/entry_x11.cpp | 5 ++ include/bgfx/bgfx.h | 35 +++++++--- include/bgfx/c99/bgfx.h | 18 +++++ src/bgfx.cpp | 1 + src/renderer_vk.cpp | 69 ++++++++++--------- src/renderer_vk.h | 15 +++- 64 files changed, 240 insertions(+), 65 deletions(-) diff --git a/examples/00-helloworld/helloworld.cpp b/examples/00-helloworld/helloworld.cpp index 37f8e0a3f..8b9891952 100644 --- a/examples/00-helloworld/helloworld.cpp +++ b/examples/00-helloworld/helloworld.cpp @@ -34,6 +34,7 @@ public: init.vendorId = args.m_pciId; init.platformData.nwh = entry::getNativeWindowHandle(entry::kDefaultWindowHandle); init.platformData.ndt = entry::getNativeDisplayHandle(); + init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle); init.resolution.width = m_width; init.resolution.height = m_height; init.resolution.reset = m_reset; diff --git a/examples/01-cubes/cubes.cpp b/examples/01-cubes/cubes.cpp index 4f8084001..4c3da5c52 100644 --- a/examples/01-cubes/cubes.cpp +++ b/examples/01-cubes/cubes.cpp @@ -149,6 +149,7 @@ public: init.vendorId = args.m_pciId; init.platformData.nwh = entry::getNativeWindowHandle(entry::kDefaultWindowHandle); init.platformData.ndt = entry::getNativeDisplayHandle(); + init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle); init.resolution.width = m_width; init.resolution.height = m_height; init.resolution.reset = m_reset; diff --git a/examples/02-metaballs/metaballs.cpp b/examples/02-metaballs/metaballs.cpp index 95ca1dbe0..8c42f2211 100644 --- a/examples/02-metaballs/metaballs.cpp +++ b/examples/02-metaballs/metaballs.cpp @@ -508,6 +508,7 @@ public: init.vendorId = args.m_pciId; init.platformData.nwh = entry::getNativeWindowHandle(entry::kDefaultWindowHandle); init.platformData.ndt = entry::getNativeDisplayHandle(); + init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle); init.resolution.width = m_width; init.resolution.height = m_height; init.resolution.reset = m_reset; diff --git a/examples/03-raymarch/raymarch.cpp b/examples/03-raymarch/raymarch.cpp index c84039762..ddbd73fe0 100644 --- a/examples/03-raymarch/raymarch.cpp +++ b/examples/03-raymarch/raymarch.cpp @@ -121,6 +121,7 @@ public: init.vendorId = args.m_pciId; init.platformData.nwh = entry::getNativeWindowHandle(entry::kDefaultWindowHandle); init.platformData.ndt = entry::getNativeDisplayHandle(); + init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle); init.resolution.width = m_width; init.resolution.height = m_height; init.resolution.reset = m_reset; diff --git a/examples/04-mesh/mesh.cpp b/examples/04-mesh/mesh.cpp index dd5837198..40469bd14 100644 --- a/examples/04-mesh/mesh.cpp +++ b/examples/04-mesh/mesh.cpp @@ -32,6 +32,7 @@ public: init.vendorId = args.m_pciId; init.platformData.nwh = entry::getNativeWindowHandle(entry::kDefaultWindowHandle); init.platformData.ndt = entry::getNativeDisplayHandle(); + init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle); init.resolution.width = m_width; init.resolution.height = m_height; init.resolution.reset = m_reset; diff --git a/examples/05-instancing/instancing.cpp b/examples/05-instancing/instancing.cpp index 307f56fb0..9d5a804b0 100644 --- a/examples/05-instancing/instancing.cpp +++ b/examples/05-instancing/instancing.cpp @@ -84,6 +84,7 @@ public: init.vendorId = args.m_pciId; init.platformData.nwh = entry::getNativeWindowHandle(entry::kDefaultWindowHandle); init.platformData.ndt = entry::getNativeDisplayHandle(); + init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle); init.resolution.width = m_width; init.resolution.height = m_height; init.resolution.reset = m_reset; diff --git a/examples/06-bump/bump.cpp b/examples/06-bump/bump.cpp index ca9cfc7b6..93aeeb386 100644 --- a/examples/06-bump/bump.cpp +++ b/examples/06-bump/bump.cpp @@ -104,6 +104,7 @@ public: init.vendorId = args.m_pciId; init.platformData.nwh = entry::getNativeWindowHandle(entry::kDefaultWindowHandle); init.platformData.ndt = entry::getNativeDisplayHandle(); + init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle); init.resolution.width = m_width; init.resolution.height = m_height; init.resolution.reset = m_reset; diff --git a/examples/07-callback/callback.cpp b/examples/07-callback/callback.cpp index d660d7f4f..2b7f59c8b 100644 --- a/examples/07-callback/callback.cpp +++ b/examples/07-callback/callback.cpp @@ -331,6 +331,7 @@ public: init.vendorId = args.m_pciId; init.platformData.nwh = entry::getNativeWindowHandle(entry::kDefaultWindowHandle); init.platformData.ndt = entry::getNativeDisplayHandle(); + init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle); init.resolution.width = m_width; init.resolution.height = m_height; init.resolution.reset = m_reset; diff --git a/examples/08-update/update.cpp b/examples/08-update/update.cpp index dfabaef2d..d6fe77960 100644 --- a/examples/08-update/update.cpp +++ b/examples/08-update/update.cpp @@ -247,6 +247,7 @@ public: init.vendorId = args.m_pciId; init.platformData.nwh = entry::getNativeWindowHandle(entry::kDefaultWindowHandle); init.platformData.ndt = entry::getNativeDisplayHandle(); + init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle); init.resolution.width = m_width; init.resolution.height = m_height; init.resolution.reset = m_reset; diff --git a/examples/09-hdr/hdr.cpp b/examples/09-hdr/hdr.cpp index 3d0af4346..626f10aab 100644 --- a/examples/09-hdr/hdr.cpp +++ b/examples/09-hdr/hdr.cpp @@ -159,6 +159,7 @@ public: init.vendorId = args.m_pciId; init.platformData.nwh = entry::getNativeWindowHandle(entry::kDefaultWindowHandle); init.platformData.ndt = entry::getNativeDisplayHandle(); + init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle); init.resolution.width = m_width; init.resolution.height = m_height; init.resolution.reset = m_reset; diff --git a/examples/10-font/font.cpp b/examples/10-font/font.cpp index 7e7be1b16..0a886594c 100644 --- a/examples/10-font/font.cpp +++ b/examples/10-font/font.cpp @@ -73,6 +73,7 @@ public: init.vendorId = args.m_pciId; init.platformData.nwh = entry::getNativeWindowHandle(entry::kDefaultWindowHandle); init.platformData.ndt = entry::getNativeDisplayHandle(); + init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle); init.resolution.width = m_width; init.resolution.height = m_height; init.resolution.reset = m_reset; diff --git a/examples/11-fontsdf/fontsdf.cpp b/examples/11-fontsdf/fontsdf.cpp index 0b2de43a2..08a2dbf53 100644 --- a/examples/11-fontsdf/fontsdf.cpp +++ b/examples/11-fontsdf/fontsdf.cpp @@ -56,6 +56,7 @@ public: init.vendorId = args.m_pciId; init.platformData.nwh = entry::getNativeWindowHandle(entry::kDefaultWindowHandle); init.platformData.ndt = entry::getNativeDisplayHandle(); + init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle); init.resolution.width = m_width; init.resolution.height = m_height; init.resolution.reset = m_reset; diff --git a/examples/12-lod/lod.cpp b/examples/12-lod/lod.cpp index b717c961e..b429334a8 100644 --- a/examples/12-lod/lod.cpp +++ b/examples/12-lod/lod.cpp @@ -48,6 +48,7 @@ public: init.vendorId = args.m_pciId; init.platformData.nwh = entry::getNativeWindowHandle(entry::kDefaultWindowHandle); init.platformData.ndt = entry::getNativeDisplayHandle(); + init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle); init.resolution.width = m_width; init.resolution.height = m_height; init.resolution.reset = m_reset; diff --git a/examples/13-stencil/stencil.cpp b/examples/13-stencil/stencil.cpp index 3acd5d501..cfbf0615c 100644 --- a/examples/13-stencil/stencil.cpp +++ b/examples/13-stencil/stencil.cpp @@ -814,6 +814,7 @@ public: init.vendorId = args.m_pciId; init.platformData.nwh = entry::getNativeWindowHandle(entry::kDefaultWindowHandle); init.platformData.ndt = entry::getNativeDisplayHandle(); + init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle); init.resolution.width = m_viewState.m_width; init.resolution.height = m_viewState.m_height; init.resolution.reset = m_reset; diff --git a/examples/14-shadowvolumes/shadowvolumes.cpp b/examples/14-shadowvolumes/shadowvolumes.cpp index 2df07dec0..48828eba6 100644 --- a/examples/14-shadowvolumes/shadowvolumes.cpp +++ b/examples/14-shadowvolumes/shadowvolumes.cpp @@ -1786,6 +1786,7 @@ public: init.vendorId = args.m_pciId; init.platformData.nwh = entry::getNativeWindowHandle(entry::kDefaultWindowHandle); init.platformData.ndt = entry::getNativeDisplayHandle(); + init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle); init.resolution.width = m_viewState.m_width; init.resolution.height = m_viewState.m_height; init.resolution.reset = m_reset; diff --git a/examples/15-shadowmaps-simple/shadowmaps_simple.cpp b/examples/15-shadowmaps-simple/shadowmaps_simple.cpp index 236b859e0..bfd4a75a0 100644 --- a/examples/15-shadowmaps-simple/shadowmaps_simple.cpp +++ b/examples/15-shadowmaps-simple/shadowmaps_simple.cpp @@ -80,6 +80,7 @@ public: init.vendorId = args.m_pciId; init.platformData.nwh = entry::getNativeWindowHandle(entry::kDefaultWindowHandle); init.platformData.ndt = entry::getNativeDisplayHandle(); + init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle); init.resolution.width = m_width; init.resolution.height = m_height; init.resolution.reset = m_reset; diff --git a/examples/16-shadowmaps/shadowmaps.cpp b/examples/16-shadowmaps/shadowmaps.cpp index 4ab7b7e60..e85f6dfab 100644 --- a/examples/16-shadowmaps/shadowmaps.cpp +++ b/examples/16-shadowmaps/shadowmaps.cpp @@ -1159,6 +1159,7 @@ public: init.vendorId = args.m_pciId; init.platformData.nwh = entry::getNativeWindowHandle(entry::kDefaultWindowHandle); init.platformData.ndt = entry::getNativeDisplayHandle(); + init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle); init.resolution.width = m_viewState.m_width; init.resolution.height = m_viewState.m_height; init.resolution.reset = m_reset; diff --git a/examples/17-drawstress/drawstress.cpp b/examples/17-drawstress/drawstress.cpp index aa9c6ecf6..c76cf9d27 100644 --- a/examples/17-drawstress/drawstress.cpp +++ b/examples/17-drawstress/drawstress.cpp @@ -131,6 +131,7 @@ public: init.vendorId = args.m_pciId; init.platformData.nwh = entry::getNativeWindowHandle(entry::kDefaultWindowHandle); init.platformData.ndt = entry::getNativeDisplayHandle(); + init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle); init.resolution.width = m_width; init.resolution.height = m_height; init.resolution.reset = m_reset; diff --git a/examples/18-ibl/ibl.cpp b/examples/18-ibl/ibl.cpp index 54a785561..fc3286b45 100644 --- a/examples/18-ibl/ibl.cpp +++ b/examples/18-ibl/ibl.cpp @@ -420,6 +420,7 @@ public: init.vendorId = args.m_pciId; init.platformData.nwh = entry::getNativeWindowHandle(entry::kDefaultWindowHandle); init.platformData.ndt = entry::getNativeDisplayHandle(); + init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle); init.resolution.width = m_width; init.resolution.height = m_height; init.resolution.reset = m_reset; diff --git a/examples/19-oit/oit.cpp b/examples/19-oit/oit.cpp index 4d4fc4bef..fa846b529 100644 --- a/examples/19-oit/oit.cpp +++ b/examples/19-oit/oit.cpp @@ -171,6 +171,7 @@ public: init.vendorId = args.m_pciId; init.platformData.nwh = entry::getNativeWindowHandle(entry::kDefaultWindowHandle); init.platformData.ndt = entry::getNativeDisplayHandle(); + init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle); init.resolution.width = m_width; init.resolution.height = m_height; init.resolution.reset = m_reset; diff --git a/examples/20-nanovg/nanovg.cpp b/examples/20-nanovg/nanovg.cpp index 51b21b936..62c17bcb9 100644 --- a/examples/20-nanovg/nanovg.cpp +++ b/examples/20-nanovg/nanovg.cpp @@ -1404,6 +1404,7 @@ public: init.vendorId = args.m_pciId; init.platformData.nwh = entry::getNativeWindowHandle(entry::kDefaultWindowHandle); init.platformData.ndt = entry::getNativeDisplayHandle(); + init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle); init.resolution.width = m_width; init.resolution.height = m_height; init.resolution.reset = m_reset; diff --git a/examples/21-deferred/deferred.cpp b/examples/21-deferred/deferred.cpp index 47adbabfc..5fa1636c1 100644 --- a/examples/21-deferred/deferred.cpp +++ b/examples/21-deferred/deferred.cpp @@ -213,6 +213,7 @@ public: init.vendorId = args.m_pciId; init.platformData.nwh = entry::getNativeWindowHandle(entry::kDefaultWindowHandle); init.platformData.ndt = entry::getNativeDisplayHandle(); + init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle); init.resolution.width = m_width; init.resolution.height = m_height; init.resolution.reset = m_reset; diff --git a/examples/22-windows/windows.cpp b/examples/22-windows/windows.cpp index 8f9150e43..04b9b26e1 100644 --- a/examples/22-windows/windows.cpp +++ b/examples/22-windows/windows.cpp @@ -88,6 +88,7 @@ public: init.vendorId = args.m_pciId; init.platformData.nwh = entry::getNativeWindowHandle(entry::kDefaultWindowHandle); init.platformData.ndt = entry::getNativeDisplayHandle(); + init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle); init.resolution.width = m_width; init.resolution.height = m_height; init.resolution.reset = m_reset; diff --git a/examples/24-nbody/nbody.cpp b/examples/24-nbody/nbody.cpp index 620470542..b47469d8c 100644 --- a/examples/24-nbody/nbody.cpp +++ b/examples/24-nbody/nbody.cpp @@ -132,6 +132,7 @@ public: init.vendorId = args.m_pciId; init.platformData.nwh = entry::getNativeWindowHandle(entry::kDefaultWindowHandle); init.platformData.ndt = entry::getNativeDisplayHandle(); + init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle); init.resolution.width = m_width; init.resolution.height = m_height; init.resolution.reset = m_reset; diff --git a/examples/25-c99/helloworld.c b/examples/25-c99/helloworld.c index 44879f97d..fcbff3d6c 100644 --- a/examples/25-c99/helloworld.c +++ b/examples/25-c99/helloworld.c @@ -9,6 +9,7 @@ extern bool entry_process_events(uint32_t* _width, uint32_t* _height, uint32_t* _debug, uint32_t* _reset); extern void* entry_get_default_native_window_handle(void); extern void* entry_get_native_display_handle(void); +extern bgfx_native_window_handle_type_t entry_get_native_window_handle_type(void); uint16_t uint16_max(uint16_t _a, uint16_t _b) { @@ -29,6 +30,7 @@ int32_t _main_(int32_t _argc, char** _argv) init.platformData.nwh = entry_get_default_native_window_handle(); init.platformData.ndt = entry_get_native_display_handle(); + init.platformData.type = entry_get_native_window_handle_type(); bgfx_init(&init); bgfx_reset(width, height, reset, init.resolution.format); diff --git a/examples/26-occlusion/occlusion.cpp b/examples/26-occlusion/occlusion.cpp index 929fff42a..57cfa097c 100644 --- a/examples/26-occlusion/occlusion.cpp +++ b/examples/26-occlusion/occlusion.cpp @@ -84,6 +84,7 @@ public: init.vendorId = args.m_pciId; init.platformData.nwh = entry::getNativeWindowHandle(entry::kDefaultWindowHandle); init.platformData.ndt = entry::getNativeDisplayHandle(); + init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle); init.resolution.width = m_width; init.resolution.height = m_height; init.resolution.reset = m_reset; diff --git a/examples/27-terrain/terrain.cpp b/examples/27-terrain/terrain.cpp index 64f1ba650..867e50894 100644 --- a/examples/27-terrain/terrain.cpp +++ b/examples/27-terrain/terrain.cpp @@ -80,6 +80,7 @@ ExampleTerrain(const char* _name, const char* _description, const char* _url) init.vendorId = args.m_pciId; init.platformData.nwh = entry::getNativeWindowHandle(entry::kDefaultWindowHandle); init.platformData.ndt = entry::getNativeDisplayHandle(); + init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle); init.resolution.width = m_width; init.resolution.height = m_height; init.resolution.reset = m_reset; diff --git a/examples/28-wireframe/wireframe.cpp b/examples/28-wireframe/wireframe.cpp index 24347c8cb..397577ba1 100644 --- a/examples/28-wireframe/wireframe.cpp +++ b/examples/28-wireframe/wireframe.cpp @@ -293,6 +293,7 @@ public: init.vendorId = args.m_pciId; init.platformData.nwh = entry::getNativeWindowHandle(entry::kDefaultWindowHandle); init.platformData.ndt = entry::getNativeDisplayHandle(); + init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle); init.resolution.width = m_width; init.resolution.height = m_height; init.resolution.reset = m_reset; diff --git a/examples/29-debugdraw/debugdraw.cpp b/examples/29-debugdraw/debugdraw.cpp index 5f2be270f..20a240fb4 100644 --- a/examples/29-debugdraw/debugdraw.cpp +++ b/examples/29-debugdraw/debugdraw.cpp @@ -780,6 +780,7 @@ public: init.vendorId = args.m_pciId; init.platformData.nwh = entry::getNativeWindowHandle(entry::kDefaultWindowHandle); init.platformData.ndt = entry::getNativeDisplayHandle(); + init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle); init.resolution.width = m_width; init.resolution.height = m_height; init.resolution.reset = m_reset; diff --git a/examples/30-picking/picking.cpp b/examples/30-picking/picking.cpp index a77395e8d..9a5c36d8f 100644 --- a/examples/30-picking/picking.cpp +++ b/examples/30-picking/picking.cpp @@ -40,6 +40,7 @@ public: init.vendorId = args.m_pciId; init.platformData.nwh = entry::getNativeWindowHandle(entry::kDefaultWindowHandle); init.platformData.ndt = entry::getNativeDisplayHandle(); + init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle); init.resolution.width = m_width; init.resolution.height = m_height; init.resolution.reset = m_reset; diff --git a/examples/31-rsm/reflectiveshadowmap.cpp b/examples/31-rsm/reflectiveshadowmap.cpp index 358893f9b..65dfe345c 100644 --- a/examples/31-rsm/reflectiveshadowmap.cpp +++ b/examples/31-rsm/reflectiveshadowmap.cpp @@ -213,6 +213,7 @@ public: init.vendorId = args.m_pciId; init.platformData.nwh = entry::getNativeWindowHandle(entry::kDefaultWindowHandle); init.platformData.ndt = entry::getNativeDisplayHandle(); + init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle); init.resolution.width = m_width; init.resolution.height = m_height; init.resolution.reset = m_reset; diff --git a/examples/32-particles/particles.cpp b/examples/32-particles/particles.cpp index 0d573a9dc..12ab607af 100644 --- a/examples/32-particles/particles.cpp +++ b/examples/32-particles/particles.cpp @@ -248,6 +248,7 @@ public: init.vendorId = args.m_pciId; init.platformData.nwh = entry::getNativeWindowHandle(entry::kDefaultWindowHandle); init.platformData.ndt = entry::getNativeDisplayHandle(); + init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle); init.resolution.width = m_width; init.resolution.height = m_height; init.resolution.reset = m_reset; diff --git a/examples/33-pom/pom.cpp b/examples/33-pom/pom.cpp index f655f7143..508178faf 100644 --- a/examples/33-pom/pom.cpp +++ b/examples/33-pom/pom.cpp @@ -130,6 +130,7 @@ public: init.vendorId = args.m_pciId; init.platformData.nwh = entry::getNativeWindowHandle(entry::kDefaultWindowHandle); init.platformData.ndt = entry::getNativeDisplayHandle(); + init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle); init.resolution.width = m_width; init.resolution.height = m_height; init.resolution.reset = m_reset; diff --git a/examples/34-mvs/mvs.cpp b/examples/34-mvs/mvs.cpp index 8782f7f48..7fecebead 100644 --- a/examples/34-mvs/mvs.cpp +++ b/examples/34-mvs/mvs.cpp @@ -126,6 +126,7 @@ public: init.vendorId = args.m_pciId; init.platformData.nwh = entry::getNativeWindowHandle(entry::kDefaultWindowHandle); init.platformData.ndt = entry::getNativeDisplayHandle(); + init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle); init.resolution.width = m_width; init.resolution.height = m_height; init.resolution.reset = m_reset; diff --git a/examples/35-dynamic/dynamic.cpp b/examples/35-dynamic/dynamic.cpp index 8d5f2191c..7ee451f5e 100644 --- a/examples/35-dynamic/dynamic.cpp +++ b/examples/35-dynamic/dynamic.cpp @@ -104,6 +104,7 @@ public: init.vendorId = args.m_pciId; init.platformData.nwh = entry::getNativeWindowHandle(entry::kDefaultWindowHandle); init.platformData.ndt = entry::getNativeDisplayHandle(); + init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle); init.resolution.width = m_width; init.resolution.height = m_height; init.resolution.reset = m_reset; diff --git a/examples/36-sky/sky.cpp b/examples/36-sky/sky.cpp index 5c04dfa89..b82c31fda 100644 --- a/examples/36-sky/sky.cpp +++ b/examples/36-sky/sky.cpp @@ -420,6 +420,7 @@ public: init.vendorId = args.m_pciId; init.platformData.nwh = entry::getNativeWindowHandle(entry::kDefaultWindowHandle); init.platformData.ndt = entry::getNativeDisplayHandle(); + init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle); init.resolution.width = m_width; init.resolution.height = m_height; init.resolution.reset = m_reset; diff --git a/examples/37-gpudrivenrendering/gpudrivenrendering.cpp b/examples/37-gpudrivenrendering/gpudrivenrendering.cpp index aa6f5bfb7..5a3ff9acc 100644 --- a/examples/37-gpudrivenrendering/gpudrivenrendering.cpp +++ b/examples/37-gpudrivenrendering/gpudrivenrendering.cpp @@ -330,6 +330,7 @@ public: init.vendorId = args.m_pciId; init.platformData.nwh = entry::getNativeWindowHandle(entry::kDefaultWindowHandle); init.platformData.ndt = entry::getNativeDisplayHandle(); + init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle); init.resolution.width = m_width; init.resolution.height = m_height; init.resolution.reset = m_reset; diff --git a/examples/38-bloom/bloom.cpp b/examples/38-bloom/bloom.cpp index 312eef0e7..99dcb7307 100644 --- a/examples/38-bloom/bloom.cpp +++ b/examples/38-bloom/bloom.cpp @@ -200,6 +200,7 @@ public: init.vendorId = args.m_pciId; init.platformData.nwh = entry::getNativeWindowHandle(entry::kDefaultWindowHandle); init.platformData.ndt = entry::getNativeDisplayHandle(); + init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle); init.resolution.width = m_width; init.resolution.height = m_height; init.resolution.reset = m_reset; diff --git a/examples/39-assao/assao.cpp b/examples/39-assao/assao.cpp index 45d1e92b7..fbff0f29c 100644 --- a/examples/39-assao/assao.cpp +++ b/examples/39-assao/assao.cpp @@ -271,6 +271,7 @@ namespace init.vendorId = args.m_pciId; init.platformData.nwh = entry::getNativeWindowHandle(entry::kDefaultWindowHandle); init.platformData.ndt = entry::getNativeDisplayHandle(); + init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle); init.resolution.width = m_width; init.resolution.height = m_height; init.resolution.reset = m_reset; diff --git a/examples/40-svt/svt.cpp b/examples/40-svt/svt.cpp index caab49c34..3256f6495 100644 --- a/examples/40-svt/svt.cpp +++ b/examples/40-svt/svt.cpp @@ -82,6 +82,7 @@ public: init.vendorId = args.m_pciId; init.platformData.nwh = entry::getNativeWindowHandle(entry::kDefaultWindowHandle); init.platformData.ndt = entry::getNativeDisplayHandle(); + init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle); init.resolution.width = m_width; init.resolution.height = m_height; init.resolution.reset = m_reset; diff --git a/examples/41-tess/tess.cpp b/examples/41-tess/tess.cpp index 45566ddcd..8f0ef1643 100644 --- a/examples/41-tess/tess.cpp +++ b/examples/41-tess/tess.cpp @@ -339,6 +339,7 @@ public: init.vendorId = args.m_pciId; init.platformData.nwh = entry::getNativeWindowHandle(entry::kDefaultWindowHandle); init.platformData.ndt = entry::getNativeDisplayHandle(); + init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle); init.resolution.width = m_width; init.resolution.height = m_height; init.resolution.reset = m_reset; diff --git a/examples/42-bunnylod/bunnylod.cpp b/examples/42-bunnylod/bunnylod.cpp index 800facb53..4bfbbf907 100644 --- a/examples/42-bunnylod/bunnylod.cpp +++ b/examples/42-bunnylod/bunnylod.cpp @@ -264,6 +264,7 @@ public: init.vendorId = args.m_pciId; init.platformData.nwh = entry::getNativeWindowHandle(entry::kDefaultWindowHandle); init.platformData.ndt = entry::getNativeDisplayHandle(); + init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle); init.resolution.width = m_width; init.resolution.height = m_height; init.resolution.reset = m_reset; diff --git a/examples/43-denoise/denoise.cpp b/examples/43-denoise/denoise.cpp index 3c9c2ef29..f9ff556a0 100644 --- a/examples/43-denoise/denoise.cpp +++ b/examples/43-denoise/denoise.cpp @@ -253,6 +253,7 @@ public: init.vendorId = args.m_pciId; init.platformData.nwh = entry::getNativeWindowHandle(entry::kDefaultWindowHandle); init.platformData.ndt = entry::getNativeDisplayHandle(); + init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle); init.resolution.width = m_width; init.resolution.height = m_height; init.resolution.reset = m_reset; diff --git a/examples/44-sss/screen_space_shadows.cpp b/examples/44-sss/screen_space_shadows.cpp index 7a142baa3..1bf85b0e9 100644 --- a/examples/44-sss/screen_space_shadows.cpp +++ b/examples/44-sss/screen_space_shadows.cpp @@ -265,6 +265,7 @@ public: init.vendorId = args.m_pciId; init.platformData.nwh = entry::getNativeWindowHandle(entry::kDefaultWindowHandle); init.platformData.ndt = entry::getNativeDisplayHandle(); + init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle); init.resolution.width = m_width; init.resolution.height = m_height; init.resolution.reset = m_reset; diff --git a/examples/45-bokeh/bokeh.cpp b/examples/45-bokeh/bokeh.cpp index b1ed78f42..965db7475 100644 --- a/examples/45-bokeh/bokeh.cpp +++ b/examples/45-bokeh/bokeh.cpp @@ -247,6 +247,7 @@ public: init.vendorId = args.m_pciId; init.platformData.nwh = entry::getNativeWindowHandle(entry::kDefaultWindowHandle); init.platformData.ndt = entry::getNativeDisplayHandle(); + init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle); init.resolution.width = m_width; init.resolution.height = m_height; init.resolution.reset = m_reset; diff --git a/examples/47-pixelformats/pixelformats.cpp b/examples/47-pixelformats/pixelformats.cpp index fcd1198e4..4eb79532d 100644 --- a/examples/47-pixelformats/pixelformats.cpp +++ b/examples/47-pixelformats/pixelformats.cpp @@ -429,6 +429,7 @@ public: init.vendorId = args.m_pciId; init.platformData.nwh = entry::getNativeWindowHandle(entry::kDefaultWindowHandle); init.platformData.ndt = entry::getNativeDisplayHandle(); + init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle); init.resolution.width = m_width; init.resolution.height = m_height; init.resolution.reset = m_reset; diff --git a/examples/48-drawindirect/drawindirect.cpp b/examples/48-drawindirect/drawindirect.cpp index d8b4d6d58..65fffa123 100644 --- a/examples/48-drawindirect/drawindirect.cpp +++ b/examples/48-drawindirect/drawindirect.cpp @@ -146,6 +146,7 @@ public: init.vendorId = args.m_pciId; init.platformData.nwh = entry::getNativeWindowHandle(entry::kDefaultWindowHandle); init.platformData.ndt = entry::getNativeDisplayHandle(); + init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle); init.resolution.width = m_width; init.resolution.height = m_height; init.resolution.reset = m_reset; diff --git a/examples/49-hextile/hextile.cpp b/examples/49-hextile/hextile.cpp index ecef40bf2..58dc2c7e3 100644 --- a/examples/49-hextile/hextile.cpp +++ b/examples/49-hextile/hextile.cpp @@ -85,6 +85,7 @@ namespace init.vendorId = args.m_pciId; init.platformData.nwh = entry::getNativeWindowHandle(entry::kDefaultWindowHandle); init.platformData.ndt = entry::getNativeDisplayHandle(); + init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle); init.resolution.width = m_width; init.resolution.height = m_height; init.resolution.reset = m_reset; diff --git a/examples/common/entry/entry.cpp b/examples/common/entry/entry.cpp index 04c702153..14a489250 100644 --- a/examples/common/entry/entry.cpp +++ b/examples/common/entry/entry.cpp @@ -1037,3 +1037,8 @@ extern "C" void* entry_get_native_display_handle() { return entry::getNativeDisplayHandle(); } + +extern "C" bgfx::NativeWindowHandleType::Enum entry_get_native_window_handle_type() +{ + return entry::getNativeWindowHandleType(entry::kDefaultWindowHandle); +} diff --git a/examples/common/entry/entry.h b/examples/common/entry/entry.h index 8be3ea071..9867aa874 100644 --- a/examples/common/entry/entry.h +++ b/examples/common/entry/entry.h @@ -7,6 +7,7 @@ #define ENTRY_H_HEADER_GUARD #include "dbg.h" +#include #include #include #include @@ -297,6 +298,9 @@ namespace entry /// void* getNativeDisplayHandle(); + /// + bgfx::NativeWindowHandleType::Enum getNativeWindowHandleType(WindowHandle _handle); + /// void setCurrentDir(const char* _dir); diff --git a/examples/common/entry/entry_android.cpp b/examples/common/entry/entry_android.cpp index 36f7fc898..aad91e3dd 100644 --- a/examples/common/entry/entry_android.cpp +++ b/examples/common/entry/entry_android.cpp @@ -550,6 +550,11 @@ namespace entry return NULL; } + bgfx::NativeWindowHandleType::Enum getNativeWindowHandleType(WindowHandle _handle) + { + return bgfx::NativeWindowHandleType::Default; + } + int32_t MainThreadEntry::threadFunc(bx::Thread* _thread, void* _userData) { BX_UNUSED(_thread); diff --git a/examples/common/entry/entry_glfw.cpp b/examples/common/entry/entry_glfw.cpp index 82336fbc9..071672696 100644 --- a/examples/common/entry/entry_glfw.cpp +++ b/examples/common/entry/entry_glfw.cpp @@ -875,6 +875,19 @@ namespace entry # endif // BX_PLATFORM_* } + bgfx::NativeWindowHandleType::Enum getNativeWindowHandleType(WindowHandle _handle) + { +# if BX_PLATFORM_LINUX || BX_PLATFORM_BSD +# if ENTRY_CONFIG_USE_WAYLAND + return bgfx::NativeWindowHandleType::Wayland; +# else + return bgfx::NativeWindowHandleType::Default; +# endif // ENTRY_CONFIG_USE_WAYLAND +# else + return bgfx::NativeWindowHandleType::Default; +# endif // BX_PLATFORM_* + } + int32_t MainThreadEntry::threadFunc(bx::Thread* _thread, void* _userData) { BX_UNUSED(_thread); diff --git a/examples/common/entry/entry_html5.cpp b/examples/common/entry/entry_html5.cpp index eb83904c8..6f01e5ac2 100644 --- a/examples/common/entry/entry_html5.cpp +++ b/examples/common/entry/entry_html5.cpp @@ -427,6 +427,11 @@ namespace entry { return NULL; } + + bgfx::NativeWindowHandleType::Enum getNativeWindowHandleType(WindowHandle _handle) + { + return bgfx::NativeWindowHandleType::Default; + } } int main(int _argc, const char* const* _argv) diff --git a/examples/common/entry/entry_ios.mm b/examples/common/entry/entry_ios.mm index 44acb7ad8..541cc3751 100644 --- a/examples/common/entry/entry_ios.mm +++ b/examples/common/entry/entry_ios.mm @@ -161,6 +161,11 @@ namespace entry return NULL; } + bgfx::NativeWindowHandleType::Enum getNativeWindowHandleType(WindowHandle _handle) + { + return bgfx::NativeWindowHandleType::Default; + } + } // namespace entry using namespace entry; diff --git a/examples/common/entry/entry_noop.cpp b/examples/common/entry/entry_noop.cpp index be0b4595c..59aa08753 100644 --- a/examples/common/entry/entry_noop.cpp +++ b/examples/common/entry/entry_noop.cpp @@ -78,6 +78,11 @@ namespace entry return NULL; } + bgfx::NativeWindowHandleType::Enum getNativeWindowHandleType(WindowHandle _handle) + { + return bgfx::NativeWindowHandleType::Default; + } + } // namespace entry int main(int _argc, const char* const* _argv) diff --git a/examples/common/entry/entry_osx.mm b/examples/common/entry/entry_osx.mm index 5db8db7b0..195e262e3 100644 --- a/examples/common/entry/entry_osx.mm +++ b/examples/common/entry/entry_osx.mm @@ -725,6 +725,11 @@ namespace entry return NULL; } + bgfx::NativeWindowHandleType::Enum getNativeWindowHandleType(WindowHandle _handle) + { + return bgfx::NativeWindowHandleType::Default; + } + } // namespace entry @implementation AppDelegate diff --git a/examples/common/entry/entry_sdl.cpp b/examples/common/entry/entry_sdl.cpp index 32a54da37..2d5e9c15e 100644 --- a/examples/common/entry/entry_sdl.cpp +++ b/examples/common/entry/entry_sdl.cpp @@ -50,21 +50,24 @@ namespace entry # 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 + if (wmi.subsystem == SDL_SYSWM_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 +# endif // ENTRY_CONFIG_USE_WAYLAND + return (void*)wmi.info.x11.window; # elif BX_PLATFORM_OSX || BX_PLATFORM_IOS return wmi.info.cocoa.window; # elif BX_PLATFORM_WINDOWS @@ -1145,18 +1148,38 @@ namespace entry { return NULL; } - # if BX_PLATFORM_LINUX || BX_PLATFORM_BSD # if ENTRY_CONFIG_USE_WAYLAND - return wmi.info.wl.display; -# else - return wmi.info.x11.display; + if (wmi.subsystem == SDL_SYSWM_WAYLAND) + return wmi.info.wl.display; + else # endif // ENTRY_CONFIG_USE_WAYLAND + return wmi.info.x11.display; # else return NULL; # endif // BX_PLATFORM_* } + bgfx::NativeWindowHandleType::Enum getNativeWindowHandleType(WindowHandle _handle) + { + SDL_SysWMinfo wmi; + SDL_VERSION(&wmi.version); + if (!SDL_GetWindowWMInfo(s_ctx.m_window[_handle.idx], &wmi) ) + { + return bgfx::NativeWindowHandleType::Default; + } +# if BX_PLATFORM_LINUX || BX_PLATFORM_BSD +# if ENTRY_CONFIG_USE_WAYLAND + if (wmi.subsystem == SDL_SYSWM_WAYLAND) + return bgfx::NativeWindowHandleType::Wayland; + else +# endif // ENTRY_CONFIG_USE_WAYLAND + return bgfx::NativeWindowHandleType::Default; +# else + return bgfx::NativeWindowHandleType::Default; +# endif // BX_PLATFORM_* + } + int32_t MainThreadEntry::threadFunc(bx::Thread* _thread, void* _userData) { BX_UNUSED(_thread); diff --git a/examples/common/entry/entry_windows.cpp b/examples/common/entry/entry_windows.cpp index 114d36d38..9d30463c5 100644 --- a/examples/common/entry/entry_windows.cpp +++ b/examples/common/entry/entry_windows.cpp @@ -1169,6 +1169,11 @@ namespace entry return NULL; } + bgfx::NativeWindowHandleType::Enum getNativeWindowHandleType(WindowHandle _handle) + { + return bgfx::NativeWindowHandleType::Default; + } + int32_t MainThreadEntry::threadFunc(bx::Thread* /*_thread*/, void* _userData) { MainThreadEntry* self = (MainThreadEntry*)_userData; diff --git a/examples/common/entry/entry_x11.cpp b/examples/common/entry/entry_x11.cpp index 7347af489..33c790d66 100644 --- a/examples/common/entry/entry_x11.cpp +++ b/examples/common/entry/entry_x11.cpp @@ -771,6 +771,11 @@ namespace entry return s_ctx.m_display; } + bgfx::NativeWindowHandleType::Enum getNativeWindowHandleType(WindowHandle _handle) + { + return bgfx::NativeWindowHandleType::Default; + } + } // namespace entry int main(int _argc, const char* const* _argv) diff --git a/include/bgfx/bgfx.h b/include/bgfx/bgfx.h index 484c68960..46347c383 100644 --- a/include/bgfx/bgfx.h +++ b/include/bgfx/bgfx.h @@ -403,6 +403,22 @@ namespace bgfx }; }; + /// Native window handle type. + /// + /// @attention C99's equivalent binding is `bgfx_native_window_handle_type_t`. + /// + + struct NativeWindowHandleType + { + enum Enum + { + Default = 0, //!< Platform default handle type (X11 on Linux). + Wayland, //!< Wayland. + + Count + }; + }; + static const uint16_t kInvalidHandle = UINT16_MAX; BGFX_HANDLE(DynamicIndexBufferHandle) @@ -622,15 +638,16 @@ namespace bgfx { PlatformData(); - void* ndt; //!< Native display type (*nix specific). - void* nwh; //!< Native window handle. If `NULL`, bgfx will create a headless - /// context/device, provided the rendering API supports it. - void* context; //!< GL context, D3D device, or Vulkan device. If `NULL`, bgfx - /// will create context/device. - void* backBuffer; //!< GL back-buffer, or D3D render target view. If `NULL` bgfx will - /// create back-buffer color surface. - void* backBufferDS; //!< Backbuffer depth/stencil. If `NULL`, bgfx will create a back-buffer - /// depth/stencil surface. + void* ndt; //!< Native display type (*nix specific). + void* nwh; //!< Native window handle. If `NULL`, bgfx will create a headless + /// context/device, provided the rendering API supports it. + void* context; //!< GL context, D3D device, or Vulkan device. If `NULL`, bgfx + /// will create context/device. + void* backBuffer; //!< GL back-buffer, or D3D render target view. If `NULL` bgfx will + /// create back-buffer color surface. + void* backBufferDS; //!< Backbuffer depth/stencil. If `NULL`, bgfx will create a back-buffer + /// depth/stencil surface. + NativeWindowHandleType::Enum type; //!< Handle type. Needed for platforms having more than one option. }; /// Backbuffer resolution and reset parameters. diff --git a/include/bgfx/c99/bgfx.h b/include/bgfx/c99/bgfx.h index cf2e9c283..f79e93241 100644 --- a/include/bgfx/c99/bgfx.h +++ b/include/bgfx/c99/bgfx.h @@ -391,6 +391,19 @@ typedef enum bgfx_view_mode } bgfx_view_mode_t; +/** + * Native window handle type.. + * + */ +typedef enum bgfx_native_window_handle_type +{ + BGFX_NATIVE_WINDOW_HANDLE_TYPE_DEFAULT, /** ( 0) Platform default handle type (X11 on Linux) */ + BGFX_NATIVE_WINDOW_HANDLE_TYPE_WAYLAND, /** ( 1) Wayland. */ + + BGFX_NATIVE_WINDOW_HANDLE_TYPE_COUNT + +} bgfx_native_window_handle_type_t; + /** * Render frame enum. * @@ -625,6 +638,11 @@ typedef struct bgfx_platform_data_s */ void* backBufferDS; + /** + * Handle type. Needed for platforms having more than one option. + */ + bgfx_native_window_handle_type_t type; + } bgfx_platform_data_t; /** diff --git a/src/bgfx.cpp b/src/bgfx.cpp index 60f0bdd1f..9b70b9dba 100644 --- a/src/bgfx.cpp +++ b/src/bgfx.cpp @@ -3437,6 +3437,7 @@ namespace bgfx , context(NULL) , backBuffer(NULL) , backBufferDS(NULL) + , type(NativeWindowHandleType::Default) { } diff --git a/src/renderer_vk.cpp b/src/renderer_vk.cpp index d0639a7cc..18c2c1806 100644 --- a/src/renderer_vk.cpp +++ b/src/renderer_vk.cpp @@ -1230,7 +1230,7 @@ VK_IMPORT BX_TRACE("\t%s", layer.m_name); } } -#if BX_PLATFORM_OSX +#if BX_PLATFORM_OSX || WL_EGL_PLATFORM uint32_t numEnabledExtensions = headless ? 0 : 3; const char* enabledExtension[Extension::Count + 3] = @@ -6776,9 +6776,9 @@ VK_DESTROY } } #elif BX_PLATFORM_LINUX -#if WL_EGL_PLATFORM { - if (NULL != vkCreateWaylandSurfaceKHR) +#if WL_EGL_PLATFORM + if (g_platformData.type == bgfx::NativeWindowHandleType::Wayland) { VkWaylandSurfaceCreateInfoKHR sci; sci.sType = VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR; @@ -6788,45 +6788,46 @@ VK_DESTROY sci.surface = (wl_surface*)((wl_egl_window*)g_platformData.nwh)->surface; result = vkCreateWaylandSurfaceKHR(instance, &sci, allocatorCb, &m_surface); } - } -#else - { - if (NULL != vkCreateXlibSurfaceKHR) + else +#endif // WL_EGL_PLATFORM { - VkXlibSurfaceCreateInfoKHR sci; - sci.sType = VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR; - sci.pNext = NULL; - sci.flags = 0; - sci.dpy = (Display*)g_platformData.ndt; - sci.window = (Window)m_nwh; - result = vkCreateXlibSurfaceKHR(instance, &sci, allocatorCb, &m_surface); - } - - if (VK_SUCCESS != result) - { - void* xcbdll = bx::dlopen("libX11-xcb.so.1"); - - if (NULL != xcbdll - && NULL != vkCreateXcbSurfaceKHR) + if (NULL != vkCreateXlibSurfaceKHR) { - typedef xcb_connection_t* (*PFN_XGETXCBCONNECTION)(Display*); - PFN_XGETXCBCONNECTION XGetXCBConnection = (PFN_XGETXCBCONNECTION)bx::dlsym(xcbdll, "XGetXCBConnection"); + VkXlibSurfaceCreateInfoKHR sci; + sci.sType = VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR; + sci.pNext = NULL; + sci.flags = 0; + sci.dpy = (Display*)g_platformData.ndt; + sci.window = (Window)m_nwh; + result = vkCreateXlibSurfaceKHR(instance, &sci, allocatorCb, &m_surface); + } - union { void* ptr; xcb_window_t window; } cast = { m_nwh }; + if (VK_SUCCESS != result) + { + void* xcbdll = bx::dlopen("libX11-xcb.so.1"); - VkXcbSurfaceCreateInfoKHR sci; - sci.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR; - sci.pNext = NULL; - sci.flags = 0; - sci.connection = XGetXCBConnection( (Display*)g_platformData.ndt); - sci.window = cast.window; - result = vkCreateXcbSurfaceKHR(instance, &sci, allocatorCb, &m_surface); + if (NULL != xcbdll + && NULL != vkCreateXcbSurfaceKHR) + { + typedef xcb_connection_t* (*PFN_XGETXCBCONNECTION)(Display*); + PFN_XGETXCBCONNECTION XGetXCBConnection = (PFN_XGETXCBCONNECTION)bx::dlsym(xcbdll, "XGetXCBConnection"); - bx::dlclose(xcbdll); + union { void* ptr; xcb_window_t window; } cast = { m_nwh }; + + VkXcbSurfaceCreateInfoKHR sci; + sci.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR; + sci.pNext = NULL; + sci.flags = 0; + sci.connection = XGetXCBConnection( (Display*)g_platformData.ndt); + sci.window = cast.window; + result = vkCreateXcbSurfaceKHR(instance, &sci, allocatorCb, &m_surface); + + bx::dlclose(xcbdll); + } } } } -#endif // WL_EGL_PLATFORM + #elif BX_PLATFORM_OSX { if (NULL != vkCreateMacOSSurfaceMVK) diff --git a/src/renderer_vk.h b/src/renderer_vk.h index a143147b8..253bd5190 100644 --- a/src/renderer_vk.h +++ b/src/renderer_vk.h @@ -17,10 +17,13 @@ #elif BX_PLATFORM_LINUX # if WL_EGL_PLATFORM # define VK_USE_PLATFORM_WAYLAND_KHR -# define KHR_SURFACE_EXTENSION_NAME VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME +# endif // WL_EGL_PLATFORM +# define VK_USE_PLATFORM_XLIB_KHR +# define VK_USE_PLATFORM_XCB_KHR +# if WL_EGL_PLATFORM +# define KHR_SURFACE_EXTENSION_NAME VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME, \ + VK_KHR_XCB_SURFACE_EXTENSION_NAME # else -# define VK_USE_PLATFORM_XLIB_KHR -# define VK_USE_PLATFORM_XCB_KHR # define KHR_SURFACE_EXTENSION_NAME VK_KHR_XCB_SURFACE_EXTENSION_NAME # endif // WL_EGL_PLATFORM # define VK_IMPORT_INSTANCE_PLATFORM VK_IMPORT_INSTANCE_LINUX @@ -75,6 +78,12 @@ /* VK_KHR_wayland_surface */ \ VK_IMPORT_INSTANCE_FUNC(true, vkCreateWaylandSurfaceKHR); \ VK_IMPORT_INSTANCE_FUNC(true, vkGetPhysicalDeviceWaylandPresentationSupportKHR); \ + /* VK_KHR_xlib_surface */ \ + VK_IMPORT_INSTANCE_FUNC(true, vkCreateXlibSurfaceKHR); \ + VK_IMPORT_INSTANCE_FUNC(true, vkGetPhysicalDeviceXlibPresentationSupportKHR); \ + /* VK_KHR_xcb_surface */ \ + VK_IMPORT_INSTANCE_FUNC(true, vkCreateXcbSurfaceKHR); \ + VK_IMPORT_INSTANCE_FUNC(true, vkGetPhysicalDeviceXcbPresentationSupportKHR); \ #else #define VK_IMPORT_INSTANCE_LINUX \