mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-20 00:31:13 +00:00
gl/wayland: run each window on a separate queue
Based on patch by Julien Isorce <julien.isorce@collabora.co.uk> https://bugzilla.gnome.org/show_bug.cgi?id=709747
This commit is contained in:
parent
0f6b04c91d
commit
00cff1f9e4
4 changed files with 54 additions and 5 deletions
|
@ -236,8 +236,13 @@ create_surface (GstGLWindowWaylandEGL * window_egl)
|
||||||
|
|
||||||
window_egl->window.surface =
|
window_egl->window.surface =
|
||||||
wl_compositor_create_surface (display->compositor);
|
wl_compositor_create_surface (display->compositor);
|
||||||
|
wl_proxy_set_queue ((struct wl_proxy *) window_egl->window.surface,
|
||||||
|
window_egl->window.queue);
|
||||||
|
|
||||||
window_egl->window.shell_surface =
|
window_egl->window.shell_surface =
|
||||||
wl_shell_get_shell_surface (display->shell, window_egl->window.surface);
|
wl_shell_get_shell_surface (display->shell, window_egl->window.surface);
|
||||||
|
wl_proxy_set_queue ((struct wl_proxy *) window_egl->window.shell_surface,
|
||||||
|
window_egl->window.queue);
|
||||||
|
|
||||||
wl_shell_surface_add_listener (window_egl->window.shell_surface,
|
wl_shell_surface_add_listener (window_egl->window.shell_surface,
|
||||||
&shell_surface_listener, window_egl);
|
&shell_surface_listener, window_egl);
|
||||||
|
@ -358,11 +363,14 @@ gst_gl_window_wayland_egl_open (GstGLWindow * window, GError ** error)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
window_egl->window.queue = wl_display_create_queue (display->display);
|
||||||
|
|
||||||
wl_display_roundtrip (display->display);
|
wl_display_roundtrip (display->display);
|
||||||
|
|
||||||
create_surface (window_egl);
|
create_surface (window_egl);
|
||||||
|
|
||||||
window_egl->wl_source = wayland_event_source_new (display->display);
|
window_egl->wl_source = wayland_event_source_new (display->display,
|
||||||
|
window_egl->window.queue);
|
||||||
|
|
||||||
g_source_attach (window_egl->wl_source, window_egl->main_context);
|
g_source_attach (window_egl->wl_source, window_egl->main_context);
|
||||||
|
|
||||||
|
|
|
@ -63,6 +63,7 @@ struct display {
|
||||||
struct window {
|
struct window {
|
||||||
struct display *display;
|
struct display *display;
|
||||||
|
|
||||||
|
struct wl_event_queue *queue;
|
||||||
struct wl_egl_window *native;
|
struct wl_egl_window *native;
|
||||||
struct wl_surface *surface;
|
struct wl_surface *surface;
|
||||||
struct wl_shell_surface *shell_surface;
|
struct wl_shell_surface *shell_surface;
|
||||||
|
|
|
@ -38,12 +38,47 @@
|
||||||
|
|
||||||
#include "wayland_event_source.h"
|
#include "wayland_event_source.h"
|
||||||
|
|
||||||
|
static void
|
||||||
|
sync_callback (void *data, struct wl_callback *callback, uint32_t serial)
|
||||||
|
{
|
||||||
|
gboolean *done = data;
|
||||||
|
|
||||||
|
*done = TRUE;
|
||||||
|
wl_callback_destroy (callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct wl_callback_listener sync_listener = {
|
||||||
|
sync_callback
|
||||||
|
};
|
||||||
|
|
||||||
|
gint
|
||||||
|
gst_gl_wl_display_roundtrip_queue (struct wl_display *display,
|
||||||
|
struct wl_event_queue *queue)
|
||||||
|
{
|
||||||
|
struct wl_callback *callback = wl_display_sync (display);
|
||||||
|
gboolean done = FALSE;
|
||||||
|
gint ret = 0;
|
||||||
|
|
||||||
|
if (callback == NULL)
|
||||||
|
return -1;
|
||||||
|
wl_callback_add_listener (callback, &sync_listener, &done);
|
||||||
|
wl_proxy_set_queue ((struct wl_proxy *) callback, queue);
|
||||||
|
while (!done && ret >= 0)
|
||||||
|
ret = wl_display_dispatch_queue (display, queue);
|
||||||
|
|
||||||
|
if (ret == -1 && !done)
|
||||||
|
wl_callback_destroy (callback);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
typedef struct _WaylandEventSource
|
typedef struct _WaylandEventSource
|
||||||
{
|
{
|
||||||
GSource source;
|
GSource source;
|
||||||
GPollFD pfd;
|
GPollFD pfd;
|
||||||
uint32_t mask;
|
uint32_t mask;
|
||||||
struct wl_display *display;
|
struct wl_display *display;
|
||||||
|
struct wl_event_queue *queue;
|
||||||
} WaylandEventSource;
|
} WaylandEventSource;
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
|
@ -79,7 +114,7 @@ wayland_event_source_dispatch (GSource * base,
|
||||||
WaylandEventSource *source = (WaylandEventSource *) base;
|
WaylandEventSource *source = (WaylandEventSource *) base;
|
||||||
|
|
||||||
if (source->pfd.revents) {
|
if (source->pfd.revents) {
|
||||||
wl_display_roundtrip (source->display);
|
wl_display_roundtrip_queue (source->display, source->queue);
|
||||||
source->pfd.revents = 0;
|
source->pfd.revents = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -97,13 +132,15 @@ static GSourceFuncs wayland_event_source_funcs = {
|
||||||
};
|
};
|
||||||
|
|
||||||
GSource *
|
GSource *
|
||||||
wayland_event_source_new (struct wl_display *display)
|
wayland_event_source_new (struct wl_display *display,
|
||||||
|
struct wl_event_queue *queue)
|
||||||
{
|
{
|
||||||
WaylandEventSource *source;
|
WaylandEventSource *source;
|
||||||
|
|
||||||
source = (WaylandEventSource *)
|
source = (WaylandEventSource *)
|
||||||
g_source_new (&wayland_event_source_funcs, sizeof (WaylandEventSource));
|
g_source_new (&wayland_event_source_funcs, sizeof (WaylandEventSource));
|
||||||
source->display = display;
|
source->display = display;
|
||||||
|
source->queue = queue;
|
||||||
source->pfd.fd = wl_display_get_fd (display);
|
source->pfd.fd = wl_display_get_fd (display);
|
||||||
source->pfd.events = G_IO_IN | G_IO_ERR;
|
source->pfd.events = G_IO_IN | G_IO_ERR;
|
||||||
g_source_add_poll (&source->source, &source->pfd);
|
g_source_add_poll (&source->source, &source->pfd);
|
||||||
|
|
|
@ -33,7 +33,10 @@
|
||||||
|
|
||||||
#include <wayland-client.h>
|
#include <wayland-client.h>
|
||||||
|
|
||||||
GSource *
|
GSource * wayland_event_source_new (struct wl_display *display,
|
||||||
wayland_event_source_new (struct wl_display *display);
|
struct wl_event_queue *queue);
|
||||||
|
|
||||||
|
gint gst_gl_wl_display_roundtrip_queue (struct wl_display *display,
|
||||||
|
struct wl_event_queue *queue);
|
||||||
|
|
||||||
#endif /* __WAYLAND_EVENT_SOURCE_H__ */
|
#endif /* __WAYLAND_EVENT_SOURCE_H__ */
|
||||||
|
|
Loading…
Reference in a new issue