dri_common.c revision 16887d042a917fa4773e4d853f50051b54e9948c
1079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis/*
2079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis * Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
3079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis * Copyright © 2008 Red Hat, Inc.
4079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis *
5079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis * Permission is hereby granted, free of charge, to any person obtaining a
6079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis * copy of this software and associated documentation files (the "Soft-
7079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis * ware"), to deal in the Software without restriction, including without
8079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis * limitation the rights to use, copy, modify, merge, publish, distribute,
9079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis * and/or sell copies of the Software, and to permit persons to whom the
10079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis * Software is furnished to do so, provided that the above copyright
11079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis * notice(s) and this permission notice appear in all copies of the Soft-
12079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis * ware and that both the above copyright notice(s) and this permission
13079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis * notice appear in supporting documentation.
14079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis *
15079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
16079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
17079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis * ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY
18079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis * RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN
19079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis * THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSE-
20079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis * QUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
21079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
22079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFOR-
23079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis * MANCE OF THIS SOFTWARE.
24079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis *
25079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis * Except as contained in this notice, the name of a copyright holder shall
26079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis * not be used in advertising or otherwise to promote the sale, use or
27079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis * other dealings in this Software without prior written authorization of
28079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis * the copyright holder.
29079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis *
30079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis * Authors:
31079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis *   Kevin E. Martin <kevin@precisioninsight.com>
32079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis *   Brian Paul <brian@precisioninsight.com>
33079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis *   Kristian Høgsberg (krh@redhat.com)
34079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis */
35079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis
3680b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
37079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis
38079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis#include <unistd.h>
39079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis#include <dlfcn.h>
40a25e1aa0aab6bd278eefa7c0748b491c9c6ae62cBrian Paul#include <stdarg.h>
41079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis#include "glxclient.h"
42079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis#include "dri_common.h"
43079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis
44079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis#ifndef RTLD_NOW
45079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis#define RTLD_NOW 0
46079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis#endif
47079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis#ifndef RTLD_GLOBAL
48079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis#define RTLD_GLOBAL 0
49079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis#endif
50079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis
510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf_X_HIDDEN void
520896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófInfoMessageF(const char *f, ...)
53079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis{
540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   va_list args;
550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   const char *env;
560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if ((env = getenv("LIBGL_DEBUG")) && strstr(env, "verbose")) {
580896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      fprintf(stderr, "libGL: ");
590896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      va_start(args, f);
600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      vfprintf(stderr, f, args);
610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      va_end(args);
620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
63079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis}
64079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis
65079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis/**
66079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis * Print error to stderr, unless LIBGL_DEBUG=="quiet".
67079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis */
680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf_X_HIDDEN void
690896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófErrorMessageF(const char *f, ...)
70079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis{
710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   va_list args;
720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   const char *env;
730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if ((env = getenv("LIBGL_DEBUG")) && !strstr(env, "quiet")) {
750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      fprintf(stderr, "libGL error: ");
760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      va_start(args, f);
770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      vfprintf(stderr, f, args);
780896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      va_end(args);
790896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
80079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis}
81079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis
82079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis#ifndef DEFAULT_DRIVER_DIR
83079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis/* this is normally defined in Mesa/configs/default with DRI_DRIVER_SEARCH_PATH */
84079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis#define DEFAULT_DRIVER_DIR "/usr/local/lib/dri"
85079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis#endif
86079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis
87079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis/**
88079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis * Try to \c dlopen the named driver.
89079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis *
90079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis * This function adds the "_dri.so" suffix to the driver name and searches the
91079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis * directories specified by the \c LIBGL_DRIVERS_PATH environment variable in
92079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis * order to find the driver.
93079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis *
94079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis * \param driverName - a name like "tdfx", "i810", "mga", etc.
95079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis *
96079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis * \returns
97079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis * A handle from \c dlopen, or \c NULL if driver file not found.
98079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis */
990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf_X_HIDDEN void *
1000896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófdriOpenDriver(const char *driverName)
101079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis{
102079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis   void *glhandle, *handle;
103079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis   const char *libPaths, *p, *next;
104079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis   char realDriverName[200];
105079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis   int len;
106079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis
107079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis   /* Attempt to make sure libGL symbols will be visible to the driver */
108079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis   glhandle = dlopen("libGL.so.1", RTLD_NOW | RTLD_GLOBAL);
109079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis
110079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis   libPaths = NULL;
111079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis   if (geteuid() == getuid()) {
112079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis      /* don't allow setuid apps to use LIBGL_DRIVERS_PATH */
113079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis      libPaths = getenv("LIBGL_DRIVERS_PATH");
114079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis      if (!libPaths)
1150896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         libPaths = getenv("LIBGL_DRIVERS_DIR");        /* deprecated */
116079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis   }
117079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis   if (libPaths == NULL)
1180896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      libPaths = DEFAULT_DRIVER_DIR;
119079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis
120079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis   handle = NULL;
121079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis   for (p = libPaths; *p; p = next) {
1220896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      next = strchr(p, ':');
1230896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      if (next == NULL) {
1240896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         len = strlen(p);
1250896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         next = p + len;
1260896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
1270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      else {
1280896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         len = next - p;
1290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         next++;
1300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
131079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis
132079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis#ifdef GLX_USE_TLS
133079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis      snprintf(realDriverName, sizeof realDriverName,
1340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf               "%.*s/tls/%s_dri.so", len, p, driverName);
135079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis      InfoMessageF("OpenDriver: trying %s\n", realDriverName);
136079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis      handle = dlopen(realDriverName, RTLD_NOW | RTLD_GLOBAL);
137079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis#endif
138079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis
1390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      if (handle == NULL) {
1400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         snprintf(realDriverName, sizeof realDriverName,
1410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                  "%.*s/%s_dri.so", len, p, driverName);
1420896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         InfoMessageF("OpenDriver: trying %s\n", realDriverName);
1430896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         handle = dlopen(realDriverName, RTLD_NOW | RTLD_GLOBAL);
144079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis      }
145079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis
1460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      if (handle != NULL)
1470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         break;
148079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis      else
1490896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         ErrorMessageF("dlopen %s failed (%s)\n", realDriverName, dlerror());
150079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis   }
151079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis
152079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis   if (!handle)
153079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis      ErrorMessageF("unable to load driver: %s_dri.so\n", driverName);
154079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis
155079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis   if (glhandle)
156079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis      dlclose(glhandle);
157079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis
158079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis   return handle;
159079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis}
160079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis
1617a66e549583a3168f05acc7df1e872d218fd670dKristian Høgsbergstatic GLboolean
1627a66e549583a3168f05acc7df1e872d218fd670dKristian Høgsberg__driGetMSCRate(__DRIdrawable *draw,
1637a66e549583a3168f05acc7df1e872d218fd670dKristian Høgsberg		int32_t * numerator, int32_t * denominator,
1647a66e549583a3168f05acc7df1e872d218fd670dKristian Høgsberg		void *loaderPrivate)
1657a66e549583a3168f05acc7df1e872d218fd670dKristian Høgsberg{
1667a66e549583a3168f05acc7df1e872d218fd670dKristian Høgsberg   __GLXDRIdrawable *glxDraw = loaderPrivate;
1677a66e549583a3168f05acc7df1e872d218fd670dKristian Høgsberg
1687a66e549583a3168f05acc7df1e872d218fd670dKristian Høgsberg   return __glxGetMscRate(glxDraw, numerator, denominator);
1697a66e549583a3168f05acc7df1e872d218fd670dKristian Høgsberg}
1707a66e549583a3168f05acc7df1e872d218fd670dKristian Høgsberg
171079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis_X_HIDDEN const __DRIsystemTimeExtension systemTimeExtension = {
1720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   {__DRI_SYSTEM_TIME, __DRI_SYSTEM_TIME_VERSION},
1730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   __glXGetUST,
1747a66e549583a3168f05acc7df1e872d218fd670dKristian Høgsberg   __driGetMSCRate
175079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis};
176079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis
177079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis#define __ATTRIB(attrib, field) \
1786ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg    { attrib, offsetof(struct glx_config, field) }
179079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis
1800896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic const struct
1810896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{
1820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   unsigned int attrib, offset;
1830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf} attribMap[] = {
1840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   __ATTRIB(__DRI_ATTRIB_BUFFER_SIZE, rgbBits),
1850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      __ATTRIB(__DRI_ATTRIB_LEVEL, level),
1860896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      __ATTRIB(__DRI_ATTRIB_RED_SIZE, redBits),
1870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      __ATTRIB(__DRI_ATTRIB_GREEN_SIZE, greenBits),
1880896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      __ATTRIB(__DRI_ATTRIB_BLUE_SIZE, blueBits),
1890896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      __ATTRIB(__DRI_ATTRIB_ALPHA_SIZE, alphaBits),
1900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      __ATTRIB(__DRI_ATTRIB_DEPTH_SIZE, depthBits),
1910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      __ATTRIB(__DRI_ATTRIB_STENCIL_SIZE, stencilBits),
1920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      __ATTRIB(__DRI_ATTRIB_ACCUM_RED_SIZE, accumRedBits),
1930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      __ATTRIB(__DRI_ATTRIB_ACCUM_GREEN_SIZE, accumGreenBits),
1940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      __ATTRIB(__DRI_ATTRIB_ACCUM_BLUE_SIZE, accumBlueBits),
1950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      __ATTRIB(__DRI_ATTRIB_ACCUM_ALPHA_SIZE, accumAlphaBits),
1960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      __ATTRIB(__DRI_ATTRIB_SAMPLE_BUFFERS, sampleBuffers),
1970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      __ATTRIB(__DRI_ATTRIB_SAMPLES, samples),
1980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      __ATTRIB(__DRI_ATTRIB_DOUBLE_BUFFER, doubleBufferMode),
1990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      __ATTRIB(__DRI_ATTRIB_STEREO, stereoMode),
2000896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      __ATTRIB(__DRI_ATTRIB_AUX_BUFFERS, numAuxBuffers),
201079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis#if 0
2020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      __ATTRIB(__DRI_ATTRIB_TRANSPARENT_TYPE, transparentPixel),
2030896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      __ATTRIB(__DRI_ATTRIB_TRANSPARENT_INDEX_VALUE, transparentIndex),
2040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      __ATTRIB(__DRI_ATTRIB_TRANSPARENT_RED_VALUE, transparentRed),
2050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      __ATTRIB(__DRI_ATTRIB_TRANSPARENT_GREEN_VALUE, transparentGreen),
2060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      __ATTRIB(__DRI_ATTRIB_TRANSPARENT_BLUE_VALUE, transparentBlue),
2070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      __ATTRIB(__DRI_ATTRIB_TRANSPARENT_ALPHA_VALUE, transparentAlpha),
2080896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      __ATTRIB(__DRI_ATTRIB_RED_MASK, redMask),
2090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      __ATTRIB(__DRI_ATTRIB_GREEN_MASK, greenMask),
2100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      __ATTRIB(__DRI_ATTRIB_BLUE_MASK, blueMask),
2110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      __ATTRIB(__DRI_ATTRIB_ALPHA_MASK, alphaMask),
212079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis#endif
2130896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      __ATTRIB(__DRI_ATTRIB_MAX_PBUFFER_WIDTH, maxPbufferWidth),
2140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      __ATTRIB(__DRI_ATTRIB_MAX_PBUFFER_HEIGHT, maxPbufferHeight),
2150896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      __ATTRIB(__DRI_ATTRIB_MAX_PBUFFER_PIXELS, maxPbufferPixels),
2160896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      __ATTRIB(__DRI_ATTRIB_OPTIMAL_PBUFFER_WIDTH, optimalPbufferWidth),
2170896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      __ATTRIB(__DRI_ATTRIB_OPTIMAL_PBUFFER_HEIGHT, optimalPbufferHeight),
218079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis#if 0
2190896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      __ATTRIB(__DRI_ATTRIB_SWAP_METHOD, swapMethod),
220079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis#endif
2210896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf__ATTRIB(__DRI_ATTRIB_BIND_TO_TEXTURE_RGB, bindToTextureRgb),
2220896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      __ATTRIB(__DRI_ATTRIB_BIND_TO_TEXTURE_RGBA, bindToTextureRgba),
2230896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      __ATTRIB(__DRI_ATTRIB_BIND_TO_MIPMAP_TEXTURE,
2240896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                     bindToMipmapTexture),
2250896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      __ATTRIB(__DRI_ATTRIB_YINVERTED, yInverted),};
226079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis
227079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzisstatic int
2286ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian HøgsbergscalarEqual(struct glx_config *mode, unsigned int attrib, unsigned int value)
229079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis{
2300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   unsigned int glxValue;
2310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int i;
232079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis
2330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   for (i = 0; i < ARRAY_SIZE(attribMap); i++)
2340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      if (attribMap[i].attrib == attrib) {
2350896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         glxValue = *(unsigned int *) ((char *) mode + attribMap[i].offset);
2360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         return glxValue == GLX_DONT_CARE || glxValue == value;
2370896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
238079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis
2390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return GL_TRUE;              /* Is a non-existing attribute equal to value? */
240079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis}
241079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis
242079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzisstatic int
2436ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian HøgsbergdriConfigEqual(const __DRIcoreExtension *core,
2446ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg               struct glx_config *config, const __DRIconfig *driConfig)
245079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis{
2460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   unsigned int attrib, value, glxValue;
2470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int i;
2480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
2490896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   i = 0;
2500896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   while (core->indexConfigAttrib(driConfig, i++, &attrib, &value)) {
2510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      switch (attrib) {
2520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      case __DRI_ATTRIB_RENDER_TYPE:
2530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         glxValue = 0;
2540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         if (value & __DRI_ATTRIB_RGBA_BIT) {
2550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf            glxValue |= GLX_RGBA_BIT;
2560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         }
2570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         else if (value & __DRI_ATTRIB_COLOR_INDEX_BIT) {
2580896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf            glxValue |= GLX_COLOR_INDEX_BIT;
2590896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         }
2606ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg         if (glxValue != config->renderType)
2610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf            return GL_FALSE;
2620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         break;
2630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
2640896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      case __DRI_ATTRIB_CONFIG_CAVEAT:
2650896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         if (value & __DRI_ATTRIB_NON_CONFORMANT_CONFIG)
2660896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf            glxValue = GLX_NON_CONFORMANT_CONFIG;
2670896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         else if (value & __DRI_ATTRIB_SLOW_BIT)
2680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf            glxValue = GLX_SLOW_CONFIG;
2690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         else
2700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf            glxValue = GLX_NONE;
2716ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg         if (glxValue != config->visualRating)
2720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf            return GL_FALSE;
2730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         break;
2740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
2750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      case __DRI_ATTRIB_BIND_TO_TEXTURE_TARGETS:
2760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         glxValue = 0;
2770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         if (value & __DRI_ATTRIB_TEXTURE_1D_BIT)
2780896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf            glxValue |= GLX_TEXTURE_1D_BIT_EXT;
2790896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         if (value & __DRI_ATTRIB_TEXTURE_2D_BIT)
2800896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf            glxValue |= GLX_TEXTURE_2D_BIT_EXT;
2810896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         if (value & __DRI_ATTRIB_TEXTURE_RECTANGLE_BIT)
2820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf            glxValue |= GLX_TEXTURE_RECTANGLE_BIT_EXT;
2836ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg         if (config->bindToTextureTargets != GLX_DONT_CARE &&
2846ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg             glxValue != config->bindToTextureTargets)
2850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf            return GL_FALSE;
2860896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         break;
2870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
2880896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      default:
2896ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg         if (!scalarEqual(config, attrib, value))
2900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf            return GL_FALSE;
2910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
2920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
2930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
2940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return GL_TRUE;
295079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis}
296079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis
2976ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsbergstatic struct glx_config *
2980896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófcreateDriMode(const __DRIcoreExtension * core,
2996ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg	      struct glx_config *config, const __DRIconfig **driConfigs)
300079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis{
3016ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   __GLXDRIconfigPrivate *driConfig;
3020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int i;
303079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis
3040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   for (i = 0; driConfigs[i]; i++) {
3056ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg      if (driConfigEqual(core, config, driConfigs[i]))
3060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         break;
3070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
308079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis
3090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (driConfigs[i] == NULL)
3100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return NULL;
311079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis
3126ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   driConfig = Xmalloc(sizeof *driConfig);
3136ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   if (driConfig == NULL)
3140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return NULL;
315079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis
3166ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   driConfig->base = *config;
3176ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   driConfig->driConfig = driConfigs[i];
318079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis
3196ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   return &driConfig->base;
320079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis}
321079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis
3226ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg_X_HIDDEN struct glx_config *
3230896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófdriConvertConfigs(const __DRIcoreExtension * core,
3246ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg                  struct glx_config *configs, const __DRIconfig **driConfigs)
325079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis{
3266ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   struct glx_config head, *tail, *m;
3270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
3280896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   tail = &head;
3290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   head.next = NULL;
3306ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   for (m = configs; m; m = m->next) {
3316ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg      tail->next = createDriMode(core, m, driConfigs);
3320896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      if (tail->next == NULL) {
3330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         /* no matching dri config for m */
3340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         continue;
3350896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
336079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis
337079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis
3380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      tail = tail->next;
3390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
340079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis
3416ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   glx_config_destroy_list(configs);
34277c7f90ed44748f0e54e894deff1cac63da54cd6Kristian Høgsberg
3430896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return head.next;
344079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis}
345079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis
346bab13969d8bf3ff9259524c3f4ab96d81485ccefKristian Høgsberg_X_HIDDEN void
347bab13969d8bf3ff9259524c3f4ab96d81485ccefKristian HøgsbergdriDestroyConfigs(const __DRIconfig **configs)
348bab13969d8bf3ff9259524c3f4ab96d81485ccefKristian Høgsberg{
349bab13969d8bf3ff9259524c3f4ab96d81485ccefKristian Høgsberg   int i;
350bab13969d8bf3ff9259524c3f4ab96d81485ccefKristian Høgsberg
351bab13969d8bf3ff9259524c3f4ab96d81485ccefKristian Høgsberg   for (i = 0; configs[i]; i++)
352bab13969d8bf3ff9259524c3f4ab96d81485ccefKristian Høgsberg      free((__DRIconfig *) configs[i]);
353bab13969d8bf3ff9259524c3f4ab96d81485ccefKristian Høgsberg   free(configs);
354bab13969d8bf3ff9259524c3f4ab96d81485ccefKristian Høgsberg}
355bab13969d8bf3ff9259524c3f4ab96d81485ccefKristian Høgsberg
356c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg_X_HIDDEN __GLXDRIdrawable *
357c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian HøgsbergdriFetchDrawable(struct glx_context *gc, GLXDrawable glxDrawable)
358c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg{
359c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg   struct glx_display *const priv = __glXInitialize(gc->psc->dpy);
360c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg   __GLXDRIdrawable *pdraw;
361c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg   struct glx_screen *psc;
362c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg
363c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg   if (priv == NULL)
364c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg      return NULL;
365c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg
366c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg   psc = priv->screens[gc->screen];
367c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg   if (priv->drawHash == NULL)
368c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg      return NULL;
369c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg
370c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg   if (__glxHashLookup(priv->drawHash, glxDrawable, (void *) &pdraw) == 0)
371c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg      return pdraw;
372c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg
373c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg   pdraw = psc->driScreen->createDrawable(psc, glxDrawable,
374c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg                                          glxDrawable, gc->config);
375c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg   if (__glxHashInsert(priv->drawHash, glxDrawable, pdraw)) {
376c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg      (*pdraw->destroyDrawable) (pdraw);
377c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg      return NULL;
378c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg   }
379c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg
380c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg   return pdraw;
381c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg}
382c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg
38316887d042a917fa4773e4d853f50051b54e9948cKristian Høgsberg_X_HIDDEN void
38416887d042a917fa4773e4d853f50051b54e9948cKristian HøgsbergdriReleaseDrawables(struct glx_context *gc)
38516887d042a917fa4773e4d853f50051b54e9948cKristian Høgsberg{
38616887d042a917fa4773e4d853f50051b54e9948cKristian Høgsberg   struct glx_display *const priv = __glXInitialize(gc->psc->dpy);
38716887d042a917fa4773e4d853f50051b54e9948cKristian Høgsberg   __GLXDRIdrawable *pdraw;
38816887d042a917fa4773e4d853f50051b54e9948cKristian Høgsberg
38916887d042a917fa4773e4d853f50051b54e9948cKristian Høgsberg   if (priv == NULL)
39016887d042a917fa4773e4d853f50051b54e9948cKristian Høgsberg      return;
39116887d042a917fa4773e4d853f50051b54e9948cKristian Høgsberg
39216887d042a917fa4773e4d853f50051b54e9948cKristian Høgsberg   if (__glxHashLookup(priv->drawHash,
39316887d042a917fa4773e4d853f50051b54e9948cKristian Høgsberg		       gc->currentDrawable, (void *) &pdraw) == 0) {
39416887d042a917fa4773e4d853f50051b54e9948cKristian Høgsberg      if (pdraw->drawable == pdraw->xDrawable)
39516887d042a917fa4773e4d853f50051b54e9948cKristian Høgsberg	 (*pdraw->destroyDrawable)(pdraw);
39616887d042a917fa4773e4d853f50051b54e9948cKristian Høgsberg      __glxHashDelete(priv->drawHash, gc->currentDrawable);
39716887d042a917fa4773e4d853f50051b54e9948cKristian Høgsberg   }
39816887d042a917fa4773e4d853f50051b54e9948cKristian Høgsberg
39916887d042a917fa4773e4d853f50051b54e9948cKristian Høgsberg   if (gc->currentDrawable != gc->currentReadable &&
40016887d042a917fa4773e4d853f50051b54e9948cKristian Høgsberg       __glxHashLookup(priv->drawHash,
40116887d042a917fa4773e4d853f50051b54e9948cKristian Høgsberg		       gc->currentReadable, (void *) &pdraw) == 0) {
40216887d042a917fa4773e4d853f50051b54e9948cKristian Høgsberg      if (pdraw->drawable == pdraw->xDrawable)
40316887d042a917fa4773e4d853f50051b54e9948cKristian Høgsberg	 (*pdraw->destroyDrawable)(pdraw);
40416887d042a917fa4773e4d853f50051b54e9948cKristian Høgsberg      __glxHashDelete(priv->drawHash, gc->currentReadable);
40516887d042a917fa4773e4d853f50051b54e9948cKristian Høgsberg   }
40616887d042a917fa4773e4d853f50051b54e9948cKristian Høgsberg}
40716887d042a917fa4773e4d853f50051b54e9948cKristian Høgsberg
408079345703901b497f2c09714051b33bb2dff1b4fGeorge Sapountzis#endif /* GLX_DIRECT_RENDERING */
409