[vlc-devel] [PATCH v2 2/3] vulkan: force swapchain resize on display size change

Rémi Denis-Courmont remi at remlab.net
Thu May 7 20:59:21 CEST 2020


Le torstaina 7. toukokuuta 2020, 20.42.33 EEST Alexandre Janniaux a écrit :
> On Windows the swapchain might not be re-created automatically, which
> result in glitches when using the vk output. This enforce 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.
> ---
>  modules/video_output/vulkan/display.c | 20 ++++++++++++++++++++
>  1 file changed, 20 insertions(+)
> 
> diff --git a/modules/video_output/vulkan/display.c
> b/modules/video_output/vulkan/display.c index 174627d67da..b65a654cb16
> 100644
> --- a/modules/video_output/vulkan/display.c
> +++ b/modules/video_output/vulkan/display.c
> @@ -351,6 +351,26 @@ static int Control(vout_display_t *vd, int query,
> va_list ap) case VOUT_DISPLAY_CHANGE_ZOOM: {
>          vout_display_cfg_t cfg = *va_arg (ap, const vout_display_cfg_t *);
>          vout_display_PlacePicture(&sys->place, &vd->source, &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 enforce
> the correct +         * behavior and prevent 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) cfg.display.width;
> +            int height = (int) cfg.display.height;
> +            pl_swapchain_resize(sys->vk->swapchain, &width, &height);
> +
> +            if (width != (int) cfg.display.width
> +             || height != (int) cfg.display.height)
> +                return VLC_EGENERIC;

Failing this call has not been allowed for a year or two as it breaks push-
buffers.

> +        }
> +#endif
>          return VLC_SUCCESS;
>      }


-- 
Реми Дёни-Курмон
http://www.remlab.net/





More information about the vlc-devel mailing list