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