summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2015-10-01 22:57:02 +0200
committerwm4 <wm4@nowhere>2015-10-01 22:57:02 +0200
commitbd87598af9c27315054814be4980806dd332f69c (patch)
tree4d902e7cc2c0b6f9ab7cee220665213115a0aa5b
parentf4d62da8f028bb2359a9a4c6792690cfa5bc8930 (diff)
downloadmpv-bd87598af9c27315054814be4980806dd332f69c.tar.bz2
mpv-bd87598af9c27315054814be4980806dd332f69c.tar.xz
vo_opengl: wayland: switch to new internal API
-rw-r--r--video/out/opengl/common.c3
-rw-r--r--video/out/opengl/common.h1
-rw-r--r--video/out/opengl/wayland.c80
-rw-r--r--video/out/vo_wayland.c2
-rw-r--r--video/out/wayland_common.c10
-rw-r--r--video/out/wayland_common.h2
6 files changed, 44 insertions, 54 deletions
diff --git a/video/out/opengl/common.c b/video/out/opengl/common.c
index f5bb45d376..765a499706 100644
--- a/video/out/opengl/common.c
+++ b/video/out/opengl/common.c
@@ -501,6 +501,7 @@ struct backend {
extern const struct mpgl_driver mpgl_driver_x11;
extern const struct mpgl_driver mpgl_driver_x11egl;
extern const struct mpgl_driver mpgl_driver_cocoa;
+extern const struct mpgl_driver mpgl_driver_wayland;
static const struct backend backends[] = {
#if HAVE_RPI
@@ -515,7 +516,7 @@ static const struct backend backends[] = {
//Add the wayland backend before x11, in order to probe for a wayland-server before a x11-server and avoid using xwayland
#if HAVE_GL_WAYLAND
- {"wayland", mpgl_set_backend_wayland},
+ {.driver = &mpgl_driver_wayland},
#endif
#if HAVE_EGL_X11
{.driver = &mpgl_driver_x11egl},
diff --git a/video/out/opengl/common.h b/video/out/opengl/common.h
index 05115c2048..1a6b62aa35 100644
--- a/video/out/opengl/common.h
+++ b/video/out/opengl/common.h
@@ -155,7 +155,6 @@ int mpgl_validate_backend_opt(struct mp_log *log, const struct m_option *opt,
struct bstr name, struct bstr param);
void mpgl_set_backend_w32(MPGLContext *ctx);
-void mpgl_set_backend_wayland(MPGLContext *ctx);
void mpgl_set_backend_rpi(MPGLContext *ctx);
void mpgl_load_functions(GL *gl, void *(*getProcAddress)(const GLubyte *),
diff --git a/video/out/opengl/wayland.c b/video/out/opengl/wayland.c
index b4d74ef98d..f345cc1563 100644
--- a/video/out/opengl/wayland.c
+++ b/video/out/opengl/wayland.c
@@ -59,9 +59,9 @@ static void egl_resize(struct vo_wayland_state *wl)
wl->window.events = 0;
}
-static bool egl_create_context(struct vo_wayland_state *wl,
- MPGLContext *ctx,
- bool enable_alpha)
+static int egl_create_context(struct vo_wayland_state *wl,
+ MPGLContext *ctx,
+ bool enable_alpha)
{
EGLint major, minor, n;
@@ -69,7 +69,7 @@ static bool egl_create_context(struct vo_wayland_state *wl,
const char *eglstr = "";
if (!(wl->egl_context.egl.dpy = eglGetDisplay(wl->display.display)))
- return false;
+ return -1;
EGLint config_attribs[] = {
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
@@ -84,7 +84,7 @@ static bool egl_create_context(struct vo_wayland_state *wl,
/* major and minor here returns the supported EGL version (e.g.: 1.4) */
if (eglInitialize(wl->egl_context.egl.dpy, &major, &minor) != EGL_TRUE)
- return false;
+ return -1;
MP_VERBOSE(wl, "EGL version %d.%d\n", major, minor);
@@ -94,7 +94,7 @@ static bool egl_create_context(struct vo_wayland_state *wl,
};
if (eglBindAPI(EGL_OPENGL_API) != EGL_TRUE)
- return false;
+ return -1;
eglChooseConfig(wl->egl_context.egl.dpy, config_attribs,
&wl->egl_context.egl.conf, 1, &n);
@@ -114,7 +114,7 @@ static bool egl_create_context(struct vo_wayland_state *wl,
context_attribs);
if (!wl->egl_context.egl.ctx)
- return false;
+ return -1;
}
eglMakeCurrent(wl->egl_context.egl.dpy, NULL, NULL, wl->egl_context.egl.ctx);
@@ -127,7 +127,7 @@ static bool egl_create_context(struct vo_wayland_state *wl,
ctx->native_display_type = "wl";
ctx->native_display = wl->display.display;
- return true;
+ return 0;
}
static void egl_create_window(struct vo_wayland_state *wl)
@@ -163,38 +163,20 @@ static void egl_create_window(struct vo_wayland_state *wl)
eglSwapInterval(wl->egl_context.egl.dpy, 0);
}
-static bool config_window_wayland(struct MPGLContext *ctx, int flags)
+static int waylandgl_reconfig(struct MPGLContext *ctx, int flags)
{
struct vo_wayland_state * wl = ctx->vo->wayland;
- bool enable_alpha = !!(flags & VOFLAG_ALPHA);
- bool ret = false;
- if (!vo_wayland_config(ctx->vo, flags))
- return false;
+ if (!vo_wayland_config(ctx->vo))
+ return -1;
- if (!wl->egl_context.egl.ctx) {
- /* Create OpenGL context */
- ret = egl_create_context(wl, ctx, enable_alpha);
-
- /* If successfully created the context and we don't want to hide the
- * window than also create the window immediately */
- if (ret && !(VOFLAG_HIDDEN & flags))
- egl_create_window(wl);
+ if (!wl->egl_context.egl_window)
+ egl_create_window(wl);
- return ret;
- }
- else {
- if (!wl->egl_context.egl_window) {
- /* If the context exists and the hidden flag is unset then
- * create the window */
- if (!(VOFLAG_HIDDEN & flags))
- egl_create_window(wl);
- }
- return true;
- }
+ return 0;
}
-static void releaseGlContext_wayland(MPGLContext *ctx)
+static void waylandgl_uninit(MPGLContext *ctx)
{
struct vo_wayland_state *wl = ctx->vo->wayland;
@@ -207,9 +189,11 @@ static void releaseGlContext_wayland(MPGLContext *ctx)
}
eglTerminate(wl->egl_context.egl.dpy);
wl->egl_context.egl.ctx = NULL;
+
+ vo_wayland_uninit(ctx->vo);
}
-static void swapGlBuffers_wayland(MPGLContext *ctx)
+static void waylandgl_swap_buffers(MPGLContext *ctx)
{
struct vo_wayland_state *wl = ctx->vo->wayland;
@@ -222,10 +206,11 @@ static void swapGlBuffers_wayland(MPGLContext *ctx)
eglSwapBuffers(wl->egl_context.egl.dpy, wl->egl_context.egl_surface);
}
-static int control(struct vo *vo, int *events, int request, void *data)
+static int waylandgl_control(MPGLContext *ctx, int *events, int request,
+ void *data)
{
- struct vo_wayland_state *wl = vo->wayland;
- int r = vo_wayland_control(vo, events, request, data);
+ struct vo_wayland_state *wl = ctx->vo->wayland;
+ int r = vo_wayland_control(ctx->vo, events, request, data);
if (*events & VO_EVENT_RESIZE)
egl_resize(wl);
@@ -233,12 +218,19 @@ static int control(struct vo *vo, int *events, int request, void *data)
return r;
}
-void mpgl_set_backend_wayland(MPGLContext *ctx)
+static int waylandgl_init(struct MPGLContext *ctx, int flags)
{
- ctx->config_window = config_window_wayland;
- ctx->releaseGlContext = releaseGlContext_wayland;
- ctx->swapGlBuffers = swapGlBuffers_wayland;
- ctx->vo_control = control;
- ctx->vo_init = vo_wayland_init;
- ctx->vo_uninit = vo_wayland_uninit;
+ if (!vo_wayland_init(ctx->vo))
+ return -1;
+
+ return egl_create_context(ctx->vo->wayland, ctx, !!(flags & VOFLAG_ALPHA));
}
+
+const struct mpgl_driver mpgl_driver_wayland = {
+ .name = "wayland",
+ .init = waylandgl_init,
+ .reconfig = waylandgl_reconfig,
+ .swap_buffers = waylandgl_swap_buffers,
+ .control = waylandgl_control,
+ .uninit = waylandgl_uninit,
+};
diff --git a/video/out/vo_wayland.c b/video/out/vo_wayland.c
index 5d3c77e2bf..fa64392c53 100644
--- a/video/out/vo_wayland.c
+++ b/video/out/vo_wayland.c
@@ -586,7 +586,7 @@ static int reconfig(struct vo *vo, struct mp_image_params *fmt, int flags)
buffer_pool_reinit(p, &p->video_bufpool, 2, p->width, p->height,
*p->video_format, p->wl->display.shm);
- vo_wayland_config(vo, flags);
+ vo_wayland_config(vo);
resize(p);
diff --git a/video/out/wayland_common.c b/video/out/wayland_common.c
index 289ed0442e..7c8bfe442c 100644
--- a/video/out/wayland_common.c
+++ b/video/out/wayland_common.c
@@ -1293,7 +1293,7 @@ int vo_wayland_control (struct vo *vo, int *events, int request, void *arg)
return VO_NOTIMPL;
}
-bool vo_wayland_config (struct vo *vo, uint32_t flags)
+bool vo_wayland_config (struct vo *vo)
{
struct vo_wayland_state *wl = vo->wayland;
@@ -1308,11 +1308,9 @@ bool vo_wayland_config (struct vo *vo, uint32_t flags)
wl->window.p_height = vo->dheight;
wl->window.aspect = vo->dwidth / (float) MPMAX(vo->dheight, 1);
- if (!(flags & VOFLAG_HIDDEN)) {
- wl->window.width = vo->dwidth;
- wl->window.height = vo->dheight;
- vo_wayland_fullscreen(vo);
- }
+ wl->window.width = vo->dwidth;
+ wl->window.height = vo->dheight;
+ vo_wayland_fullscreen(vo);
return true;
}
diff --git a/video/out/wayland_common.h b/video/out/wayland_common.h
index 6f3ac72e94..44033c73a3 100644
--- a/video/out/wayland_common.h
+++ b/video/out/wayland_common.h
@@ -147,7 +147,7 @@ struct vo_wayland_state {
int vo_wayland_init(struct vo *vo);
void vo_wayland_uninit(struct vo *vo);
-bool vo_wayland_config(struct vo *vo, uint32_t flags);
+bool vo_wayland_config(struct vo *vo);
int vo_wayland_control(struct vo *vo, int *events, int request, void *arg);
void vo_wayland_request_frame(struct vo *vo, void *data, vo_wayland_frame_cb cb);
bool vo_wayland_wait_frame(struct vo *vo);