Browse Source

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
Julian Sikorski 2 years ago
parent
commit
f4d463990a
64 changed files with 239 additions and 64 deletions
  1. 1 0
      examples/00-helloworld/helloworld.cpp
  2. 1 0
      examples/01-cubes/cubes.cpp
  3. 1 0
      examples/02-metaballs/metaballs.cpp
  4. 1 0
      examples/03-raymarch/raymarch.cpp
  5. 1 0
      examples/04-mesh/mesh.cpp
  6. 1 0
      examples/05-instancing/instancing.cpp
  7. 1 0
      examples/06-bump/bump.cpp
  8. 1 0
      examples/07-callback/callback.cpp
  9. 1 0
      examples/08-update/update.cpp
  10. 1 0
      examples/09-hdr/hdr.cpp
  11. 1 0
      examples/10-font/font.cpp
  12. 1 0
      examples/11-fontsdf/fontsdf.cpp
  13. 1 0
      examples/12-lod/lod.cpp
  14. 1 0
      examples/13-stencil/stencil.cpp
  15. 1 0
      examples/14-shadowvolumes/shadowvolumes.cpp
  16. 1 0
      examples/15-shadowmaps-simple/shadowmaps_simple.cpp
  17. 1 0
      examples/16-shadowmaps/shadowmaps.cpp
  18. 1 0
      examples/17-drawstress/drawstress.cpp
  19. 1 0
      examples/18-ibl/ibl.cpp
  20. 1 0
      examples/19-oit/oit.cpp
  21. 1 0
      examples/20-nanovg/nanovg.cpp
  22. 1 0
      examples/21-deferred/deferred.cpp
  23. 1 0
      examples/22-windows/windows.cpp
  24. 1 0
      examples/24-nbody/nbody.cpp
  25. 2 0
      examples/25-c99/helloworld.c
  26. 1 0
      examples/26-occlusion/occlusion.cpp
  27. 1 0
      examples/27-terrain/terrain.cpp
  28. 1 0
      examples/28-wireframe/wireframe.cpp
  29. 1 0
      examples/29-debugdraw/debugdraw.cpp
  30. 1 0
      examples/30-picking/picking.cpp
  31. 1 0
      examples/31-rsm/reflectiveshadowmap.cpp
  32. 1 0
      examples/32-particles/particles.cpp
  33. 1 0
      examples/33-pom/pom.cpp
  34. 1 0
      examples/34-mvs/mvs.cpp
  35. 1 0
      examples/35-dynamic/dynamic.cpp
  36. 1 0
      examples/36-sky/sky.cpp
  37. 1 0
      examples/37-gpudrivenrendering/gpudrivenrendering.cpp
  38. 1 0
      examples/38-bloom/bloom.cpp
  39. 1 0
      examples/39-assao/assao.cpp
  40. 1 0
      examples/40-svt/svt.cpp
  41. 1 0
      examples/41-tess/tess.cpp
  42. 1 0
      examples/42-bunnylod/bunnylod.cpp
  43. 1 0
      examples/43-denoise/denoise.cpp
  44. 1 0
      examples/44-sss/screen_space_shadows.cpp
  45. 1 0
      examples/45-bokeh/bokeh.cpp
  46. 1 0
      examples/47-pixelformats/pixelformats.cpp
  47. 1 0
      examples/48-drawindirect/drawindirect.cpp
  48. 1 0
      examples/49-hextile/hextile.cpp
  49. 5 0
      examples/common/entry/entry.cpp
  50. 4 0
      examples/common/entry/entry.h
  51. 5 0
      examples/common/entry/entry_android.cpp
  52. 13 0
      examples/common/entry/entry_glfw.cpp
  53. 5 0
      examples/common/entry/entry_html5.cpp
  54. 5 0
      examples/common/entry/entry_ios.mm
  55. 5 0
      examples/common/entry/entry_noop.cpp
  56. 5 0
      examples/common/entry/entry_osx.mm
  57. 42 19
      examples/common/entry/entry_sdl.cpp
  58. 5 0
      examples/common/entry/entry_windows.cpp
  59. 5 0
      examples/common/entry/entry_x11.cpp
  60. 26 9
      include/bgfx/bgfx.h
  61. 18 0
      include/bgfx/c99/bgfx.h
  62. 1 0
      src/bgfx.cpp
  63. 34 33
      src/renderer_vk.cpp
  64. 12 3
      src/renderer_vk.h

+ 1 - 0
examples/00-helloworld/helloworld.cpp

@@ -34,6 +34,7 @@ public:
 		init.vendorId = args.m_pciId;
 		init.vendorId = args.m_pciId;
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
+		init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle);
 		init.resolution.width  = m_width;
 		init.resolution.width  = m_width;
 		init.resolution.height = m_height;
 		init.resolution.height = m_height;
 		init.resolution.reset  = m_reset;
 		init.resolution.reset  = m_reset;

+ 1 - 0
examples/01-cubes/cubes.cpp

@@ -149,6 +149,7 @@ public:
 		init.vendorId = args.m_pciId;
 		init.vendorId = args.m_pciId;
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
+		init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle);
 		init.resolution.width  = m_width;
 		init.resolution.width  = m_width;
 		init.resolution.height = m_height;
 		init.resolution.height = m_height;
 		init.resolution.reset  = m_reset;
 		init.resolution.reset  = m_reset;

+ 1 - 0
examples/02-metaballs/metaballs.cpp

@@ -508,6 +508,7 @@ public:
 		init.vendorId = args.m_pciId;
 		init.vendorId = args.m_pciId;
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
+		init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle);
 		init.resolution.width  = m_width;
 		init.resolution.width  = m_width;
 		init.resolution.height = m_height;
 		init.resolution.height = m_height;
 		init.resolution.reset  = m_reset;
 		init.resolution.reset  = m_reset;

+ 1 - 0
examples/03-raymarch/raymarch.cpp

@@ -121,6 +121,7 @@ public:
 		init.vendorId = args.m_pciId;
 		init.vendorId = args.m_pciId;
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
+		init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle);
 		init.resolution.width  = m_width;
 		init.resolution.width  = m_width;
 		init.resolution.height = m_height;
 		init.resolution.height = m_height;
 		init.resolution.reset  = m_reset;
 		init.resolution.reset  = m_reset;

+ 1 - 0
examples/04-mesh/mesh.cpp

@@ -32,6 +32,7 @@ public:
 		init.vendorId = args.m_pciId;
 		init.vendorId = args.m_pciId;
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
+		init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle);
 		init.resolution.width  = m_width;
 		init.resolution.width  = m_width;
 		init.resolution.height = m_height;
 		init.resolution.height = m_height;
 		init.resolution.reset  = m_reset;
 		init.resolution.reset  = m_reset;

+ 1 - 0
examples/05-instancing/instancing.cpp

@@ -84,6 +84,7 @@ public:
 		init.vendorId = args.m_pciId;
 		init.vendorId = args.m_pciId;
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
+		init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle);
 		init.resolution.width  = m_width;
 		init.resolution.width  = m_width;
 		init.resolution.height = m_height;
 		init.resolution.height = m_height;
 		init.resolution.reset  = m_reset;
 		init.resolution.reset  = m_reset;

+ 1 - 0
examples/06-bump/bump.cpp

@@ -104,6 +104,7 @@ public:
 		init.vendorId = args.m_pciId;
 		init.vendorId = args.m_pciId;
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
+		init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle);
 		init.resolution.width  = m_width;
 		init.resolution.width  = m_width;
 		init.resolution.height = m_height;
 		init.resolution.height = m_height;
 		init.resolution.reset  = m_reset;
 		init.resolution.reset  = m_reset;

+ 1 - 0
examples/07-callback/callback.cpp

@@ -331,6 +331,7 @@ public:
 		init.vendorId = args.m_pciId;
 		init.vendorId = args.m_pciId;
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
+		init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle);
 		init.resolution.width  = m_width;
 		init.resolution.width  = m_width;
 		init.resolution.height = m_height;
 		init.resolution.height = m_height;
 		init.resolution.reset  = m_reset;
 		init.resolution.reset  = m_reset;

+ 1 - 0
examples/08-update/update.cpp

@@ -247,6 +247,7 @@ public:
 		init.vendorId = args.m_pciId;
 		init.vendorId = args.m_pciId;
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
+		init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle);
 		init.resolution.width  = m_width;
 		init.resolution.width  = m_width;
 		init.resolution.height = m_height;
 		init.resolution.height = m_height;
 		init.resolution.reset  = m_reset;
 		init.resolution.reset  = m_reset;

+ 1 - 0
examples/09-hdr/hdr.cpp

@@ -159,6 +159,7 @@ public:
 		init.vendorId = args.m_pciId;
 		init.vendorId = args.m_pciId;
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
+		init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle);
 		init.resolution.width  = m_width;
 		init.resolution.width  = m_width;
 		init.resolution.height = m_height;
 		init.resolution.height = m_height;
 		init.resolution.reset  = m_reset;
 		init.resolution.reset  = m_reset;

+ 1 - 0
examples/10-font/font.cpp

@@ -73,6 +73,7 @@ public:
 		init.vendorId = args.m_pciId;
 		init.vendorId = args.m_pciId;
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
+		init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle);
 		init.resolution.width  = m_width;
 		init.resolution.width  = m_width;
 		init.resolution.height = m_height;
 		init.resolution.height = m_height;
 		init.resolution.reset  = m_reset;
 		init.resolution.reset  = m_reset;

+ 1 - 0
examples/11-fontsdf/fontsdf.cpp

@@ -56,6 +56,7 @@ public:
 		init.vendorId = args.m_pciId;
 		init.vendorId = args.m_pciId;
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
+		init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle);
 		init.resolution.width  = m_width;
 		init.resolution.width  = m_width;
 		init.resolution.height = m_height;
 		init.resolution.height = m_height;
 		init.resolution.reset  = m_reset;
 		init.resolution.reset  = m_reset;

+ 1 - 0
examples/12-lod/lod.cpp

@@ -48,6 +48,7 @@ public:
 		init.vendorId = args.m_pciId;
 		init.vendorId = args.m_pciId;
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
+		init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle);
 		init.resolution.width  = m_width;
 		init.resolution.width  = m_width;
 		init.resolution.height = m_height;
 		init.resolution.height = m_height;
 		init.resolution.reset  = m_reset;
 		init.resolution.reset  = m_reset;

+ 1 - 0
examples/13-stencil/stencil.cpp

@@ -814,6 +814,7 @@ public:
 		init.vendorId = args.m_pciId;
 		init.vendorId = args.m_pciId;
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
+		init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle);
 		init.resolution.width  = m_viewState.m_width;
 		init.resolution.width  = m_viewState.m_width;
 		init.resolution.height = m_viewState.m_height;
 		init.resolution.height = m_viewState.m_height;
 		init.resolution.reset  = m_reset;
 		init.resolution.reset  = m_reset;

+ 1 - 0
examples/14-shadowvolumes/shadowvolumes.cpp

@@ -1786,6 +1786,7 @@ public:
 		init.vendorId = args.m_pciId;
 		init.vendorId = args.m_pciId;
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
+		init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle);
 		init.resolution.width  = m_viewState.m_width;
 		init.resolution.width  = m_viewState.m_width;
 		init.resolution.height = m_viewState.m_height;
 		init.resolution.height = m_viewState.m_height;
 		init.resolution.reset  = m_reset;
 		init.resolution.reset  = m_reset;

+ 1 - 0
examples/15-shadowmaps-simple/shadowmaps_simple.cpp

@@ -80,6 +80,7 @@ public:
 		init.vendorId = args.m_pciId;
 		init.vendorId = args.m_pciId;
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
+		init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle);
 		init.resolution.width  = m_width;
 		init.resolution.width  = m_width;
 		init.resolution.height = m_height;
 		init.resolution.height = m_height;
 		init.resolution.reset  = m_reset;
 		init.resolution.reset  = m_reset;

+ 1 - 0
examples/16-shadowmaps/shadowmaps.cpp

@@ -1159,6 +1159,7 @@ public:
 		init.vendorId = args.m_pciId;
 		init.vendorId = args.m_pciId;
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
+		init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle);
 		init.resolution.width  = m_viewState.m_width;
 		init.resolution.width  = m_viewState.m_width;
 		init.resolution.height = m_viewState.m_height;
 		init.resolution.height = m_viewState.m_height;
 		init.resolution.reset  = m_reset;
 		init.resolution.reset  = m_reset;

+ 1 - 0
examples/17-drawstress/drawstress.cpp

@@ -131,6 +131,7 @@ public:
 		init.vendorId = args.m_pciId;
 		init.vendorId = args.m_pciId;
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
+		init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle);
 		init.resolution.width  = m_width;
 		init.resolution.width  = m_width;
 		init.resolution.height = m_height;
 		init.resolution.height = m_height;
 		init.resolution.reset  = m_reset;
 		init.resolution.reset  = m_reset;

+ 1 - 0
examples/18-ibl/ibl.cpp

@@ -420,6 +420,7 @@ public:
 		init.vendorId = args.m_pciId;
 		init.vendorId = args.m_pciId;
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
+		init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle);
 		init.resolution.width  = m_width;
 		init.resolution.width  = m_width;
 		init.resolution.height = m_height;
 		init.resolution.height = m_height;
 		init.resolution.reset  = m_reset;
 		init.resolution.reset  = m_reset;

+ 1 - 0
examples/19-oit/oit.cpp

@@ -171,6 +171,7 @@ public:
 		init.vendorId = args.m_pciId;
 		init.vendorId = args.m_pciId;
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
+		init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle);
 		init.resolution.width  = m_width;
 		init.resolution.width  = m_width;
 		init.resolution.height = m_height;
 		init.resolution.height = m_height;
 		init.resolution.reset  = m_reset;
 		init.resolution.reset  = m_reset;

+ 1 - 0
examples/20-nanovg/nanovg.cpp

@@ -1404,6 +1404,7 @@ public:
 		init.vendorId = args.m_pciId;
 		init.vendorId = args.m_pciId;
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
+		init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle);
 		init.resolution.width  = m_width;
 		init.resolution.width  = m_width;
 		init.resolution.height = m_height;
 		init.resolution.height = m_height;
 		init.resolution.reset  = m_reset;
 		init.resolution.reset  = m_reset;

+ 1 - 0
examples/21-deferred/deferred.cpp

@@ -213,6 +213,7 @@ public:
 		init.vendorId = args.m_pciId;
 		init.vendorId = args.m_pciId;
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
+		init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle);
 		init.resolution.width  = m_width;
 		init.resolution.width  = m_width;
 		init.resolution.height = m_height;
 		init.resolution.height = m_height;
 		init.resolution.reset  = m_reset;
 		init.resolution.reset  = m_reset;

+ 1 - 0
examples/22-windows/windows.cpp

@@ -88,6 +88,7 @@ public:
 		init.vendorId = args.m_pciId;
 		init.vendorId = args.m_pciId;
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
+		init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle);
 		init.resolution.width  = m_width;
 		init.resolution.width  = m_width;
 		init.resolution.height = m_height;
 		init.resolution.height = m_height;
 		init.resolution.reset  = m_reset;
 		init.resolution.reset  = m_reset;

+ 1 - 0
examples/24-nbody/nbody.cpp

@@ -132,6 +132,7 @@ public:
 		init.vendorId = args.m_pciId;
 		init.vendorId = args.m_pciId;
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
+		init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle);
 		init.resolution.width  = m_width;
 		init.resolution.width  = m_width;
 		init.resolution.height = m_height;
 		init.resolution.height = m_height;
 		init.resolution.reset  = m_reset;
 		init.resolution.reset  = m_reset;

+ 2 - 0
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 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_default_native_window_handle(void);
 extern void* entry_get_native_display_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)
 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.nwh = entry_get_default_native_window_handle();
 	init.platformData.ndt = entry_get_native_display_handle();
 	init.platformData.ndt = entry_get_native_display_handle();
+	init.platformData.type = entry_get_native_window_handle_type();
 
 
 	bgfx_init(&init);
 	bgfx_init(&init);
 	bgfx_reset(width, height, reset, init.resolution.format);
 	bgfx_reset(width, height, reset, init.resolution.format);

+ 1 - 0
examples/26-occlusion/occlusion.cpp

@@ -84,6 +84,7 @@ public:
 		init.vendorId = args.m_pciId;
 		init.vendorId = args.m_pciId;
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
+		init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle);
 		init.resolution.width  = m_width;
 		init.resolution.width  = m_width;
 		init.resolution.height = m_height;
 		init.resolution.height = m_height;
 		init.resolution.reset  = m_reset;
 		init.resolution.reset  = m_reset;

+ 1 - 0
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.vendorId = args.m_pciId;
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
+		init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle);
 		init.resolution.width  = m_width;
 		init.resolution.width  = m_width;
 		init.resolution.height = m_height;
 		init.resolution.height = m_height;
 		init.resolution.reset  = m_reset;
 		init.resolution.reset  = m_reset;

+ 1 - 0
examples/28-wireframe/wireframe.cpp

@@ -293,6 +293,7 @@ public:
 		init.vendorId = args.m_pciId;
 		init.vendorId = args.m_pciId;
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
+		init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle);
 		init.resolution.width  = m_width;
 		init.resolution.width  = m_width;
 		init.resolution.height = m_height;
 		init.resolution.height = m_height;
 		init.resolution.reset  = m_reset;
 		init.resolution.reset  = m_reset;

+ 1 - 0
examples/29-debugdraw/debugdraw.cpp

@@ -780,6 +780,7 @@ public:
 		init.vendorId = args.m_pciId;
 		init.vendorId = args.m_pciId;
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
+		init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle);
 		init.resolution.width  = m_width;
 		init.resolution.width  = m_width;
 		init.resolution.height = m_height;
 		init.resolution.height = m_height;
 		init.resolution.reset  = m_reset;
 		init.resolution.reset  = m_reset;

+ 1 - 0
examples/30-picking/picking.cpp

@@ -40,6 +40,7 @@ public:
 		init.vendorId = args.m_pciId;
 		init.vendorId = args.m_pciId;
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
+		init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle);
 		init.resolution.width  = m_width;
 		init.resolution.width  = m_width;
 		init.resolution.height = m_height;
 		init.resolution.height = m_height;
 		init.resolution.reset  = m_reset;
 		init.resolution.reset  = m_reset;

+ 1 - 0
examples/31-rsm/reflectiveshadowmap.cpp

@@ -213,6 +213,7 @@ public:
 		init.vendorId = args.m_pciId;
 		init.vendorId = args.m_pciId;
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
+		init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle);
 		init.resolution.width  = m_width;
 		init.resolution.width  = m_width;
 		init.resolution.height = m_height;
 		init.resolution.height = m_height;
 		init.resolution.reset  = m_reset;
 		init.resolution.reset  = m_reset;

+ 1 - 0
examples/32-particles/particles.cpp

@@ -248,6 +248,7 @@ public:
 		init.vendorId = args.m_pciId;
 		init.vendorId = args.m_pciId;
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
+		init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle);
 		init.resolution.width  = m_width;
 		init.resolution.width  = m_width;
 		init.resolution.height = m_height;
 		init.resolution.height = m_height;
 		init.resolution.reset  = m_reset;
 		init.resolution.reset  = m_reset;

+ 1 - 0
examples/33-pom/pom.cpp

@@ -130,6 +130,7 @@ public:
 		init.vendorId = args.m_pciId;
 		init.vendorId = args.m_pciId;
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
+		init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle);
 		init.resolution.width  = m_width;
 		init.resolution.width  = m_width;
 		init.resolution.height = m_height;
 		init.resolution.height = m_height;
 		init.resolution.reset  = m_reset;
 		init.resolution.reset  = m_reset;

+ 1 - 0
examples/34-mvs/mvs.cpp

@@ -126,6 +126,7 @@ public:
 		init.vendorId = args.m_pciId;
 		init.vendorId = args.m_pciId;
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
+		init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle);
 		init.resolution.width  = m_width;
 		init.resolution.width  = m_width;
 		init.resolution.height = m_height;
 		init.resolution.height = m_height;
 		init.resolution.reset  = m_reset;
 		init.resolution.reset  = m_reset;

+ 1 - 0
examples/35-dynamic/dynamic.cpp

@@ -104,6 +104,7 @@ public:
 		init.vendorId = args.m_pciId;
 		init.vendorId = args.m_pciId;
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
+		init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle);
 		init.resolution.width  = m_width;
 		init.resolution.width  = m_width;
 		init.resolution.height = m_height;
 		init.resolution.height = m_height;
 		init.resolution.reset  = m_reset;
 		init.resolution.reset  = m_reset;

+ 1 - 0
examples/36-sky/sky.cpp

@@ -420,6 +420,7 @@ public:
 		init.vendorId = args.m_pciId;
 		init.vendorId = args.m_pciId;
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
+		init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle);
 		init.resolution.width  = m_width;
 		init.resolution.width  = m_width;
 		init.resolution.height = m_height;
 		init.resolution.height = m_height;
 		init.resolution.reset  = m_reset;
 		init.resolution.reset  = m_reset;

+ 1 - 0
examples/37-gpudrivenrendering/gpudrivenrendering.cpp

@@ -330,6 +330,7 @@ public:
 		init.vendorId = args.m_pciId;
 		init.vendorId = args.m_pciId;
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
+		init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle);
 		init.resolution.width  = m_width;
 		init.resolution.width  = m_width;
 		init.resolution.height = m_height;
 		init.resolution.height = m_height;
 		init.resolution.reset  = m_reset;
 		init.resolution.reset  = m_reset;

+ 1 - 0
examples/38-bloom/bloom.cpp

@@ -200,6 +200,7 @@ public:
 		init.vendorId = args.m_pciId;
 		init.vendorId = args.m_pciId;
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
+		init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle);
 		init.resolution.width  = m_width;
 		init.resolution.width  = m_width;
 		init.resolution.height = m_height;
 		init.resolution.height = m_height;
 		init.resolution.reset  = m_reset;
 		init.resolution.reset  = m_reset;

+ 1 - 0
examples/39-assao/assao.cpp

@@ -271,6 +271,7 @@ namespace
 			init.vendorId = args.m_pciId;
 			init.vendorId = args.m_pciId;
 			init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 			init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 			init.platformData.ndt  = entry::getNativeDisplayHandle();
 			init.platformData.ndt  = entry::getNativeDisplayHandle();
+		init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle);
 			init.resolution.width  = m_width;
 			init.resolution.width  = m_width;
 			init.resolution.height = m_height;
 			init.resolution.height = m_height;
 			init.resolution.reset  = m_reset;
 			init.resolution.reset  = m_reset;

+ 1 - 0
examples/40-svt/svt.cpp

@@ -82,6 +82,7 @@ public:
 		init.vendorId = args.m_pciId;
 		init.vendorId = args.m_pciId;
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
+		init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle);
 		init.resolution.width  = m_width;
 		init.resolution.width  = m_width;
 		init.resolution.height = m_height;
 		init.resolution.height = m_height;
 		init.resolution.reset  = m_reset;
 		init.resolution.reset  = m_reset;

+ 1 - 0
examples/41-tess/tess.cpp

@@ -339,6 +339,7 @@ public:
 		init.vendorId = args.m_pciId;
 		init.vendorId = args.m_pciId;
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
+		init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle);
 		init.resolution.width = m_width;
 		init.resolution.width = m_width;
 		init.resolution.height = m_height;
 		init.resolution.height = m_height;
 		init.resolution.reset = m_reset;
 		init.resolution.reset = m_reset;

+ 1 - 0
examples/42-bunnylod/bunnylod.cpp

@@ -264,6 +264,7 @@ public:
 		init.vendorId = args.m_pciId;
 		init.vendorId = args.m_pciId;
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
+		init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle);
 		init.resolution.width  = m_width;
 		init.resolution.width  = m_width;
 		init.resolution.height = m_height;
 		init.resolution.height = m_height;
 		init.resolution.reset  = m_reset;
 		init.resolution.reset  = m_reset;

+ 1 - 0
examples/43-denoise/denoise.cpp

@@ -253,6 +253,7 @@ public:
 		init.vendorId = args.m_pciId;
 		init.vendorId = args.m_pciId;
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
+		init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle);
 		init.resolution.width  = m_width;
 		init.resolution.width  = m_width;
 		init.resolution.height = m_height;
 		init.resolution.height = m_height;
 		init.resolution.reset  = m_reset;
 		init.resolution.reset  = m_reset;

+ 1 - 0
examples/44-sss/screen_space_shadows.cpp

@@ -265,6 +265,7 @@ public:
 		init.vendorId = args.m_pciId;
 		init.vendorId = args.m_pciId;
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
+		init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle);
 		init.resolution.width  = m_width;
 		init.resolution.width  = m_width;
 		init.resolution.height = m_height;
 		init.resolution.height = m_height;
 		init.resolution.reset  = m_reset;
 		init.resolution.reset  = m_reset;

+ 1 - 0
examples/45-bokeh/bokeh.cpp

@@ -247,6 +247,7 @@ public:
 		init.vendorId = args.m_pciId;
 		init.vendorId = args.m_pciId;
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
+		init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle);
 		init.resolution.width  = m_width;
 		init.resolution.width  = m_width;
 		init.resolution.height = m_height;
 		init.resolution.height = m_height;
 		init.resolution.reset  = m_reset;
 		init.resolution.reset  = m_reset;

+ 1 - 0
examples/47-pixelformats/pixelformats.cpp

@@ -429,6 +429,7 @@ public:
 		init.vendorId = args.m_pciId;
 		init.vendorId = args.m_pciId;
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
+		init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle);
 		init.resolution.width  = m_width;
 		init.resolution.width  = m_width;
 		init.resolution.height = m_height;
 		init.resolution.height = m_height;
 		init.resolution.reset  = m_reset;
 		init.resolution.reset  = m_reset;

+ 1 - 0
examples/48-drawindirect/drawindirect.cpp

@@ -146,6 +146,7 @@ public:
 		init.vendorId = args.m_pciId;
 		init.vendorId = args.m_pciId;
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.nwh  = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
 		init.platformData.ndt  = entry::getNativeDisplayHandle();
+		init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle);
 		init.resolution.width  = m_width;
 		init.resolution.width  = m_width;
 		init.resolution.height = m_height;
 		init.resolution.height = m_height;
 		init.resolution.reset  = m_reset;
 		init.resolution.reset  = m_reset;

+ 1 - 0
examples/49-hextile/hextile.cpp

@@ -85,6 +85,7 @@ namespace
 			init.vendorId = args.m_pciId;
 			init.vendorId = args.m_pciId;
 			init.platformData.nwh = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 			init.platformData.nwh = entry::getNativeWindowHandle(entry::kDefaultWindowHandle);
 			init.platformData.ndt = entry::getNativeDisplayHandle();
 			init.platformData.ndt = entry::getNativeDisplayHandle();
+		init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle);
 			init.resolution.width = m_width;
 			init.resolution.width = m_width;
 			init.resolution.height = m_height;
 			init.resolution.height = m_height;
 			init.resolution.reset = m_reset;
 			init.resolution.reset = m_reset;

+ 5 - 0
examples/common/entry/entry.cpp

@@ -1037,3 +1037,8 @@ extern "C" void* entry_get_native_display_handle()
 {
 {
 	return entry::getNativeDisplayHandle();
 	return entry::getNativeDisplayHandle();
 }
 }
+
+extern "C" bgfx::NativeWindowHandleType::Enum entry_get_native_window_handle_type()
+{
+	return entry::getNativeWindowHandleType(entry::kDefaultWindowHandle);
+}

+ 4 - 0
examples/common/entry/entry.h

@@ -7,6 +7,7 @@
 #define ENTRY_H_HEADER_GUARD
 #define ENTRY_H_HEADER_GUARD
 
 
 #include "dbg.h"
 #include "dbg.h"
+#include <bgfx/bgfx.h>
 #include <bx/bx.h>
 #include <bx/bx.h>
 #include <bx/filepath.h>
 #include <bx/filepath.h>
 #include <bx/string.h>
 #include <bx/string.h>
@@ -297,6 +298,9 @@ namespace entry
 	///
 	///
 	void* getNativeDisplayHandle();
 	void* getNativeDisplayHandle();
 
 
+	///
+	bgfx::NativeWindowHandleType::Enum getNativeWindowHandleType(WindowHandle _handle);
+
 	///
 	///
 	void setCurrentDir(const char* _dir);
 	void setCurrentDir(const char* _dir);
 
 

+ 5 - 0
examples/common/entry/entry_android.cpp

@@ -550,6 +550,11 @@ namespace entry
 		return NULL;
 		return NULL;
 	}
 	}
 
 
+	bgfx::NativeWindowHandleType::Enum getNativeWindowHandleType(WindowHandle _handle)
+	{
+		return bgfx::NativeWindowHandleType::Default;
+	}
+
 	int32_t MainThreadEntry::threadFunc(bx::Thread* _thread, void* _userData)
 	int32_t MainThreadEntry::threadFunc(bx::Thread* _thread, void* _userData)
 	{
 	{
 		BX_UNUSED(_thread);
 		BX_UNUSED(_thread);

+ 13 - 0
examples/common/entry/entry_glfw.cpp

@@ -875,6 +875,19 @@ namespace entry
 #	endif // BX_PLATFORM_*
 #	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)
 	int32_t MainThreadEntry::threadFunc(bx::Thread* _thread, void* _userData)
 	{
 	{
 		BX_UNUSED(_thread);
 		BX_UNUSED(_thread);

+ 5 - 0
examples/common/entry/entry_html5.cpp

@@ -427,6 +427,11 @@ namespace entry
 	{
 	{
 		return NULL;
 		return NULL;
 	}
 	}
+
+	bgfx::NativeWindowHandleType::Enum getNativeWindowHandleType(WindowHandle _handle)
+	{
+		return bgfx::NativeWindowHandleType::Default;
+	}
 }
 }
 
 
 int main(int _argc, const char* const* _argv)
 int main(int _argc, const char* const* _argv)

+ 5 - 0
examples/common/entry/entry_ios.mm

@@ -161,6 +161,11 @@ namespace entry
 		return NULL;
 		return NULL;
 	}
 	}
 
 
+	bgfx::NativeWindowHandleType::Enum getNativeWindowHandleType(WindowHandle _handle)
+	{
+		return bgfx::NativeWindowHandleType::Default;
+	}
+
 } // namespace entry
 } // namespace entry
 
 
 using namespace entry;
 using namespace entry;

+ 5 - 0
examples/common/entry/entry_noop.cpp

@@ -78,6 +78,11 @@ namespace entry
 		return NULL;
 		return NULL;
 	}
 	}
 
 
+	bgfx::NativeWindowHandleType::Enum getNativeWindowHandleType(WindowHandle _handle)
+	{
+		return bgfx::NativeWindowHandleType::Default;
+	}
+
 } // namespace entry
 } // namespace entry
 
 
 int main(int _argc, const char* const* _argv)
 int main(int _argc, const char* const* _argv)

+ 5 - 0
examples/common/entry/entry_osx.mm

@@ -725,6 +725,11 @@ namespace entry
 		return NULL;
 		return NULL;
 	}
 	}
 
 
+	bgfx::NativeWindowHandleType::Enum getNativeWindowHandleType(WindowHandle _handle)
+	{
+		return bgfx::NativeWindowHandleType::Default;
+	}
+
 } // namespace entry
 } // namespace entry
 
 
 @implementation AppDelegate
 @implementation AppDelegate

+ 42 - 19
examples/common/entry/entry_sdl.cpp

@@ -50,21 +50,24 @@ namespace entry
 
 
 #	if BX_PLATFORM_LINUX || BX_PLATFORM_BSD
 #	if BX_PLATFORM_LINUX || BX_PLATFORM_BSD
 #		if ENTRY_CONFIG_USE_WAYLAND
 #		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
 #	elif BX_PLATFORM_OSX || BX_PLATFORM_IOS
 		return wmi.info.cocoa.window;
 		return wmi.info.cocoa.window;
 #	elif BX_PLATFORM_WINDOWS
 #	elif BX_PLATFORM_WINDOWS
@@ -1145,18 +1148,38 @@ namespace entry
 		{
 		{
 			return NULL;
 			return NULL;
 		}
 		}
-
 #	if BX_PLATFORM_LINUX || BX_PLATFORM_BSD
 #	if BX_PLATFORM_LINUX || BX_PLATFORM_BSD
 #		if ENTRY_CONFIG_USE_WAYLAND
 #		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
 #		endif // ENTRY_CONFIG_USE_WAYLAND
+				return wmi.info.x11.display;
 #	else
 #	else
 		return NULL;
 		return NULL;
 #	endif // BX_PLATFORM_*
 #	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)
 	int32_t MainThreadEntry::threadFunc(bx::Thread* _thread, void* _userData)
 	{
 	{
 		BX_UNUSED(_thread);
 		BX_UNUSED(_thread);

+ 5 - 0
examples/common/entry/entry_windows.cpp

@@ -1169,6 +1169,11 @@ namespace entry
 		return NULL;
 		return NULL;
 	}
 	}
 
 
+	bgfx::NativeWindowHandleType::Enum getNativeWindowHandleType(WindowHandle _handle)
+	{
+		return bgfx::NativeWindowHandleType::Default;
+	}
+
 	int32_t MainThreadEntry::threadFunc(bx::Thread* /*_thread*/, void* _userData)
 	int32_t MainThreadEntry::threadFunc(bx::Thread* /*_thread*/, void* _userData)
 	{
 	{
 		MainThreadEntry* self = (MainThreadEntry*)_userData;
 		MainThreadEntry* self = (MainThreadEntry*)_userData;

+ 5 - 0
examples/common/entry/entry_x11.cpp

@@ -771,6 +771,11 @@ namespace entry
 		return s_ctx.m_display;
 		return s_ctx.m_display;
 	}
 	}
 
 
+	bgfx::NativeWindowHandleType::Enum getNativeWindowHandleType(WindowHandle _handle)
+	{
+		return bgfx::NativeWindowHandleType::Default;
+	}
+
 } // namespace entry
 } // namespace entry
 
 
 int main(int _argc, const char* const* _argv)
 int main(int _argc, const char* const* _argv)

+ 26 - 9
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;
 	static const uint16_t kInvalidHandle = UINT16_MAX;
 
 
 	BGFX_HANDLE(DynamicIndexBufferHandle)
 	BGFX_HANDLE(DynamicIndexBufferHandle)
@@ -622,15 +638,16 @@ namespace bgfx
 	{
 	{
 		PlatformData();
 		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.
 	/// Backbuffer resolution and reset parameters.

+ 18 - 0
include/bgfx/c99/bgfx.h

@@ -391,6 +391,19 @@ typedef enum bgfx_view_mode
 
 
 } bgfx_view_mode_t;
 } 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.
  * Render frame enum.
  *
  *
@@ -625,6 +638,11 @@ typedef struct bgfx_platform_data_s
      */
      */
     void*                backBufferDS;
     void*                backBufferDS;
 
 
+    /**
+     * Handle type. Needed for platforms having more than one option.
+     */
+     bgfx_native_window_handle_type_t type;
+
 } bgfx_platform_data_t;
 } bgfx_platform_data_t;
 
 
 /**
 /**

+ 1 - 0
src/bgfx.cpp

@@ -3437,6 +3437,7 @@ namespace bgfx
 		, context(NULL)
 		, context(NULL)
 		, backBuffer(NULL)
 		, backBuffer(NULL)
 		, backBufferDS(NULL)
 		, backBufferDS(NULL)
+		, type(NativeWindowHandleType::Default)
 	{
 	{
 	}
 	}
 
 

+ 34 - 33
src/renderer_vk.cpp

@@ -1230,7 +1230,7 @@ VK_IMPORT
 						BX_TRACE("\t%s", layer.m_name);
 						BX_TRACE("\t%s", layer.m_name);
 					}
 					}
 				}
 				}
-#if BX_PLATFORM_OSX
+#if BX_PLATFORM_OSX || WL_EGL_PLATFORM
 				uint32_t numEnabledExtensions = headless ? 0 : 3;
 				uint32_t numEnabledExtensions = headless ? 0 : 3;
 
 
 				const char* enabledExtension[Extension::Count + 3] =
 				const char* enabledExtension[Extension::Count + 3] =
@@ -6776,9 +6776,9 @@ VK_DESTROY
 			}
 			}
 		}
 		}
 #elif BX_PLATFORM_LINUX
 #elif BX_PLATFORM_LINUX
-#if     WL_EGL_PLATFORM
 		{
 		{
-			if (NULL != vkCreateWaylandSurfaceKHR)
+#if     WL_EGL_PLATFORM
+			if (g_platformData.type == bgfx::NativeWindowHandleType::Wayland)
 			{
 			{
 				VkWaylandSurfaceCreateInfoKHR sci;
 				VkWaylandSurfaceCreateInfoKHR sci;
 				sci.sType = VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR;
 				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;
 				sci.surface = (wl_surface*)((wl_egl_window*)g_platformData.nwh)->surface;
 				result = vkCreateWaylandSurfaceKHR(instance, &sci, allocatorCb, &m_surface);
 				result = vkCreateWaylandSurfaceKHR(instance, &sci, allocatorCb, &m_surface);
 			}
 			}
-		}
-#else
-		{
-			if (NULL != vkCreateXlibSurfaceKHR)
-			{
-				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)
+			else
+#endif // WL_EGL_PLATFORM
 			{
 			{
-				void* xcbdll = bx::dlopen("libX11-xcb.so.1");
+				if (NULL != vkCreateXlibSurfaceKHR)
+				{
+					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 (NULL != xcbdll
-				&&  NULL != vkCreateXcbSurfaceKHR)
+				if (VK_SUCCESS != result)
 				{
 				{
-					typedef xcb_connection_t* (*PFN_XGETXCBCONNECTION)(Display*);
-					PFN_XGETXCBCONNECTION XGetXCBConnection = (PFN_XGETXCBCONNECTION)bx::dlsym(xcbdll, "XGetXCBConnection");
+					void* xcbdll = bx::dlopen("libX11-xcb.so.1");
 
 
-					union { void* ptr; xcb_window_t window; } cast = { m_nwh };
+					if (NULL != xcbdll
+					&&  NULL != vkCreateXcbSurfaceKHR)
+					{
+						typedef xcb_connection_t* (*PFN_XGETXCBCONNECTION)(Display*);
+						PFN_XGETXCBCONNECTION XGetXCBConnection = (PFN_XGETXCBCONNECTION)bx::dlsym(xcbdll, "XGetXCBConnection");
+
+						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);
+						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);
+						bx::dlclose(xcbdll);
+					}
 				}
 				}
 			}
 			}
 		}
 		}
-#endif // WL_EGL_PLATFORM
+
 #elif BX_PLATFORM_OSX
 #elif BX_PLATFORM_OSX
 		{
 		{
 			if (NULL != vkCreateMacOSSurfaceMVK)
 			if (NULL != vkCreateMacOSSurfaceMVK)

+ 12 - 3
src/renderer_vk.h

@@ -17,10 +17,13 @@
 #elif BX_PLATFORM_LINUX
 #elif BX_PLATFORM_LINUX
 #	if WL_EGL_PLATFORM
 #	if WL_EGL_PLATFORM
 #		define VK_USE_PLATFORM_WAYLAND_KHR
 #		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
 #	else
-#		define VK_USE_PLATFORM_XLIB_KHR
-#		define VK_USE_PLATFORM_XCB_KHR
 #		define KHR_SURFACE_EXTENSION_NAME VK_KHR_XCB_SURFACE_EXTENSION_NAME
 #		define KHR_SURFACE_EXTENSION_NAME VK_KHR_XCB_SURFACE_EXTENSION_NAME
 #	endif // WL_EGL_PLATFORM
 #	endif // WL_EGL_PLATFORM
 #	define VK_IMPORT_INSTANCE_PLATFORM VK_IMPORT_INSTANCE_LINUX
 #	define VK_IMPORT_INSTANCE_PLATFORM VK_IMPORT_INSTANCE_LINUX
@@ -75,6 +78,12 @@
 			/* VK_KHR_wayland_surface */                                                      \
 			/* VK_KHR_wayland_surface */                                                      \
 			VK_IMPORT_INSTANCE_FUNC(true,  vkCreateWaylandSurfaceKHR);                        \
 			VK_IMPORT_INSTANCE_FUNC(true,  vkCreateWaylandSurfaceKHR);                        \
 			VK_IMPORT_INSTANCE_FUNC(true,  vkGetPhysicalDeviceWaylandPresentationSupportKHR); \
 			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
 #else
 #define VK_IMPORT_INSTANCE_LINUX                                                           \
 #define VK_IMPORT_INSTANCE_LINUX                                                           \