mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-10 03:19:40 +00:00
wayland: really wait until the pending redraw completed.
Introduce gst_vaapi_window_wayland_sync() helper function to wait for the completion of the redraw request. Use it in _render() function to actually block until the previous draw request is completed.
This commit is contained in:
parent
23c6053b94
commit
1fb25b0853
1 changed files with 24 additions and 4 deletions
|
@ -71,6 +71,26 @@ gst_vaapi_window_wayland_hide(GstVaapiWindow *window)
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gst_vaapi_window_wayland_sync(GstVaapiWindow *window)
|
||||
{
|
||||
GstVaapiWindowWaylandPrivate * const priv =
|
||||
GST_VAAPI_WINDOW_WAYLAND(window)->priv;
|
||||
gboolean success = TRUE;
|
||||
|
||||
if (priv->redraw_pending) {
|
||||
struct wl_display * const wl_display =
|
||||
GST_VAAPI_OBJECT_WL_DISPLAY(window);
|
||||
|
||||
GST_VAAPI_OBJECT_LOCK_DISPLAY(window);
|
||||
do {
|
||||
success = wl_display_dispatch(wl_display) >= 0;
|
||||
} while (success && priv->redraw_pending);
|
||||
GST_VAAPI_OBJECT_UNLOCK_DISPLAY(window);
|
||||
}
|
||||
return success;
|
||||
}
|
||||
|
||||
static void
|
||||
handle_ping(void *data, struct wl_shell_surface *shell_surface,
|
||||
uint32_t serial)
|
||||
|
@ -256,11 +276,11 @@ gst_vaapi_window_wayland_render(
|
|||
if (surface_id == VA_INVALID_ID)
|
||||
return FALSE;
|
||||
|
||||
GST_VAAPI_OBJECT_LOCK_DISPLAY(window);
|
||||
|
||||
/* Wait for the previous frame to complete redraw */
|
||||
if (priv->redraw_pending)
|
||||
wl_display_dispatch(wl_display);
|
||||
if (!gst_vaapi_window_wayland_sync(window))
|
||||
return FALSE;
|
||||
|
||||
GST_VAAPI_OBJECT_LOCK_DISPLAY(window);
|
||||
|
||||
/* XXX: use VA/VPP for other filters */
|
||||
va_flags = from_GstVaapiSurfaceRenderFlags(flags);
|
||||
|
|
Loading…
Reference in a new issue