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