1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Mesa 3-D graphics library
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Version:  7.8
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 2009-2010 Chia-I Wu <olv@0xlab.org>
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"),
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions:
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in all copies or substantial portions of the Software.
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * DEALINGS IN THE SOFTWARE.
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <unistd.h>
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <fcntl.h>
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <sys/types.h>
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <sys/stat.h>
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <xf86drm.h>
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <X11/Xlibint.h>
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <X11/extensions/XShm.h>
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_memory.h"
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "egllog.h"
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "x11_screen.h"
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "dri2.h"
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "glxinit.h"
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct x11_screen {
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   Display *dpy;
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int number;
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * This is used to fetch GLX visuals/fbconfigs.  It steals code from GLX.
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * It might be better to rewrite the part in Xlib or XCB.
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   __GLXdisplayPrivate *glx_dpy;
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int dri_major, dri_minor;
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   char *dri_driver;
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   char *dri_device;
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int dri_fd;
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   x11_drawable_invalidate_buffers dri_invalidate_buffers;
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void *dri_user_data;
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XVisualInfo *visuals;
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int num_visuals;
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* cached values for x11_drawable_get_depth */
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   Drawable last_drawable;
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned int last_depth;
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Create a X11 screen.
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct x11_screen *
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgx11_screen_create(Display *dpy, int screen)
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct x11_screen *xscr;
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (screen >= ScreenCount(dpy))
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   xscr = CALLOC_STRUCT(x11_screen);
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (xscr) {
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      xscr->dpy = dpy;
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      xscr->number = screen;
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      xscr->dri_major = -1;
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      xscr->dri_fd = -1;
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return xscr;
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Destroy a X11 screen.
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgx11_screen_destroy(struct x11_screen *xscr)
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (xscr->dri_fd >= 0)
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      close(xscr->dri_fd);
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (xscr->dri_driver)
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      Xfree(xscr->dri_driver);
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (xscr->dri_device)
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      Xfree(xscr->dri_device);
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef GLX_DIRECT_RENDERING
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* xscr->glx_dpy will be destroyed with the X display */
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (xscr->glx_dpy)
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      xscr->glx_dpy->xscr = NULL;
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (xscr->visuals)
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      XFree(xscr->visuals);
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   FREE(xscr);
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef GLX_DIRECT_RENDERING
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgx11_screen_init_dri2(struct x11_screen *xscr)
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (xscr->dri_major < 0) {
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int eventBase, errorBase;
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!DRI2QueryExtension(xscr->dpy, &eventBase, &errorBase) ||
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          !DRI2QueryVersion(xscr->dpy, &xscr->dri_major, &xscr->dri_minor))
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         xscr->dri_major = -1;
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return (xscr->dri_major >= 0);
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgx11_screen_init_glx(struct x11_screen *xscr)
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!xscr->glx_dpy)
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      xscr->glx_dpy = __glXInitialize(xscr->dpy);
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return (xscr->glx_dpy != NULL);
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif /* GLX_DIRECT_RENDERING */
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return true if the screen supports the extension.
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgx11_screen_support(struct x11_screen *xscr, enum x11_screen_extension ext)
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   boolean supported = FALSE;
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (ext) {
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case X11_SCREEN_EXTENSION_XSHM:
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      supported = XShmQueryExtension(xscr->dpy);
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef GLX_DIRECT_RENDERING
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case X11_SCREEN_EXTENSION_GLX:
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      supported = x11_screen_init_glx(xscr);
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case X11_SCREEN_EXTENSION_DRI2:
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      supported = x11_screen_init_dri2(xscr);
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return supported;
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return the X visuals.
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst XVisualInfo *
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgx11_screen_get_visuals(struct x11_screen *xscr, int *num_visuals)
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!xscr->visuals) {
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      XVisualInfo vinfo_template;
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vinfo_template.screen = xscr->number;
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      xscr->visuals = XGetVisualInfo(xscr->dpy, VisualScreenMask,
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            &vinfo_template, &xscr->num_visuals);
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (num_visuals)
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *num_visuals = xscr->num_visuals;
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return xscr->visuals;
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return the depth of a drawable.
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Unlike other drawable functions, the drawable needs not be a DRI2 drawable.
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orguint
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgx11_drawable_get_depth(struct x11_screen *xscr, Drawable drawable)
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned int depth;
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (drawable != xscr->last_drawable) {
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      Window root;
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int x, y;
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      unsigned int w, h, border;
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      Status ok;
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ok = XGetGeometry(xscr->dpy, drawable, &root,
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            &x, &y, &w, &h, &border, &depth);
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!ok)
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         depth = 0;
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      xscr->last_drawable = drawable;
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      xscr->last_depth = depth;
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      depth = xscr->last_depth;
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return depth;
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef GLX_DIRECT_RENDERING
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return the GLX fbconfigs.
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst __GLcontextModes *
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgx11_screen_get_glx_configs(struct x11_screen *xscr)
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return (x11_screen_init_glx(xscr))
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ? xscr->glx_dpy->screenConfigs[xscr->number]->configs
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      : NULL;
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Probe the screen for the DRI2 driver name.
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst char *
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgx11_screen_probe_dri2(struct x11_screen *xscr, int *major, int *minor)
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!x11_screen_init_dri2(xscr))
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* get the driver name and the device name */
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!xscr->dri_driver) {
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!DRI2Connect(xscr->dpy, RootWindow(xscr->dpy, xscr->number),
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               &xscr->dri_driver, &xscr->dri_device))
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         xscr->dri_driver = xscr->dri_device = NULL;
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (major)
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *major = xscr->dri_major;
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (minor)
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *minor = xscr->dri_minor;
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return xscr->dri_driver;
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Enable DRI2 and returns the file descriptor of the DRM device.  The file
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * descriptor will be closed automatically when the screen is destoryed.
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgx11_screen_enable_dri2(struct x11_screen *xscr,
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       x11_drawable_invalidate_buffers invalidate_buffers,
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       void *user_data)
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (xscr->dri_fd < 0) {
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int fd;
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      drm_magic_t magic;
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* get the driver name and the device name first */
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!x11_screen_probe_dri2(xscr, NULL, NULL))
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return -1;
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef O_CLOEXEC
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fd = open(xscr->dri_device, O_RDWR | O_CLOEXEC);
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (fd == -1 && errno == EINVAL)
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      {
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         fd = open(xscr->dri_device, O_RDWR);
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (fd != -1)
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC);
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (fd < 0) {
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _eglLog(_EGL_WARNING, "failed to open %s", xscr->dri_device);
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return -1;
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memset(&magic, 0, sizeof(magic));
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (drmGetMagic(fd, &magic)) {
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _eglLog(_EGL_WARNING, "failed to get magic");
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         close(fd);
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return -1;
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!DRI2Authenticate(xscr->dpy,
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               RootWindow(xscr->dpy, xscr->number), magic)) {
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _eglLog(_EGL_WARNING, "failed to authenticate magic");
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         close(fd);
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return -1;
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!x11_screen_init_glx(xscr)) {
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _eglLog(_EGL_WARNING, "failed to initialize GLX");
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         close(fd);
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return -1;
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (xscr->glx_dpy->xscr) {
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _eglLog(_EGL_WARNING,
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               "display is already managed by another x11 screen");
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         close(fd);
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return -1;
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      xscr->glx_dpy->xscr = xscr;
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      xscr->dri_invalidate_buffers = invalidate_buffers;
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      xscr->dri_user_data = user_data;
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      xscr->dri_fd = fd;
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return xscr->dri_fd;
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgchar *
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgx11_screen_get_device_name(struct x11_screen *xscr)
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return xscr->dri_device;
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgx11_screen_authenticate(struct x11_screen *xscr, uint32_t id)
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   boolean authenticated;
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   authenticated = DRI2Authenticate(xscr->dpy,
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RootWindow(xscr->dpy, xscr->number), id);
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return authenticated ? 0 : -1;
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Create/Destroy the DRI drawable.
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgx11_drawable_enable_dri2(struct x11_screen *xscr,
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         Drawable drawable, boolean on)
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (on)
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      DRI2CreateDrawable(xscr->dpy, drawable);
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      DRI2DestroyDrawable(xscr->dpy, drawable);
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copy between buffers of the DRI2 drawable.
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgx11_drawable_copy_buffers_region(struct x11_screen *xscr, Drawable drawable,
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 int num_rects, const int *rects,
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 int src_buf, int dst_buf)
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XserverRegion region;
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XRectangle *rectangles = CALLOC(num_rects, sizeof(XRectangle));
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (int i = 0; i < num_rects; i++) {
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rectangles[i].x = rects[i * 4 + 0];
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rectangles[i].y = rects[i * 4 + 1];
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rectangles[i].width = rects[i * 4 + 2];
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rectangles[i].height = rects[i * 4 + 3];
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   region = XFixesCreateRegion(xscr->dpy, rectangles, num_rects);
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DRI2CopyRegion(xscr->dpy, drawable, region, dst_buf, src_buf);
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XFixesDestroyRegion(xscr->dpy, region);
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   FREE(rectangles);
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Get the buffers of the DRI2 drawable.  The returned array should be freed.
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct x11_drawable_buffer *
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgx11_drawable_get_buffers(struct x11_screen *xscr, Drawable drawable,
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         int *width, int *height, unsigned int *attachments,
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         boolean with_format, int num_ins, int *num_outs)
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DRI2Buffer *dri2bufs;
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (with_format)
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dri2bufs = DRI2GetBuffersWithFormat(xscr->dpy, drawable, width, height,
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            attachments, num_ins, num_outs);
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dri2bufs = DRI2GetBuffers(xscr->dpy, drawable, width, height,
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            attachments, num_ins, num_outs);
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return (struct x11_drawable_buffer *) dri2bufs;
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Create a mode list of the given size.
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org__GLcontextModes *
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgx11_context_modes_create(unsigned count)
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const size_t size = sizeof(__GLcontextModes);
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   __GLcontextModes *base = NULL;
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   __GLcontextModes **next;
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned i;
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   next = &base;
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < count; i++) {
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *next = (__GLcontextModes *) CALLOC(1, size);
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (*next == NULL) {
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         x11_context_modes_destroy(base);
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         base = NULL;
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      next = &((*next)->next);
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return base;
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Destroy a mode list.
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgx11_context_modes_destroy(__GLcontextModes *modes)
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   while (modes != NULL) {
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      __GLcontextModes *next = modes->next;
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FREE(modes);
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      modes = next;
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return the number of the modes in the mode list.
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgunsigned
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgx11_context_modes_count(const __GLcontextModes *modes)
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const __GLcontextModes *mode;
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int count = 0;
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (mode = modes; mode; mode = mode->next)
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      count++;
440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return count;
441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern void
444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2InvalidateBuffers(Display *dpy, XID drawable);
445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This is called from src/glx/dri2.c.
448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2InvalidateBuffers(Display *dpy, XID drawable)
451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   __GLXdisplayPrivate *priv = __glXInitialize(dpy);
453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct x11_screen *xscr = NULL;
454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (priv && priv->xscr)
456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      xscr = priv->xscr;
457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!xscr || !xscr->dri_invalidate_buffers)
458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   xscr->dri_invalidate_buffers(xscr, drawable, xscr->dri_user_data);
461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern unsigned
464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2GetSwapEventType(Display *dpy, XID drawable);
465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern void *
467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2GetGlxDrawableFromXDrawableId(Display *dpy, XID id);
468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern void *
470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGetGLXDrawable(Display *dpy, XID drawable);
471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This is also called from src/glx/dri2.c.
474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgunsigned dri2GetSwapEventType(Display *dpy, XID drawable)
476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return 0;
478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid *
481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2GetGlxDrawableFromXDrawableId(Display *dpy, XID id)
482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return NULL;
484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid *
487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGetGLXDrawable(Display *dpy, XID drawable)
488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return NULL;
490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif /* GLX_DIRECT_RENDERING */
493