/** * Return the GLX fbconfigs. */ const __GLcontextModes * x11_screen_get_glx_configs(struct x11_screen *xscr) { return (x11_screen_init_glx(xscr)) ? xscr->glx_dpy->screenConfigs[xscr->number]->configs : NULL; }
/** * 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; }
/** * Return true if the screen supports the extension. */ boolean x11_screen_support(struct x11_screen *xscr, enum x11_screen_extension ext) { boolean supported = FALSE; switch (ext) { case X11_SCREEN_EXTENSION_XSHM: supported = XShmQueryExtension(xscr->dpy); break; #ifdef GLX_DIRECT_RENDERING case X11_SCREEN_EXTENSION_GLX: supported = x11_screen_init_glx(xscr); break; case X11_SCREEN_EXTENSION_DRI2: supported = x11_screen_init_dri2(xscr); break; #endif default: break; } return supported; }