diff --git a/src/amd/vulkan/radv_instance.c b/src/amd/vulkan/radv_instance.c index c43b8f9a00c..fb0db9769e6 100644 --- a/src/amd/vulkan/radv_instance.c +++ b/src/amd/vulkan/radv_instance.c @@ -154,7 +154,7 @@ static const struct debug_control trace_options[] = { static const driOptionDescription radv_dri_options[] = { DRI_CONF_SECTION_PERFORMANCE DRI_CONF_ADAPTIVE_SYNC(true) - DRI_CONF_VK_X11_OVERRIDE_MIN_IMAGE_COUNT(0) + DRI_CONF_VK_OVERRIDE_MIN_IMAGE_COUNT(0) DRI_CONF_VK_X11_STRICT_IMAGE_COUNT(false) DRI_CONF_VK_X11_ENSURE_MIN_IMAGE_COUNT(false) DRI_CONF_VK_XWAYLAND_WAIT_READY(false) diff --git a/src/asahi/vulkan/hk_instance.c b/src/asahi/vulkan/hk_instance.c index 1fd2c844681..a872018d923 100644 --- a/src/asahi/vulkan/hk_instance.c +++ b/src/asahi/vulkan/hk_instance.c @@ -80,7 +80,7 @@ hk_EnumerateInstanceExtensionProperties(const char *pLayerName, static const driOptionDescription hk_dri_options[] = { DRI_CONF_SECTION_PERFORMANCE DRI_CONF_ADAPTIVE_SYNC(true) - DRI_CONF_VK_X11_OVERRIDE_MIN_IMAGE_COUNT(0) + DRI_CONF_VK_OVERRIDE_MIN_IMAGE_COUNT(0) DRI_CONF_VK_X11_STRICT_IMAGE_COUNT(false) DRI_CONF_VK_X11_ENSURE_MIN_IMAGE_COUNT(false) DRI_CONF_VK_XWAYLAND_WAIT_READY(false) diff --git a/src/freedreno/vulkan/tu_device.cc b/src/freedreno/vulkan/tu_device.cc index 05ffad6424d..e32862161de 100644 --- a/src/freedreno/vulkan/tu_device.cc +++ b/src/freedreno/vulkan/tu_device.cc @@ -1748,7 +1748,7 @@ tu_destroy_physical_device(struct vk_physical_device *device) static const driOptionDescription tu_dri_options[] = { DRI_CONF_SECTION_PERFORMANCE - DRI_CONF_VK_X11_OVERRIDE_MIN_IMAGE_COUNT(0) + DRI_CONF_VK_OVERRIDE_MIN_IMAGE_COUNT(0) DRI_CONF_VK_X11_STRICT_IMAGE_COUNT(false) DRI_CONF_VK_X11_ENSURE_MIN_IMAGE_COUNT(false) DRI_CONF_VK_XWAYLAND_WAIT_READY(false) diff --git a/src/intel/vulkan/anv_instance.c b/src/intel/vulkan/anv_instance.c index a6f2c5985c0..b509fa21404 100644 --- a/src/intel/vulkan/anv_instance.c +++ b/src/intel/vulkan/anv_instance.c @@ -10,7 +10,7 @@ static const driOptionDescription anv_dri_options[] = { DRI_CONF_SECTION_PERFORMANCE DRI_CONF_ADAPTIVE_SYNC(true) - DRI_CONF_VK_X11_OVERRIDE_MIN_IMAGE_COUNT(0) + DRI_CONF_VK_OVERRIDE_MIN_IMAGE_COUNT(0) DRI_CONF_VK_X11_STRICT_IMAGE_COUNT(false) DRI_CONF_VK_WSI_DISABLE_UNORDERED_SUBMITS(false) DRI_CONF_VK_XWAYLAND_WAIT_READY(false) diff --git a/src/intel/vulkan_hasvk/anv_device.c b/src/intel/vulkan_hasvk/anv_device.c index d111c96ae7a..42e3f82eff9 100644 --- a/src/intel/vulkan_hasvk/anv_device.c +++ b/src/intel/vulkan_hasvk/anv_device.c @@ -66,7 +66,7 @@ static const driOptionDescription anv_dri_options[] = { DRI_CONF_SECTION_PERFORMANCE DRI_CONF_ADAPTIVE_SYNC(true) - DRI_CONF_VK_X11_OVERRIDE_MIN_IMAGE_COUNT(0) + DRI_CONF_VK_OVERRIDE_MIN_IMAGE_COUNT(0) DRI_CONF_VK_X11_STRICT_IMAGE_COUNT(false) DRI_CONF_VK_XWAYLAND_WAIT_READY(true) DRI_CONF_ANV_ASSUME_FULL_SUBGROUPS(0) diff --git a/src/nouveau/vulkan/nvk_instance.c b/src/nouveau/vulkan/nvk_instance.c index e2413045455..2261dc080a8 100644 --- a/src/nouveau/vulkan/nvk_instance.c +++ b/src/nouveau/vulkan/nvk_instance.c @@ -98,7 +98,7 @@ nvk_init_debug_flags(struct nvk_instance *instance) static const driOptionDescription nvk_dri_options[] = { DRI_CONF_SECTION_PERFORMANCE DRI_CONF_ADAPTIVE_SYNC(true) - DRI_CONF_VK_X11_OVERRIDE_MIN_IMAGE_COUNT(0) + DRI_CONF_VK_OVERRIDE_MIN_IMAGE_COUNT(0) DRI_CONF_VK_X11_STRICT_IMAGE_COUNT(false) DRI_CONF_VK_X11_ENSURE_MIN_IMAGE_COUNT(false) DRI_CONF_VK_XWAYLAND_WAIT_READY(false) diff --git a/src/panfrost/vulkan/panvk_instance.c b/src/panfrost/vulkan/panvk_instance.c index bb425414bb1..39f137d5ab3 100644 --- a/src/panfrost/vulkan/panvk_instance.c +++ b/src/panfrost/vulkan/panvk_instance.c @@ -178,7 +178,7 @@ panvk_kmod_free(const struct pan_kmod_allocator *allocator, void *data) static const driOptionDescription panvk_dri_options[] = { DRI_CONF_SECTION_PERFORMANCE DRI_CONF_ADAPTIVE_SYNC(true) - DRI_CONF_VK_X11_OVERRIDE_MIN_IMAGE_COUNT(0) + DRI_CONF_VK_OVERRIDE_MIN_IMAGE_COUNT(0) DRI_CONF_VK_X11_STRICT_IMAGE_COUNT(false) DRI_CONF_VK_X11_ENSURE_MIN_IMAGE_COUNT(false) DRI_CONF_VK_XWAYLAND_WAIT_READY(false) diff --git a/src/util/00-mesa-defaults.conf b/src/util/00-mesa-defaults.conf index 926db52670e..78c6934b829 100644 --- a/src/util/00-mesa-defaults.conf +++ b/src/util/00-mesa-defaults.conf @@ -645,24 +645,24 @@ TODO: document the other workarounds. - - - @@ -723,10 +723,12 @@ TODO: document the other workarounds. diff --git a/src/util/driconf.h b/src/util/driconf.h index ab9aca4cb07..d6dd50f7539 100644 --- a/src/util/driconf.h +++ b/src/util/driconf.h @@ -456,8 +456,8 @@ DRI_CONF_OPT_B(vk_wsi_disable_unordered_submits, def, \ "Disable unordered WSI submits to workaround application synchronization bugs") -#define DRI_CONF_VK_X11_OVERRIDE_MIN_IMAGE_COUNT(def) \ - DRI_CONF_OPT_I(vk_x11_override_min_image_count, def, 0, 999, \ +#define DRI_CONF_VK_OVERRIDE_MIN_IMAGE_COUNT(def) \ + DRI_CONF_OPT_I(vk_override_min_image_count, def, 0, 999, \ "Override the VkSurfaceCapabilitiesKHR::minImageCount (0 = no override)") #define DRI_CONF_VK_X11_STRICT_IMAGE_COUNT(def) \ diff --git a/src/virtio/vulkan/vn_instance.c b/src/virtio/vulkan/vn_instance.c index 523f0590e9a..b1f642f1c2e 100644 --- a/src/virtio/vulkan/vn_instance.c +++ b/src/virtio/vulkan/vn_instance.c @@ -70,8 +70,8 @@ static const struct vk_instance_extension_table static const driOptionDescription vn_dri_options[] = { /* clang-format off */ DRI_CONF_SECTION_PERFORMANCE + DRI_CONF_VK_OVERRIDE_MIN_IMAGE_COUNT(0) DRI_CONF_VK_X11_ENSURE_MIN_IMAGE_COUNT(false) - DRI_CONF_VK_X11_OVERRIDE_MIN_IMAGE_COUNT(0) DRI_CONF_VK_X11_STRICT_IMAGE_COUNT(false) DRI_CONF_VK_XWAYLAND_WAIT_READY(true) DRI_CONF_VENUS_IMPLICIT_FENCING(false) diff --git a/src/vulkan/wsi/wsi_common.c b/src/vulkan/wsi/wsi_common.c index 0c4a4ce652e..2a95cfd557b 100644 --- a/src/vulkan/wsi/wsi_common.c +++ b/src/vulkan/wsi/wsi_common.c @@ -220,7 +220,7 @@ wsi_device_init(struct wsi_device *wsi, #endif #ifdef VK_USE_PLATFORM_WAYLAND_KHR - result = wsi_wl_init_wsi(wsi, alloc, pdevice); + result = wsi_wl_init_wsi(wsi, alloc, pdevice, dri_options); if (result != VK_SUCCESS) goto fail; #endif diff --git a/src/vulkan/wsi/wsi_common.h b/src/vulkan/wsi/wsi_common.h index abe771b5bfc..d67f953c42a 100644 --- a/src/vulkan/wsi/wsi_common.h +++ b/src/vulkan/wsi/wsi_common.h @@ -161,6 +161,10 @@ struct wsi_device { struct { /* Don't use the commit-timing protocol for pacing */ bool disable_timestamps; + + /* Override the minimum number of images on the swapchain. + * 0 = no override */ + double override_minImageCount; } wayland; /* diff --git a/src/vulkan/wsi/wsi_common_private.h b/src/vulkan/wsi/wsi_common_private.h index 9fe64cfba95..c20174f6175 100644 --- a/src/vulkan/wsi/wsi_common_private.h +++ b/src/vulkan/wsi/wsi_common_private.h @@ -456,7 +456,8 @@ void wsi_x11_finish_wsi(struct wsi_device *wsi_device, const VkAllocationCallbacks *alloc); VkResult wsi_wl_init_wsi(struct wsi_device *wsi_device, const VkAllocationCallbacks *alloc, - VkPhysicalDevice physical_device); + VkPhysicalDevice physical_device, + const struct driOptionCache *dri_options); void wsi_wl_finish_wsi(struct wsi_device *wsi_device, const VkAllocationCallbacks *alloc); VkResult wsi_win32_init_wsi(struct wsi_device *wsi_device, diff --git a/src/vulkan/wsi/wsi_common_wayland.c b/src/vulkan/wsi/wsi_common_wayland.c index cf3749be6d4..04278d3c8a3 100644 --- a/src/vulkan/wsi/wsi_common_wayland.c +++ b/src/vulkan/wsi/wsi_common_wayland.c @@ -58,6 +58,7 @@ #include #include #include +#include #include @@ -1703,9 +1704,12 @@ wsi_wl_surface_get_support(VkIcdSurfaceBase *surface, #define WSI_WL_DEFAULT_NUM_IMAGES 3 static uint32_t -wsi_wl_surface_get_min_image_count(struct wsi_wl_display *display, +wsi_wl_surface_get_min_image_count(struct wsi_device *wsi_device, struct wsi_wl_display *display, const VkSurfacePresentModeEXT *present_mode) { + if (wsi_device->wayland.override_minImageCount) + return wsi_device->wayland.override_minImageCount; + if (present_mode) { return present_mode->presentMode == VK_PRESENT_MODE_MAILBOX_KHR ? WSI_WL_BUMPED_NUM_IMAGES : WSI_WL_DEFAULT_NUM_IMAGES; @@ -1754,7 +1758,7 @@ wsi_wl_surface_get_capabilities(VkIcdSurfaceBase *icd_surface, display = &temp_display; } - caps->minImageCount = wsi_wl_surface_get_min_image_count(display, present_mode); + caps->minImageCount = wsi_wl_surface_get_min_image_count(wsi_device, display, present_mode); if (!wsi_wl_surface->display) wsi_wl_display_finish(&temp_display); @@ -3516,7 +3520,7 @@ wsi_wl_surface_create_swapchain(VkIcdSurfaceBase *icd_surface, const VkSurfacePresentModeEXT mode = { VK_STRUCTURE_TYPE_SURFACE_PRESENT_MODE_EXT, NULL, pCreateInfo->presentMode }; - uint32_t min_images = wsi_wl_surface_get_min_image_count(wsi_wl_surface->display, &mode); + uint32_t min_images = wsi_wl_surface_get_min_image_count(wsi_device, wsi_wl_surface->display, &mode); bool requires_image_count_bump = min_images == WSI_WL_BUMPED_NUM_IMAGES; if (requires_image_count_bump) num_images = MAX2(min_images, num_images); @@ -3711,7 +3715,8 @@ fail: VkResult wsi_wl_init_wsi(struct wsi_device *wsi_device, const VkAllocationCallbacks *alloc, - VkPhysicalDevice physical_device) + VkPhysicalDevice physical_device, + const struct driOptionCache *dri_options) { struct wsi_wayland *wsi; VkResult result; @@ -3737,6 +3742,14 @@ wsi_wl_init_wsi(struct wsi_device *wsi_device, wsi_device->wsi[VK_ICD_WSI_PLATFORM_WAYLAND] = &wsi->base; + if (dri_options) + { + if (driCheckOption(dri_options, "vk_override_min_image_count", DRI_INT)) { + wsi_device->wayland.override_minImageCount = + driQueryOptioni(dri_options, "vk_override_min_image_count"); + } + } + return VK_SUCCESS; fail: diff --git a/src/vulkan/wsi/wsi_common_x11.c b/src/vulkan/wsi/wsi_common_x11.c index 2cd023dadcf..7872a2a899f 100644 --- a/src/vulkan/wsi/wsi_common_x11.c +++ b/src/vulkan/wsi/wsi_common_x11.c @@ -2924,9 +2924,9 @@ wsi_x11_init_wsi(struct wsi_device *wsi_device, } if (dri_options) { - if (driCheckOption(dri_options, "vk_x11_override_min_image_count", DRI_INT)) { + if (driCheckOption(dri_options, "vk_override_min_image_count", DRI_INT)) { wsi_device->x11.override_minImageCount = - driQueryOptioni(dri_options, "vk_x11_override_min_image_count"); + driQueryOptioni(dri_options, "vk_override_min_image_count"); } if (driCheckOption(dri_options, "vk_x11_strict_image_count", DRI_BOOL)) { wsi_device->x11.strict_imageCount =