From 311b9f25834d9ad6ad91f9eb41ec77ab71ab2a73 Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Wed, 1 Jul 2020 07:50:08 +0200 Subject: [PATCH] Revert "vulkan/wsi/x11: Ensure we create at least minImageCount images." This breaks some games like Wolfenstein Youngblood or Wolfenstein 2 that crash at launch if the number of images is more than what they expected. We could add vk_x11_strict_image_count to fix these game bugs but it seems more conservative to revert that change and add a new wsi drirc workaround for Doom Eternal. This reverts commit 5f97dfc4c848cb6388ec138c19a22a8a880901d1. Cc: 20.1 Signed-off-by: Samuel Pitoiset Reviewed-by: Bas Nieuwenhuizen Part-of: --- src/vulkan/wsi/wsi_common_x11.c | 60 ++++++++++++++------------------- 1 file changed, 26 insertions(+), 34 deletions(-) diff --git a/src/vulkan/wsi/wsi_common_x11.c b/src/vulkan/wsi/wsi_common_x11.c index 8dbd6eebf5d..fd275ce7930 100644 --- a/src/vulkan/wsi/wsi_common_x11.c +++ b/src/vulkan/wsi/wsi_common_x11.c @@ -450,33 +450,6 @@ x11_surface_get_support(VkIcdSurfaceBase *icd_surface, return VK_SUCCESS; } - -static uint32_t -x11_get_min_image_count(struct wsi_device *wsi_device) -{ - if (wsi_device->x11.override_minImageCount) - return wsi_device->x11.override_minImageCount; - - /* For IMMEDIATE and FIFO, most games work in a pipelined manner where the - * can produce frames at a rate of 1/MAX(CPU duration, GPU duration), but - * the render latency is CPU duration + GPU duration. - * - * This means that with scanout from pageflipping we need 3 frames to run - * full speed: - * 1) CPU rendering work - * 2) GPU rendering work - * 3) scanout - * - * Once we have a nonblocking acquire that returns a semaphore we can merge - * 1 and 3. Hence the ideal implementation needs only 2 images, but games - * cannot tellwe currently do not have an ideal implementation and that - * hence they need to allocate 3 images. So let us do it for them. - * - * This is a tradeoff as it uses more memory than needed for non-fullscreen - * and non-performance intensive applications. - */ - return 3; -} static VkResult x11_surface_get_capabilities(VkIcdSurfaceBase *icd_surface, struct wsi_device *wsi_device, @@ -529,10 +502,31 @@ x11_surface_get_capabilities(VkIcdSurfaceBase *icd_surface, VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR; } - caps->minImageCount = x11_get_min_image_count(wsi_device); + /* For IMMEDIATE and FIFO, most games work in a pipelined manner where the + * can produce frames at a rate of 1/MAX(CPU duration, GPU duration), but + * the render latency is CPU duration + GPU duration. + * + * This means that with scanout from pageflipping we need 3 frames to run + * full speed: + * 1) CPU rendering work + * 2) GPU rendering work + * 3) scanout + * + * Once we have a nonblocking acquire that returns a semaphore we can merge + * 1 and 3. Hence the ideal implementation needs only 2 images, but games + * cannot tellwe currently do not have an ideal implementation and that + * hence they need to allocate 3 images. So let us do it for them. + * + * This is a tradeoff as it uses more memory than needed for non-fullscreen + * and non-performance intensive applications. + */ + caps->minImageCount = 3; /* There is no real maximum */ caps->maxImageCount = 0; + if (wsi_device->x11.override_minImageCount) + caps->minImageCount = wsi_device->x11.override_minImageCount; + caps->supportedTransforms = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR; caps->currentTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR; caps->maxImageArrayLayers = 1; @@ -1442,12 +1436,10 @@ x11_surface_create_swapchain(VkIcdSurfaceBase *icd_surface, assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR); unsigned num_images = pCreateInfo->minImageCount; - if (!wsi_device->x11.strict_imageCount) { - if (present_mode == VK_PRESENT_MODE_MAILBOX_KHR) - num_images = MAX2(num_images, 5); - - num_images = MAX2(num_images, x11_get_min_image_count(wsi_device)); - } + if (wsi_device->x11.strict_imageCount) + num_images = pCreateInfo->minImageCount; + else if (present_mode == VK_PRESENT_MODE_MAILBOX_KHR) + num_images = MAX2(num_images, 5); xcb_connection_t *conn = x11_surface_get_connection(icd_surface); struct wsi_x11_connection *wsi_conn = -- 2.30.2