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