/** * Initialize DRI2 and pipe screen. */ static boolean dri2_display_init_screen(struct native_display *ndpy) { struct dri2_display *dri2dpy = dri2_display(ndpy); int fd; if (!x11_screen_support(dri2dpy->xscr, X11_SCREEN_EXTENSION_DRI2) || !x11_screen_support(dri2dpy->xscr, X11_SCREEN_EXTENSION_GLX)) { _eglLog(_EGL_WARNING, "GLX/DRI2 is not supported"); return FALSE; } dri2dpy->dri_driver = x11_screen_probe_dri2(dri2dpy->xscr, &dri2dpy->dri_major, &dri2dpy->dri_minor); fd = x11_screen_enable_dri2(dri2dpy->xscr, dri2_display_invalidate_buffers, &dri2dpy->base); if (fd < 0) return FALSE; dri2dpy->base.screen = dri2dpy->event_handler->new_drm_screen(&dri2dpy->base, dri2dpy->dri_driver, fd); if (!dri2dpy->base.screen) { _eglLog(_EGL_DEBUG, "failed to create DRM screen"); return FALSE; } return TRUE; }
/** * Enable DRI2 and returns the file descriptor of the DRM device. The file * descriptor will be closed automatically when the screen is destoryed. */ int x11_screen_enable_dri2(struct x11_screen *xscr, x11_drawable_invalidate_buffers invalidate_buffers, void *user_data) { if (xscr->dri_fd < 0) { int fd; drm_magic_t magic; /* get the driver name and the device name first */ if (!x11_screen_probe_dri2(xscr, NULL, NULL)) return -1; fd = open(xscr->dri_device, O_RDWR); if (fd < 0) { _eglLog(_EGL_WARNING, "failed to open %s", xscr->dri_device); return -1; } memset(&magic, 0, sizeof(magic)); if (drmGetMagic(fd, &magic)) { _eglLog(_EGL_WARNING, "failed to get magic"); close(fd); return -1; } if (!DRI2Authenticate(xscr->dpy, RootWindow(xscr->dpy, xscr->number), magic)) { _eglLog(_EGL_WARNING, "failed to authenticate magic"); close(fd); return -1; } if (!x11_screen_init_glx(xscr)) { _eglLog(_EGL_WARNING, "failed to initialize GLX"); close(fd); return -1; } if (xscr->glx_dpy->xscr) { _eglLog(_EGL_WARNING, "display is already managed by another x11 screen"); close(fd); return -1; } xscr->glx_dpy->xscr = xscr; xscr->dri_invalidate_buffers = invalidate_buffers; xscr->dri_user_data = user_data; xscr->dri_fd = fd; } return xscr->dri_fd; }
/** * Initialize DRI2 and pipe screen. */ static boolean dri2_display_init_screen(struct native_display *ndpy) { struct dri2_display *dri2dpy = dri2_display(ndpy); int fd; if (!x11_screen_support(dri2dpy->xscr, X11_SCREEN_EXTENSION_DRI2) || !x11_screen_support(dri2dpy->xscr, X11_SCREEN_EXTENSION_GLX)) { _eglLog(_EGL_WARNING, "GLX/DRI2 is not supported"); return FALSE; } dri2dpy->dri_driver = x11_screen_probe_dri2(dri2dpy->xscr, &dri2dpy->dri_major, &dri2dpy->dri_minor); fd = x11_screen_enable_dri2(dri2dpy->xscr, dri2_display_invalidate_buffers, &dri2dpy->base); if (fd < 0) return FALSE; dri2dpy->base.screen = dri2dpy->event_handler->new_drm_screen(&dri2dpy->base, dri2dpy->dri_driver, fd); if (!dri2dpy->base.screen) { _eglLog(_EGL_DEBUG, "failed to create DRM screen"); return FALSE; } #ifdef HAVE_WAYLAND_BACKEND dri2dpy->base.wayland_bufmgr = wayland_drm_bufmgr_create( dri2_display_authenticate, dri2dpy, x11_screen_get_device_name(dri2dpy->xscr)); #endif return TRUE; }