aboutsummaryrefslogtreecommitdiffstats
path: root/src/vulkan
diff options
context:
space:
mode:
authorSamuel Pitoiset <[email protected]>2020-07-01 07:50:08 +0200
committerMarge Bot <[email protected]>2020-07-02 08:31:57 +0000
commit311b9f25834d9ad6ad91f9eb41ec77ab71ab2a73 (patch)
treed77d1d768a971c1352d55890641f43ad8893da79 /src/vulkan
parent11a6a96f8a5fbec77353618d158be391e46ca647 (diff)
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 <[email protected]> Signed-off-by: Samuel Pitoiset <[email protected]> Reviewed-by: Bas Nieuwenhuizen <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5704>
Diffstat (limited to 'src/vulkan')
-rw-r--r--src/vulkan/wsi/wsi_common_x11.c60
1 files 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 =