wsi/x11: Rewrite logic for how we consider minImageCount.
MAILBOX reduced from 5 to 4 to be more inline with WL. With xwayland_wait_ready = false now being the default, add some extra consideration for non-FIFO present modes. Add a lengthy rationale for why minImageCount = 3 is exposed on Xwl. Signed-off-by: Hans-Kristian Arntzen <post@arntzen-software.no> Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/27074>
This commit is contained in:

committed by
Marge Bot

parent
8b4259e69b
commit
bd23753991
@@ -1542,6 +1542,53 @@ x11_needs_wait_for_fences(const struct wsi_device *wsi_device,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* This matches Wayland. */
|
||||||
|
#define X11_SWAPCHAIN_MAILBOX_IMAGES 4
|
||||||
|
|
||||||
|
static bool
|
||||||
|
x11_requires_mailbox_image_count(const struct wsi_device *device,
|
||||||
|
struct wsi_x11_connection *wsi_conn,
|
||||||
|
VkPresentModeKHR present_mode)
|
||||||
|
{
|
||||||
|
/* If we're resorting to wait for fences, we're assuming a MAILBOX-like model,
|
||||||
|
* and we should allocate accordingly.
|
||||||
|
*
|
||||||
|
* One potential concern here is IMMEDIATE mode on Wayland.
|
||||||
|
* This situation could arise:
|
||||||
|
* - Fullscreen FLIP mode
|
||||||
|
* - Compositor does not support tearing protocol (we cannot know this here)
|
||||||
|
*
|
||||||
|
* With 3 images, during the window between latch and flip, there is only one image left to app,
|
||||||
|
* so peak FPS may not be reached if the window between latch and flip is large,
|
||||||
|
* but tests on contemporary compositors suggest this effect is minor.
|
||||||
|
* Frame rate in the thousands can easily be reached.
|
||||||
|
*
|
||||||
|
* There are pragmatic reasons to expose 3 images for IMMEDIATE on Xwl.
|
||||||
|
* - minImageCount is not intended as a tool to tune performance, its intent is to signal forward progress.
|
||||||
|
* Our X11 and WL implementations do so for pragmatic reasons due to sync acquire interacting poorly with 2 images.
|
||||||
|
* A jump from 3 to 4 is at best a minor improvement which only affects applications
|
||||||
|
* running at extremely high frame rates, way beyond the monitor refresh rate.
|
||||||
|
* On the other hand, lowering minImageCount to 2 would break the fundamental idea of MAILBOX
|
||||||
|
* (and IMMEDIATE without tear), since FPS > refresh rate would not be possible.
|
||||||
|
*
|
||||||
|
* - Several games developed for other platforms and other Linux WSI implementations
|
||||||
|
* do not expect that image counts arbitrarily change when changing present mode,
|
||||||
|
* and will crash when Mesa does so.
|
||||||
|
* There are several games using the strict_image_count drirc to work around this,
|
||||||
|
* and it would be good to be friendlier in the first place, so we don't have to work around more games.
|
||||||
|
* IMMEDIATE is a common presentation mode on those platforms, but MAILBOX is more Wayland-centric in nature,
|
||||||
|
* so increasing image count for that mode is more reasonable.
|
||||||
|
*
|
||||||
|
* - IMMEDIATE expects tearing, and when tearing, 3 images are more than enough.
|
||||||
|
*
|
||||||
|
* - With EXT_swapchain_maintenance1, toggling between FIFO / IMMEDIATE (used extensively by D3D layering)
|
||||||
|
* would require application to allocate >3 images which is unfortunate for memory usage,
|
||||||
|
* and potentially disastrous for latency unless KHR_present_wait is used.
|
||||||
|
*/
|
||||||
|
return x11_needs_wait_for_fences(device, wsi_conn, present_mode) ||
|
||||||
|
present_mode == VK_PRESENT_MODE_MAILBOX_KHR;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Send image to the X server for presentation at target_msc.
|
* Send image to the X server for presentation at target_msc.
|
||||||
*/
|
*/
|
||||||
@@ -2312,10 +2359,11 @@ x11_get_min_image_count_for_present_mode(struct wsi_device *wsi_device,
|
|||||||
struct wsi_x11_connection *wsi_conn,
|
struct wsi_x11_connection *wsi_conn,
|
||||||
VkPresentModeKHR present_mode)
|
VkPresentModeKHR present_mode)
|
||||||
{
|
{
|
||||||
if (x11_needs_wait_for_fences(wsi_device, wsi_conn, present_mode))
|
uint32_t min_image_count = x11_get_min_image_count(wsi_device, wsi_conn->is_xwayland);
|
||||||
return 5;
|
if (x11_requires_mailbox_image_count(wsi_device, wsi_conn, present_mode))
|
||||||
|
return MAX2(min_image_count, X11_SWAPCHAIN_MAILBOX_IMAGES);
|
||||||
else
|
else
|
||||||
return x11_get_min_image_count(wsi_device, wsi_conn->is_xwayland);
|
return min_image_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -2354,12 +2402,14 @@ x11_surface_create_swapchain(VkIcdSurfaceBase *icd_surface,
|
|||||||
* - presentation mode.
|
* - presentation mode.
|
||||||
*/
|
*/
|
||||||
unsigned num_images = pCreateInfo->minImageCount;
|
unsigned num_images = pCreateInfo->minImageCount;
|
||||||
if (wsi_device->x11.strict_imageCount)
|
if (!wsi_device->x11.strict_imageCount) {
|
||||||
num_images = pCreateInfo->minImageCount;
|
if (x11_requires_mailbox_image_count(wsi_device, wsi_conn, present_mode) ||
|
||||||
else if (x11_needs_wait_for_fences(wsi_device, wsi_conn, present_mode))
|
wsi_device->x11.ensure_minImageCount) {
|
||||||
num_images = MAX2(num_images, 5);
|
unsigned present_mode_images = x11_get_min_image_count_for_present_mode(
|
||||||
else if (wsi_device->x11.ensure_minImageCount)
|
wsi_device, wsi_conn, pCreateInfo->presentMode);
|
||||||
num_images = MAX2(num_images, x11_get_min_image_count(wsi_device, wsi_conn->is_xwayland));
|
num_images = MAX2(num_images, present_mode_images);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Check that we have a window up-front. It is an error to not have one. */
|
/* 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);
|
xcb_window_t window = x11_surface_get_window(icd_surface);
|
||||||
|
Reference in New Issue
Block a user