Răsfoiți Sursa

Fix Vulkan renderer on wayland (#3143)

* Initial proof-of-concept of vulkan renderer working on wayland

* Get wayland surface from the window handle
Julian Sikorski 2 ani în urmă
părinte
comite
3101a0d93f
2 a modificat fișierele cu 33 adăugiri și 4 ștergeri
  1. 19 0
      src/renderer_vk.cpp
  2. 14 4
      src/renderer_vk.h

+ 19 - 0
src/renderer_vk.cpp

@@ -17,6 +17,10 @@
 #	import <Metal/Metal.h>
 #	import <Metal/Metal.h>
 #endif // BX_PLATFORM_OSX
 #endif // BX_PLATFORM_OSX
 
 
+#if WL_EGL_PLATFORM
+#	include <wayland-egl-backend.h>
+#endif
+
 namespace bgfx { namespace vk
 namespace bgfx { namespace vk
 {
 {
 	static char s_viewName[BGFX_CONFIG_MAX_VIEWS][BGFX_CONFIG_MAX_VIEW_NAME];
 	static char s_viewName[BGFX_CONFIG_MAX_VIEWS][BGFX_CONFIG_MAX_VIEW_NAME];
@@ -6770,6 +6774,20 @@ VK_DESTROY
 			}
 			}
 		}
 		}
 #elif BX_PLATFORM_LINUX
 #elif BX_PLATFORM_LINUX
+#if     WL_EGL_PLATFORM
+		{
+			if (NULL != vkCreateWaylandSurfaceKHR)
+			{
+				VkWaylandSurfaceCreateInfoKHR sci;
+				sci.sType = VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR;
+				sci.pNext = NULL;
+				sci.flags = 0;
+				sci.display = (wl_display*)g_platformData.ndt;
+				sci.surface = (wl_surface*)((wl_egl_window*)g_platformData.nwh)->surface;
+				result = vkCreateWaylandSurfaceKHR(instance, &sci, allocatorCb, &m_surface);
+			}
+		}
+#else
 		{
 		{
 			if (NULL != vkCreateXlibSurfaceKHR)
 			if (NULL != vkCreateXlibSurfaceKHR)
 			{
 			{
@@ -6806,6 +6824,7 @@ VK_DESTROY
 				}
 				}
 			}
 			}
 		}
 		}
+#endif // WL_EGL_PLATFORM
 #elif BX_PLATFORM_OSX
 #elif BX_PLATFORM_OSX
 		{
 		{
 			if (NULL != vkCreateMacOSSurfaceMVK)
 			if (NULL != vkCreateMacOSSurfaceMVK)

+ 14 - 4
src/renderer_vk.h

@@ -11,10 +11,14 @@
 #	define KHR_SURFACE_EXTENSION_NAME VK_KHR_ANDROID_SURFACE_EXTENSION_NAME
 #	define KHR_SURFACE_EXTENSION_NAME VK_KHR_ANDROID_SURFACE_EXTENSION_NAME
 #	define VK_IMPORT_INSTANCE_PLATFORM VK_IMPORT_INSTANCE_ANDROID
 #	define VK_IMPORT_INSTANCE_PLATFORM VK_IMPORT_INSTANCE_ANDROID
 #elif BX_PLATFORM_LINUX
 #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
+#else
 #	define VK_USE_PLATFORM_XLIB_KHR
 #	define VK_USE_PLATFORM_XLIB_KHR
 #	define VK_USE_PLATFORM_XCB_KHR
 #	define VK_USE_PLATFORM_XCB_KHR
-//#	define VK_USE_PLATFORM_WAYLAND_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
 #	define VK_IMPORT_INSTANCE_PLATFORM VK_IMPORT_INSTANCE_LINUX
 #	define VK_IMPORT_INSTANCE_PLATFORM VK_IMPORT_INSTANCE_LINUX
 #elif BX_PLATFORM_WINDOWS
 #elif BX_PLATFORM_WINDOWS
 #	define VK_USE_PLATFORM_WIN32_KHR
 #	define VK_USE_PLATFORM_WIN32_KHR
@@ -62,6 +66,14 @@
 			/* VK_KHR_android_surface */                               \
 			/* VK_KHR_android_surface */                               \
 			VK_IMPORT_INSTANCE_FUNC(true,  vkCreateAndroidSurfaceKHR); \
 			VK_IMPORT_INSTANCE_FUNC(true,  vkCreateAndroidSurfaceKHR); \
 
 
+#if WL_EGL_PLATFORM
+#define VK_IMPORT_INSTANCE_LINUX                                                              \
+			/* VK_KHR_wayland_surface */                                                      \
+			VK_IMPORT_INSTANCE_FUNC(true,  vkCreateWaylandSurfaceKHR);                        \
+			VK_IMPORT_INSTANCE_FUNC(true,  vkGetPhysicalDeviceWaylandPresentationSupportKHR); \
+
+
+#else
 #define VK_IMPORT_INSTANCE_LINUX                                                           \
 #define VK_IMPORT_INSTANCE_LINUX                                                           \
 			/* VK_KHR_xlib_surface */                                                      \
 			/* VK_KHR_xlib_surface */                                                      \
 			VK_IMPORT_INSTANCE_FUNC(true,  vkCreateXlibSurfaceKHR);                        \
 			VK_IMPORT_INSTANCE_FUNC(true,  vkCreateXlibSurfaceKHR);                        \
@@ -70,9 +82,7 @@
 			VK_IMPORT_INSTANCE_FUNC(true,  vkCreateXcbSurfaceKHR);                         \
 			VK_IMPORT_INSTANCE_FUNC(true,  vkCreateXcbSurfaceKHR);                         \
 			VK_IMPORT_INSTANCE_FUNC(true,  vkGetPhysicalDeviceXcbPresentationSupportKHR);  \
 			VK_IMPORT_INSTANCE_FUNC(true,  vkGetPhysicalDeviceXcbPresentationSupportKHR);  \
 
 
-//			/* VK_KHR_wayland_surface */
-//			VK_IMPORT_INSTANCE_FUNC(true,  vkCreateWaylandSurfaceKHR);
-//			VK_IMPORT_INSTANCE_FUNC(true,  vkGetPhysicalDeviceWaylandPresentationSupportKHR);
+#endif // WL_EGL_PLATFORM
 
 
 #define VK_IMPORT_INSTANCE_WINDOWS                                                          \
 #define VK_IMPORT_INSTANCE_WINDOWS                                                          \
 			/* VK_KHR_win32_surface */                                                      \
 			/* VK_KHR_win32_surface */                                                      \