From 04d654a5d0b7bb4a072f515f6fbe2a686fc7f7f8 Mon Sep 17 00:00:00 2001 From: Gert Wollny Date: Mon, 6 Feb 2023 09:28:38 +0100 Subject: [PATCH] vulkan/wsi: Take Xwayland into account for x11_min_image_count For wayland we report a minimum of four swapchain images, so for Xwayland we should report the same. v2: Fix typo (Eric) v3: Make that four images on Xwayland (Daniel) Signed-off-by: Gert Wollny Part-of: --- src/vulkan/wsi/wsi_common_x11.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/vulkan/wsi/wsi_common_x11.c b/src/vulkan/wsi/wsi_common_x11.c index 7db7aecd363..6de51942301 100644 --- a/src/vulkan/wsi/wsi_common_x11.c +++ b/src/vulkan/wsi/wsi_common_x11.c @@ -629,7 +629,7 @@ x11_surface_get_support(VkIcdSurfaceBase *icd_surface, } static uint32_t -x11_get_min_image_count(const struct wsi_device *wsi_device) +x11_get_min_image_count(const struct wsi_device *wsi_device, bool is_xwayland) { if (wsi_device->x11.override_minImageCount) return wsi_device->x11.override_minImageCount; @@ -651,8 +651,11 @@ x11_get_min_image_count(const struct wsi_device *wsi_device) * * This is a tradeoff as it uses more memory than needed for non-fullscreen * and non-performance intensive applications. + * + * For Xwayland we report four images as describes in + * wsi_wl_surface_get_capabilities */ - return 3; + return is_xwayland ? 4 : 3; } static VkResult @@ -662,6 +665,8 @@ x11_surface_get_capabilities(VkIcdSurfaceBase *icd_surface, { xcb_connection_t *conn = x11_surface_get_connection(icd_surface); xcb_window_t window = x11_surface_get_window(icd_surface); + struct wsi_x11_connection *wsi_conn = + wsi_x11_get_connection(wsi_device, conn); xcb_get_geometry_cookie_t geom_cookie; xcb_generic_error_t *err; xcb_get_geometry_reply_t *geom; @@ -698,7 +703,7 @@ x11_surface_get_capabilities(VkIcdSurfaceBase *icd_surface, VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR; } - caps->minImageCount = x11_get_min_image_count(wsi_device); + caps->minImageCount = x11_get_min_image_count(wsi_device, wsi_conn->is_xwayland); /* There is no real maximum */ caps->maxImageCount = 0; @@ -1871,7 +1876,7 @@ x11_manage_fifo_queues(void *state) /* Assume this isn't a swapchain where we force 5 images, because those * don't end up with an acquire queue at the moment. */ - unsigned min_image_count = x11_get_min_image_count(chain->base.wsi); + unsigned min_image_count = x11_get_min_image_count(chain->base.wsi, wsi_conn->is_xwayland); /* With drirc overrides some games have swapchain with less than * minimum number of images. */ @@ -2477,7 +2482,7 @@ x11_surface_create_swapchain(VkIcdSurfaceBase *icd_surface, else if (x11_needs_wait_for_fences(wsi_device, wsi_conn, present_mode)) num_images = MAX2(num_images, 5); else if (wsi_device->x11.ensure_minImageCount) - num_images = MAX2(num_images, x11_get_min_image_count(wsi_device)); + num_images = MAX2(num_images, x11_get_min_image_count(wsi_device, wsi_conn->is_xwayland)); /* Check that we have a window up-front. It is an error to not have one. */ xcb_window_t window = x11_surface_get_window(icd_surface);