#include <cairo.h>
#include <glib.h>
#include <glib-object.h>
+#include <xf86drm.h>
#define EGL_EGLEXT_PROTOTYPES 1
#define GL_GLEXT_PROTOTYPES 1
struct wl_drm *drm;
struct wl_output *output;
struct rectangle screen_allocation;
+ int authenticated;
EGLDisplay dpy;
EGLContext ctx;
cairo_device_t *device;
static void drm_handle_authenticated(void *data, struct wl_drm *drm)
{
+ struct display *d = data;
+
+ d->authenticated = 1;
}
static const struct wl_drm_listener drm_listener = {
int fd;
GOptionContext *context;
GError *error;
+ drm_magic_t magic;
g_type_init();
return NULL;
}
+ if (drmGetMagic(fd, &magic)) {
+ fprintf(stderr, "DRI2: failed to get drm magic");
+ return NULL;
+ }
+
+ /* Wait for authenticated event */
+ wl_drm_authenticate(d->drm, magic);
+ wl_display_iterate(d->display, WL_DISPLAY_WRITABLE);
+ while (!d->authenticated)
+ wl_display_iterate(d->display, WL_DISPLAY_READABLE);
+
d->dpy = eglGetDRMDisplayMESA(fd);
if (!eglInitialize(d->dpy, &major, &minor)) {
fprintf(stderr, "failed to initialize display\n");
return 0;
}
+static int
+drm_authenticate(struct wlsc_compositor *c, uint32_t id)
+{
+ struct drm_compositor *ec = (struct drm_compositor *) c;
+
+ return drmAuthMagic(ec->base.drm.fd, id);
+}
+
struct wlsc_compositor *
drm_compositor_create(struct wl_display *display)
{
wl_event_loop_add_fd(loop, ec->base.drm.fd,
WL_EVENT_READABLE, on_drm_input, ec);
setup_tty(ec, loop);
+ ec->base.authenticate = drm_authenticate;
ec->base.present = drm_compositor_present;
ec->base.focus = 1;
}
static int
-dri2_authenticate(struct x11_compositor *c)
+dri2_authenticate(struct x11_compositor *c, uint32_t magic)
{
xcb_dri2_authenticate_reply_t *authenticate;
xcb_dri2_authenticate_cookie_t authenticate_cookie;
- drm_magic_t magic;
-
- if (drmGetMagic(c->base.drm.fd, &magic)) {
- fprintf(stderr, "DRI2: failed to get drm magic");
- return -1;
- }
authenticate_cookie =
xcb_dri2_authenticate_unchecked(c->conn,
{
EGLint major, minor;
const char *extensions;
+ drm_magic_t magic;
static const EGLint context_attribs[] = {
EGL_CONTEXT_CLIENT_VERSION, 2,
EGL_NONE
if (dri2_connect(c) < 0)
return -1;
- if (dri2_authenticate(c) < 0)
+ if (drmGetMagic(c->base.drm.fd, &magic)) {
+ fprintf(stderr, "DRI2: failed to get drm magic");
+ return -1;
+ }
+
+ if (dri2_authenticate(c, magic) < 0)
return -1;
c->base.display = eglGetDRMDisplayMESA(c->base.drm.fd);
xcb_free_pixmap(c->conn, pixmap);
}
+static int
+x11_authenticate(struct wlsc_compositor *c, uint32_t id)
+{
+ return dri2_authenticate((struct x11_compositor *) c, id);
+}
+
struct wlsc_compositor *
x11_compositor_create(struct wl_display *display)
{
WL_EVENT_READABLE,
x11_compositor_handle_event, c);
+ c->base.authenticate = x11_authenticate;
c->base.present = x11_compositor_present;
return &c->base;
uint32_t focus;
- void (*authenticate)(struct wlsc_compositor *c, uint32_t id);
+ int (*authenticate)(struct wlsc_compositor *c, uint32_t id);
void (*present)(struct wlsc_compositor *c);
};
PKG_CHECK_MODULES(COMPOSITOR,
[egl gl libpng cairo gdk-pixbuf-2.0 libudev >= 136 libdrm >= 2.4.17] xcb-dri2 xcb-xfixes)
-PKG_CHECK_MODULES(CLIENT, [egl gl cairo-gl gdk-pixbuf-2.0 glib-2.0 gobject-2.0 xkbcommon])
+PKG_CHECK_MODULES(CLIENT, [egl gl cairo-gl gdk-pixbuf-2.0 glib-2.0 gobject-2.0 xkbcommon libdrm])
PKG_CHECK_MODULES(POPPLER, [poppler-glib gdk-2.0])
if test $CC = gcc; then