From 2efeab6a4c9ef2207345da92b8f16f8df2a86893 Mon Sep 17 00:00:00 2001 From: Daniel Svensson Date: Fri, 6 Sep 2024 18:32:13 +0200 Subject: [PATCH] Vulkan+Wayland fixes (#271) * Process wayland events with vulkan renderer. * Handle vulkan offscreen swapchain size selection. --- engine/gl/gl_vidwayland.c | 9 ++++++++- engine/vk/vk_init.c | 15 +++++++++++++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/engine/gl/gl_vidwayland.c b/engine/gl/gl_vidwayland.c index f0827bb07..8f8807150 100644 --- a/engine/gl/gl_vidwayland.c +++ b/engine/gl/gl_vidwayland.c @@ -1489,7 +1489,14 @@ static void WL_SwapBuffers(void) } break; #endif - case QR_VULKAN: //the vulkan stuff handles this itself. FIXME: are we still receiving inputs? no idea! + case QR_VULKAN: + if (pwl_display_dispatch_pending(w.display) < 0) + { + Con_Printf(CON_ERROR "wayland connection was lost. Restarting video\n"); + Cbuf_InsertText("vid_restart", RESTRICT_LOCAL, true); + return; + } + break; default: break; } diff --git a/engine/vk/vk_init.c b/engine/vk/vk_init.c index a4786a6e4..3e3155068 100644 --- a/engine/vk/vk_init.c +++ b/engine/vk/vk_init.c @@ -715,8 +715,19 @@ static qboolean VK_CreateSwapChain(void) swapinfo.minImageCount = surfcaps.maxImageCount; if (swapinfo.minImageCount < surfcaps.minImageCount) swapinfo.minImageCount = surfcaps.minImageCount; - swapinfo.imageExtent.width = surfcaps.currentExtent.width; - swapinfo.imageExtent.height = surfcaps.currentExtent.height; + + // With offscreen rendering, the size is not known at first + if (surfcaps.currentExtent.width == UINT32_MAX && surfcaps.currentExtent.height == UINT32_MAX) + { + swapinfo.imageExtent.width = bound(surfcaps.minImageExtent.width, vid.pixelwidth, surfcaps.maxImageExtent.width); + swapinfo.imageExtent.height = bound(surfcaps.minImageExtent.height, vid.pixelheight, surfcaps.maxImageExtent.height); + } + else + { + swapinfo.imageExtent.width = surfcaps.currentExtent.width; + swapinfo.imageExtent.height = surfcaps.currentExtent.height; + } + swapinfo.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT|VK_IMAGE_USAGE_TRANSFER_SRC_BIT; swapinfo.preTransform = surfcaps.currentTransform;//VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR; if (surfcaps.supportedCompositeAlpha & VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR)