static int init_drm(struct display *d) { EGLint major, minor; int fd; drm_magic_t magic; fd = open(d->device_name, O_RDWR); if (fd < 0) { fprintf(stderr, "drm open failed: %m\n"); return -1; } if (drmGetMagic(fd, &magic)) { fprintf(stderr, "DRI2: failed to get drm magic"); return -1; } /* 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 -1; } if (!eglBindAPI(EGL_OPENGL_API)) { fprintf(stderr, "failed to bind api EGL_OPENGL_API\n"); return -1; } d->ctx = eglCreateContext(d->dpy, NULL, EGL_NO_CONTEXT, NULL); if (d->ctx == NULL) { fprintf(stderr, "failed to create context\n"); return -1; } if (!eglMakeCurrent(d->dpy, NULL, NULL, d->ctx)) { fprintf(stderr, "faile to make context current\n"); return -1; } #ifdef HAVE_CAIRO_EGL d->device = cairo_egl_device_create(d->dpy, d->ctx); if (d->device == NULL) { fprintf(stderr, "failed to get cairo drm device\n"); return -1; } #endif return 0; }
void QXcbConnection::initializeDri2() { xcb_dri2_connect_cookie_t connect_cookie = xcb_dri2_connect_unchecked (m_connection, m_screens[0]->root(), XCB_DRI2_DRIVER_TYPE_DRI); xcb_dri2_connect_reply_t *connect = xcb_dri2_connect_reply (m_connection, connect_cookie, NULL); if (! connect || connect->driver_name_length + connect->device_name_length == 0) { qDebug() << "Failed to connect to dri2"; return; } m_dri2_device_name = QByteArray(xcb_dri2_connect_device_name (connect), xcb_dri2_connect_device_name_length (connect)); delete connect; int fd = open(m_dri2_device_name.constData(), O_RDWR); if (fd < 0) { qDebug() << "InitializeDri2: Could'nt open device << dri2DeviceName"; m_dri2_device_name = QByteArray(); return; } drm_magic_t magic; if (drmGetMagic(fd, &magic)) { qDebug() << "Failed to get drmMagic"; return; } xcb_dri2_authenticate_cookie_t authenticate_cookie = xcb_dri2_authenticate_unchecked(m_connection, m_screens[0]->root(), magic); xcb_dri2_authenticate_reply_t *authenticate = xcb_dri2_authenticate_reply(m_connection, authenticate_cookie, NULL); if (authenticate == NULL || !authenticate->authenticated) { fprintf(stderr, "DRI2: failed to authenticate\n"); free(authenticate); return; } delete authenticate; EGLDisplay display = eglGetDRMDisplayMESA(fd); if (!display) { fprintf(stderr, "failed to create display\n"); return; } m_egl_display = display; EGLint major,minor; if (!eglInitialize(display, &major, &minor)) { fprintf(stderr, "failed to initialize display\n"); return; } }