Commit 23c6053b authored by Gwenole Beauchesne's avatar Gwenole Beauchesne

wayland: fix frame_redraw callback.

The redraw callback needs to be attached to the surface prior to the
commit. Otherwise, the callback notifies the next surface repaint,
which is not the desired behaviour. i.e. we want to be notified for
the surface we have just filled.

Another isse was the redraw_pending was reset before the actual completion
of the frame redraw callback function, thus causing concurrency issues.
e.g. the callback could have been called again, but with a NULL buffer.
parent 087bf30c
......@@ -208,10 +208,10 @@ frame_redraw_callback(void *data, struct wl_callback *callback, uint32_t time)
{
GstVaapiWindowWaylandPrivate * const priv = data;
priv->redraw_pending = FALSE;
wl_buffer_destroy(priv->buffer);
priv->buffer = NULL;
wl_callback_destroy(callback);
priv->redraw_pending = FALSE;
}
static const struct wl_callback_listener frame_callback_listener = {
......@@ -292,14 +292,13 @@ gst_vaapi_window_wayland_render(
priv->opaque_region = NULL;
}
wl_surface_commit(priv->surface);
wl_display_flush(wl_display);
priv->redraw_pending = TRUE;
priv->buffer = buffer;
callback = wl_surface_frame(priv->surface);
wl_callback_add_listener(callback, &frame_callback_listener, priv);
wl_surface_commit(priv->surface);
wl_display_flush(wl_display);
GST_VAAPI_OBJECT_UNLOCK_DISPLAY(window);
return TRUE;
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment