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