@@ -107,7 +107,11 @@ std::vector<VulkanRenderer::DeviceInfo> VulkanRenderer::GetDevices()
107
107
#if BOOST_OS_WINDOWS
108
108
requiredExtensions.emplace_back (VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
109
109
#elif BOOST_OS_LINUX
110
- requiredExtensions.emplace_back (VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
110
+ auto backend = gui_getWindowInfo ().window_main .backend ;
111
+ if (backend == WindowHandleInfo::Backend::X11)
112
+ requiredExtensions.emplace_back (VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
113
+ else if (backend == WindowHandleInfo::Backend::WAYLAND)
114
+ requiredExtensions.emplace_back (VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
111
115
#elif BOOST_OS_MACOS
112
116
requiredExtensions.emplace_back (VK_EXT_METAL_SURFACE_EXTENSION_NAME);
113
117
#endif
@@ -1149,7 +1153,11 @@ std::vector<const char*> VulkanRenderer::CheckInstanceExtensionSupport(FeatureCo
1149
1153
#if BOOST_OS_WINDOWS
1150
1154
requiredInstanceExtensions.emplace_back (VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
1151
1155
#elif BOOST_OS_LINUX
1152
- requiredInstanceExtensions.emplace_back (VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
1156
+ auto backend = gui_getWindowInfo ().window_main .backend ;
1157
+ if (backend == WindowHandleInfo::Backend::X11)
1158
+ requiredInstanceExtensions.emplace_back (VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
1159
+ else if (backend == WindowHandleInfo::Backend::WAYLAND)
1160
+ requiredInstanceExtensions.emplace_back (VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
1153
1161
#elif BOOST_OS_MACOS
1154
1162
requiredInstanceExtensions.emplace_back (VK_EXT_METAL_SURFACE_EXTENSION_NAME);
1155
1163
#endif
@@ -1267,14 +1275,37 @@ VkSurfaceKHR VulkanRenderer::CreateXcbSurface(VkInstance instance, xcb_connectio
1267
1275
1268
1276
return result;
1269
1277
}
1278
+
1279
+ VkSurfaceKHR VulkanRenderer::CreateWaylandSurface (VkInstance instance, wl_display* display, wl_surface* surface)
1280
+ {
1281
+ VkWaylandSurfaceCreateInfoKHR sci{};
1282
+ sci.sType = VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR;
1283
+ sci.flags = 0 ;
1284
+ sci.display = display;
1285
+ sci.surface = surface;
1286
+
1287
+ VkSurfaceKHR result;
1288
+ VkResult err;
1289
+ if ((err = vkCreateWaylandSurfaceKHR (instance, &sci, nullptr , &result)) != VK_SUCCESS)
1290
+ {
1291
+ forceLog_printf (" Cannot create a Wayland Vulkan surface: %d" , (sint32)err);
1292
+ throw std::runtime_error (fmt::format (" Cannot create a Wayland Vulkan surface: {}" , err));
1293
+ }
1294
+
1295
+ return result;
1296
+ }
1270
1297
#endif
1271
1298
1272
1299
VkSurfaceKHR VulkanRenderer::CreateFramebufferSurface (VkInstance instance, struct WindowHandleInfo & windowInfo)
1273
1300
{
1274
1301
#if BOOST_OS_WINDOWS
1275
1302
return CreateWinSurface (instance, windowInfo.hwnd );
1276
1303
#elif BOOST_OS_LINUX
1277
- return CreateXlibSurface (instance, windowInfo.xlib_display , windowInfo.xlib_window );
1304
+ if (windowInfo.backend == WindowHandleInfo::Backend::X11)
1305
+ return CreateXlibSurface (instance, windowInfo.xlib_display , windowInfo.xlib_window );
1306
+ if (windowInfo.backend == WindowHandleInfo::Backend::WAYLAND)
1307
+ return CreateWaylandSurface (instance, windowInfo.display , windowInfo.surface );
1308
+ return {};
1278
1309
#elif BOOST_OS_MACOS
1279
1310
return CreateCocoaSurface (instance, windowInfo.handle );
1280
1311
#endif
@@ -2596,6 +2627,15 @@ bool VulkanRenderer::UpdateSwapchainProperties(bool mainWindow)
2596
2627
if (chainInfo.m_usesSRGB != latteBufferUsesSRGB)
2597
2628
stateChanged = true ;
2598
2629
2630
+ int width, height;
2631
+ if (mainWindow)
2632
+ gui_getWindowSize (width, height);
2633
+ else
2634
+ gui_getPadWindowSize (width, height);
2635
+ auto extent = chainInfo.getExtent ();
2636
+ if (width != extent.width || height != extent.height )
2637
+ stateChanged = true ;
2638
+
2599
2639
if (stateChanged)
2600
2640
{
2601
2641
try
0 commit comments