[vlc-devel] [PATCH v3 09/16] vulkan: force swapchain resize on display size change

Alexandre Janniaux ajanni at videolabs.io
Wed Apr 21 08:04:43 UTC 2021


On Windows the swapchain might not be re-created automatically, which
results in glitches when using the vk output. This enforces the creation
of the swapchain as soon as the display size is changed.

On Wayland, the size of the window is the size of the content so there
is no automatic swapchain sizing and this call is mandatory.

Co-authored-by: Niklas Haas <git at haasn.xyz>
---
 modules/video_output/vulkan/display.c | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/modules/video_output/vulkan/display.c b/modules/video_output/vulkan/display.c
index afeede820e..cb0f3a74fb 100644
--- a/modules/video_output/vulkan/display.c
+++ b/modules/video_output/vulkan/display.c
@@ -402,6 +402,30 @@ static int Control(vout_display_t *vd, int query)
     case VOUT_DISPLAY_CHANGE_SOURCE_CROP:
     case VOUT_DISPLAY_CHANGE_ZOOM: {
         vout_display_PlacePicture(&sys->place, vd->source, vd->cfg);
+
+        /* The following resize should be automatic on most platforms but can
+         * trigger bugs on some platform with some drivers, that have been seen
+         * on Windows in particular. Doing it right now enforces the correct
+         * behavior and prevents these bugs.
+         * In addition, platforms like Wayland need the call as the size of the
+         * window is defined by the size of the content, and not the opposite.
+         * The swapchain creation won't be done twice with this call. */
+#if PL_API_VER >= 18
+        if (query == VOUT_DISPLAY_CHANGE_DISPLAY_SIZE)
+        {
+            int width = (int) vd->cfg->display.width;
+            int height = (int) vd->cfg->display.height;
+            pl_swapchain_resize(sys->swapchain, &width, &height);
+
+            /* NOTE: We currently ignore resizing failures that are transient
+             * on X11. Maybe improving resizing might fix that, but we don't
+             * implement reset_pictures anyway.
+            if (width != (int) vd->cfg->display.width
+             || height != (int) vd->cfg->display.height)
+                return VLC_EGENERIC;
+            */
+        }
+#endif
         return VLC_SUCCESS;
     }
 
-- 
2.31.1



More information about the vlc-devel mailing list