dri_common.c revision 23215ef4d60a86d9f3b3fdc08e3fdadc59e98890
1d76f655fc29c5b3858d6657f22a5c656c3143767Sam Judd/*
2d76f655fc29c5b3858d6657f22a5c656c3143767Sam Judd * Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
3fcca8d79a3a04e71924d06799de2af46c923a84eSam Judd * Copyright © 2008 Red Hat, Inc.
48a6067fbe2a670d2e893c79c9c0ec17817da6568Sam Judd *
50e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd * Permission is hereby granted, free of charge, to any person obtaining a
6d76f655fc29c5b3858d6657f22a5c656c3143767Sam Judd * copy of this software and associated documentation files (the "Soft-
70ae32dc10d668a04f9f0484d587aefe5a7210e1cSam Judd * ware"), to deal in the Software without restriction, including without
877e0200ba76c89177b6ec8c781f4f8f86984989bSam Judd * limitation the rights to use, copy, modify, merge, publish, distribute,
9b44604067356bb73cae3c910ac0e0044d26974a5Sam Judd * and/or sell copies of the Software, and to permit persons to whom the
104e8c4e61ae9f011c1bfccbace9c24aee61865bf0Sam Judd * Software is furnished to do so, provided that the above copyright
11fcd787c911d5fbca2a34ff0963d4665543a03275Sam Judd * notice(s) and this permission notice appear in all copies of the Soft-
128a6067fbe2a670d2e893c79c9c0ec17817da6568Sam Judd * ware and that both the above copyright notice(s) and this permission
138a6067fbe2a670d2e893c79c9c0ec17817da6568Sam Judd * notice appear in supporting documentation.
14e9498d0b46d4c79410968eb11c332c42c9be7ec0Sam Judd *
15b44604067356bb73cae3c910ac0e0044d26974a5Sam Judd * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
16d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
1729f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd * ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY
18127f265355747f88a7ef0f5c73a2e2789f05efc3Sam Judd * RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN
19127f265355747f88a7ef0f5c73a2e2789f05efc3Sam Judd * THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSE-
20127f265355747f88a7ef0f5c73a2e2789f05efc3Sam Judd * QUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
21127f265355747f88a7ef0f5c73a2e2789f05efc3Sam Judd * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
229fc12334a7d14347cd6951d0653264b2597bd3a0Sam Judd * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFOR-
23127f265355747f88a7ef0f5c73a2e2789f05efc3Sam Judd * MANCE OF THIS SOFTWARE.
24dbb67f826b0e76645c809be6d589e9dcb8271324Sam Judd *
259fc12334a7d14347cd6951d0653264b2597bd3a0Sam Judd * Except as contained in this notice, the name of a copyright holder shall
269fc12334a7d14347cd6951d0653264b2597bd3a0Sam Judd * not be used in advertising or otherwise to promote the sale, use or
279fc12334a7d14347cd6951d0653264b2597bd3a0Sam Judd * other dealings in this Software without prior written authorization of
289fc12334a7d14347cd6951d0653264b2597bd3a0Sam Judd * the copyright holder.
299fc12334a7d14347cd6951d0653264b2597bd3a0Sam Judd *
309fc12334a7d14347cd6951d0653264b2597bd3a0Sam Judd * Authors:
319fc12334a7d14347cd6951d0653264b2597bd3a0Sam Judd *   Kevin E. Martin <kevin@precisioninsight.com>
329fc12334a7d14347cd6951d0653264b2597bd3a0Sam Judd *   Brian Paul <brian@precisioninsight.com>
339fc12334a7d14347cd6951d0653264b2597bd3a0Sam Judd *   Kristian Høgsberg (krh@redhat.com)
349fc12334a7d14347cd6951d0653264b2597bd3a0Sam Judd */
359fc12334a7d14347cd6951d0653264b2597bd3a0Sam Judd
369fc12334a7d14347cd6951d0653264b2597bd3a0Sam Judd#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
379fc12334a7d14347cd6951d0653264b2597bd3a0Sam Judd
3870db081bbc0a80737f457c6388f4af4c1391f5f5Sam Judd#include <unistd.h>
39be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Judd#include <dlfcn.h>
4070db081bbc0a80737f457c6388f4af4c1391f5f5Sam Judd#include <stdarg.h>
41be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Judd#include "glxclient.h"
42be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Judd#include "glcontextmodes.h"
43cbba04826bfaf4f8055f922bc41937572983c17fSam Judd#include "dri_common.h"
44be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Judd
45cbba04826bfaf4f8055f922bc41937572983c17fSam Judd#ifndef RTLD_NOW
46fc3f03260933d96fae33a43846860f226dd661feSam Judd#define RTLD_NOW 0
4770db081bbc0a80737f457c6388f4af4c1391f5f5Sam Judd#endif
48be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Judd#ifndef RTLD_GLOBAL
49be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Judd#define RTLD_GLOBAL 0
5044b89ba468c3f0f996bf1497d2f55fc9b50de0e8Sam Judd#endif
5144b89ba468c3f0f996bf1497d2f55fc9b50de0e8Sam Judd
52be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Judd_X_HIDDEN void
53be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam JuddInfoMessageF(const char *f, ...)
548a6067fbe2a670d2e893c79c9c0ec17817da6568Sam Judd{
5595800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd   va_list args;
56531667420f0cb59e01e0ae5928392469006148ddSam Judd   const char *env;
579fc12334a7d14347cd6951d0653264b2597bd3a0Sam Judd
58785dc5ee71beeb3ebd77ea73b313eeaf057ae112Sam Judd   if ((env = getenv("LIBGL_DEBUG")) && strstr(env, "verbose")) {
599fc12334a7d14347cd6951d0653264b2597bd3a0Sam Judd      fprintf(stderr, "libGL: ");
609fc12334a7d14347cd6951d0653264b2597bd3a0Sam Judd      va_start(args, f);
612d923581ee57592181845aa98231eec988fab9f6Sam Judd      vfprintf(stderr, f, args);
62d76f655fc29c5b3858d6657f22a5c656c3143767Sam Judd      va_end(args);
63d76f655fc29c5b3858d6657f22a5c656c3143767Sam Judd   }
640ae32dc10d668a04f9f0484d587aefe5a7210e1cSam Judd}
65d76f655fc29c5b3858d6657f22a5c656c3143767Sam Judd
6678790c322a30ac2e62498b79bdc965832bf2342dSam Judd/**
67d76f655fc29c5b3858d6657f22a5c656c3143767Sam Judd * Print error to stderr, unless LIBGL_DEBUG=="quiet".
6844e0516ee31912216c9e668c255f2d5baf86ac6dSam Judd */
690e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd_X_HIDDEN void
7056e62046cf9e1bd2d341b6455a9b81b5757e269cSam JuddErrorMessageF(const char *f, ...)
71058ef77ccc7fd40a80a2da72dc97695c7dda2c0bSam Judd{
7256e62046cf9e1bd2d341b6455a9b81b5757e269cSam Judd   va_list args;
73058ef77ccc7fd40a80a2da72dc97695c7dda2c0bSam Judd   const char *env;
74d76f655fc29c5b3858d6657f22a5c656c3143767Sam Judd
75d76f655fc29c5b3858d6657f22a5c656c3143767Sam Judd   if ((env = getenv("LIBGL_DEBUG")) && !strstr(env, "quiet")) {
760e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd      fprintf(stderr, "libGL error: ");
770e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd      va_start(args, f);
780e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd      vfprintf(stderr, f, args);
790e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd      va_end(args);
80e9498d0b46d4c79410968eb11c332c42c9be7ec0Sam Judd   }
8129f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd}
820e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd
83c95a13d712f57271047e467d367e1145517b0c2aSam Judd#ifndef DEFAULT_DRIVER_DIR
8429f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd/* this is normally defined in Mesa/configs/default with DRI_DRIVER_SEARCH_PATH */
85b215b51a0ba86c2db14bd735cc0207cf3f1c7cd8Sam Judd#define DEFAULT_DRIVER_DIR "/usr/local/lib/dri"
8627eb05702fd4531d6974640c62df1d569629edb6Sam Judd#endif
870e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd
8895800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd/**
8995800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd * Try to \c dlopen the named driver.
9095800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd *
9170db081bbc0a80737f457c6388f4af4c1391f5f5Sam Judd * This function adds the "_dri.so" suffix to the driver name and searches the
9270db081bbc0a80737f457c6388f4af4c1391f5f5Sam Judd * directories specified by the \c LIBGL_DRIVERS_PATH environment variable in
9370db081bbc0a80737f457c6388f4af4c1391f5f5Sam Judd * order to find the driver.
9470db081bbc0a80737f457c6388f4af4c1391f5f5Sam Judd *
950e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd * \param driverName - a name like "tdfx", "i810", "mga", etc.
960e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd *
970e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd * \returns
980e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd * A handle from \c dlopen, or \c NULL if driver file not found.
990e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd */
1000e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd_X_HIDDEN void *
1010e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam JudddriOpenDriver(const char *driverName)
1020e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd{
1030e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd   void *glhandle, *handle;
1040e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd   const char *libPaths, *p, *next;
1050e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd   char realDriverName[200];
1060e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd   int len;
1070e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd
1080e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd   /* Attempt to make sure libGL symbols will be visible to the driver */
1090e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd   glhandle = dlopen("libGL.so.1", RTLD_NOW | RTLD_GLOBAL);
1100e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd
1110e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd   libPaths = NULL;
1120e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd   if (geteuid() == getuid()) {
1130e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd      /* don't allow setuid apps to use LIBGL_DRIVERS_PATH */
1140e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd      libPaths = getenv("LIBGL_DRIVERS_PATH");
1150e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd      if (!libPaths)
1160e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd         libPaths = getenv("LIBGL_DRIVERS_DIR");        /* deprecated */
1170e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd   }
1180e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd   if (libPaths == NULL)
1190e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd      libPaths = DEFAULT_DRIVER_DIR;
1200e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd
1210e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd   handle = NULL;
1220e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd   for (p = libPaths; *p; p = next) {
1230e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd      next = strchr(p, ':');
1240e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd      if (next == NULL) {
1250e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd         len = strlen(p);
1260e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd         next = p + len;
1270e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd      }
128d76f655fc29c5b3858d6657f22a5c656c3143767Sam Judd      else {
12956e62046cf9e1bd2d341b6455a9b81b5757e269cSam Judd         len = next - p;
13056e62046cf9e1bd2d341b6455a9b81b5757e269cSam Judd         next++;
13156e62046cf9e1bd2d341b6455a9b81b5757e269cSam Judd      }
13256e62046cf9e1bd2d341b6455a9b81b5757e269cSam Judd
13356e62046cf9e1bd2d341b6455a9b81b5757e269cSam Judd#ifdef GLX_USE_TLS
13429f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd      snprintf(realDriverName, sizeof realDriverName,
13529f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd               "%.*s/tls/%s_dri.so", len, p, driverName);
13629f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd      InfoMessageF("OpenDriver: trying %s\n", realDriverName);
13729f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd      handle = dlopen(realDriverName, RTLD_NOW | RTLD_GLOBAL);
13829f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd#endif
139d76f655fc29c5b3858d6657f22a5c656c3143767Sam Judd
140d76f655fc29c5b3858d6657f22a5c656c3143767Sam Judd      if (handle == NULL) {
141d76f655fc29c5b3858d6657f22a5c656c3143767Sam Judd         snprintf(realDriverName, sizeof realDriverName,
1429f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd                  "%.*s/%s_dri.so", len, p, driverName);
1439f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd         InfoMessageF("OpenDriver: trying %s\n", realDriverName);
1449f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd         handle = dlopen(realDriverName, RTLD_NOW | RTLD_GLOBAL);
1459f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd      }
1469f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd
1479f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd      if (handle != NULL)
14829f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd         break;
14929f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd      else
15029f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd         ErrorMessageF("dlopen %s failed (%s)\n", realDriverName, dlerror());
15129f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd   }
1529f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd
1539f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd   if (!handle)
1549f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd      ErrorMessageF("unable to load driver: %s_dri.so\n", driverName);
1559f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd
1569f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd   if (glhandle)
1579f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd      dlclose(glhandle);
1589f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd
1599f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd   return handle;
1609f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd}
16129f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd
1620e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd_X_HIDDEN const __DRIsystemTimeExtension systemTimeExtension = {
16329f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd   {__DRI_SYSTEM_TIME, __DRI_SYSTEM_TIME_VERSION},
16429f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd   __glXGetUST,
16529f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd   __driGetMscRateOML
16629f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd};
16729f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd
16829f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd#define __ATTRIB(attrib, field) \
169b215b51a0ba86c2db14bd735cc0207cf3f1c7cd8Sam Judd    { attrib, offsetof(__GLcontextModes, field) }
170b215b51a0ba86c2db14bd735cc0207cf3f1c7cd8Sam Judd
171b215b51a0ba86c2db14bd735cc0207cf3f1c7cd8Sam Juddstatic const struct
172b215b51a0ba86c2db14bd735cc0207cf3f1c7cd8Sam Judd{
17377e0200ba76c89177b6ec8c781f4f8f86984989bSam Judd   unsigned int attrib, offset;
174be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Judd} attribMap[] = {
175b215b51a0ba86c2db14bd735cc0207cf3f1c7cd8Sam Judd   __ATTRIB(__DRI_ATTRIB_BUFFER_SIZE, rgbBits),
17629f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd      __ATTRIB(__DRI_ATTRIB_LEVEL, level),
17727eb05702fd4531d6974640c62df1d569629edb6Sam Judd      __ATTRIB(__DRI_ATTRIB_RED_SIZE, redBits),
1780e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd      __ATTRIB(__DRI_ATTRIB_GREEN_SIZE, greenBits),
179c8c79d03924a757c29bbe7df5bc07b3cf8e02a83Sam Judd      __ATTRIB(__DRI_ATTRIB_BLUE_SIZE, blueBits),
18095800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd      __ATTRIB(__DRI_ATTRIB_ALPHA_SIZE, alphaBits),
181be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Judd      __ATTRIB(__DRI_ATTRIB_DEPTH_SIZE, depthBits),
182cbba04826bfaf4f8055f922bc41937572983c17fSam Judd      __ATTRIB(__DRI_ATTRIB_STENCIL_SIZE, stencilBits),
18395800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd      __ATTRIB(__DRI_ATTRIB_ACCUM_RED_SIZE, accumRedBits),
18495800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd      __ATTRIB(__DRI_ATTRIB_ACCUM_GREEN_SIZE, accumGreenBits),
185be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Judd      __ATTRIB(__DRI_ATTRIB_ACCUM_BLUE_SIZE, accumBlueBits),
186be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Judd      __ATTRIB(__DRI_ATTRIB_ACCUM_ALPHA_SIZE, accumAlphaBits),
187be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Judd      __ATTRIB(__DRI_ATTRIB_SAMPLE_BUFFERS, sampleBuffers),
188be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Judd      __ATTRIB(__DRI_ATTRIB_SAMPLES, samples),
189be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Judd      __ATTRIB(__DRI_ATTRIB_DOUBLE_BUFFER, doubleBufferMode),
190cbba04826bfaf4f8055f922bc41937572983c17fSam Judd      __ATTRIB(__DRI_ATTRIB_STEREO, stereoMode),
191cbba04826bfaf4f8055f922bc41937572983c17fSam Judd      __ATTRIB(__DRI_ATTRIB_AUX_BUFFERS, numAuxBuffers),
192fc3f03260933d96fae33a43846860f226dd661feSam Judd#if 0
193be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Judd      __ATTRIB(__DRI_ATTRIB_TRANSPARENT_TYPE, transparentPixel),
194c8c79d03924a757c29bbe7df5bc07b3cf8e02a83Sam Judd      __ATTRIB(__DRI_ATTRIB_TRANSPARENT_INDEX_VALUE, transparentIndex),
195896af010afa2c88aa6b63fc80c1a412357caed97Sam Judd      __ATTRIB(__DRI_ATTRIB_TRANSPARENT_RED_VALUE, transparentRed),
196896af010afa2c88aa6b63fc80c1a412357caed97Sam Judd      __ATTRIB(__DRI_ATTRIB_TRANSPARENT_GREEN_VALUE, transparentGreen),
197896af010afa2c88aa6b63fc80c1a412357caed97Sam Judd      __ATTRIB(__DRI_ATTRIB_TRANSPARENT_BLUE_VALUE, transparentBlue),
198896af010afa2c88aa6b63fc80c1a412357caed97Sam Judd      __ATTRIB(__DRI_ATTRIB_TRANSPARENT_ALPHA_VALUE, transparentAlpha),
199896af010afa2c88aa6b63fc80c1a412357caed97Sam Judd      __ATTRIB(__DRI_ATTRIB_RED_MASK, redMask),
200896af010afa2c88aa6b63fc80c1a412357caed97Sam Judd      __ATTRIB(__DRI_ATTRIB_GREEN_MASK, greenMask),
201896af010afa2c88aa6b63fc80c1a412357caed97Sam Judd      __ATTRIB(__DRI_ATTRIB_BLUE_MASK, blueMask),
202896af010afa2c88aa6b63fc80c1a412357caed97Sam Judd      __ATTRIB(__DRI_ATTRIB_ALPHA_MASK, alphaMask),
203c5ba6fb229c79a6f90e9c430f11d02b43bfdc247Sam Judd#endif
204c5ba6fb229c79a6f90e9c430f11d02b43bfdc247Sam Judd      __ATTRIB(__DRI_ATTRIB_MAX_PBUFFER_WIDTH, maxPbufferWidth),
20577e0200ba76c89177b6ec8c781f4f8f86984989bSam Judd      __ATTRIB(__DRI_ATTRIB_MAX_PBUFFER_HEIGHT, maxPbufferHeight),
20695800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd      __ATTRIB(__DRI_ATTRIB_MAX_PBUFFER_PIXELS, maxPbufferPixels),
207be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Judd      __ATTRIB(__DRI_ATTRIB_OPTIMAL_PBUFFER_WIDTH, optimalPbufferWidth),
208fc3f03260933d96fae33a43846860f226dd661feSam Judd      __ATTRIB(__DRI_ATTRIB_OPTIMAL_PBUFFER_HEIGHT, optimalPbufferHeight),
20944b89ba468c3f0f996bf1497d2f55fc9b50de0e8Sam Judd#if 0
21044b89ba468c3f0f996bf1497d2f55fc9b50de0e8Sam Judd      __ATTRIB(__DRI_ATTRIB_SWAP_METHOD, swapMethod),
211cbba04826bfaf4f8055f922bc41937572983c17fSam Judd#endif
21270db081bbc0a80737f457c6388f4af4c1391f5f5Sam Judd__ATTRIB(__DRI_ATTRIB_BIND_TO_TEXTURE_RGB, bindToTextureRgb),
21370db081bbc0a80737f457c6388f4af4c1391f5f5Sam Judd      __ATTRIB(__DRI_ATTRIB_BIND_TO_TEXTURE_RGBA, bindToTextureRgba),
21470db081bbc0a80737f457c6388f4af4c1391f5f5Sam Judd      __ATTRIB(__DRI_ATTRIB_BIND_TO_MIPMAP_TEXTURE,
21570db081bbc0a80737f457c6388f4af4c1391f5f5Sam Judd                     bindToMipmapTexture),
21670db081bbc0a80737f457c6388f4af4c1391f5f5Sam Judd      __ATTRIB(__DRI_ATTRIB_YINVERTED, yInverted),};
21770db081bbc0a80737f457c6388f4af4c1391f5f5Sam Judd
218e13dcedf144c02927c122fae32179f460b21fef5Sam Judd#define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0]))
219e13dcedf144c02927c122fae32179f460b21fef5Sam Judd
220be9ba784e13d6f8bf390ec0f11fc2600a38b0548Sam Juddstatic int
221d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam JuddscalarEqual(__GLcontextModes * mode, unsigned int attrib, unsigned int value)
222d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd{
223d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd   unsigned int glxValue;
224d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd   int i;
225d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd
226d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd   for (i = 0; i < ARRAY_SIZE(attribMap); i++)
227d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd      if (attribMap[i].attrib == attrib) {
228d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd         glxValue = *(unsigned int *) ((char *) mode + attribMap[i].offset);
229d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd         return glxValue == GLX_DONT_CARE || glxValue == value;
230d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd      }
231d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd
232d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd   return GL_TRUE;              /* Is a non-existing attribute equal to value? */
233d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd}
234d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd
235d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Juddstatic int
236d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam JudddriConfigEqual(const __DRIcoreExtension * core,
237d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd               __GLcontextModes * modes, const __DRIconfig * driConfig)
238d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd{
239d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd   unsigned int attrib, value, glxValue;
24070db081bbc0a80737f457c6388f4af4c1391f5f5Sam Judd   int i;
24170db081bbc0a80737f457c6388f4af4c1391f5f5Sam Judd
24270db081bbc0a80737f457c6388f4af4c1391f5f5Sam Judd   i = 0;
24370db081bbc0a80737f457c6388f4af4c1391f5f5Sam Judd   while (core->indexConfigAttrib(driConfig, i++, &attrib, &value)) {
24470db081bbc0a80737f457c6388f4af4c1391f5f5Sam Judd      switch (attrib) {
24570db081bbc0a80737f457c6388f4af4c1391f5f5Sam Judd      case __DRI_ATTRIB_RENDER_TYPE:
24670db081bbc0a80737f457c6388f4af4c1391f5f5Sam Judd         glxValue = 0;
24770db081bbc0a80737f457c6388f4af4c1391f5f5Sam Judd         if (value & __DRI_ATTRIB_RGBA_BIT) {
24870db081bbc0a80737f457c6388f4af4c1391f5f5Sam Judd            glxValue |= GLX_RGBA_BIT;
24970db081bbc0a80737f457c6388f4af4c1391f5f5Sam Judd         }
25070db081bbc0a80737f457c6388f4af4c1391f5f5Sam Judd         else if (value & __DRI_ATTRIB_COLOR_INDEX_BIT) {
25170db081bbc0a80737f457c6388f4af4c1391f5f5Sam Judd            glxValue |= GLX_COLOR_INDEX_BIT;
25270db081bbc0a80737f457c6388f4af4c1391f5f5Sam Judd         }
25370db081bbc0a80737f457c6388f4af4c1391f5f5Sam Judd         if (glxValue != modes->renderType)
25470db081bbc0a80737f457c6388f4af4c1391f5f5Sam Judd            return GL_FALSE;
25570db081bbc0a80737f457c6388f4af4c1391f5f5Sam Judd         break;
2560e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd
2570e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd      case __DRI_ATTRIB_CONFIG_CAVEAT:
2580e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd         if (value & __DRI_ATTRIB_NON_CONFORMANT_CONFIG)
2590e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd            glxValue = GLX_NON_CONFORMANT_CONFIG;
260d76f655fc29c5b3858d6657f22a5c656c3143767Sam Judd         else if (value & __DRI_ATTRIB_SLOW_BIT)
26129f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd            glxValue = GLX_SLOW_CONFIG;
262d76f655fc29c5b3858d6657f22a5c656c3143767Sam Judd         else
26329f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd            glxValue = GLX_NONE;
26429f3a82eaaf784c3722e7673b6ea6acff9449a4dSam Judd         if (glxValue != modes->visualRating)
265d76f655fc29c5b3858d6657f22a5c656c3143767Sam Judd            return GL_FALSE;
266d76f655fc29c5b3858d6657f22a5c656c3143767Sam Judd         break;
267d76f655fc29c5b3858d6657f22a5c656c3143767Sam Judd
2680e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd      case __DRI_ATTRIB_BIND_TO_TEXTURE_TARGETS:
2690e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd         glxValue = 0;
2700e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd         if (value & __DRI_ATTRIB_TEXTURE_1D_BIT)
2710e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd            glxValue |= GLX_TEXTURE_1D_BIT_EXT;
2720e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd         if (value & __DRI_ATTRIB_TEXTURE_2D_BIT)
2730e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd            glxValue |= GLX_TEXTURE_2D_BIT_EXT;
2740e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd         if (value & __DRI_ATTRIB_TEXTURE_RECTANGLE_BIT)
2750e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd            glxValue |= GLX_TEXTURE_RECTANGLE_BIT_EXT;
2760e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd         if (modes->bindToTextureTargets != GLX_DONT_CARE &&
2770e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd             glxValue != modes->bindToTextureTargets)
2780e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd            return GL_FALSE;
2790e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd         break;
2800e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd
2810e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd      default:
2820e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd         if (!scalarEqual(modes, attrib, value))
2830e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd            return GL_FALSE;
2840e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd      }
2850e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd   }
2860e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd
2870e2e2b1b8df449b6e3223b090f5a55f1993e6c1fSam Judd   return GL_TRUE;
2887050d58f72f666896e7f1ad6a27faafb0230fd37Sam Judd}
2897050d58f72f666896e7f1ad6a27faafb0230fd37Sam Judd
2907050d58f72f666896e7f1ad6a27faafb0230fd37Sam Juddstatic __GLcontextModes *
2917050d58f72f666896e7f1ad6a27faafb0230fd37Sam JuddcreateDriMode(const __DRIcoreExtension * core,
2927050d58f72f666896e7f1ad6a27faafb0230fd37Sam Judd              __GLcontextModes * modes, const __DRIconfig ** driConfigs)
2937050d58f72f666896e7f1ad6a27faafb0230fd37Sam Judd{
2947050d58f72f666896e7f1ad6a27faafb0230fd37Sam Judd   __GLXDRIconfigPrivate *config;
2957050d58f72f666896e7f1ad6a27faafb0230fd37Sam Judd   int i;
2967050d58f72f666896e7f1ad6a27faafb0230fd37Sam Judd
2977050d58f72f666896e7f1ad6a27faafb0230fd37Sam Judd   for (i = 0; driConfigs[i]; i++) {
2987050d58f72f666896e7f1ad6a27faafb0230fd37Sam Judd      if (driConfigEqual(core, modes, driConfigs[i]))
2997050d58f72f666896e7f1ad6a27faafb0230fd37Sam Judd         break;
3007050d58f72f666896e7f1ad6a27faafb0230fd37Sam Judd   }
3017050d58f72f666896e7f1ad6a27faafb0230fd37Sam Judd
3027050d58f72f666896e7f1ad6a27faafb0230fd37Sam Judd   if (driConfigs[i] == NULL)
3037050d58f72f666896e7f1ad6a27faafb0230fd37Sam Judd      return NULL;
304b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
305b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd   config = Xmalloc(sizeof *config);
306b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd   if (config == NULL)
307b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd      return NULL;
308b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
309b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd   config->modes = *modes;
310b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd   config->driConfig = driConfigs[i];
311b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
312b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd   return &config->modes;
313b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd}
314b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
315b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd_X_HIDDEN __GLcontextModes *
316b8963a023ceb009cbf7f73a4506e7af7e693a219Sam JudddriConvertConfigs(const __DRIcoreExtension * core,
317b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd                  __GLcontextModes * modes, const __DRIconfig ** configs)
318b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd{
319b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd   __GLcontextModes head, *tail, *m;
320b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
321b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd   tail = &head;
322b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd   head.next = NULL;
323b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd   for (m = modes; m; m = m->next) {
324b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd      tail->next = createDriMode(core, m, configs);
325b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd      if (tail->next == NULL) {
326b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd         /* no matching dri config for m */
327b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd         continue;
328b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd      }
329b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
330b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
331b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd      tail = tail->next;
332b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd   }
333b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd
334b8963a023ceb009cbf7f73a4506e7af7e693a219Sam Judd   _gl_context_modes_destroy(modes);
335da9073795a5ca847f17d39cda1d964cfc1fa25dcSam Judd
336da9073795a5ca847f17d39cda1d964cfc1fa25dcSam Judd   return head.next;
337e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd}
338e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd
339031fed2e364feacf89dfb904a3a0de98b050fdc4Sam Judd/* Bind DRI1 specific extensions */
340031fed2e364feacf89dfb904a3a0de98b050fdc4Sam Judd_X_HIDDEN void
341633966f8087dc4ef5e52ef0f559ec8090fbbc945Sam JudddriBindExtensions(__GLXscreenConfigs *psc)
342058ef77ccc7fd40a80a2da72dc97695c7dda2c0bSam Judd{
3439c04fc7a0c1d5c9e8f54660b0f954f754100f250Sam Judd   const __DRIextension **extensions;
3440ae32dc10d668a04f9f0484d587aefe5a7210e1cSam Judd   int i;
3459c04fc7a0c1d5c9e8f54660b0f954f754100f250Sam Judd
3469c04fc7a0c1d5c9e8f54660b0f954f754100f250Sam Judd   extensions = psc->core->getExtensions(psc->__driScreen);
3479c04fc7a0c1d5c9e8f54660b0f954f754100f250Sam Judd
348c95a13d712f57271047e467d367e1145517b0c2aSam Judd   for (i = 0; extensions[i]; i++) {
349c95a13d712f57271047e467d367e1145517b0c2aSam Judd#ifdef __DRI_SWAP_CONTROL
350c95a13d712f57271047e467d367e1145517b0c2aSam Judd      /* No DRI2 support for swap_control at the moment, since SwapBuffers
351c95a13d712f57271047e467d367e1145517b0c2aSam Judd       * is done by the X server */
352c95a13d712f57271047e467d367e1145517b0c2aSam Judd      if (strcmp(extensions[i]->name, __DRI_SWAP_CONTROL) == 0) {
353e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd	 psc->swapControl = (__DRIswapControlExtension *) extensions[i];
354e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd	 __glXEnableDirectExtension(psc, "GLX_SGI_swap_control");
355896af010afa2c88aa6b63fc80c1a412357caed97Sam Judd	 __glXEnableDirectExtension(psc, "GLX_MESA_swap_control");
356896af010afa2c88aa6b63fc80c1a412357caed97Sam Judd      }
357896af010afa2c88aa6b63fc80c1a412357caed97Sam Judd#endif
358896af010afa2c88aa6b63fc80c1a412357caed97Sam Judd
359896af010afa2c88aa6b63fc80c1a412357caed97Sam Judd#ifdef __DRI_MEDIA_STREAM_COUNTER
360896af010afa2c88aa6b63fc80c1a412357caed97Sam Judd      if (strcmp(extensions[i]->name, __DRI_MEDIA_STREAM_COUNTER) == 0) {
3619c04fc7a0c1d5c9e8f54660b0f954f754100f250Sam Judd         psc->msc = (__DRImediaStreamCounterExtension *) extensions[i];
362896af010afa2c88aa6b63fc80c1a412357caed97Sam Judd         __glXEnableDirectExtension(psc, "GLX_SGI_video_sync");
363896af010afa2c88aa6b63fc80c1a412357caed97Sam Judd      }
3649c04fc7a0c1d5c9e8f54660b0f954f754100f250Sam Judd#endif
3659c04fc7a0c1d5c9e8f54660b0f954f754100f250Sam Judd
3669c04fc7a0c1d5c9e8f54660b0f954f754100f250Sam Judd#ifdef __DRI_SWAP_BUFFER_COUNTER
3679c04fc7a0c1d5c9e8f54660b0f954f754100f250Sam Judd      /* No driver supports this at this time and the extension is
3689c04fc7a0c1d5c9e8f54660b0f954f754100f250Sam Judd       * not defined in dri_interface.h.  Will enable
3699c04fc7a0c1d5c9e8f54660b0f954f754100f250Sam Judd       * GLX_OML_sync_control if implemented. */
370031fed2e364feacf89dfb904a3a0de98b050fdc4Sam Judd#endif
371031fed2e364feacf89dfb904a3a0de98b050fdc4Sam Judd
372031fed2e364feacf89dfb904a3a0de98b050fdc4Sam Judd      /* Ignore unknown extensions */
373031fed2e364feacf89dfb904a3a0de98b050fdc4Sam Judd   }
374031fed2e364feacf89dfb904a3a0de98b050fdc4Sam Judd}
375031fed2e364feacf89dfb904a3a0de98b050fdc4Sam Judd
376031fed2e364feacf89dfb904a3a0de98b050fdc4Sam Judd/* Bind DRI2 specific extensions */
377031fed2e364feacf89dfb904a3a0de98b050fdc4Sam Judd_X_HIDDEN void
378031fed2e364feacf89dfb904a3a0de98b050fdc4Sam Judddri2BindExtensions(__GLXscreenConfigs *psc)
379031fed2e364feacf89dfb904a3a0de98b050fdc4Sam Judd{
380031fed2e364feacf89dfb904a3a0de98b050fdc4Sam Judd   const __DRIextension **extensions;
381031fed2e364feacf89dfb904a3a0de98b050fdc4Sam Judd   int i;
382031fed2e364feacf89dfb904a3a0de98b050fdc4Sam Judd
383031fed2e364feacf89dfb904a3a0de98b050fdc4Sam Judd   extensions = psc->core->getExtensions(psc->__driScreen);
384031fed2e364feacf89dfb904a3a0de98b050fdc4Sam Judd
385031fed2e364feacf89dfb904a3a0de98b050fdc4Sam Judd   for (i = 0; extensions[i]; i++) {
38615df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd#ifdef __DRI_TEX_BUFFER
3879c04fc7a0c1d5c9e8f54660b0f954f754100f250Sam Judd      if ((strcmp(extensions[i]->name, __DRI_TEX_BUFFER) == 0)) {
38815df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd	 psc->texBuffer = (__DRItexBufferExtension *) extensions[i];
38915df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd	 __glXEnableDirectExtension(psc, "GLX_EXT_texture_from_pixmap");
39015df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd      }
39115df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd#endif
39215df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd
39315df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd      __glXEnableDirectExtension(psc, "GLX_SGI_video_sync");
39415df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd      __glXEnableDirectExtension(psc, "GLX_SGI_swap_control");
39515df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd      __glXEnableDirectExtension(psc, "GLX_MESA_swap_control");
39615df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd
39715df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd      /* FIXME: if DRI2 version supports it... */
3989c04fc7a0c1d5c9e8f54660b0f954f754100f250Sam Judd      __glXEnableDirectExtension(psc, "INTEL_swap_event");
3990ba0245a97116b2f2c7bd67213961ac4e2dc3e56Sam Judd
4000ba0245a97116b2f2c7bd67213961ac4e2dc3e56Sam Judd#ifdef __DRI2_FLUSH
40115df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd      if ((strcmp(extensions[i]->name, __DRI2_FLUSH) == 0)) {
40215df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd	 psc->f = (__DRI2flushExtension *) extensions[i];
40315df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd	 /* internal driver extension, no GL extension exposed */
40415df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd      }
40515df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd#endif
40615df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd   }
40715df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd}
40815df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd
40915df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd/* Bind extensions common to DRI1 and DRI2 */
41015df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd_X_HIDDEN void
41115df8d073a97cfa2b589b547535a5b055c71bfbbSam JudddriBindCommonExtensions(__GLXscreenConfigs *psc)
41215df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd{
41315df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd   const __DRIextension **extensions;
41415df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd   int i;
415e9498d0b46d4c79410968eb11c332c42c9be7ec0Sam Judd
41615df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd   extensions = psc->core->getExtensions(psc->__driScreen);
41715df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd
41815df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd   for (i = 0; extensions[i]; i++) {
41915df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd#ifdef __DRI_COPY_SUB_BUFFER
420e9498d0b46d4c79410968eb11c332c42c9be7ec0Sam Judd      if (strcmp(extensions[i]->name, __DRI_COPY_SUB_BUFFER) == 0) {
421e9498d0b46d4c79410968eb11c332c42c9be7ec0Sam Judd	 psc->driCopySubBuffer = (__DRIcopySubBufferExtension *) extensions[i];
422e9498d0b46d4c79410968eb11c332c42c9be7ec0Sam Judd	 __glXEnableDirectExtension(psc, "GLX_MESA_copy_sub_buffer");
423e9498d0b46d4c79410968eb11c332c42c9be7ec0Sam Judd      }
42415df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd#endif
42515df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd
4269c04fc7a0c1d5c9e8f54660b0f954f754100f250Sam Judd#ifdef __DRI_ALLOCATE
4279c04fc7a0c1d5c9e8f54660b0f954f754100f250Sam Judd      if (strcmp(extensions[i]->name, __DRI_ALLOCATE) == 0) {
428ebf002122d17f21676230a4499894cc9f103d0b4Sam Judd	 psc->allocate = (__DRIallocateExtension *) extensions[i];
42915df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd	 __glXEnableDirectExtension(psc, "GLX_MESA_allocate_memory");
43015df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd      }
431ebf002122d17f21676230a4499894cc9f103d0b4Sam Judd#endif
432ebf002122d17f21676230a4499894cc9f103d0b4Sam Judd
433ebf002122d17f21676230a4499894cc9f103d0b4Sam Judd#ifdef __DRI_FRAME_TRACKING
434ebf002122d17f21676230a4499894cc9f103d0b4Sam Judd      if (strcmp(extensions[i]->name, __DRI_FRAME_TRACKING) == 0) {
435ebf002122d17f21676230a4499894cc9f103d0b4Sam Judd	 psc->frameTracking = (__DRIframeTrackingExtension *) extensions[i];
436ebf002122d17f21676230a4499894cc9f103d0b4Sam Judd	 __glXEnableDirectExtension(psc, "GLX_MESA_swap_frame_usage");
437ebf002122d17f21676230a4499894cc9f103d0b4Sam Judd      }
438ebf002122d17f21676230a4499894cc9f103d0b4Sam Judd#endif
43915df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd
44015df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd#ifdef __DRI_READ_DRAWABLE
44115df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd      if (strcmp(extensions[i]->name, __DRI_READ_DRAWABLE) == 0) {
44215df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd	 __glXEnableDirectExtension(psc, "GLX_SGI_make_current_read");
44315df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd      }
44415df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd#endif
44515df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd
44615df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd      /* Ignore unknown extensions */
44715df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd   }
44815df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd}
44915df8d073a97cfa2b589b547535a5b055c71bfbbSam Judd
450ebf002122d17f21676230a4499894cc9f103d0b4Sam Judd#endif /* GLX_DIRECT_RENDERING */
451ebf002122d17f21676230a4499894cc9f103d0b4Sam Judd