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;