+
+ if (!wsi_swapchain_is_present_mode_supported(wsi, pCreateInfo,
mode)) {
+ fprintf(stderr, "Unsupported MESA_VK_WSI_PRESENT_MODE value!\n");
+ return pCreateInfo->presentMode;
+ }
+
+ return mode;
+}
+
void
wsi_swapchain_finish(struct wsi_swapchain *chain)
{
diff --git a/src/vulkan/wsi/wsi_common.h b/src/vulkan/wsi/wsi_common.h
index e693e2be425..5ca376b4c49 100644
--- a/src/vulkan/wsi/wsi_common.h
+++ b/src/vulkan/wsi/wsi_common.h
@@ -101,6 +101,7 @@ struct wsi_device {
bool supports_modifiers;
uint32_t maxImageDimension2D;
+ const char *override_present_mode;
uint64_t (*image_get_modifier)(VkImage image);
diff --git a/src/vulkan/wsi/wsi_common_display.c
b/src/vulkan/wsi/wsi_common_display.c
index 09c18315623..74ed36ed646 100644
--- a/src/vulkan/wsi/wsi_common_display.c
+++ b/src/vulkan/wsi/wsi_common_display.c
@@ -1757,7 +1757,7 @@ wsi_display_surface_create_swapchain(
chain->base.get_wsi_image = wsi_display_get_wsi_image;
chain->base.acquire_next_image = wsi_display_acquire_next_image;
chain->base.queue_present = wsi_display_queue_present;
- chain->base.present_mode = create_info->presentMode;
+ chain->base.present_mode =
wsi_swapchain_get_present_mode(wsi_device, create_info);
chain->base.image_count = num_images;
chain->wsi = wsi;
diff --git a/src/vulkan/wsi/wsi_common_private.h
b/src/vulkan/wsi/wsi_common_private.h
index a6f49fc3124..6d8f4b7a0e4 100644
--- a/src/vulkan/wsi/wsi_common_private.h
+++ b/src/vulkan/wsi/wsi_common_private.h
@@ -79,6 +79,10 @@ wsi_swapchain_init(const struct wsi_device *wsi,
const VkSwapchainCreateInfoKHR *pCreateInfo,
const VkAllocationCallbacks *pAllocator);
+enum VkPresentModeKHR
+wsi_swapchain_get_present_mode(struct wsi_device *wsi,
+ const VkSwapchainCreateInfoKHR
*pCreateInfo);
+
void wsi_swapchain_finish(struct wsi_swapchain *chain);
VkResult
diff --git a/src/vulkan/wsi/wsi_common_wayland.c
b/src/vulkan/wsi/wsi_common_wayland.c
index 03a47028ef2..ad653848b82 100644
--- a/src/vulkan/wsi/wsi_common_wayland.c
+++ b/src/vulkan/wsi/wsi_common_wayland.c
@@ -1009,7 +1009,7 @@
wsi_wl_surface_create_swapchain(VkIcdSurfaceBase *icd_surface,
chain->base.get_wsi_image = wsi_wl_swapchain_get_wsi_image;
chain->base.acquire_next_image =
wsi_wl_swapchain_acquire_next_image;
chain->base.queue_present = wsi_wl_swapchain_queue_present;
- chain->base.present_mode = pCreateInfo->presentMode;
+ chain->base.present_mode =
wsi_swapchain_get_present_mode(wsi_device, pCreateInfo);
chain->base.image_count = num_images;
chain->extent = pCreateInfo->imageExtent;
chain->vk_format = pCreateInfo->imageFormat;
diff --git a/src/vulkan/wsi/wsi_common_x11.c
b/src/vulkan/wsi/wsi_common_x11.c
index c87b9312636..1782aa525bc 100644
--- a/src/vulkan/wsi/wsi_common_x11.c
+++ b/src/vulkan/wsi/wsi_common_x11.c
@@ -1361,7 +1361,7 @@ x11_surface_create_swapchain(VkIcdSurfaceBase
*icd_surface,
chain->base.get_wsi_image = x11_get_wsi_image;
chain->base.acquire_next_image = x11_acquire_next_image;
chain->base.queue_present = x11_queue_present;
- chain->base.present_mode = pCreateInfo->presentMode;
+ chain->base.present_mode =
wsi_swapchain_get_present_mode(wsi_device, pCreateInfo);
chain->base.image_count = num_images;
chain->conn = conn;
chain->window = window;