From 0616b7ac90cf4f86bb409d34101e3a3cceac8cbe Mon Sep 17 00:00:00 2001 From: Lionel Landwerlin Date: Thu, 5 Sep 2019 23:54:53 +0300 Subject: [PATCH] vulkan: add vk_x11_strict_image_count option This option strictly allocate the minImageCount given by the application at swapchain creation. This works around application that do not deal with the fact that the implementation allocates more images than the minimum specified. v2: Add values in default drirc (Bas) v3: specify engine name/version (Lionel) Signed-off-by: Lionel Landwerlin Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=111522 Reviewed-by: Bas Nieuwenhuizen Reviewed-by: Eric Engestrom Cc: 19.2 --- src/amd/vulkan/radv_device.c | 1 + src/intel/vulkan/anv_device.c | 1 + src/util/00-mesa-defaults.conf | 9 +++++++++ src/util/xmlpool/t_options.h | 5 +++++ src/vulkan/wsi/wsi_common.h | 5 +++++ src/vulkan/wsi/wsi_common_x11.c | 8 +++++++- 6 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c index 7a6af563797..bdc38a555de 100644 --- a/src/amd/vulkan/radv_device.c +++ b/src/amd/vulkan/radv_device.c @@ -559,6 +559,7 @@ DRI_CONF_BEGIN DRI_CONF_SECTION_PERFORMANCE DRI_CONF_ADAPTIVE_SYNC("true") DRI_CONF_VK_X11_OVERRIDE_MIN_IMAGE_COUNT(0) + DRI_CONF_VK_X11_STRICT_IMAGE_COUNT("false") DRI_CONF_SECTION_END DRI_CONF_END; diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c index b458c15abed..50d910780cb 100644 --- a/src/intel/vulkan/anv_device.c +++ b/src/intel/vulkan/anv_device.c @@ -52,6 +52,7 @@ static const char anv_dri_options_xml[] = DRI_CONF_BEGIN DRI_CONF_SECTION_PERFORMANCE DRI_CONF_VK_X11_OVERRIDE_MIN_IMAGE_COUNT(0) + DRI_CONF_VK_X11_STRICT_IMAGE_COUNT("false") DRI_CONF_SECTION_END DRI_CONF_END; diff --git a/src/util/00-mesa-defaults.conf b/src/util/00-mesa-defaults.conf index 3deb8aee1a5..8f3e84788d9 100644 --- a/src/util/00-mesa-defaults.conf +++ b/src/util/00-mesa-defaults.conf @@ -469,6 +469,15 @@ TODO: document the other workarounds. + + + + + + diff --git a/src/util/xmlpool/t_options.h b/src/util/xmlpool/t_options.h index 9f3dee4945f..e08ba1bf815 100644 --- a/src/util/xmlpool/t_options.h +++ b/src/util/xmlpool/t_options.h @@ -225,6 +225,11 @@ DRI_CONF_OPT_BEGIN_V(vk_x11_override_min_image_count, int, def, "0:999") \ DRI_CONF_DESC(en,gettext("Override the VkSurfaceCapabilitiesKHR::minImageCount (0 = no override)")) \ DRI_CONF_OPT_END +#define DRI_CONF_VK_X11_STRICT_IMAGE_COUNT(def) \ +DRI_CONF_OPT_BEGIN_B(vk_x11_strict_image_count, def) \ + DRI_CONF_DESC(en,gettext("Force the X11 WSI to create exactly the number of image specified by the application in VkSwapchainCreateInfoKHR::minImageCount")) \ +DRI_CONF_OPT_END + #define DRI_CONF_MESA_GLTHREAD(def) \ DRI_CONF_OPT_BEGIN_B(mesa_glthread, def) \ DRI_CONF_DESC(en,gettext("Enable offloading GL driver work to a separate thread")) \ diff --git a/src/vulkan/wsi/wsi_common.h b/src/vulkan/wsi/wsi_common.h index b00fc3c1857..064b16a5e7a 100644 --- a/src/vulkan/wsi/wsi_common.h +++ b/src/vulkan/wsi/wsi_common.h @@ -113,6 +113,11 @@ struct wsi_device { /* Override the minimum number of images on the swapchain. * 0 = no override */ uint32_t override_minImageCount; + + /* Forces strict number of image on the swapchain using application + * provided VkSwapchainCreateInfoKH::RminImageCount. + */ + bool strict_imageCount; } x11; uint64_t (*image_get_modifier)(VkImage image); diff --git a/src/vulkan/wsi/wsi_common_x11.c b/src/vulkan/wsi/wsi_common_x11.c index af61bb91dca..491bd8a3702 100644 --- a/src/vulkan/wsi/wsi_common_x11.c +++ b/src/vulkan/wsi/wsi_common_x11.c @@ -1413,7 +1413,9 @@ x11_surface_create_swapchain(VkIcdSurfaceBase *icd_surface, assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR); unsigned num_images = pCreateInfo->minImageCount; - if (present_mode == VK_PRESENT_MODE_MAILBOX_KHR) + 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); @@ -1630,6 +1632,10 @@ wsi_x11_init_wsi(struct wsi_device *wsi_device, wsi_device->x11.override_minImageCount = driQueryOptioni(dri_options, "vk_x11_override_min_image_count"); } + if (driCheckOption(dri_options, "vk_x11_strict_image_count", DRI_BOOL)) { + wsi_device->x11.strict_imageCount = + driQueryOptionb(dri_options, "vk_x11_strict_image_count"); + } } wsi->base.get_support = x11_surface_get_support; -- 2.30.2