149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu/* 249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Mesa 3-D graphics library 349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Version: 7.8 449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * 549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Copyright (C) 2009-2010 Chia-I Wu <olv@0xlab.org> 649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * 749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Permission is hereby granted, free of charge, to any person obtaining a 849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * copy of this software and associated documentation files (the "Software"), 949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * to deal in the Software without restriction, including without limitation 1049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * the rights to use, copy, modify, merge, publish, distribute, sublicense, 1149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * and/or sell copies of the Software, and to permit persons to whom the 1249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Software is furnished to do so, subject to the following conditions: 1349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * 1449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * The above copyright notice and this permission notice shall be included 1549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * in all copies or substantial portions of the Software. 1649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * 17ba81b0743efd978509b1931d7b4b93f37e8aeb5eChia-I Wu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18ba81b0743efd978509b1931d7b4b93f37e8aeb5eChia-I Wu * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20ba81b0743efd978509b1931d7b4b93f37e8aeb5eChia-I Wu * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21ba81b0743efd978509b1931d7b4b93f37e8aeb5eChia-I Wu * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 22ba81b0743efd978509b1931d7b4b93f37e8aeb5eChia-I Wu * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 23ba81b0743efd978509b1931d7b4b93f37e8aeb5eChia-I Wu * DEALINGS IN THE SOFTWARE. 2449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu */ 2549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 2649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include <unistd.h> 2749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include <fcntl.h> 2849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include <sys/types.h> 2949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include <sys/stat.h> 30870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu#include <xf86drm.h> 3149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include <X11/Xlibint.h> 3249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include <X11/extensions/XShm.h> 33870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu 3449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include "util/u_memory.h" 3549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include "egllog.h" 3649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 3749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include "x11_screen.h" 3849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include "dri2.h" 3949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu#include "glxinit.h" 4049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 4149381d63e61c724b156b76068058df1c01a906c2Chia-I Wustruct x11_screen { 4249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu Display *dpy; 4349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu int number; 4449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 45cfb1ed39771c7f3876a8231ab1c8a8d6f7b5deaeChia-I Wu /* 465f08eff2a769e27df37fc00e46797e70a54727bbChia-I Wu * This is used to fetch GLX visuals/fbconfigs. It steals code from GLX. 47cfb1ed39771c7f3876a8231ab1c8a8d6f7b5deaeChia-I Wu * It might be better to rewrite the part in Xlib or XCB. 48cfb1ed39771c7f3876a8231ab1c8a8d6f7b5deaeChia-I Wu */ 4949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu __GLXdisplayPrivate *glx_dpy; 5049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 5149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu int dri_major, dri_minor; 5249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu char *dri_driver; 5349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu char *dri_device; 5449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu int dri_fd; 5549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 56545ac97f9b95e9b5ebd04d2960abb224b5adbe17Chia-I Wu x11_drawable_invalidate_buffers dri_invalidate_buffers; 57545ac97f9b95e9b5ebd04d2960abb224b5adbe17Chia-I Wu void *dri_user_data; 58545ac97f9b95e9b5ebd04d2960abb224b5adbe17Chia-I Wu 5949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu XVisualInfo *visuals; 6049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu int num_visuals; 61f8244e294646c1b5127a2bf3e92811300b0e3b9eChia-I Wu 62064eb0a095b1ac56e20459c216c9271bef01cb9fChia-I Wu /* cached values for x11_drawable_get_depth */ 63f8244e294646c1b5127a2bf3e92811300b0e3b9eChia-I Wu Drawable last_drawable; 64f8244e294646c1b5127a2bf3e92811300b0e3b9eChia-I Wu unsigned int last_depth; 6549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu}; 6649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 6749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 6849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu/** 6949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Create a X11 screen. 7049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu */ 7149381d63e61c724b156b76068058df1c01a906c2Chia-I Wustruct x11_screen * 7249381d63e61c724b156b76068058df1c01a906c2Chia-I Wux11_screen_create(Display *dpy, int screen) 7349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu{ 7449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu struct x11_screen *xscr; 7549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 7649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu if (screen >= ScreenCount(dpy)) 7749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu return NULL; 7849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 7949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu xscr = CALLOC_STRUCT(x11_screen); 8049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu if (xscr) { 8149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu xscr->dpy = dpy; 8249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu xscr->number = screen; 8349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 8449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu xscr->dri_major = -1; 8549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu xscr->dri_fd = -1; 8649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu } 8749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu return xscr; 8849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu} 8949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 9049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu/** 9149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Destroy a X11 screen. 9249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu */ 9349381d63e61c724b156b76068058df1c01a906c2Chia-I Wuvoid 9449381d63e61c724b156b76068058df1c01a906c2Chia-I Wux11_screen_destroy(struct x11_screen *xscr) 9549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu{ 9649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu if (xscr->dri_fd >= 0) 9749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu close(xscr->dri_fd); 9849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu if (xscr->dri_driver) 9949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu Xfree(xscr->dri_driver); 10049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu if (xscr->dri_device) 10149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu Xfree(xscr->dri_device); 10249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 103cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu#ifdef GLX_DIRECT_RENDERING 104cfb1ed39771c7f3876a8231ab1c8a8d6f7b5deaeChia-I Wu /* xscr->glx_dpy will be destroyed with the X display */ 105545ac97f9b95e9b5ebd04d2960abb224b5adbe17Chia-I Wu if (xscr->glx_dpy) 106aa44bd9189848b91619335207b8ec3be5679f982Kristian Høgsberg xscr->glx_dpy->xscr = NULL; 107cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu#endif 108cfb1ed39771c7f3876a8231ab1c8a8d6f7b5deaeChia-I Wu 10949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu if (xscr->visuals) 11049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu XFree(xscr->visuals); 111870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu FREE(xscr); 11249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu} 11349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 114cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu#ifdef GLX_DIRECT_RENDERING 115cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu 11649381d63e61c724b156b76068058df1c01a906c2Chia-I Wustatic boolean 11749381d63e61c724b156b76068058df1c01a906c2Chia-I Wux11_screen_init_dri2(struct x11_screen *xscr) 11849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu{ 11949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu if (xscr->dri_major < 0) { 12049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu int eventBase, errorBase; 12149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 12249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu if (!DRI2QueryExtension(xscr->dpy, &eventBase, &errorBase) || 12349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu !DRI2QueryVersion(xscr->dpy, &xscr->dri_major, &xscr->dri_minor)) 12449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu xscr->dri_major = -1; 12549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu } 12649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu return (xscr->dri_major >= 0); 12749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu} 12849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 12949381d63e61c724b156b76068058df1c01a906c2Chia-I Wustatic boolean 13049381d63e61c724b156b76068058df1c01a906c2Chia-I Wux11_screen_init_glx(struct x11_screen *xscr) 13149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu{ 13249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu if (!xscr->glx_dpy) 13349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu xscr->glx_dpy = __glXInitialize(xscr->dpy); 13449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu return (xscr->glx_dpy != NULL); 13549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu} 13649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 137cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu#endif /* GLX_DIRECT_RENDERING */ 138cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu 13949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu/** 14049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Return true if the screen supports the extension. 14149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu */ 14249381d63e61c724b156b76068058df1c01a906c2Chia-I Wuboolean 14349381d63e61c724b156b76068058df1c01a906c2Chia-I Wux11_screen_support(struct x11_screen *xscr, enum x11_screen_extension ext) 14449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu{ 14549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu boolean supported = FALSE; 14649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 14749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu switch (ext) { 14849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu case X11_SCREEN_EXTENSION_XSHM: 14949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu supported = XShmQueryExtension(xscr->dpy); 15049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu break; 151cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu#ifdef GLX_DIRECT_RENDERING 15249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu case X11_SCREEN_EXTENSION_GLX: 15349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu supported = x11_screen_init_glx(xscr); 15449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu break; 15549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu case X11_SCREEN_EXTENSION_DRI2: 15649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu supported = x11_screen_init_dri2(xscr); 15749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu break; 158cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu#endif 15949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu default: 16049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu break; 16149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu } 16249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 16349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu return supported; 16449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu} 16549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 16649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu/** 16749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Return the X visuals. 16849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu */ 16949381d63e61c724b156b76068058df1c01a906c2Chia-I Wuconst XVisualInfo * 17049381d63e61c724b156b76068058df1c01a906c2Chia-I Wux11_screen_get_visuals(struct x11_screen *xscr, int *num_visuals) 17149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu{ 17249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu if (!xscr->visuals) { 17349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu XVisualInfo vinfo_template; 17449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu vinfo_template.screen = xscr->number; 17549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu xscr->visuals = XGetVisualInfo(xscr->dpy, VisualScreenMask, 17649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu &vinfo_template, &xscr->num_visuals); 17749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu } 17849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 17949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu if (num_visuals) 18049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu *num_visuals = xscr->num_visuals; 18149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu return xscr->visuals; 18249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu} 18349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 18449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu/** 185cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu * Return the depth of a drawable. 186cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu * 187cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu * Unlike other drawable functions, the drawable needs not be a DRI2 drawable. 188cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu */ 189cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wuuint 190cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wux11_drawable_get_depth(struct x11_screen *xscr, Drawable drawable) 191cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu{ 192cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu unsigned int depth; 193cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu 194cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu if (drawable != xscr->last_drawable) { 195cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu Window root; 196cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu int x, y; 197cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu unsigned int w, h, border; 198cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu Status ok; 199cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu 200cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu ok = XGetGeometry(xscr->dpy, drawable, &root, 201cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu &x, &y, &w, &h, &border, &depth); 202cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu if (!ok) 203cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu depth = 0; 204cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu 205cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu xscr->last_drawable = drawable; 206cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu xscr->last_depth = depth; 207cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu } 208cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu else { 209cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu depth = xscr->last_depth; 210cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu } 211cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu 212cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu return depth; 213cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu} 214cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu 215cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu#ifdef GLX_DIRECT_RENDERING 216cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu 217cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu/** 21849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Return the GLX fbconfigs. 21949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu */ 22049381d63e61c724b156b76068058df1c01a906c2Chia-I Wuconst __GLcontextModes * 22149381d63e61c724b156b76068058df1c01a906c2Chia-I Wux11_screen_get_glx_configs(struct x11_screen *xscr) 22249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu{ 22349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu return (x11_screen_init_glx(xscr)) 22487290a383be2eeffef4407eeb17c1070d1122b2fChia-I Wu ? xscr->glx_dpy->screenConfigs[xscr->number]->configs 22549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu : NULL; 22649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu} 22749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 22849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu/** 22911f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu * Probe the screen for the DRI2 driver name. 23011f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu */ 23111f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wuconst char * 232545ac97f9b95e9b5ebd04d2960abb224b5adbe17Chia-I Wux11_screen_probe_dri2(struct x11_screen *xscr, int *major, int *minor) 23311f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu{ 234545ac97f9b95e9b5ebd04d2960abb224b5adbe17Chia-I Wu if (!x11_screen_init_dri2(xscr)) 235545ac97f9b95e9b5ebd04d2960abb224b5adbe17Chia-I Wu return NULL; 236545ac97f9b95e9b5ebd04d2960abb224b5adbe17Chia-I Wu 23711f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu /* get the driver name and the device name */ 23811f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu if (!xscr->dri_driver) { 23911f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu if (!DRI2Connect(xscr->dpy, RootWindow(xscr->dpy, xscr->number), 24011f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu &xscr->dri_driver, &xscr->dri_device)) 24111f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu xscr->dri_driver = xscr->dri_device = NULL; 24211f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu } 243545ac97f9b95e9b5ebd04d2960abb224b5adbe17Chia-I Wu if (major) 244545ac97f9b95e9b5ebd04d2960abb224b5adbe17Chia-I Wu *major = xscr->dri_major; 245545ac97f9b95e9b5ebd04d2960abb224b5adbe17Chia-I Wu if (minor) 246545ac97f9b95e9b5ebd04d2960abb224b5adbe17Chia-I Wu *minor = xscr->dri_minor; 24711f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu 24811f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu return xscr->dri_driver; 24911f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu} 25011f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu 25111f4360f2e915f236558da22efe5bdabd81446f3Chia-I Wu/** 25249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Enable DRI2 and returns the file descriptor of the DRM device. The file 25349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * descriptor will be closed automatically when the screen is destoryed. 25449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu */ 25549381d63e61c724b156b76068058df1c01a906c2Chia-I Wuint 256545ac97f9b95e9b5ebd04d2960abb224b5adbe17Chia-I Wux11_screen_enable_dri2(struct x11_screen *xscr, 257545ac97f9b95e9b5ebd04d2960abb224b5adbe17Chia-I Wu x11_drawable_invalidate_buffers invalidate_buffers, 258545ac97f9b95e9b5ebd04d2960abb224b5adbe17Chia-I Wu void *user_data) 25949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu{ 26049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu if (xscr->dri_fd < 0) { 26149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu int fd; 26249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu drm_magic_t magic; 26349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 26449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu /* get the driver name and the device name first */ 265545ac97f9b95e9b5ebd04d2960abb224b5adbe17Chia-I Wu if (!x11_screen_probe_dri2(xscr, NULL, NULL)) 26649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu return -1; 26749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 268b60120608f6ddf4098bc324363197c979ee04cb7David Fries#ifdef O_CLOEXEC 269b60120608f6ddf4098bc324363197c979ee04cb7David Fries fd = open(xscr->dri_device, O_RDWR | O_CLOEXEC); 270b60120608f6ddf4098bc324363197c979ee04cb7David Fries if (fd == -1 && errno == EINVAL) 271b60120608f6ddf4098bc324363197c979ee04cb7David Fries#endif 272b60120608f6ddf4098bc324363197c979ee04cb7David Fries { 273b60120608f6ddf4098bc324363197c979ee04cb7David Fries fd = open(xscr->dri_device, O_RDWR); 274b60120608f6ddf4098bc324363197c979ee04cb7David Fries if (fd != -1) 275b60120608f6ddf4098bc324363197c979ee04cb7David Fries fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC); 276b60120608f6ddf4098bc324363197c979ee04cb7David Fries } 27749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu if (fd < 0) { 27849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu _eglLog(_EGL_WARNING, "failed to open %s", xscr->dri_device); 27949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu return -1; 28049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu } 28149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 28249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu memset(&magic, 0, sizeof(magic)); 28349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu if (drmGetMagic(fd, &magic)) { 28449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu _eglLog(_EGL_WARNING, "failed to get magic"); 28549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu close(fd); 28649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu return -1; 28749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu } 28849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 28949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu if (!DRI2Authenticate(xscr->dpy, 29049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu RootWindow(xscr->dpy, xscr->number), magic)) { 29149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu _eglLog(_EGL_WARNING, "failed to authenticate magic"); 29249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu close(fd); 29349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu return -1; 29449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu } 29549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 296545ac97f9b95e9b5ebd04d2960abb224b5adbe17Chia-I Wu if (!x11_screen_init_glx(xscr)) { 297545ac97f9b95e9b5ebd04d2960abb224b5adbe17Chia-I Wu _eglLog(_EGL_WARNING, "failed to initialize GLX"); 298545ac97f9b95e9b5ebd04d2960abb224b5adbe17Chia-I Wu close(fd); 299545ac97f9b95e9b5ebd04d2960abb224b5adbe17Chia-I Wu return -1; 300545ac97f9b95e9b5ebd04d2960abb224b5adbe17Chia-I Wu } 301aa44bd9189848b91619335207b8ec3be5679f982Kristian Høgsberg if (xscr->glx_dpy->xscr) { 302545ac97f9b95e9b5ebd04d2960abb224b5adbe17Chia-I Wu _eglLog(_EGL_WARNING, 303545ac97f9b95e9b5ebd04d2960abb224b5adbe17Chia-I Wu "display is already managed by another x11 screen"); 304545ac97f9b95e9b5ebd04d2960abb224b5adbe17Chia-I Wu close(fd); 305545ac97f9b95e9b5ebd04d2960abb224b5adbe17Chia-I Wu return -1; 306545ac97f9b95e9b5ebd04d2960abb224b5adbe17Chia-I Wu } 307545ac97f9b95e9b5ebd04d2960abb224b5adbe17Chia-I Wu 308aa44bd9189848b91619335207b8ec3be5679f982Kristian Høgsberg xscr->glx_dpy->xscr = xscr; 309545ac97f9b95e9b5ebd04d2960abb224b5adbe17Chia-I Wu xscr->dri_invalidate_buffers = invalidate_buffers; 310545ac97f9b95e9b5ebd04d2960abb224b5adbe17Chia-I Wu xscr->dri_user_data = user_data; 311545ac97f9b95e9b5ebd04d2960abb224b5adbe17Chia-I Wu 31249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu xscr->dri_fd = fd; 31349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu } 31449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 31549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu return xscr->dri_fd; 31649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu} 31749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 318184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzkechar * 319184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzkex11_screen_get_device_name(struct x11_screen *xscr) 320184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke{ 321184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke return xscr->dri_device; 322184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke} 323184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke 324184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzkeint 325184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzkex11_screen_authenticate(struct x11_screen *xscr, uint32_t id) 326184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke{ 327184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke boolean authenticated; 328184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke 329184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke authenticated = DRI2Authenticate(xscr->dpy, 330184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke RootWindow(xscr->dpy, xscr->number), id); 331184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke 332184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke return authenticated ? 0 : -1; 333184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke} 334184bb09ff5cf2715dfee91e25ec20cbaa2e4445cBenjamin Franzke 33549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu/** 33649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Create/Destroy the DRI drawable. 33749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu */ 33849381d63e61c724b156b76068058df1c01a906c2Chia-I Wuvoid 33949381d63e61c724b156b76068058df1c01a906c2Chia-I Wux11_drawable_enable_dri2(struct x11_screen *xscr, 34049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu Drawable drawable, boolean on) 34149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu{ 34249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu if (on) 34349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu DRI2CreateDrawable(xscr->dpy, drawable); 34449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu else 34549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu DRI2DestroyDrawable(xscr->dpy, drawable); 34649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu} 34749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 34849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu/** 34949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Copy between buffers of the DRI2 drawable. 35049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu */ 35149381d63e61c724b156b76068058df1c01a906c2Chia-I Wuvoid 352a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglundx11_drawable_copy_buffers_region(struct x11_screen *xscr, Drawable drawable, 353a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund int num_rects, const int *rects, 354a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund int src_buf, int dst_buf) 35549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu{ 35649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu XserverRegion region; 357a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund XRectangle *rectangles = CALLOC(num_rects, sizeof(XRectangle)); 35849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 359a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund for (int i = 0; i < num_rects; i++) { 360a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund rectangles[i].x = rects[i * 4 + 0]; 361a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund rectangles[i].y = rects[i * 4 + 1]; 362a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund rectangles[i].width = rects[i * 4 + 2]; 363a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund rectangles[i].height = rects[i * 4 + 3]; 364a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund } 36549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 366a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund region = XFixesCreateRegion(xscr->dpy, rectangles, num_rects); 36749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu DRI2CopyRegion(xscr->dpy, drawable, region, dst_buf, src_buf); 36849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu XFixesDestroyRegion(xscr->dpy, region); 369a06f58fee5dbf0054fb363e759d30cf13c4bbab9Fredrik Höglund FREE(rectangles); 37049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu} 37149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 37249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu/** 37349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Get the buffers of the DRI2 drawable. The returned array should be freed. 37449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu */ 37549381d63e61c724b156b76068058df1c01a906c2Chia-I Wustruct x11_drawable_buffer * 37649381d63e61c724b156b76068058df1c01a906c2Chia-I Wux11_drawable_get_buffers(struct x11_screen *xscr, Drawable drawable, 37749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu int *width, int *height, unsigned int *attachments, 37849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu boolean with_format, int num_ins, int *num_outs) 37949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu{ 38049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu DRI2Buffer *dri2bufs; 38149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 38249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu if (with_format) 38349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu dri2bufs = DRI2GetBuffersWithFormat(xscr->dpy, drawable, width, height, 38449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu attachments, num_ins, num_outs); 38549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu else 38649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu dri2bufs = DRI2GetBuffers(xscr->dpy, drawable, width, height, 38749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu attachments, num_ins, num_outs); 38849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 38949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu return (struct x11_drawable_buffer *) dri2bufs; 39049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu} 39149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 39249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu/** 39349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Create a mode list of the given size. 39449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu */ 39549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu__GLcontextModes * 39649381d63e61c724b156b76068058df1c01a906c2Chia-I Wux11_context_modes_create(unsigned count) 39749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu{ 39849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu const size_t size = sizeof(__GLcontextModes); 39949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu __GLcontextModes *base = NULL; 40049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu __GLcontextModes **next; 40149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu unsigned i; 40249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 40349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu next = &base; 40449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu for (i = 0; i < count; i++) { 405870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu *next = (__GLcontextModes *) CALLOC(1, size); 40649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu if (*next == NULL) { 40749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu x11_context_modes_destroy(base); 40849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu base = NULL; 40949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu break; 41049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu } 41149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu next = &((*next)->next); 41249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu } 41349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 41449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu return base; 41549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu} 41649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 41749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu/** 41849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Destroy a mode list. 41949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu */ 42049381d63e61c724b156b76068058df1c01a906c2Chia-I Wuvoid 42149381d63e61c724b156b76068058df1c01a906c2Chia-I Wux11_context_modes_destroy(__GLcontextModes *modes) 42249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu{ 42349381d63e61c724b156b76068058df1c01a906c2Chia-I Wu while (modes != NULL) { 42449381d63e61c724b156b76068058df1c01a906c2Chia-I Wu __GLcontextModes *next = modes->next; 425870a9d643b1f256e6a379d96a325284dd2f7eeeaChia-I Wu FREE(modes); 42649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu modes = next; 42749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu } 42849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu} 42949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu 43049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu/** 43149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu * Return the number of the modes in the mode list. 43249381d63e61c724b156b76068058df1c01a906c2Chia-I Wu */ 43349381d63e61c724b156b76068058df1c01a906c2Chia-I Wuunsigned 43449381d63e61c724b156b76068058df1c01a906c2Chia-I Wux11_context_modes_count(const __GLcontextModes *modes) 43549381d63e61c724b156b76068058df1c01a906c2Chia-I Wu{ 43649381d63e61c724b156b76068058df1c01a906c2Chia-I Wu const __GLcontextModes *mode; 43749381d63e61c724b156b76068058df1c01a906c2Chia-I Wu int count = 0; 43849381d63e61c724b156b76068058df1c01a906c2Chia-I Wu for (mode = modes; mode; mode = mode->next) 43949381d63e61c724b156b76068058df1c01a906c2Chia-I Wu count++; 44049381d63e61c724b156b76068058df1c01a906c2Chia-I Wu return count; 44149381d63e61c724b156b76068058df1c01a906c2Chia-I Wu} 442545ac97f9b95e9b5ebd04d2960abb224b5adbe17Chia-I Wu 443aa44bd9189848b91619335207b8ec3be5679f982Kristian Høgsbergextern void 444aa44bd9189848b91619335207b8ec3be5679f982Kristian Høgsbergdri2InvalidateBuffers(Display *dpy, XID drawable); 445aa44bd9189848b91619335207b8ec3be5679f982Kristian Høgsberg 446545ac97f9b95e9b5ebd04d2960abb224b5adbe17Chia-I Wu/** 447545ac97f9b95e9b5ebd04d2960abb224b5adbe17Chia-I Wu * This is called from src/glx/dri2.c. 448545ac97f9b95e9b5ebd04d2960abb224b5adbe17Chia-I Wu */ 449545ac97f9b95e9b5ebd04d2960abb224b5adbe17Chia-I Wuvoid 450545ac97f9b95e9b5ebd04d2960abb224b5adbe17Chia-I Wudri2InvalidateBuffers(Display *dpy, XID drawable) 451545ac97f9b95e9b5ebd04d2960abb224b5adbe17Chia-I Wu{ 452545ac97f9b95e9b5ebd04d2960abb224b5adbe17Chia-I Wu __GLXdisplayPrivate *priv = __glXInitialize(dpy); 453545ac97f9b95e9b5ebd04d2960abb224b5adbe17Chia-I Wu struct x11_screen *xscr = NULL; 454545ac97f9b95e9b5ebd04d2960abb224b5adbe17Chia-I Wu 455aa44bd9189848b91619335207b8ec3be5679f982Kristian Høgsberg if (priv && priv->xscr) 456aa44bd9189848b91619335207b8ec3be5679f982Kristian Høgsberg xscr = priv->xscr; 457545ac97f9b95e9b5ebd04d2960abb224b5adbe17Chia-I Wu if (!xscr || !xscr->dri_invalidate_buffers) 458545ac97f9b95e9b5ebd04d2960abb224b5adbe17Chia-I Wu return; 459545ac97f9b95e9b5ebd04d2960abb224b5adbe17Chia-I Wu 460545ac97f9b95e9b5ebd04d2960abb224b5adbe17Chia-I Wu xscr->dri_invalidate_buffers(xscr, drawable, xscr->dri_user_data); 461545ac97f9b95e9b5ebd04d2960abb224b5adbe17Chia-I Wu} 462cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu 463a0e510320009766faa5ff8c0ed744e87f8095df7Luca Barbieriextern unsigned 464a0e510320009766faa5ff8c0ed744e87f8095df7Luca Barbieridri2GetSwapEventType(Display *dpy, XID drawable); 465a0e510320009766faa5ff8c0ed744e87f8095df7Luca Barbieri 46695f9e118fe7b02ab5d28550dabd8751e5fb15e3cChia-I Wuextern void * 46795f9e118fe7b02ab5d28550dabd8751e5fb15e3cChia-I Wudri2GetGlxDrawableFromXDrawableId(Display *dpy, XID id); 46895f9e118fe7b02ab5d28550dabd8751e5fb15e3cChia-I Wu 46995f9e118fe7b02ab5d28550dabd8751e5fb15e3cChia-I Wuextern void * 47095f9e118fe7b02ab5d28550dabd8751e5fb15e3cChia-I WuGetGLXDrawable(Display *dpy, XID drawable); 47195f9e118fe7b02ab5d28550dabd8751e5fb15e3cChia-I Wu 472a0e510320009766faa5ff8c0ed744e87f8095df7Luca Barbieri/** 473a0e510320009766faa5ff8c0ed744e87f8095df7Luca Barbieri * This is also called from src/glx/dri2.c. 474a0e510320009766faa5ff8c0ed744e87f8095df7Luca Barbieri */ 475a0e510320009766faa5ff8c0ed744e87f8095df7Luca Barbieriunsigned dri2GetSwapEventType(Display *dpy, XID drawable) 476a0e510320009766faa5ff8c0ed744e87f8095df7Luca Barbieri{ 477a0e510320009766faa5ff8c0ed744e87f8095df7Luca Barbieri return 0; 478a0e510320009766faa5ff8c0ed744e87f8095df7Luca Barbieri} 479a0e510320009766faa5ff8c0ed744e87f8095df7Luca Barbieri 48095f9e118fe7b02ab5d28550dabd8751e5fb15e3cChia-I Wuvoid * 48195f9e118fe7b02ab5d28550dabd8751e5fb15e3cChia-I Wudri2GetGlxDrawableFromXDrawableId(Display *dpy, XID id) 48295f9e118fe7b02ab5d28550dabd8751e5fb15e3cChia-I Wu{ 48395f9e118fe7b02ab5d28550dabd8751e5fb15e3cChia-I Wu return NULL; 48495f9e118fe7b02ab5d28550dabd8751e5fb15e3cChia-I Wu} 48595f9e118fe7b02ab5d28550dabd8751e5fb15e3cChia-I Wu 48695f9e118fe7b02ab5d28550dabd8751e5fb15e3cChia-I Wuvoid * 48795f9e118fe7b02ab5d28550dabd8751e5fb15e3cChia-I WuGetGLXDrawable(Display *dpy, XID drawable) 48895f9e118fe7b02ab5d28550dabd8751e5fb15e3cChia-I Wu{ 48995f9e118fe7b02ab5d28550dabd8751e5fb15e3cChia-I Wu return NULL; 49095f9e118fe7b02ab5d28550dabd8751e5fb15e3cChia-I Wu} 49195f9e118fe7b02ab5d28550dabd8751e5fb15e3cChia-I Wu 492cf588ab3f1edb89be4cd57045a3888ff482fa817Chia-I Wu#endif /* GLX_DIRECT_RENDERING */ 493