X-Git-Url: https://git.libre-soc.org/?p=mesa.git;a=blobdiff_plain;f=src%2Fvulkan%2Fwsi%2Fwsi_common_x11.c;h=979dca0784c30af0892b57b07ba12f4d476e2612;hp=fd275ce7930dd420102d963d82ddad48aa705e6b;hb=323d5bbfd9a1d6684bb5381b67b8965ea98d5fc0;hpb=cb1e0db23e3fa17562bb276b125aeab0b85582cb diff --git a/src/vulkan/wsi/wsi_common_x11.c b/src/vulkan/wsi/wsi_common_x11.c index fd275ce7930..979dca0784c 100644 --- a/src/vulkan/wsi/wsi_common_x11.c +++ b/src/vulkan/wsi/wsi_common_x11.c @@ -41,6 +41,7 @@ #include "util/xmlconfig.h" #include "vk_util.h" +#include "vk_enum_to_str.h" #include "wsi_common_private.h" #include "wsi_common_x11.h" #include "wsi_common_queue.h" @@ -450,6 +451,33 @@ 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, @@ -502,31 +530,10 @@ x11_surface_get_capabilities(VkIcdSurfaceBase *icd_surface, VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR; } - /* 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; + caps->minImageCount = x11_get_min_image_count(wsi_device); /* 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; @@ -790,7 +797,8 @@ VK_DEFINE_NONDISP_HANDLE_CASTS(x11_swapchain, base.base, VkSwapchainKHR, * this has not been seen, success will be returned. */ static VkResult -x11_swapchain_result(struct x11_swapchain *chain, VkResult result) +_x11_swapchain_result(struct x11_swapchain *chain, VkResult result, + const char *file, int line) { /* Prioritise returning existing errors for consistency. */ if (chain->status < 0) @@ -798,6 +806,10 @@ x11_swapchain_result(struct x11_swapchain *chain, VkResult result) /* If we have a new error, mark it as permanent on the chain and return. */ if (result < 0) { +#ifndef NDEBUG + fprintf(stderr, "%s:%d: Swapchain status changed to %s\n", + file, line, vk_Result_to_str(result)); +#endif chain->status = result; return result; } @@ -810,6 +822,12 @@ x11_swapchain_result(struct x11_swapchain *chain, VkResult result) * and is always returned rather than success. */ if (result == VK_SUBOPTIMAL_KHR) { +#ifndef NDEBUG + if (chain->status != VK_SUBOPTIMAL_KHR) { + fprintf(stderr, "%s:%d: Swapchain status changed to %s\n", + file, line, vk_Result_to_str(result)); + } +#endif chain->status = result; return result; } @@ -817,6 +835,8 @@ x11_swapchain_result(struct x11_swapchain *chain, VkResult result) /* No changes, so return the last status. */ return chain->status; } +#define x11_swapchain_result(chain, result) \ + _x11_swapchain_result(chain, result, __FILE__, __LINE__) static struct wsi_image * x11_get_wsi_image(struct wsi_swapchain *wsi_chain, uint32_t image_index) @@ -1440,6 +1460,8 @@ x11_surface_create_swapchain(VkIcdSurfaceBase *icd_surface, num_images = pCreateInfo->minImageCount; else if (present_mode == VK_PRESENT_MODE_MAILBOX_KHR) 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)); xcb_connection_t *conn = x11_surface_get_connection(icd_surface); struct wsi_x11_connection *wsi_conn = @@ -1659,6 +1681,11 @@ wsi_x11_init_wsi(struct wsi_device *wsi_device, wsi_device->x11.strict_imageCount = driQueryOptionb(dri_options, "vk_x11_strict_image_count"); } + if (driCheckOption(dri_options, "vk_x11_ensure_min_image_count", DRI_BOOL)) { + wsi_device->x11.ensure_minImageCount = + driQueryOptionb(dri_options, "vk_x11_ensure_min_image_count"); + } + } wsi->base.get_support = x11_surface_get_support;