/* * Guest-side implementation of GL/GLX API. Replacement of standard libGL.so * * Copyright (c) 2006,2007 Even Rouault * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ #include #include #include #include #include #include #include #include #include "opengl_func.h" #include "common.h" #include "lock.h" #include "call.h" #include "log.h" GLState* new_gl_state() { int i, j; GLState* state; state = malloc(sizeof(GLState)); memset(state, 0, sizeof(GLState)); state->activeTexture = GL_TEXTURE0_ARB; state->client_state.pack.alignment = 4; state->client_state.unpack.alignment = 4; state->current_server_state.matrixMode = GL_MODELVIEW; state->current_server_state.depthFunc = GL_LESS; state->current_server_state.fog.mode = GL_EXP; state->current_server_state.fog.density = 1; state->current_server_state.fog.start = 0; state->current_server_state.fog.end = 1; state->current_server_state.fog.index = 0; state->textureAllocator = &state->ownTextureAllocator; state->bufferAllocator = &state->ownBufferAllocator; state->listAllocator = &state->ownListAllocator; state->currentRasterPosKnown = 1; state->currentRasterPos[0] = 0; state->currentRasterPos[1] = 0; state->currentRasterPos[2] = 0; state->currentRasterPos[3] = 1; for(i=0;imatrix[i].sp = 0; for(j=0;j<16;j++) { state->matrix[i].current.val[j] = (j == 0 || j == 5 || j == 10 || j == 15); } } return state; } typedef struct { int attrib; int value; int ret; } _glXGetConfigAttribs; typedef struct { int val; char* name; } glXAttrib; #define VAL_AND_NAME(x) { x, #x } static const glXAttrib tabRequestedAttribsPair[] = { VAL_AND_NAME(GLX_USE_GL), VAL_AND_NAME(GLX_BUFFER_SIZE), VAL_AND_NAME(GLX_LEVEL), VAL_AND_NAME(GLX_RGBA), VAL_AND_NAME(GLX_DOUBLEBUFFER), VAL_AND_NAME(GLX_STEREO), VAL_AND_NAME(GLX_AUX_BUFFERS), VAL_AND_NAME(GLX_RED_SIZE), VAL_AND_NAME(GLX_GREEN_SIZE), VAL_AND_NAME(GLX_BLUE_SIZE), VAL_AND_NAME(GLX_ALPHA_SIZE), VAL_AND_NAME(GLX_DEPTH_SIZE), VAL_AND_NAME(GLX_STENCIL_SIZE), VAL_AND_NAME(GLX_ACCUM_RED_SIZE), VAL_AND_NAME(GLX_ACCUM_GREEN_SIZE), VAL_AND_NAME(GLX_ACCUM_BLUE_SIZE), VAL_AND_NAME(GLX_ACCUM_ALPHA_SIZE), VAL_AND_NAME(GLX_CONFIG_CAVEAT), VAL_AND_NAME(GLX_X_VISUAL_TYPE), VAL_AND_NAME(GLX_TRANSPARENT_TYPE), VAL_AND_NAME(GLX_TRANSPARENT_INDEX_VALUE), VAL_AND_NAME(GLX_TRANSPARENT_RED_VALUE), VAL_AND_NAME(GLX_TRANSPARENT_GREEN_VALUE), VAL_AND_NAME(GLX_TRANSPARENT_BLUE_VALUE), VAL_AND_NAME(GLX_TRANSPARENT_ALPHA_VALUE), VAL_AND_NAME(GLX_SLOW_CONFIG), VAL_AND_NAME(GLX_TRUE_COLOR), VAL_AND_NAME(GLX_DIRECT_COLOR), VAL_AND_NAME(GLX_PSEUDO_COLOR), VAL_AND_NAME(GLX_STATIC_COLOR), VAL_AND_NAME(GLX_GRAY_SCALE), VAL_AND_NAME(GLX_STATIC_GRAY), VAL_AND_NAME(GLX_TRANSPARENT_RGB), VAL_AND_NAME(GLX_TRANSPARENT_INDEX), VAL_AND_NAME(GLX_VISUAL_ID), VAL_AND_NAME(GLX_DRAWABLE_TYPE), VAL_AND_NAME(GLX_RENDER_TYPE), VAL_AND_NAME(GLX_X_RENDERABLE), VAL_AND_NAME(GLX_FBCONFIG_ID), VAL_AND_NAME(GLX_RGBA_TYPE), VAL_AND_NAME(GLX_COLOR_INDEX_TYPE), VAL_AND_NAME(GLX_MAX_PBUFFER_WIDTH), VAL_AND_NAME(GLX_MAX_PBUFFER_HEIGHT), VAL_AND_NAME(GLX_MAX_PBUFFER_PIXELS), VAL_AND_NAME(GLX_PRESERVED_CONTENTS), VAL_AND_NAME(GLX_FLOAT_COMPONENTS_NV), VAL_AND_NAME(GLX_SAMPLE_BUFFERS), VAL_AND_NAME(GLX_SAMPLES) }; #define N_REQUESTED_ATTRIBS (sizeof(tabRequestedAttribsPair)/sizeof(tabRequestedAttribsPair[0])) static int* getTabRequestedAttribsInt() { static int tabRequestedAttribsInt[N_REQUESTED_ATTRIBS] = { 0 }; if (tabRequestedAttribsInt[0] == 0) { int i; for(i=0;iclass; temp.visualid = DefaultVisual(dpy,screen)->visualid; vis = XGetVisualInfo( dpy, mask, &temp, &n ); if (vis == NULL) log_gl("cannot get visual from client side\n"); assert (nEltTabAssocVisualInfoVisualId < MAX_SIZE_TAB_ASSOC_VISUALINFO_VISUALID); for(i=0;i= 0 && name < 100); if (glXQueryServerString_ret[name] == NULL) { long args[] = { POINTER_TO_ARG(dpy), INT_TO_ARG(screen), INT_TO_ARG(name) }; do_opengl_call_no_lock(glXQueryServerString_func, &glXQueryServerString_ret[name], args, NULL); glXQueryServerString_ret[name] = strdup(glXQueryServerString_ret[name]); } UNLOCK(glXQueryServerString_func); return glXQueryServerString_ret[name]; } const char *glXGetClientString( Display *dpy, int name ) { LOCK(glXGetClientString_func); static char* glXGetClientString_ret[100] = {NULL}; assert(name >= 0 && name < 100); if (glXGetClientString_ret[name] == NULL) { long args[] = { POINTER_TO_ARG(dpy), INT_TO_ARG(name) }; do_opengl_call_no_lock(glXGetClientString_func, &glXGetClientString_ret[name], args, NULL); if (getenv("GLX_VENDOR") && name == GLX_VENDOR) { glXGetClientString_ret[name] = getenv("GLX_VENDOR"); } else glXGetClientString_ret[name] = strdup(glXGetClientString_ret[name]); } UNLOCK(glXGetClientString_func); return glXGetClientString_ret[name]; } static void _create_context(GLXContext context, GLXContext shareList) { int i; glstates = realloc(glstates, (nbGLStates+1) * sizeof(GLState*)); glstates[nbGLStates] = new_gl_state(); glstates[nbGLStates]->ref = 1; glstates[nbGLStates]->context = context; glstates[nbGLStates]->shareList = shareList; glstates[nbGLStates]->viewport.width = 0; if (shareList) { for(i=0; icontext == shareList) { glstates[i]->ref++; glstates[nbGLStates]->textureAllocator = glstates[i]->textureAllocator; glstates[nbGLStates]->bufferAllocator = glstates[i]->bufferAllocator; glstates[nbGLStates]->listAllocator = glstates[i]->listAllocator; break; } } if (i == nbGLStates) { log_gl("unknown shareList %p\n", (void*)shareList); } } nbGLStates++; } static GLXFBConfig* glXChooseFBConfig_no_lock( Display *dpy, int screen, const int *attribList, int *nitems ); static XVisualInfo* glXGetVisualFromFBConfig_no_lock( Display *dpy, GLXFBConfig config ); GLXContext glXCreateContext( Display *dpy, XVisualInfo *vis, GLXContext shareList, Bool direct ) { LOCK(glXCreateContext_func); int isFbConfigVisual = 0; int i; int visualid = 0; for(i=0;ivisualid; if (debug_gl) log_gl("not found vis %p in table, visualid=%d\n", vis, visualid); } long args[] = { POINTER_TO_ARG(dpy), INT_TO_ARG(visualid), INT_TO_ARG(shareList), INT_TO_ARG(direct) }; do_opengl_call_no_lock(glXCreateContext_func, &ctxt, args, NULL); if (ctxt) { _create_context(ctxt, shareList); glstates[nbGLStates-1]->isAssociatedToFBConfigVisual = isFbConfigVisual; } UNLOCK(glXCreateContext_func); return ctxt; } GLXContext glXGetCurrentContext (void) { GET_CURRENT_STATE(); if (debug_gl) log_gl("glXGetCurrentContext() -> %p\n", state->context); return state->context; } GLXDrawable glXGetCurrentDrawable (void) { GET_CURRENT_STATE(); if (debug_gl) log_gl("glXGetCurrentDrawable() -> %p\n", (void*)state->current_drawable); return state->current_drawable; } static void _free_context(Display* dpy, int i, GLState* state) { free(state->last_cursor.pixels); free(state->ownTextureAllocator.values); free(state->ownBufferAllocator.values); free(state->ownListAllocator.values); free(state); //memmove(&state, &glstates[i+1], (nbGLStates-i-1) * sizeof(GLState*)); memmove(&glstates[i], &glstates[i+1], (nbGLStates-i-1) * sizeof(GLState*)); nbGLStates--; } GLAPI void APIENTRY glXDestroyContext( Display *dpy, GLXContext ctx ) { int i; LOCK(glXDestroyContext_func); GET_CURRENT_STATE(); for(i=0;icontext == ctx) { long args[] = { POINTER_TO_ARG(dpy), POINTER_TO_ARG(ctx) }; do_opengl_call_no_lock(glXDestroyContext_func, NULL, args, NULL); if (ctx == state->context) { SET_CURRENT_STATE(NULL); } GLXContext shareList = glstates[i]->shareList; glstates[i]->ref --; if (glstates[i]->ref == 0) { _free_context(dpy, i, glstates[i]); } if (shareList) { for(i=0; icontext == shareList) { glstates[i]->ref--; if (glstates[i]->ref == 0) { _free_context(dpy, i, glstates[i]); } break; } } } break; } } UNLOCK(glXDestroyContext_func); } Bool glXQueryVersion( Display *dpy, int *maj, int *min ) { LOCK(glXQueryVersion_func); static Bool ret = -1; static int l_maj, l_min; if (ret == -1) { long args[] = { POINTER_TO_ARG(dpy), POINTER_TO_ARG(&l_maj), POINTER_TO_ARG(&l_min) }; do_opengl_call_no_lock(glXQueryVersion_func, &ret, args, NULL); } if (maj) *maj = l_maj; if (min) *min = l_min; UNLOCK(glXQueryVersion_func); return ret; } /* Getting window information by using XCB API. It looks more complicated * than the way using xlib API. The reason not to use xlib is to avoid the * potential conflicts between xcb and xlib. * * XCB could be called asynchronously. Take the example of getting window * attributes. If there is xlib call of "XGetWindowAttributes()" between * xcb_shape_get_rectangles() and xcb_shape_get_rectangles_reply(), xcb call * will not be able to get the result. * * That is the case we countered for mcompositor in MeeGo handset image while * running with GL accelerations. Using xcb API here could avoid such conflict. */ static void _get_window_info(Display *dpy, Window win, WindowInfoStruct* info) { xcb_generic_error_t *error; xcb_connection_t *xcb_conn = XGetXCBConnection(dpy); xcb_get_window_attributes_reply_t *attr = xcb_get_window_attributes_reply( xcb_conn, xcb_get_window_attributes(xcb_conn, win), &error); #ifndef XCB_EVENT_ERROR_BAD_MATCH #define XCB_EVENT_ERROR_BAD_MATCH 8 #endif /* BAD_MATCH indicate the drawable is PIXMAP instead of window */ if ( !attr && error->error_code != XCB_EVENT_ERROR_BAD_MATCH ) { info->width = 0; info->height= 0; info->map_state = IsUnviewable; return; } if (attr) { if (attr->map_state == XCB_MAP_STATE_VIEWABLE) { info->map_state = IsViewable; } else if (attr->map_state == XCB_MAP_STATE_UNVIEWABLE){ info->map_state = IsUnviewable; } else { info->map_state = IsUnmapped; } free (attr); } else /* Keep rendering PIXMAP as it can be copied to any window */ info->map_state = IsViewable; xcb_get_geometry_reply_t *geom = xcb_get_geometry_reply( xcb_conn, xcb_get_geometry(xcb_conn, win), 0); if (geom) { info->width = geom->width; info->height = geom->height; free (geom); } else { info->width = 0; info->height= 0; } } #if 0 /* Alternative implementation of getting window attributes. Using xlib API */ static void _get_window_info(Display *dpy, Window win, WindowInfoStruct* info) { XWindowAttributes attr; XGetWindowAttributes(dpy, win, &attr); info->width = attr.width; info->height = attr.height; info->map_state = attr.map_state; } #endif RendererData *renderer_create_image(Display *dpy, int w, int h) { RendererData *rdata = calloc(1, sizeof(*rdata)); if(!rdata) goto out; rdata->w = w; rdata->h = h; rdata->image = XShmCreateImage(dpy, DefaultVisual(dpy, 0), 24, ZPixmap, NULL, &rdata->shminfo, w, h); if(!rdata->image) goto out_try_non_shm; rdata->shminfo.shmid = shmget(IPC_PRIVATE, rdata->image->bytes_per_line * h, IPC_CREAT | 0777); if(rdata->shminfo.shmid == -1) { goto out_destroy_img; } rdata->shminfo.shmaddr = shmat(rdata->shminfo.shmid, NULL,0); if(rdata->shminfo.shmaddr == (void*)-1) goto out_shmput; rdata->buffer = rdata->shminfo.shmaddr; rdata->image->data = rdata->buffer; rdata->shminfo.readOnly = False; rdata->use_shm = 1; XShmAttach(dpy, &rdata->shminfo); XSync(dpy, 0); memset(rdata->buffer, 0, rdata->image->bytes_per_line * h); return rdata; out_shmput: shmctl(rdata->shminfo.shmid, IPC_RMID, NULL); out_destroy_img: XDestroyImage(rdata->image); out_try_non_shm: // Fallback path rdata->image = XCreateImage(dpy, DefaultVisual(dpy, 0), 24, ZPixmap, 0, NULL, w, h, 32, 0); if(rdata->image) { rdata->buffer = calloc(1, (rdata->image->bytes_per_line) * h); if(rdata->buffer) { rdata->image->data = rdata->buffer; return rdata; } } XDestroyImage(rdata->image); free(rdata); out: return NULL; } void renderer_destroy_image(Display *dpy, RendererData *rdata) { if(!rdata) { return; } if(rdata->use_shm) XShmDetach(dpy, &rdata->shminfo); else free(rdata->image->data); rdata->image->data = NULL; XDestroyImage(rdata->image); if(rdata->use_shm) { shmdt(rdata->shminfo.shmaddr); shmctl(rdata->shminfo.shmid, IPC_RMID, NULL); } free(rdata); } #define MAX_PBUFFERS 100 /* Do this only with lock held */ static void _request_host_resize(Display *dpy, Window win, GLState *state, int w, int h) { if(state->renderer_data) renderer_destroy_image(dpy, state->renderer_data); state->renderer_data = renderer_create_image(dpy, w, h); long args[] = { INT_TO_ARG(win), INT_TO_ARG(w), INT_TO_ARG(h)}; do_opengl_call_no_lock(_resize_surface_func, NULL, args, 0); } static void _update_renderer(Display *dpy, Window win) { GET_CURRENT_STATE(); WindowInfoStruct info; WindowInfoStruct *old_info = &state->last_win_state; if(!win) return; _get_window_info(dpy, win, &info); if(info.map_state != IsViewable) { if(state->renderer_data); renderer_destroy_image(dpy, state->renderer_data); state->renderer_data = NULL; goto out; } if(!state->renderer_data) { state->renderer_data = renderer_create_image(dpy, info.width, info.height); _request_host_resize(dpy, win, state, info.width, info.height); goto out; } if ((info.width != old_info->width) || (info.height != old_info->height)) { _request_host_resize(dpy, win, state, info.width, info.height); goto out; } //fprintf(stderr, "render: win: %08x w: %d h: %d stride: %d\n", win, state->renderer_data->w, state->renderer_data->h, state->renderer_data->image->bytes_per_line); // Actually render stuff long args[] = { INT_TO_ARG(win), INT_TO_ARG(state->renderer_data->image->bits_per_pixel), INT_TO_ARG(state->renderer_data->image->bytes_per_line), POINTER_TO_ARG(state->renderer_data->buffer)}; int args_size[] = {0, 0, 0, state->renderer_data->image->bytes_per_line*state->renderer_data->h}; do_opengl_call_no_lock(_render_surface_func, NULL, args, args_size); /* draw into window */ if(state->renderer_data->use_shm) XShmPutImage(dpy, win, DefaultGC(dpy, 0), state->renderer_data->image, 0, 0, 0, 0, state->renderer_data->w, state->renderer_data->h, False); else XPutImage(dpy, win, DefaultGC(dpy, 0), state->renderer_data->image, 0, 0, 0, 0, state->renderer_data->w, state->renderer_data->h); XFlush(dpy); #if 0 do { char filename[50]; FILE *f; sprintf(filename, "/home/ian/dump_%08x.rgb", win); f = fopen(filename, "wb"); fwrite(state->renderer_data->buffer, state->renderer_data->image->bytes_per_line*state->renderer_data->h, 1, f); fclose(f); } while(0); #endif out: memcpy(old_info, &info, sizeof(info)); } /* Read the X window information to see whether the resize of render buffer * on host side is needed. If so do the resize and return 1; otherwise * return 0. */ int _check_and_resize_window (GLState *state, Window win) { WindowInfoStruct info; WindowInfoStruct *old_info = &state->last_win_state; int changed = 0; if(!win) return changed; _get_window_info(state->display, win, &info); LOCK(_resize_surface_func); if(info.map_state != IsViewable) { if(state->renderer_data); renderer_destroy_image(state->display, state->renderer_data); state->renderer_data = NULL; changed = 1; } else if(!state->renderer_data) { state->renderer_data = renderer_create_image(state->display, info.width, info.height); _request_host_resize(state->display, win, state, info.width, info.height); changed = 1; } else if ((info.width != old_info->width) || (info.height != old_info->height)) { _request_host_resize(state->display, win, state, info.width, info.height); changed = 1; } memcpy(old_info, &info, sizeof(info)); UNLOCK(_resize_surface_func); return changed; } Bool glXMakeCurrent_no_lock( Display *dpy, GLXDrawable drawable, GLXContext ctx) { Bool ret = False; int i; #if 0 if (drawable == 0 && ctx == 0) return True; if (current_drawable == drawable && current_context == ctx) /* optimization */ return True; #endif GET_CURRENT_STATE(); { //log_gl("glXMakeCurrent %d %d\n", drawable, ctx); long args[] = { POINTER_TO_ARG(dpy), INT_TO_ARG(drawable), INT_TO_ARG(ctx) }; do_opengl_call_no_lock(glXMakeCurrent_func, NULL /*&ret*/, args, NULL); ret = True; } if (ret) { int i; if (ctx > 0) { for(i=0; icontext == ctx) { state = glstates[i]; SET_CURRENT_STATE(state); break; } } if (i == nbGLStates) { log_gl("cannot set current_gl_state\n"); log_gl("nbGLStates = %d\n", nbGLStates); } } state->display = dpy; state->current_drawable = drawable; state->current_read_drawable = drawable; } return ret; } GLAPI Bool APIENTRY glXMakeCurrent( Display *dpy, GLXDrawable drawable, GLXContext ctx) { Bool ret; LOCK(glXMakeCurrent_func); ret = glXMakeCurrent_no_lock(dpy, drawable, ctx); UNLOCK(glXMakeCurrent_func); return ret; } GLAPI void APIENTRY glXCopyContext( Display *dpy, GLXContext src, GLXContext dst, unsigned long mask ) { long args[] = { POINTER_TO_ARG(dpy), INT_TO_ARG(src), INT_TO_ARG(dst), INT_TO_ARG(mask) }; do_opengl_call(glXCopyContext_func, NULL, args, NULL); } GLAPI Bool APIENTRY glXIsDirect( Display *dpy, GLXContext ctx ) { Bool ret = False; long args[] = { POINTER_TO_ARG(dpy), INT_TO_ARG(ctx) }; do_opengl_call(glXIsDirect_func, &ret, args, NULL); return ret; } GLAPI int APIENTRY glXGetConfig( Display *dpy, XVisualInfo *vis, int attrib, int *value ) { int ret = 0; int i, j; if (vis == NULL || value == NULL) return 0; LOCK(glXGetConfig_func); int visualid = 0; for(i=0;ivisualid; } /* Optimization */ for(i=0;i %d\n", vis, attrib, *value); if (configs[i].nbAttribs < N_MAX_ATTRIBS) { configs[i].attribs[configs[i].nbAttribs].attrib = attrib; configs[i].attribs[configs[i].nbAttribs].value = *value; configs[i].attribs[configs[i].nbAttribs].ret = ret; configs[i].nbAttribs++; } } } else { long args[] = { POINTER_TO_ARG(dpy), INT_TO_ARG(visualid), INT_TO_ARG(attrib), POINTER_TO_ARG(value) }; do_opengl_call_no_lock(glXGetConfig_func, &ret, args, NULL); if (debug_gl) log_gl("glXGetConfig visual=%p, attrib=%d -> %d\n", vis, attrib, *value); } end_of_glx_get_config: UNLOCK(glXGetConfig_func); return ret; } void glXSwapBuffers_no_lock( Display *dpy, GLXDrawable drawable ) { //log_gl("glXSwapBuffers %d\n", drawable); long args[] = { POINTER_TO_ARG(dpy), INT_TO_ARG(drawable) }; do_opengl_call_no_lock(glXSwapBuffers_func, NULL, args, NULL); _update_renderer(dpy, drawable); } GLAPI void APIENTRY glXSwapBuffers( Display *dpy, GLXDrawable drawable ) { LOCK(glXSwapBuffers_func); glXSwapBuffers_no_lock(dpy, drawable); UNLOCK(glXSwapBuffers_func); } GLAPI Bool APIENTRY glXQueryExtension( Display *dpy, int *errorBase, int *eventBase ) { Bool ret; LOCK(glXQueryExtension_func); int fake_int; if (errorBase == NULL) errorBase = &fake_int; if (eventBase == NULL) eventBase = &fake_int; long args[] = { POINTER_TO_ARG(dpy), POINTER_TO_ARG(errorBase), POINTER_TO_ARG(eventBase) }; do_opengl_call_no_lock(glXQueryExtension_func, &ret, args, NULL); UNLOCK(glXQueryExtension_func); return ret; } GLAPI void APIENTRY glXWaitGL (void) { int ret; do_opengl_call(glXWaitGL_func, &ret, NULL, NULL); } GLAPI void APIENTRY glXWaitX (void) { int ret; do_opengl_call(glXWaitX_func, &ret, NULL, NULL); } GLAPI Display* APIENTRY glXGetCurrentDisplay( void ) { GET_CURRENT_STATE(); return state->display; } static GLXFBConfig* glXChooseFBConfig_no_lock( Display *dpy, int screen, const int *attribList, int *nitems ) { CHECK_PROC_WITH_RET(glXChooseFBConfig); GLXFBConfig* fbConfig = NULL; if (debug_gl) log_gl("glXChooseFBConfig\n"); int i=0; int ret = 0; int emptyAttribList = None; if (attribList == NULL) attribList = &emptyAttribList; long args[] = { POINTER_TO_ARG(dpy), INT_TO_ARG(screen), POINTER_TO_ARG(attribList), POINTER_TO_ARG(nitems) }; int args_size[] = { 0, 0, sizeof(int) * _compute_length_of_attrib_list_including_zero(attribList, 1), 0 }; do_opengl_call_no_lock(glXChooseFBConfig_func, &ret, args, args_size); if (debug_gl) log_gl("nitems = %d\n", *nitems); if (*nitems == 0) return NULL; fbConfig = malloc(sizeof(GLXFBConfig) * (*nitems)); for(i=0;i<*nitems;i++) { fbConfig[i] = (GLXFBConfig)(long)(ret + i); if (debug_gl && (i == 0 || i == *nitems-1)) log_gl("config %d = %d\n", i, ret+i); } return fbConfig; } GLAPI GLXFBConfig* APIENTRY glXChooseFBConfig( Display *dpy, int screen, const int *attribList, int *nitems ) { GLXFBConfig* fbconfig; LOCK(glXChooseFBConfig_func); fbconfig = glXChooseFBConfig_no_lock(dpy, screen, attribList, nitems); UNLOCK(glXChooseFBConfig_func); return fbconfig; } GLAPI GLXFBConfig* APIENTRY glXGetFBConfigs( Display *dpy, int screen, int *nitems ) { CHECK_PROC_WITH_RET(glXGetFBConfigs); if (debug_gl) log_gl("glXGetFBConfigs\n"); int i = 0; GLXFBConfig* fbConfig; int ret = 0; long args[] = { POINTER_TO_ARG(dpy), INT_TO_ARG(screen), POINTER_TO_ARG(nitems) }; do_opengl_call(glXGetFBConfigs_func, &ret, args, NULL); if (debug_gl) log_gl("nitems = %d\n", *nitems); fbConfig = malloc(sizeof(GLXFBConfig) * (*nitems)); for(i=0;i<*nitems;i++) { fbConfig[i] = (GLXFBConfig)(long)(ret + i); if (debug_gl && (i == 0 || i == *nitems-1)) log_gl("config %d = %d\n", i, ret+i); } return fbConfig; } GLAPI int APIENTRY glXGetFBConfigAttrib(Display *dpy, GLXFBConfig config, int attrib, int *value) { CHECK_PROC_WITH_RET(glXGetFBConfigAttrib); LOCK(glXGetFBConfigAttrib_func); int ret = 0; int i, j; /* Optimization */ for(i=0;ivisualid; fbconfigs[i].attribs[j].ret = 0; } else if (tabRequestedAttribsPair[j].val == GLX_X_VISUAL_TYPE) { fbconfigs[i].attribs[j].attrib = GLX_X_VISUAL_TYPE; fbconfigs[i].attribs[j].value = GLX_TRUE_COLOR; fbconfigs[i].attribs[j].ret = 0; } else { fbconfigs[i].attribs[j].attrib = tabRequestedAttribsPair[j].val; fbconfigs[i].attribs[j].value = tabGottenValues[j]; fbconfigs[i].attribs[j].ret = tabGottenRes[j]; } fbconfigs[i].nbAttribs++; if (tabRequestedAttribsPair[j].val == attrib) { found = 1; *value = fbconfigs[i].attribs[j].value; ret = fbconfigs[i].attribs[j].ret; if (debug_gl) log_gl("glXGetFBConfigAttrib(config=%p, %s)=%d (%d)\n", config, tabRequestedAttribsPair[j].name, *value, ret); } } nbFBConfigs++; if (found) goto end_of_glx_get_fb_config_attrib; } { long args[] = { POINTER_TO_ARG(dpy), INT_TO_ARG(config), INT_TO_ARG(attrib), POINTER_TO_ARG(value) }; do_opengl_call_no_lock(glXGetFBConfigAttrib_func, &ret, args, NULL); if (debug_gl) log_gl("glXGetFBConfigAttrib config=%p, attrib=%d -> %d\n", config, attrib, *value); if (fbconfigs[i].nbAttribs < N_MAX_ATTRIBS) { fbconfigs[i].attribs[fbconfigs[i].nbAttribs].attrib = attrib; fbconfigs[i].attribs[fbconfigs[i].nbAttribs].value = *value; fbconfigs[i].attribs[fbconfigs[i].nbAttribs].ret = ret; fbconfigs[i].nbAttribs++; } } } else { if (attrib == GLX_VISUAL_ID) { // get the visual id in guest os int screen = 0; *value = DefaultVisual(dpy, screen)->visualid; ret = 0; } else if (attrib == GLX_X_VISUAL_TYPE){ *value = GLX_TRUE_COLOR; ret = 0; } else { long args[] = { POINTER_TO_ARG(dpy), INT_TO_ARG(config), INT_TO_ARG(attrib), POINTER_TO_ARG(value) }; do_opengl_call_no_lock(glXGetFBConfigAttrib_func, &ret, args, NULL); if (debug_gl) log_gl("glXGetFBConfigAttrib config=%p, attrib=%d -> %d\n", config, attrib, *value); } } end_of_glx_get_fb_config_attrib: UNLOCK(glXGetFBConfigAttrib_func); return ret; } GLAPI int APIENTRY glXQueryContext( Display *dpy, GLXContext ctx, int attribute, int *value ) { CHECK_PROC_WITH_RET(glXQueryContext); int ret = 0; long args[] = { POINTER_TO_ARG(dpy), INT_TO_ARG(ctx), INT_TO_ARG(attribute), POINTER_TO_ARG(value) }; do_opengl_call(glXQueryContext_func, &ret, args, NULL); return ret; } GLAPI void APIENTRY glXQueryDrawable( Display *dpy, GLXDrawable draw, int attribute, unsigned int *value ) { CHECK_PROC(glXQueryDrawable); long args[] = { POINTER_TO_ARG(dpy), INT_TO_ARG(draw), INT_TO_ARG(attribute), POINTER_TO_ARG(value) }; do_opengl_call(glXQueryDrawable_func, NULL, args, NULL); } static XVisualInfo* glXGetVisualFromFBConfig_no_lock( Display *dpy, GLXFBConfig config ) { CHECK_PROC_WITH_RET(glXGetVisualFromFBConfig); int screen = 0; if (debug_gl) log_gl("glXGetVisualFromFBConfig %p\n", (void*)config); XVisualInfo temp, *vis; long mask; int n; int i; mask = VisualScreenMask | VisualDepthMask | VisualClassMask; temp.screen = screen; temp.depth = DefaultDepth(dpy,screen); temp.class = DefaultVisual(dpy,screen)->class; temp.visualid = DefaultVisual(dpy,screen)->visualid; mask |= VisualIDMask; vis = XGetVisualInfo( dpy, mask, &temp, &n ); long args[] = { POINTER_TO_ARG(dpy), INT_TO_ARG(config)}; int visualid; do_opengl_call_no_lock(glXGetVisualFromFBConfig_func, &visualid, args, NULL); vis->visualid = visualid; assert (nEltTabAssocVisualInfoVisualId < MAX_SIZE_TAB_ASSOC_VISUALINFO_VISUALID); for(i=0;icurrent_read_drawable = read; return ret; } GLAPI GLXWindow APIENTRY glXCreateWindow( Display *dpy, GLXFBConfig config, Window win, const int *attribList ) { CHECK_PROC_WITH_RET(glXCreateWindow); /* do nothing. Not sure about this implementation. FIXME */ fprintf(stderr, "createwindow?\n"); return win; } GLAPI void APIENTRY glXDestroyWindow( Display *dpy, GLXWindow window ) { CHECK_PROC(glXDestroyWindow); /* do nothing. Not sure about this implementation. FIXME */ } GLAPI GLXPixmap APIENTRY glXCreateGLXPixmap( Display *dpy, XVisualInfo *vis, Pixmap pixmap ) { CHECK_PROC_WITH_RET(glXCreateGLXPixmap); /* XXX: Not sure about this implementaiton * Do thing but return pixmap as ID. New pixmap will be created via * MakeCurrent in Emulator from host. After rendering done on the host, the * buffer will be copied back when CopyBuffers. */ return pixmap; } GLAPI void APIENTRY glXDestroyGLXPixmap( Display *dpy, GLXPixmap pixmap ) { CHECK_PROC(glXDestroyGLXPixmap); /* XXX:do nothing. Not sure about this implementation */ /* FIXME */ log_gl("glXDestroyGLXPixmap : sorry, unsupported call and I don't really see how I could implement it..."); } GLAPI GLXPixmap APIENTRY glXCreatePixmap( Display *dpy, GLXFBConfig fbconfig, Pixmap pixmap, const int *attribList ) { CHECK_PROC_WITH_RET(glXCreatePixmap); LOCK(glXCreatePixmap_func); if (debug_gl) log_gl("glXCreatePixmap %p\n", (void*)fbconfig); int emptyAttribList = None; if (attribList == NULL) attribList = &emptyAttribList; GLXPixmap glxpixmap; long args[] = { POINTER_TO_ARG(dpy), INT_TO_ARG(fbconfig), INT_TO_ARG(pixmap), POINTER_TO_ARG(attribList) }; int args_size[] = { 0, 0, 0, sizeof(int) * _compute_length_of_attrib_list_including_zero(attribList, 1) }; do_opengl_call_no_lock(glXCreatePixmap_func, &glxpixmap, args, args_size); if (glxpixmap) { /*XXX:maintain the info?*/ } UNLOCK(glXCreatePixmap_func); return glxpixmap; } GLAPI void APIENTRY glXDestroyPixmap( Display *dpy, GLXPixmap pixmap ) { CHECK_PROC(glXDestroyPixmap); /* XXX:do nothing. Not sure about this implementation */ /* FIXME */ log_gl("glXDestroyPixmap : sorry, unsupported call and I don't really see how I could implement it..."); } GLAPI GLXPbuffer APIENTRY glXCreatePbuffer( Display *dpy, GLXFBConfig config, const int *attribList ) { CHECK_PROC_WITH_RET(glXCreatePbuffer); /* FIXME */ log_gl("glXCreatePbuffer: sorry, unsupported call and I don't really see how I could implement it..."); return 0; } GLAPI void APIENTRY glXDestroyPbuffer( Display *dpy, GLXPbuffer pbuf ) { CHECK_PROC(glXDestroyPbuffer); /* FIXME */ log_gl("glXDestroyPbuffer: sorry, unsupported call and I don't really see how I could implement it..."); } GLAPI GLXDrawable APIENTRY glXGetCurrentReadDrawable( void ) { CHECK_PROC_WITH_RET(glXGetCurrentReadDrawable); GET_CURRENT_STATE(); return state->current_read_drawable; } GLAPI void APIENTRY glXSelectEvent( Display *dpy, GLXDrawable drawable, unsigned long mask ) { CHECK_PROC(glXSelectEvent); log_gl("glXSelectEvent : sorry, unsupported call"); } GLAPI void APIENTRY glXGetSelectedEvent( Display *dpy, GLXDrawable drawable, unsigned long *mask ) { CHECK_PROC(glXGetSelectedEvent); log_gl("glXGetSelectedEvent : sorry, unsupported call"); } #include "opengl_client_xfonts.c" GLAPI const char * APIENTRY EXT_FUNC(glXGetScreenDriver) (Display *dpy, int screen) { static const char* ret = NULL; LOCK(glXGetScreenDriver_func); CHECK_PROC_WITH_RET(glXGetScreenDriver); if (ret == NULL) { long args[] = { POINTER_TO_ARG(dpy), INT_TO_ARG(screen) }; do_opengl_call_no_lock(glXGetScreenDriver_func, &ret, args, NULL); ret = strdup(ret); } UNLOCK(glXGetScreenDriver_func); return ret; } GLAPI const char * APIENTRY EXT_FUNC(glXGetDriverConfig) (const char *drivername) { static const char* ret = NULL; CHECK_PROC_WITH_RET(glXGetDriverConfig); long args[] = { POINTER_TO_ARG(drivername) }; if (ret) free((void*)ret); do_opengl_call(glXGetDriverConfig_func, &ret, args, NULL); ret = strdup(ret); return ret; } /* For googleearth */ static int counterSync = 0; GLAPI int APIENTRY EXT_FUNC(glXWaitVideoSyncSGI) ( int divisor, int remainder, unsigned int *count ) { CHECK_PROC_WITH_RET(glXWaitVideoSyncSGI); //log_gl("glXWaitVideoSyncSGI %d %d\n", divisor, remainder); *count = counterSync++; // FIXME ? return 0; } GLAPI int APIENTRY EXT_FUNC(glXGetVideoSyncSGI)( unsigned int *count ) { CHECK_PROC_WITH_RET(glXGetVideoSyncSGI); //log_gl("glXGetVideoSyncSGI\n"); *count = counterSync++; // FIXME ? return 0; } GLAPI int APIENTRY EXT_FUNC(glXSwapIntervalSGI) ( int interval ) { CHECK_PROC_WITH_RET(glXSwapIntervalSGI); long args[] = { INT_TO_ARG(interval) }; int ret = 0; do_opengl_call(glXSwapIntervalSGI_func, &ret, args, NULL); //log_gl("glXSwapIntervalSGI(%d) = %d\n", interval, ret); return ret; } static unsigned int str_hash (const void* v) { /* 31 bit hash function */ const signed char *p = v; unsigned int h = *p; if (h) for (p += 1; *p != '\0'; p++) h = (h << 5) - h + *p; return h; } static const char* global_glXGetProcAddress_request = { "glAccum\0" "glActiveStencilFaceEXT\0" "glActiveTexture\0" "glActiveTextureARB\0" "glActiveVaryingNV\0" "glAddSwapHintRectWIN\0" "glAlphaFragmentOp1ATI\0" "glAlphaFragmentOp2ATI\0" "glAlphaFragmentOp3ATI\0" "glAlphaFunc\0" "glApplyTextureEXT\0" "glAreProgramsResidentNV\0" "glAreTexturesResident\0" "glAreTexturesResidentEXT\0" "glArrayElement\0" "glArrayElementEXT\0" "glArrayObjectATI\0" "glAsyncMarkerSGIX\0" "glAttachObjectARB\0" "glAttachShader\0" "glBegin\0" "glBeginConditionalRenderNVX\0" "glBeginDefineVisibilityQueryATI\0" "glBeginFragmentShaderATI\0" "glBeginOcclusionQuery\0" "glBeginOcclusionQueryNV\0" "glBeginQuery\0" "glBeginQueryARB\0" "glBeginSceneEXT\0" "glBeginTransformFeedbackNV\0" "glBeginUseVisibilityQueryATI\0" "glBeginVertexShaderEXT\0" "glBindArraySetARB\0" "glBindAttribLocation\0" "glBindAttribLocationARB\0" "glBindBuffer\0" "glBindBufferARB\0" "glBindBufferBaseNV\0" "glBindBufferOffsetNV\0" "glBindBufferRangeNV\0" "glBindFragDataLocationEXT\0" "glBindFragmentShaderATI\0" "glBindFramebufferEXT\0" "glBindLightParameterEXT\0" "glBindMaterialParameterEXT\0" "glBindParameterEXT\0" "glBindProgramARB\0" "glBindProgramNV\0" "glBindRenderbufferEXT\0" "glBindTexGenParameterEXT\0" "glBindTexture\0" "glBindTextureEXT\0" "glBindTextureUnitParameterEXT\0" "glBindVertexArrayAPPLE\0" "glBindVertexShaderEXT\0" "glBinormal3bEXT\0" "glBinormal3bvEXT\0" "glBinormal3dEXT\0" "glBinormal3dvEXT\0" "glBinormal3fEXT\0" "glBinormal3fvEXT\0" "glBinormal3iEXT\0" "glBinormal3ivEXT\0" "glBinormal3sEXT\0" "glBinormal3svEXT\0" "glBinormalArrayEXT\0" "glBitmap\0" "glBlendColor\0" "glBlendColorEXT\0" "glBlendEquation\0" "glBlendEquationEXT\0" "glBlendEquationSeparate\0" "glBlendEquationSeparateATI\0" "glBlendEquationSeparateEXT\0" "glBlendFunc\0" "glBlendFuncSeparate\0" "glBlendFuncSeparateEXT\0" "glBlendFuncSeparateINGR\0" "glBlitFramebufferEXT\0" "glBufferData\0" "glBufferDataARB\0" "glBufferParameteriAPPLE\0" "glBufferRegionEnabled\0" "glBufferRegionEnabledEXT\0" "glBufferSubData\0" "glBufferSubDataARB\0" "glCallList\0" "glCallLists\0" "glCheckFramebufferStatusEXT\0" "glClampColorARB\0" "glClear\0" "glClearAccum\0" "glClearColor\0" "glClearColorIiEXT\0" "glClearColorIuiEXT\0" "glClearDepth\0" "glClearDepthdNV\0" "glClearIndex\0" "glClearStencil\0" "glClientActiveTexture\0" "glClientActiveTextureARB\0" "glClientActiveVertexStreamATI\0" "glClipPlane\0" "glColor3b\0" "glColor3bv\0" "glColor3d\0" "glColor3dv\0" "glColor3f\0" "glColor3fv\0" "glColor3fVertex3fSUN\0" "glColor3fVertex3fvSUN\0" "glColor3hNV\0" "glColor3hvNV\0" "glColor3i\0" "glColor3iv\0" "glColor3s\0" "glColor3sv\0" "glColor3ub\0" "glColor3ubv\0" "glColor3ui\0" "glColor3uiv\0" "glColor3us\0" "glColor3usv\0" "glColor4b\0" "glColor4bv\0" "glColor4d\0" "glColor4dv\0" "glColor4f\0" "glColor4fNormal3fVertex3fSUN\0" "glColor4fNormal3fVertex3fvSUN\0" "glColor4fv\0" "glColor4hNV\0" "glColor4hvNV\0" "glColor4i\0" "glColor4iv\0" "glColor4s\0" "glColor4sv\0" "glColor4ub\0" "glColor4ubv\0" "glColor4ubVertex2fSUN\0" "glColor4ubVertex2fvSUN\0" "glColor4ubVertex3fSUN\0" "glColor4ubVertex3fvSUN\0" "glColor4ui\0" "glColor4uiv\0" "glColor4us\0" "glColor4usv\0" "glColorFragmentOp1ATI\0" "glColorFragmentOp2ATI\0" "glColorFragmentOp3ATI\0" "glColorMask\0" "glColorMaskIndexedEXT\0" "glColorMaterial\0" "glColorPointer\0" "glColorPointerEXT\0" "glColorPointerListIBM\0" "glColorPointervINTEL\0" "glColorSubTable\0" "glColorSubTableEXT\0" "glColorTable\0" "glColorTableEXT\0" "glColorTableParameterfv\0" "glColorTableParameterfvSGI\0" "glColorTableParameteriv\0" "glColorTableParameterivSGI\0" "glColorTableSGI\0" "glCombinerInputNV\0" "glCombinerOutputNV\0" "glCombinerParameterfNV\0" "glCombinerParameterfvNV\0" "glCombinerParameteriNV\0" "glCombinerParameterivNV\0" "glCombinerStageParameterfvNV\0" "glCompileShader\0" "glCompileShaderARB\0" "glCompressedTexImage1D\0" "glCompressedTexImage1DARB\0" "glCompressedTexImage2D\0" "glCompressedTexImage2DARB\0" "glCompressedTexImage3D\0" "glCompressedTexImage3DARB\0" "glCompressedTexSubImage1D\0" "glCompressedTexSubImage1DARB\0" "glCompressedTexSubImage2D\0" "glCompressedTexSubImage2DARB\0" "glCompressedTexSubImage3D\0" "glCompressedTexSubImage3DARB\0" "glConvolutionFilter1D\0" "glConvolutionFilter1DEXT\0" "glConvolutionFilter2D\0" "glConvolutionFilter2DEXT\0" "glConvolutionParameterf\0" "glConvolutionParameterfEXT\0" "glConvolutionParameterfv\0" "glConvolutionParameterfvEXT\0" "glConvolutionParameteri\0" "glConvolutionParameteriEXT\0" "glConvolutionParameteriv\0" "glConvolutionParameterivEXT\0" "glCopyColorSubTable\0" "glCopyColorSubTableEXT\0" "glCopyColorTable\0" "glCopyColorTableSGI\0" "glCopyConvolutionFilter1D\0" "glCopyConvolutionFilter1DEXT\0" "glCopyConvolutionFilter2D\0" "glCopyConvolutionFilter2DEXT\0" "glCopyPixels\0" "glCopyTexImage1D\0" "glCopyTexImage1DEXT\0" "glCopyTexImage2D\0" "glCopyTexImage2DEXT\0" "glCopyTexSubImage1D\0" "glCopyTexSubImage1DEXT\0" "glCopyTexSubImage2D\0" "glCopyTexSubImage2DEXT\0" "glCopyTexSubImage3D\0" "glCopyTexSubImage3DEXT\0" "glCreateProgram\0" "glCreateProgramObjectARB\0" "glCreateShader\0" "glCreateShaderObjectARB\0" "glCullFace\0" "glCullParameterdvEXT\0" "glCullParameterfvEXT\0" "glCurrentPaletteMatrixARB\0" "glDeformationMap3dSGIX\0" "glDeformationMap3fSGIX\0" "glDeformSGIX\0" "glDeleteArraySetsARB\0" "glDeleteAsyncMarkersSGIX\0" "glDeleteBufferRegion\0" "glDeleteBufferRegionEXT\0" "glDeleteBuffers\0" "glDeleteBuffersARB\0" "glDeleteFencesAPPLE\0" "glDeleteFencesNV\0" "glDeleteFragmentShaderATI\0" "glDeleteFramebuffersEXT\0" "glDeleteLists\0" "glDeleteObjectARB\0" "glDeleteObjectBufferATI\0" "glDeleteOcclusionQueries\0" "glDeleteOcclusionQueriesNV\0" "glDeleteProgram\0" "glDeleteProgramsARB\0" "glDeleteProgramsNV\0" "glDeleteQueries\0" "glDeleteQueriesARB\0" "glDeleteRenderbuffersEXT\0" "glDeleteShader\0" "glDeleteTextures\0" "glDeleteTexturesEXT\0" "glDeleteVertexArraysAPPLE\0" "glDeleteVertexShaderEXT\0" "glDeleteVisibilityQueriesATI\0" "glDepthBoundsdNV\0" "glDepthBoundsEXT\0" "glDepthFunc\0" "glDepthMask\0" "glDepthRange\0" "glDepthRangedNV\0" "glDetachObjectARB\0" "glDetachShader\0" "glDetailTexFuncSGIS\0" "glDisable\0" "glDisableClientState\0" "glDisableIndexedEXT\0" "glDisableVariantClientStateEXT\0" "glDisableVertexAttribAPPLE\0" "glDisableVertexAttribArray\0" "glDisableVertexAttribArrayARB\0" "glDrawArrays\0" "glDrawArraysEXT\0" "glDrawArraysInstancedEXT\0" "glDrawBuffer\0" "glDrawBufferRegion\0" "glDrawBufferRegionEXT\0" "glDrawBuffers\0" "glDrawBuffersARB\0" "glDrawBuffersATI\0" "glDrawElementArrayAPPLE\0" "glDrawElementArrayATI\0" "glDrawElements\0" "glDrawElementsFGL\0" "glDrawElementsInstancedEXT\0" "glDrawMeshArraysSUN\0" "glDrawMeshNV\0" "glDrawPixels\0" "glDrawRangeElementArrayAPPLE\0" "glDrawRangeElementArrayATI\0" "glDrawRangeElements\0" "glDrawRangeElementsEXT\0" "glDrawWireTrianglesFGL\0" "glEdgeFlag\0" "glEdgeFlagPointer\0" "glEdgeFlagPointerEXT\0" "glEdgeFlagPointerListIBM\0" "glEdgeFlagv\0" "glElementPointerAPPLE\0" "glElementPointerATI\0" "glEnable\0" "glEnableClientState\0" "glEnableIndexedEXT\0" "glEnableVariantClientStateEXT\0" "glEnableVertexAttribAPPLE\0" "glEnableVertexAttribArray\0" "glEnableVertexAttribArrayARB\0" "glEnd\0" "glEndConditionalRenderNVX\0" "glEndDefineVisibilityQueryATI\0" "glEndFragmentShaderATI\0" "glEndList\0" "glEndOcclusionQuery\0" "glEndOcclusionQueryNV\0" "glEndQuery\0" "glEndQueryARB\0" "glEndSceneEXT\0" "glEndTransformFeedbackNV\0" "glEndUseVisibilityQueryATI\0" "glEndVertexShaderEXT\0" "glEvalCoord1d\0" "glEvalCoord1dv\0" "glEvalCoord1f\0" "glEvalCoord1fv\0" "glEvalCoord2d\0" "glEvalCoord2dv\0" "glEvalCoord2f\0" "glEvalCoord2fv\0" "glEvalMapsNV\0" "glEvalMesh1\0" "glEvalMesh2\0" "glEvalPoint1\0" "glEvalPoint2\0" "glExecuteProgramNV\0" "glExtractComponentEXT\0" "glFeedbackBuffer\0" "glFinalCombinerInputNV\0" "glFinish\0" "glFinishAsyncSGIX\0" "glFinishFenceAPPLE\0" "glFinishFenceNV\0" "glFinishObjectAPPLE\0" "glFinishRenderAPPLE\0" "glFinishTextureSUNX\0" "glFlush\0" "glFlushMappedBufferRangeAPPLE\0" "glFlushPixelDataRangeNV\0" "glFlushRasterSGIX\0" "glFlushRenderAPPLE\0" "glFlushVertexArrayRangeAPPLE\0" "glFlushVertexArrayRangeNV\0" "glFogCoordd\0" "glFogCoorddEXT\0" "glFogCoorddv\0" "glFogCoorddvEXT\0" "glFogCoordf\0" "glFogCoordfEXT\0" "glFogCoordfv\0" "glFogCoordfvEXT\0" "glFogCoordhNV\0" "glFogCoordhvNV\0" "glFogCoordPointer\0" "glFogCoordPointerEXT\0" "glFogCoordPointerListIBM\0" "glFogf\0" "glFogFuncSGIS\0" "glFogfv\0" "glFogi\0" "glFogiv\0" "glFragmentColorMaterialEXT\0" "glFragmentColorMaterialSGIX\0" "glFragmentLightfEXT\0" "glFragmentLightfSGIX\0" "glFragmentLightfvEXT\0" "glFragmentLightfvSGIX\0" "glFragmentLightiEXT\0" "glFragmentLightiSGIX\0" "glFragmentLightivEXT\0" "glFragmentLightivSGIX\0" "glFragmentLightModelfEXT\0" "glFragmentLightModelfSGIX\0" "glFragmentLightModelfvEXT\0" "glFragmentLightModelfvSGIX\0" "glFragmentLightModeliEXT\0" "glFragmentLightModeliSGIX\0" "glFragmentLightModelivEXT\0" "glFragmentLightModelivSGIX\0" "glFragmentMaterialfEXT\0" "glFragmentMaterialfSGIX\0" "glFragmentMaterialfvEXT\0" "glFragmentMaterialfvSGIX\0" "glFragmentMaterialiEXT\0" "glFragmentMaterialiSGIX\0" "glFragmentMaterialivEXT\0" "glFragmentMaterialivSGIX\0" "glFramebufferRenderbufferEXT\0" "glFramebufferTexture1DEXT\0" "glFramebufferTexture2DEXT\0" "glFramebufferTexture2D\0" "glFramebufferTexture3DEXT\0" "glFramebufferTextureEXT\0" "glFramebufferTextureFaceEXT\0" "glFramebufferTextureLayerEXT\0" "glFrameZoomSGIX\0" "glFreeObjectBufferATI\0" "glFrontFace\0" "glFrustum\0" "glGenArraySetsARB\0" "glGenAsyncMarkersSGIX\0" "glGenBuffers\0" "glGenBuffersARB\0" "glGenerateMipmapEXT\0" "glGenFencesAPPLE\0" "glGenFencesNV\0" "glGenFragmentShadersATI\0" "glGenFramebuffersEXT\0" "glGenLists\0" "glGenOcclusionQueries\0" "glGenOcclusionQueriesNV\0" "glGenProgramsARB\0" "glGenProgramsNV\0" "glGenQueries\0" "glGenQueriesARB\0" "glGenRenderbuffersEXT\0" "glGenSymbolsEXT\0" "glGenTextures\0" "glGenTexturesEXT\0" "glGenVertexArraysAPPLE\0" "glGenVertexShadersEXT\0" "glGenVisibilityQueriesATI\0" "glGetActiveAttrib\0" "glGetActiveAttribARB\0" "glGetActiveUniform\0" "glGetActiveUniformARB\0" "glGetActiveVaryingNV\0" "glGetArrayObjectfvATI\0" "glGetArrayObjectivATI\0" "glGetAttachedObjectsARB\0" "glGetAttachedShaders\0" "glGetAttribLocation\0" "glGetAttribLocationARB\0" "glGetBooleanIndexedvEXT\0" "glGetBooleanv\0" "glGetBufferParameteriv\0" "glGetBufferParameterivARB\0" "glGetBufferPointerv\0" "glGetBufferPointervARB\0" "glGetBufferSubData\0" "glGetBufferSubDataARB\0" "glGetClipPlane\0" "glGetColorTable\0" "glGetColorTableEXT\0" "glGetColorTableParameterfv\0" "glGetColorTableParameterfvEXT\0" "glGetColorTableParameterfvSGI\0" "glGetColorTableParameteriv\0" "glGetColorTableParameterivEXT\0" "glGetColorTableParameterivSGI\0" "glGetColorTableSGI\0" "glGetCombinerInputParameterfvNV\0" "glGetCombinerInputParameterivNV\0" "glGetCombinerOutputParameterfvNV\0" "glGetCombinerOutputParameterivNV\0" "glGetCombinerStageParameterfvNV\0" "glGetCompressedTexImage\0" "glGetCompressedTexImageARB\0" "glGetConvolutionFilter\0" "glGetConvolutionFilterEXT\0" "glGetConvolutionParameterfv\0" "glGetConvolutionParameterfvEXT\0" "glGetConvolutionParameteriv\0" "glGetConvolutionParameterivEXT\0" "glGetDetailTexFuncSGIS\0" "glGetDoublev\0" "glGetError\0" "glGetFenceivNV\0" "glGetFinalCombinerInputParameterfvNV\0" "glGetFinalCombinerInputParameterivNV\0" "glGetFloatv\0" "glGetFogFuncSGIS\0" "glGetFragDataLocationEXT\0" "glGetFragmentLightfvEXT\0" "glGetFragmentLightfvSGIX\0" "glGetFragmentLightivEXT\0" "glGetFragmentLightivSGIX\0" "glGetFragmentMaterialfvEXT\0" "glGetFragmentMaterialfvSGIX\0" "glGetFragmentMaterialivEXT\0" "glGetFragmentMaterialivSGIX\0" "glGetFramebufferAttachmentParameterivEXT\0" "glGetHandleARB\0" "glGetHistogram\0" "glGetHistogramEXT\0" "glGetHistogramParameterfv\0" "glGetHistogramParameterfvEXT\0" "glGetHistogramParameteriv\0" "glGetHistogramParameterivEXT\0" "glGetImageTransformParameterfvHP\0" "glGetImageTransformParameterivHP\0" "glGetInfoLogARB\0" "glGetInstrumentsSGIX\0" "glGetIntegerIndexedvEXT\0" "glGetIntegerv\0" "glGetInvariantBooleanvEXT\0" "glGetInvariantFloatvEXT\0" "glGetInvariantIntegervEXT\0" "glGetLightfv\0" "glGetLightiv\0" "glGetListParameterfvSGIX\0" "glGetListParameterivSGIX\0" "glGetLocalConstantBooleanvEXT\0" "glGetLocalConstantFloatvEXT\0" "glGetLocalConstantIntegervEXT\0" "glGetMapAttribParameterfvNV\0" "glGetMapAttribParameterivNV\0" "glGetMapControlPointsNV\0" "glGetMapdv\0" "glGetMapfv\0" "glGetMapiv\0" "glGetMapParameterfvNV\0" "glGetMapParameterivNV\0" "glGetMaterialfv\0" "glGetMaterialiv\0" "glGetMinmax\0" "glGetMinmaxEXT\0" "glGetMinmaxParameterfv\0" "glGetMinmaxParameterfvEXT\0" "glGetMinmaxParameteriv\0" "glGetMinmaxParameterivEXT\0" "glGetObjectBufferfvATI\0" "glGetObjectBufferivATI\0" "glGetObjectParameterfvARB\0" "glGetObjectParameterivARB\0" "glGetOcclusionQueryiv\0" "glGetOcclusionQueryivNV\0" "glGetOcclusionQueryuiv\0" "glGetOcclusionQueryuivNV\0" "glGetPixelMapfv\0" "glGetPixelMapuiv\0" "glGetPixelMapusv\0" "glGetPixelTexGenParameterfvSGIS\0" "glGetPixelTexGenParameterivSGIS\0" "glGetPixelTransformParameterfvEXT\0" "glGetPixelTransformParameterivEXT\0" "glGetPointerv\0" "glGetPointervEXT\0" "glGetPolygonStipple\0" "glGetProgramEnvParameterdvARB\0" "glGetProgramEnvParameterfvARB\0" "glGetProgramEnvParameterIivNV\0" "glGetProgramEnvParameterIuivNV\0" "glGetProgramInfoLog\0" "glGetProgramiv\0" "glGetProgramivARB\0" "glGetProgramivNV\0" "glGetProgramLocalParameterdvARB\0" "glGetProgramLocalParameterfvARB\0" "glGetProgramLocalParameterIivNV\0" "glGetProgramLocalParameterIuivNV\0" "glGetProgramNamedParameterdvNV\0" "glGetProgramNamedParameterfvNV\0" "glGetProgramParameterdvNV\0" "glGetProgramParameterfvNV\0" "glGetProgramRegisterfvMESA\0" "glGetProgramStringARB\0" "glGetProgramStringNV\0" "glGetQueryiv\0" "glGetQueryivARB\0" "glGetQueryObjecti64vEXT\0" "glGetQueryObjectiv\0" "glGetQueryObjectivARB\0" "glGetQueryObjectui64vEXT\0" "glGetQueryObjectuiv\0" "glGetQueryObjectuivARB\0" "glGetRenderbufferParameterivEXT\0" "glGetSeparableFilter\0" "glGetSeparableFilterEXT\0" "glGetShaderInfoLog\0" "glGetShaderiv\0" "glGetShaderSource\0" "glGetShaderSourceARB\0" "glGetSharpenTexFuncSGIS\0" "glGetString\0" "glGetTexBumpParameterfvATI\0" "glGetTexBumpParameterivATI\0" "glGetTexEnvfv\0" "glGetTexEnviv\0" "glGetTexFilterFuncSGIS\0" "glGetTexGendv\0" "glGetTexGenfv\0" "glGetTexGeniv\0" "glGetTexImage\0" "glGetTexLevelParameterfv\0" "glGetTexLevelParameteriv\0" "glGetTexParameterfv\0" "glGetTexParameterIivEXT\0" "glGetTexParameterIuivEXT\0" "glGetTexParameteriv\0" "glGetTexParameterPointervAPPLE\0" "glGetTrackMatrixivNV\0" "glGetTransformFeedbackVaryingNV\0" "glGetUniformBufferSizeEXT\0" "glGetUniformfv\0" "glGetUniformfvARB\0" "glGetUniformiv\0" "glGetUniformivARB\0" "glGetUniformLocation\0" "glGetUniformLocationARB\0" "glGetUniformOffsetEXT\0" "glGetUniformuivEXT\0" "glGetVariantArrayObjectfvATI\0" "glGetVariantArrayObjectivATI\0" "glGetVariantBooleanvEXT\0" "glGetVariantFloatvEXT\0" "glGetVariantIntegervEXT\0" "glGetVariantPointervEXT\0" "glGetVaryingLocationNV\0" "glGetVertexAttribArrayObjectfvATI\0" "glGetVertexAttribArrayObjectivATI\0" "glGetVertexAttribdv\0" "glGetVertexAttribdvARB\0" "glGetVertexAttribdvNV\0" "glGetVertexAttribfv\0" "glGetVertexAttribfvARB\0" "glGetVertexAttribfvNV\0" "glGetVertexAttribIivEXT\0" "glGetVertexAttribIuivEXT\0" "glGetVertexAttribiv\0" "glGetVertexAttribivARB\0" "glGetVertexAttribivNV\0" "glGetVertexAttribPointerv\0" "glGetVertexAttribPointervARB\0" "glGetVertexAttribPointervNV\0" "glGlobalAlphaFactorbSUN\0" "glGlobalAlphaFactordSUN\0" "glGlobalAlphaFactorfSUN\0" "glGlobalAlphaFactoriSUN\0" "glGlobalAlphaFactorsSUN\0" "glGlobalAlphaFactorubSUN\0" "glGlobalAlphaFactoruiSUN\0" "glGlobalAlphaFactorusSUN\0" "glHint\0" "glHintPGI\0" "glHistogram\0" "glHistogramEXT\0" "glIglooInterfaceSGIX\0" "glImageTransformParameterfHP\0" "glImageTransformParameterfvHP\0" "glImageTransformParameteriHP\0" "glImageTransformParameterivHP\0" "glIndexd\0" "glIndexdv\0" "glIndexf\0" "glIndexFuncEXT\0" "glIndexfv\0" "glIndexi\0" "glIndexiv\0" "glIndexMask\0" "glIndexMaterialEXT\0" "glIndexPointer\0" "glIndexPointerEXT\0" "glIndexPointerListIBM\0" "glIndexs\0" "glIndexsv\0" "glIndexub\0" "glIndexubv\0" "glInitNames\0" "glInsertComponentEXT\0" "glInstrumentsBufferSGIX\0" "glInterleavedArrays\0" "glIsArraySetARB\0" "glIsAsyncMarkerSGIX\0" "glIsBuffer\0" "glIsBufferARB\0" "glIsEnabled\0" "glIsEnabledIndexedEXT\0" "glIsFenceAPPLE\0" "glIsFenceNV\0" "glIsFramebufferEXT\0" "glIsList\0" "glIsObjectBufferATI\0" "glIsOcclusionQuery\0" "_glIsOcclusionQueryNV\0" "glIsOcclusionQueryNV\0" "glIsProgram\0" "glIsProgramARB\0" "glIsProgramNV\0" "glIsQuery\0" "glIsQueryARB\0" "glIsRenderbufferEXT\0" "glIsShader\0" "glIsTexture\0" "glIsTextureEXT\0" "glIsVariantEnabledEXT\0" "glIsVertexArrayAPPLE\0" "glIsVertexAttribEnabledAPPLE\0" "glLightEnviEXT\0" "glLightEnviSGIX\0" "glLightf\0" "glLightfv\0" "glLighti\0" "glLightiv\0" "glLightModelf\0" "glLightModelfv\0" "glLightModeli\0" "glLightModeliv\0" "glLineStipple\0" "glLineWidth\0" "glLinkProgram\0" "glLinkProgramARB\0" "glListBase\0" "glListParameterfSGIX\0" "glListParameterfvSGIX\0" "glListParameteriSGIX\0" "glListParameterivSGIX\0" "glLoadIdentity\0" "glLoadIdentityDeformationMapSGIX\0" "glLoadMatrixd\0" "glLoadMatrixf\0" "glLoadName\0" "glLoadProgramNV\0" "glLoadTransposeMatrixd\0" "glLoadTransposeMatrixdARB\0" "glLoadTransposeMatrixf\0" "glLoadTransposeMatrixfARB\0" "glLockArraysEXT\0" "glLogicOp\0" "glMap1d\0" "glMap1f\0" "glMap2d\0" "glMap2f\0" "glMapBuffer\0" "glMapBufferARB\0" "glMapControlPointsNV\0" "glMapGrid1d\0" "glMapGrid1f\0" "glMapGrid2d\0" "glMapGrid2f\0" "glMapObjectBufferATI\0" "glMapParameterfvNV\0" "glMapParameterivNV\0" "glMapTexture3DATI\0" "glMapVertexAttrib1dAPPLE\0" "glMapVertexAttrib1fAPPLE\0" "glMapVertexAttrib2dAPPLE\0" "glMapVertexAttrib2fAPPLE\0" "glMaterialf\0" "glMaterialfv\0" "glMateriali\0" "glMaterialiv\0" "glMatrixIndexPointerARB\0" "glMatrixIndexubvARB\0" "glMatrixIndexuivARB\0" "glMatrixIndexusvARB\0" "glMatrixMode\0" "glMinmax\0" "glMinmaxEXT\0" "glMultiDrawArrays\0" "glMultiDrawArraysEXT\0" "glMultiDrawElementArrayAPPLE\0" "glMultiDrawElements\0" "glMultiDrawElementsEXT\0" "glMultiDrawRangeElementArrayAPPLE\0" "glMultiModeDrawArraysIBM\0" "glMultiModeDrawElementsIBM\0" "glMultiTexCoord1d\0" "glMultiTexCoord1dARB\0" "glMultiTexCoord1dSGIS\0" "glMultiTexCoord1dv\0" "glMultiTexCoord1dvARB\0" "glMultiTexCoord1dvSGIS\0" "glMultiTexCoord1f\0" "glMultiTexCoord1fARB\0" "glMultiTexCoord1fSGIS\0" "glMultiTexCoord1fv\0" "glMultiTexCoord1fvARB\0" "glMultiTexCoord1fvSGIS\0" "glMultiTexCoord1hNV\0" "glMultiTexCoord1hvNV\0" "glMultiTexCoord1i\0" "glMultiTexCoord1iARB\0" "glMultiTexCoord1iSGIS\0" "glMultiTexCoord1iv\0" "glMultiTexCoord1ivARB\0" "glMultiTexCoord1ivSGIS\0" "glMultiTexCoord1s\0" "glMultiTexCoord1sARB\0" "glMultiTexCoord1sSGIS\0" "glMultiTexCoord1sv\0" "glMultiTexCoord1svARB\0" "glMultiTexCoord1svSGIS\0" "glMultiTexCoord2d\0" "glMultiTexCoord2dARB\0" "glMultiTexCoord2dSGIS\0" "glMultiTexCoord2dv\0" "glMultiTexCoord2dvARB\0" "glMultiTexCoord2dvSGIS\0" "glMultiTexCoord2f\0" "glMultiTexCoord2fARB\0" "glMultiTexCoord2fSGIS\0" "glMultiTexCoord2fv\0" "glMultiTexCoord2fvARB\0" "glMultiTexCoord2fvSGIS\0" "glMultiTexCoord2hNV\0" "glMultiTexCoord2hvNV\0" "glMultiTexCoord2i\0" "glMultiTexCoord2iARB\0" "glMultiTexCoord2iSGIS\0" "glMultiTexCoord2iv\0" "glMultiTexCoord2ivARB\0" "glMultiTexCoord2ivSGIS\0" "glMultiTexCoord2s\0" "glMultiTexCoord2sARB\0" "glMultiTexCoord2sSGIS\0" "glMultiTexCoord2sv\0" "glMultiTexCoord2svARB\0" "glMultiTexCoord2svSGIS\0" "glMultiTexCoord3d\0" "glMultiTexCoord3dARB\0" "glMultiTexCoord3dSGIS\0" "glMultiTexCoord3dv\0" "glMultiTexCoord3dvARB\0" "glMultiTexCoord3dvSGIS\0" "glMultiTexCoord3f\0" "glMultiTexCoord3fARB\0" "glMultiTexCoord3fSGIS\0" "glMultiTexCoord3fv\0" "glMultiTexCoord3fvARB\0" "glMultiTexCoord3fvSGIS\0" "glMultiTexCoord3hNV\0" "glMultiTexCoord3hvNV\0" "glMultiTexCoord3i\0" "glMultiTexCoord3iARB\0" "glMultiTexCoord3iSGIS\0" "glMultiTexCoord3iv\0" "glMultiTexCoord3ivARB\0" "glMultiTexCoord3ivSGIS\0" "glMultiTexCoord3s\0" "glMultiTexCoord3sARB\0" "glMultiTexCoord3sSGIS\0" "glMultiTexCoord3sv\0" "glMultiTexCoord3svARB\0" "glMultiTexCoord3svSGIS\0" "glMultiTexCoord4d\0" "glMultiTexCoord4dARB\0" "glMultiTexCoord4dSGIS\0" "glMultiTexCoord4dv\0" "glMultiTexCoord4dvARB\0" "glMultiTexCoord4dvSGIS\0" "glMultiTexCoord4f\0" "glMultiTexCoord4fARB\0" "glMultiTexCoord4fSGIS\0" "glMultiTexCoord4fv\0" "glMultiTexCoord4fvARB\0" "glMultiTexCoord4fvSGIS\0" "glMultiTexCoord4hNV\0" "glMultiTexCoord4hvNV\0" "glMultiTexCoord4i\0" "glMultiTexCoord4iARB\0" "glMultiTexCoord4iSGIS\0" "glMultiTexCoord4iv\0" "glMultiTexCoord4ivARB\0" "glMultiTexCoord4ivSGIS\0" "glMultiTexCoord4s\0" "glMultiTexCoord4sARB\0" "glMultiTexCoord4sSGIS\0" "glMultiTexCoord4sv\0" "glMultiTexCoord4svARB\0" "glMultiTexCoord4svSGIS\0" "glMultiTexCoordPointerSGIS\0" "glMultMatrixd\0" "glMultMatrixf\0" "glMultTransposeMatrixd\0" "glMultTransposeMatrixdARB\0" "glMultTransposeMatrixf\0" "glMultTransposeMatrixfARB\0" "glNewBufferRegion\0" "glNewBufferRegionEXT\0" "glNewList\0" "glNewObjectBufferATI\0" "glNormal3b\0" "glNormal3bv\0" "glNormal3d\0" "glNormal3dv\0" "glNormal3f\0" "glNormal3fv\0" "glNormal3fVertex3fSUN\0" "glNormal3fVertex3fvSUN\0" "glNormal3hNV\0" "glNormal3hvNV\0" "glNormal3i\0" "glNormal3iv\0" "glNormal3s\0" "glNormal3sv\0" "glNormalPointer\0" "glNormalPointerEXT\0" "glNormalPointerListIBM\0" "glNormalPointervINTEL\0" "glNormalStream3bATI\0" "glNormalStream3bvATI\0" "glNormalStream3dATI\0" "glNormalStream3dvATI\0" "glNormalStream3fATI\0" "glNormalStream3fvATI\0" "glNormalStream3iATI\0" "glNormalStream3ivATI\0" "glNormalStream3sATI\0" "glNormalStream3svATI\0" "glOrtho\0" "glPassTexCoordATI\0" "glPassThrough\0" "glPixelDataRangeNV\0" "glPixelMapfv\0" "glPixelMapuiv\0" "glPixelMapusv\0" "glPixelStoref\0" "glPixelStorei\0" "glPixelTexGenParameterfSGIS\0" "glPixelTexGenParameterfvSGIS\0" "glPixelTexGenParameteriSGIS\0" "glPixelTexGenParameterivSGIS\0" "glPixelTexGenSGIX\0" "glPixelTransferf\0" "glPixelTransferi\0" "glPixelTransformParameterfEXT\0" "glPixelTransformParameterfvEXT\0" "glPixelTransformParameteriEXT\0" "glPixelTransformParameterivEXT\0" "glPixelZoom\0" "glPNTrianglesfATI\0" "glPNTrianglesiATI\0" "glPointParameterf\0" "glPointParameterfARB\0" "glPointParameterfEXT\0" "glPointParameterfSGIS\0" "glPointParameterfv\0" "glPointParameterfvARB\0" "glPointParameterfvEXT\0" "glPointParameterfvSGIS\0" "glPointParameteri\0" "glPointParameteriEXT\0" "glPointParameteriNV\0" "glPointParameteriv\0" "glPointParameterivEXT\0" "glPointParameterivNV\0" "glPointSize\0" "glPollAsyncSGIX\0" "glPollInstrumentsSGIX\0" "glPolygonMode\0" "glPolygonOffset\0" "glPolygonOffsetEXT\0" "glPolygonStipple\0" "glPopAttrib\0" "glPopClientAttrib\0" "glPopMatrix\0" "glPopName\0" "glPrimitiveRestartIndexNV\0" "glPrimitiveRestartNV\0" "glPrioritizeTextures\0" "glPrioritizeTexturesEXT\0" "glProgramBufferParametersfvNV\0" "glProgramBufferParametersIivNV\0" "glProgramBufferParametersIuivNV\0" "glProgramCallbackMESA\0" "glProgramEnvParameter4dARB\0" "glProgramEnvParameter4dvARB\0" "glProgramEnvParameter4fARB\0" "glProgramEnvParameter4fvARB\0" "glProgramEnvParameterI4iNV\0" "glProgramEnvParameterI4ivNV\0" "glProgramEnvParameterI4uiNV\0" "glProgramEnvParameterI4uivNV\0" "glProgramEnvParameters4fvEXT\0" "glProgramEnvParametersI4ivNV\0" "glProgramEnvParametersI4uivNV\0" "glProgramLocalParameter4dARB\0" "glProgramLocalParameter4dvARB\0" "glProgramLocalParameter4fARB\0" "glProgramLocalParameter4fvARB\0" "glProgramLocalParameterI4iNV\0" "glProgramLocalParameterI4ivNV\0" "glProgramLocalParameterI4uiNV\0" "glProgramLocalParameterI4uivNV\0" "glProgramLocalParameters4fvEXT\0" "glProgramLocalParametersI4ivNV\0" "glProgramLocalParametersI4uivNV\0" "glProgramNamedParameter4dNV\0" "glProgramNamedParameter4dvNV\0" "glProgramNamedParameter4fNV\0" "glProgramNamedParameter4fvNV\0" "glProgramParameter4dNV\0" "glProgramParameter4dvNV\0" "glProgramParameter4fNV\0" "glProgramParameter4fvNV\0" "glProgramParameteriEXT\0" "glProgramParameters4dvNV\0" "glProgramParameters4fvNV\0" "glProgramStringARB\0" "glProgramVertexLimitNV\0" "glPushAttrib\0" "glPushClientAttrib\0" "glPushMatrix\0" "glPushName\0" "glRasterPos2d\0" "glRasterPos2dv\0" "glRasterPos2f\0" "glRasterPos2fv\0" "glRasterPos2i\0" "glRasterPos2iv\0" "glRasterPos2s\0" "glRasterPos2sv\0" "glRasterPos3d\0" "glRasterPos3dv\0" "glRasterPos3f\0" "glRasterPos3fv\0" "glRasterPos3i\0" "glRasterPos3iv\0" "glRasterPos3s\0" "glRasterPos3sv\0" "glRasterPos4d\0" "glRasterPos4dv\0" "glRasterPos4f\0" "glRasterPos4fv\0" "glRasterPos4i\0" "glRasterPos4iv\0" "glRasterPos4s\0" "glRasterPos4sv\0" "glReadBuffer\0" "glReadBufferRegion\0" "glReadBufferRegionEXT\0" "glReadInstrumentsSGIX\0" "glReadPixels\0" "glReadVideoPixelsSUN\0" "glRectd\0" "glRectdv\0" "glRectf\0" "glRectfv\0" "glRecti\0" "glRectiv\0" "glRects\0" "glRectsv\0" "glReferencePlaneSGIX\0" "glRenderbufferStorageEXT\0" "glRenderbufferStorageMultisampleCoverageNV\0" "glRenderbufferStorageMultisampleEXT\0" "glRenderMode\0" "glReplacementCodePointerSUN\0" "glReplacementCodeubSUN\0" "glReplacementCodeubvSUN\0" "glReplacementCodeuiColor3fVertex3fSUN\0" "glReplacementCodeuiColor3fVertex3fvSUN\0" "glReplacementCodeuiColor4fNormal3fVertex3fSUN\0" "glReplacementCodeuiColor4fNormal3fVertex3fvSUN\0" "glReplacementCodeuiColor4ubVertex3fSUN\0" "glReplacementCodeuiColor4ubVertex3fvSUN\0" "glReplacementCodeuiNormal3fVertex3fSUN\0" "glReplacementCodeuiNormal3fVertex3fvSUN\0" "glReplacementCodeuiSUN\0" "glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN\0" "glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN\0" "glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN\0" "glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN\0" "glReplacementCodeuiTexCoord2fVertex3fSUN\0" "glReplacementCodeuiTexCoord2fVertex3fvSUN\0" "glReplacementCodeuiVertex3fSUN\0" "glReplacementCodeuiVertex3fvSUN\0" "glReplacementCodeuivSUN\0" "glReplacementCodeusSUN\0" "glReplacementCodeusvSUN\0" "glRequestResidentProgramsNV\0" "glResetHistogram\0" "glResetHistogramEXT\0" "glResetMinmax\0" "glResetMinmaxEXT\0" "glResizeBuffersMESA\0" "glRotated\0" "glRotatef\0" "glSampleCoverage\0" "glSampleCoverageARB\0" "glSampleMapATI\0" "glSampleMaskEXT\0" "glSampleMaskSGIS\0" "glSamplePassARB\0" "glSamplePatternEXT\0" "glSamplePatternSGIS\0" "glScaled\0" "glScalef\0" "glScissor\0" "glSecondaryColor3b\0" "glSecondaryColor3bEXT\0" "glSecondaryColor3bv\0" "glSecondaryColor3bvEXT\0" "glSecondaryColor3d\0" "glSecondaryColor3dEXT\0" "glSecondaryColor3dv\0" "glSecondaryColor3dvEXT\0" "glSecondaryColor3f\0" "glSecondaryColor3fEXT\0" "glSecondaryColor3fv\0" "glSecondaryColor3fvEXT\0" "glSecondaryColor3hNV\0" "glSecondaryColor3hvNV\0" "glSecondaryColor3i\0" "glSecondaryColor3iEXT\0" "glSecondaryColor3iv\0" "glSecondaryColor3ivEXT\0" "glSecondaryColor3s\0" "glSecondaryColor3sEXT\0" "glSecondaryColor3sv\0" "glSecondaryColor3svEXT\0" "glSecondaryColor3ub\0" "glSecondaryColor3ubEXT\0" "glSecondaryColor3ubv\0" "glSecondaryColor3ubvEXT\0" "glSecondaryColor3ui\0" "glSecondaryColor3uiEXT\0" "glSecondaryColor3uiv\0" "glSecondaryColor3uivEXT\0" "glSecondaryColor3us\0" "glSecondaryColor3usEXT\0" "glSecondaryColor3usv\0" "glSecondaryColor3usvEXT\0" "glSecondaryColorPointer\0" "glSecondaryColorPointerEXT\0" "glSecondaryColorPointerListIBM\0" "glSelectBuffer\0" "glSelectTextureCoordSetSGIS\0" "glSelectTextureSGIS\0" "glSelectTextureTransformSGIS\0" "glSeparableFilter2D\0" "glSeparableFilter2DEXT\0" "glSetFenceAPPLE\0" "glSetFenceNV\0" "glSetFragmentShaderConstantATI\0" "glSetInvariantEXT\0" "glSetLocalConstantEXT\0" "glShadeModel\0" "glShaderOp1EXT\0" "glShaderOp2EXT\0" "glShaderOp3EXT\0" "glShaderSource\0" "glShaderSourceARB\0" "glSharpenTexFuncSGIS\0" "glSpriteParameterfSGIX\0" "glSpriteParameterfvSGIX\0" "glSpriteParameteriSGIX\0" "glSpriteParameterivSGIX\0" "glStartInstrumentsSGIX\0" "glStencilClearTagEXT\0" "glStencilFunc\0" "glStencilFuncSeparate\0" "glStencilFuncSeparateATI\0" "glStencilMask\0" "glStencilMaskSeparate\0" "glStencilOp\0" "glStencilOpSeparate\0" "glStencilOpSeparateATI\0" "glStopInstrumentsSGIX\0" "glStringMarkerGREMEDY\0" "glSwapAPPLE\0" "glSwizzleEXT\0" "glTagSampleBufferSGIX\0" "glTangent3bEXT\0" "glTangent3bvEXT\0" "glTangent3dEXT\0" "glTangent3dvEXT\0" "glTangent3fEXT\0" "glTangent3fvEXT\0" "glTangent3iEXT\0" "glTangent3ivEXT\0" "glTangent3sEXT\0" "glTangent3svEXT\0" "glTangentPointerEXT\0" "glTbufferMask3DFX\0" "glTestFenceAPPLE\0" "glTestFenceNV\0" "glTestObjectAPPLE\0" "glTexBufferEXT\0" "glTexBumpParameterfvATI\0" "glTexBumpParameterivATI\0" "glTexCoord1d\0" "glTexCoord1dv\0" "glTexCoord1f\0" "glTexCoord1fv\0" "glTexCoord1hNV\0" "glTexCoord1hvNV\0" "glTexCoord1i\0" "glTexCoord1iv\0" "glTexCoord1s\0" "glTexCoord1sv\0" "glTexCoord2d\0" "glTexCoord2dv\0" "glTexCoord2f\0" "glTexCoord2fColor3fVertex3fSUN\0" "glTexCoord2fColor3fVertex3fvSUN\0" "glTexCoord2fColor4fNormal3fVertex3fSUN\0" "glTexCoord2fColor4fNormal3fVertex3fvSUN\0" "glTexCoord2fColor4ubVertex3fSUN\0" "glTexCoord2fColor4ubVertex3fvSUN\0" "glTexCoord2fNormal3fVertex3fSUN\0" "glTexCoord2fNormal3fVertex3fvSUN\0" "glTexCoord2fv\0" "glTexCoord2fVertex3fSUN\0" "glTexCoord2fVertex3fvSUN\0" "glTexCoord2hNV\0" "glTexCoord2hvNV\0" "glTexCoord2i\0" "glTexCoord2iv\0" "glTexCoord2s\0" "glTexCoord2sv\0" "glTexCoord3d\0" "glTexCoord3dv\0" "glTexCoord3f\0" "glTexCoord3fv\0" "glTexCoord3hNV\0" "glTexCoord3hvNV\0" "glTexCoord3i\0" "glTexCoord3iv\0" "glTexCoord3s\0" "glTexCoord3sv\0" "glTexCoord4d\0" "glTexCoord4dv\0" "glTexCoord4f\0" "glTexCoord4fColor4fNormal3fVertex4fSUN\0" "glTexCoord4fColor4fNormal3fVertex4fvSUN\0" "glTexCoord4fv\0" "glTexCoord4fVertex4fSUN\0" "glTexCoord4fVertex4fvSUN\0" "glTexCoord4hNV\0" "glTexCoord4hvNV\0" "glTexCoord4i\0" "glTexCoord4iv\0" "glTexCoord4s\0" "glTexCoord4sv\0" "glTexCoordPointer\0" "glTexCoordPointerEXT\0" "glTexCoordPointerListIBM\0" "glTexCoordPointervINTEL\0" "glTexEnvf\0" "glTexEnvfv\0" "glTexEnvi\0" "glTexEnviv\0" "glTexFilterFuncSGIS\0" "glTexGend\0" "glTexGendv\0" "glTexGenf\0" "glTexGenfv\0" "glTexGeni\0" "glTexGeniv\0" "glTexImage1D\0" "glTexImage2D\0" "glTexImage3D\0" "glTexImage3DEXT\0" "glTexImage4DSGIS\0" "glTexParameterf\0" "glTexParameterfv\0" "glTexParameteri\0" "glTexParameterIivEXT\0" "glTexParameterIuivEXT\0" "glTexParameteriv\0" "glTexScissorFuncINTEL\0" "glTexScissorINTEL\0" "glTexSubImage1D\0" "glTexSubImage1DEXT\0" "glTexSubImage2D\0" "glTexSubImage2DEXT\0" "glTexSubImage3D\0" "glTexSubImage3DEXT\0" "glTexSubImage4DSGIS\0" "glTextureColorMaskSGIS\0" "glTextureFogSGIX\0" "glTextureLightEXT\0" "glTextureMaterialEXT\0" "glTextureNormalEXT\0" "glTextureRangeAPPLE\0" //"glEGLImageTargetTexture2DOES\n" "glTrackMatrixNV\0" "glTransformFeedbackAttribsNV\0" "glTransformFeedbackVaryingsNV\0" "glTranslated\0" "glTranslatef\0" "glUniform1f\0" "glUniform1fARB\0" "glUniform1fv\0" "glUniform1fvARB\0" "glUniform1i\0" "glUniform1iARB\0" "glUniform1iv\0" "glUniform1ivARB\0" "glUniform1uiEXT\0" "glUniform1uivEXT\0" "glUniform2f\0" "glUniform2fARB\0" "glUniform2fv\0" "glUniform2fvARB\0" "glUniform2i\0" "glUniform2iARB\0" "glUniform2iv\0" "glUniform2ivARB\0" "glUniform2uiEXT\0" "glUniform2uivEXT\0" "glUniform3f\0" "glUniform3fARB\0" "glUniform3fv\0" "glUniform3fvARB\0" "glUniform3i\0" "glUniform3iARB\0" "glUniform3iv\0" "glUniform3ivARB\0" "glUniform3uiEXT\0" "glUniform3uivEXT\0" "glUniform4f\0" "glUniform4fARB\0" "glUniform4fv\0" "glUniform4fvARB\0" "glUniform4i\0" "glUniform4iARB\0" "glUniform4iv\0" "glUniform4ivARB\0" "glUniform4uiEXT\0" "glUniform4uivEXT\0" "glUniformBufferEXT\0" "glUniformMatrix2fv\0" "glUniformMatrix2fvARB\0" "glUniformMatrix2x3fv\0" "glUniformMatrix2x4fv\0" "glUniformMatrix3fv\0" "glUniformMatrix3fvARB\0" "glUniformMatrix3x2fv\0" "glUniformMatrix3x4fv\0" "glUniformMatrix4fv\0" "glUniformMatrix4fvARB\0" "glUniformMatrix4x2fv\0" "glUniformMatrix4x3fv\0" "glUnlockArraysEXT\0" "glUnmapBuffer\0" "glUnmapBufferARB\0" "glUnmapObjectBufferATI\0" "glUnmapTexture3DATI\0" "glUpdateObjectBufferATI\0" "glUseProgram\0" "glUseProgramObjectARB\0" "glValidateProgram\0" "glValidateProgramARB\0" "glValidBackBufferHintAutodesk\0" "glVariantArrayObjectATI\0" "glVariantbvEXT\0" "glVariantdvEXT\0" "glVariantfvEXT\0" "glVariantivEXT\0" "glVariantPointerEXT\0" "glVariantsvEXT\0" "glVariantubvEXT\0" "glVariantuivEXT\0" "glVariantusvEXT\0" "glVertex2d\0" "glVertex2dv\0" "glVertex2f\0" "glVertex2fv\0" "glVertex2hNV\0" "glVertex2hvNV\0" "glVertex2i\0" "glVertex2iv\0" "glVertex2s\0" "glVertex2sv\0" "glVertex3d\0" "glVertex3dv\0" "glVertex3f\0" "glVertex3fv\0" "glVertex3hNV\0" "glVertex3hvNV\0" "glVertex3i\0" "glVertex3iv\0" "glVertex3s\0" "glVertex3sv\0" "glVertex4d\0" "glVertex4dv\0" "glVertex4f\0" "glVertex4fv\0" "glVertex4hNV\0" "glVertex4hvNV\0" "glVertex4i\0" "glVertex4iv\0" "glVertex4s\0" "glVertex4sv\0" "glVertexArrayParameteriAPPLE\0" "glVertexArrayRangeAPPLE\0" "glVertexArrayRangeNV\0" "glVertexAttrib1d\0" "glVertexAttrib1dARB\0" "glVertexAttrib1dNV\0" "glVertexAttrib1dv\0" "glVertexAttrib1dvARB\0" "glVertexAttrib1dvNV\0" "glVertexAttrib1f\0" "glVertexAttrib1fARB\0" "glVertexAttrib1fNV\0" "glVertexAttrib1fv\0" "glVertexAttrib1fvARB\0" "glVertexAttrib1fvNV\0" "glVertexAttrib1hNV\0" "glVertexAttrib1hvNV\0" "glVertexAttrib1s\0" "glVertexAttrib1sARB\0" "glVertexAttrib1sNV\0" "glVertexAttrib1sv\0" "glVertexAttrib1svARB\0" "glVertexAttrib1svNV\0" "glVertexAttrib2d\0" "glVertexAttrib2dARB\0" "glVertexAttrib2dNV\0" "glVertexAttrib2dv\0" "glVertexAttrib2dvARB\0" "glVertexAttrib2dvNV\0" "glVertexAttrib2f\0" "glVertexAttrib2fARB\0" "glVertexAttrib2fNV\0" "glVertexAttrib2fv\0" "glVertexAttrib2fvARB\0" "glVertexAttrib2fvNV\0" "glVertexAttrib2hNV\0" "glVertexAttrib2hvNV\0" "glVertexAttrib2s\0" "glVertexAttrib2sARB\0" "glVertexAttrib2sNV\0" "glVertexAttrib2sv\0" "glVertexAttrib2svARB\0" "glVertexAttrib2svNV\0" "glVertexAttrib3d\0" "glVertexAttrib3dARB\0" "glVertexAttrib3dNV\0" "glVertexAttrib3dv\0" "glVertexAttrib3dvARB\0" "glVertexAttrib3dvNV\0" "glVertexAttrib3f\0" "glVertexAttrib3fARB\0" "glVertexAttrib3fNV\0" "glVertexAttrib3fv\0" "glVertexAttrib3fvARB\0" "glVertexAttrib3fvNV\0" "glVertexAttrib3hNV\0" "glVertexAttrib3hvNV\0" "glVertexAttrib3s\0" "glVertexAttrib3sARB\0" "glVertexAttrib3sNV\0" "glVertexAttrib3sv\0" "glVertexAttrib3svARB\0" "glVertexAttrib3svNV\0" "glVertexAttrib4bv\0" "glVertexAttrib4bvARB\0" "glVertexAttrib4d\0" "glVertexAttrib4dARB\0" "glVertexAttrib4dNV\0" "glVertexAttrib4dv\0" "glVertexAttrib4dvARB\0" "glVertexAttrib4dvNV\0" "glVertexAttrib4f\0" "glVertexAttrib4fARB\0" "glVertexAttrib4fNV\0" "glVertexAttrib4fv\0" "glVertexAttrib4fvARB\0" "glVertexAttrib4fvNV\0" "glVertexAttrib4hNV\0" "glVertexAttrib4hvNV\0" "glVertexAttrib4iv\0" "glVertexAttrib4ivARB\0" "glVertexAttrib4Nbv\0" "glVertexAttrib4NbvARB\0" "glVertexAttrib4Niv\0" "glVertexAttrib4NivARB\0" "glVertexAttrib4Nsv\0" "glVertexAttrib4NsvARB\0" "glVertexAttrib4Nub\0" "glVertexAttrib4NubARB\0" "glVertexAttrib4Nubv\0" "glVertexAttrib4NubvARB\0" "glVertexAttrib4Nuiv\0" "glVertexAttrib4NuivARB\0" "glVertexAttrib4Nusv\0" "glVertexAttrib4NusvARB\0" "glVertexAttrib4s\0" "glVertexAttrib4sARB\0" "glVertexAttrib4sNV\0" "glVertexAttrib4sv\0" "glVertexAttrib4svARB\0" "glVertexAttrib4svNV\0" "glVertexAttrib4ubNV\0" "glVertexAttrib4ubv\0" "glVertexAttrib4ubvARB\0" "glVertexAttrib4ubvNV\0" "glVertexAttrib4uiv\0" "glVertexAttrib4uivARB\0" "glVertexAttrib4usv\0" "glVertexAttrib4usvARB\0" "glVertexAttribArrayObjectATI\0" "glVertexAttribI1iEXT\0" "glVertexAttribI1ivEXT\0" "glVertexAttribI1uiEXT\0" "glVertexAttribI1uivEXT\0" "glVertexAttribI2iEXT\0" "glVertexAttribI2ivEXT\0" "glVertexAttribI2uiEXT\0" "glVertexAttribI2uivEXT\0" "glVertexAttribI3iEXT\0" "glVertexAttribI3ivEXT\0" "glVertexAttribI3uiEXT\0" "glVertexAttribI3uivEXT\0" "glVertexAttribI4bvEXT\0" "glVertexAttribI4iEXT\0" "glVertexAttribI4ivEXT\0" "glVertexAttribI4svEXT\0" "glVertexAttribI4ubvEXT\0" "glVertexAttribI4uiEXT\0" "glVertexAttribI4uivEXT\0" "glVertexAttribI4usvEXT\0" "glVertexAttribIPointerEXT\0" "glVertexAttribPointer\0" "glVertexAttribPointerARB\0" "glVertexAttribPointerNV\0" "glVertexAttribs1dvNV\0" "glVertexAttribs1fvNV\0" "glVertexAttribs1hvNV\0" "glVertexAttribs1svNV\0" "glVertexAttribs2dvNV\0" "glVertexAttribs2fvNV\0" "glVertexAttribs2hvNV\0" "glVertexAttribs2svNV\0" "glVertexAttribs3dvNV\0" "glVertexAttribs3fvNV\0" "glVertexAttribs3hvNV\0" "glVertexAttribs3svNV\0" "glVertexAttribs4dvNV\0" "glVertexAttribs4fvNV\0" "glVertexAttribs4hvNV\0" "glVertexAttribs4svNV\0" "glVertexAttribs4ubvNV\0" "glVertexBlendARB\0" "glVertexBlendEnvfATI\0" "glVertexBlendEnviATI\0" "glVertexPointer\0" "glVertexPointerEXT\0" "glVertexPointerListIBM\0" "glVertexPointervINTEL\0" "glVertexStream1dATI\0" "glVertexStream1dvATI\0" "glVertexStream1fATI\0" "glVertexStream1fvATI\0" "glVertexStream1iATI\0" "glVertexStream1ivATI\0" "glVertexStream1sATI\0" "glVertexStream1svATI\0" "glVertexStream2dATI\0" "glVertexStream2dvATI\0" "glVertexStream2fATI\0" "glVertexStream2fvATI\0" "glVertexStream2iATI\0" "glVertexStream2ivATI\0" "glVertexStream2sATI\0" "glVertexStream2svATI\0" "glVertexStream3dATI\0" "glVertexStream3dvATI\0" "glVertexStream3fATI\0" "glVertexStream3fvATI\0" "glVertexStream3iATI\0" "glVertexStream3ivATI\0" "glVertexStream3sATI\0" "glVertexStream3svATI\0" "glVertexStream4dATI\0" "glVertexStream4dvATI\0" "glVertexStream4fATI\0" "glVertexStream4fvATI\0" "glVertexStream4iATI\0" "glVertexStream4ivATI\0" "glVertexStream4sATI\0" "glVertexStream4svATI\0" "glVertexWeightfEXT\0" "glVertexWeightfvEXT\0" "glVertexWeighthNV\0" "glVertexWeighthvNV\0" "glVertexWeightPointerEXT\0" "glViewport\0" "glWeightbvARB\0" "glWeightdvARB\0" "glWeightfvARB\0" "glWeightivARB\0" "glWeightPointerARB\0" "glWeightsvARB\0" "glWeightubvARB\0" "glWeightuivARB\0" "glWeightusvARB\0" "glWindowBackBufferHintAutodesk\0" "glWindowPos2d\0" "glWindowPos2dARB\0" "glWindowPos2dMESA\0" "glWindowPos2dv\0" "glWindowPos2dvARB\0" "glWindowPos2dvMESA\0" "glWindowPos2f\0" "glWindowPos2fARB\0" "glWindowPos2fMESA\0" "glWindowPos2fv\0" "glWindowPos2fvARB\0" "glWindowPos2fvMESA\0" "glWindowPos2i\0" "glWindowPos2iARB\0" "glWindowPos2iMESA\0" "glWindowPos2iv\0" "glWindowPos2ivARB\0" "glWindowPos2ivMESA\0" "glWindowPos2s\0" "glWindowPos2sARB\0" "glWindowPos2sMESA\0" "glWindowPos2sv\0" "glWindowPos2svARB\0" "glWindowPos2svMESA\0" "glWindowPos3d\0" "glWindowPos3dARB\0" "glWindowPos3dMESA\0" "glWindowPos3dv\0" "glWindowPos3dvARB\0" "glWindowPos3dvMESA\0" "glWindowPos3f\0" "glWindowPos3fARB\0" "glWindowPos3fMESA\0" "glWindowPos3fv\0" "glWindowPos3fvARB\0" "glWindowPos3fvMESA\0" "glWindowPos3i\0" "glWindowPos3iARB\0" "glWindowPos3iMESA\0" "glWindowPos3iv\0" "glWindowPos3ivARB\0" "glWindowPos3ivMESA\0" "glWindowPos3s\0" "glWindowPos3sARB\0" "glWindowPos3sMESA\0" "glWindowPos3sv\0" "glWindowPos3svARB\0" "glWindowPos3svMESA\0" "glWindowPos4dMESA\0" "glWindowPos4dvMESA\0" "glWindowPos4fMESA\0" "glWindowPos4fvMESA\0" "glWindowPos4iMESA\0" "glWindowPos4ivMESA\0" "glWindowPos4sMESA\0" "glWindowPos4svMESA\0" "glWriteMaskEXT\0" "glXAllocateMemoryMESA\0" "glXAllocateMemoryNV\0" "glXBindChannelToWindowSGIX\0" "glXBindHyperpipeSGIX\0" "glXBindSwapBarrierNV\0" "glXBindSwapBarrierSGIX\0" "glXBindTexImageEXT\0" "glXBindVideoImageNV\0" "glXChannelRectSGIX\0" "glXChannelRectSyncSGIX\0" "glXChooseFBConfig\0" "glXChooseVisual\0" "glXCopyContext\0" "glXCopySubBufferMESA\0" "glXCreateContext\0" "glXCreateGLXPixmap\0" "glXCreateGLXPixmapMESA\0" "glXCreateGLXPixmapWithConfigSGIX\0" "glXCreateNewContext\0" "glXCreatePbuffer\0" "glXCreatePixmap\0" "glXCreateWindow\0" "glXCushionSGI\0" "glXDestroyContext\0" "glXDestroyGLXPixmap\0" "glXDestroyHyperpipeConfigSGIX\0" "glXDestroyPbuffer\0" "glXDestroyPixmap\0" "glXDestroyWindow\0" "glXDrawableAttribARB\0" "glXDrawableAttribATI\0" "glXFreeContextEXT\0" "glXFreeMemoryMESA\0" "glXFreeMemoryNV\0" "glXGetAGPOffsetMESA\0" "glXGetClientString\0" "glXGetConfig\0" "glXGetContextIDEXT\0" "glXGetCurrentContext\0" "glXGetCurrentDisplay\0" "glXGetCurrentDisplayEXT\0" "glXGetCurrentDrawable\0" "glXGetCurrentReadDrawable\0" "glXGetCurrentReadDrawableSGI\0" "glXGetDriverConfig\0" "glXGetFBConfigAttrib\0" "glXGetFBConfigFromVisualSGIX\0" "glXGetFBConfigs\0" "glXGetMemoryOffsetMESA\0" "glXGetMscRateOML\0" "glXGetProcAddress\0" "glXGetProcAddressARB\0" "glXGetRefreshRateSGI\0" "glXGetScreenDriver\0" "glXGetSelectedEvent\0" "glXGetSelectedEventSGIX\0" "glXGetSyncValuesOML\0" "glXGetTransparentIndexSUN\0" "glXGetVideoDeviceNV\0" "glXGetVideoInfoNV\0" "glXGetVideoResizeSUN\0" "glXGetVideoSyncSGI\0" "glXGetVisualFromFBConfig\0" "glXGetVisualFromFBConfigSGIX\0" "glXHyperpipeAttribSGIX\0" "glXHyperpipeConfigSGIX\0" "glXImportContextEXT\0" "glXIsDirect\0" "glXJoinSwapGroupNV\0" "glXJoinSwapGroupSGIX\0" "glXMakeContextCurrent\0" "glXMakeCurrent\0" "glXMakeCurrentReadSGI\0" "glXQueryChannelDeltasSGIX\0" "glXQueryChannelRectSGIX\0" "glXQueryContext\0" "glXQueryContextInfoEXT\0" "glXQueryDrawable\0" "glXQueryExtension\0" "glXQueryExtensionsString\0" "glXQueryFrameCountNV\0" "glXQueryHyperpipeAttribSGIX\0" "glXQueryHyperpipeBestAttribSGIX\0" "glXQueryHyperpipeConfigSGIX\0" "glXQueryHyperpipeNetworkSGIX\0" "glXQueryMaxSwapBarriersSGIX\0" "glXQueryMaxSwapGroupsNV\0" "glXQueryServerString\0" "glXQuerySwapGroupNV\0" "glXQueryVersion\0" "glXReleaseBuffersMESA\0" "glXReleaseTexImageEXT\0" "glXReleaseVideoDeviceNV\0" "glXReleaseVideoImageNV\0" "glXResetFrameCountNV\0" "glXSelectEvent\0" "glXSelectEventSGIX\0" "glXSendPbufferToVideoNV\0" "glXSet3DfxModeMESA\0" "glXSwapBuffers\0" "glXSwapBuffersMscOML\0" "glXSwapIntervalSGI\0" "glXUseXFont\0" "glXVideoResizeSUN\0" "glXWaitForMscOML\0" "glXWaitForSbcOML\0" "glXWaitGL\0" "glXWaitVideoSyncSGI\0" "glXWaitX\0" "\0" }; typedef struct { unsigned int hash; char* name; __GLXextFuncPtr func; int found_on_client_side; int found_on_server_side; int alreadyAsked; } AssocProcAdress; #ifdef PROVIDE_STUB_IMPLEMENTATION static void _glStubImplementation() { log_gl("This function is a stub !!!\n"); } #endif __GLXextFuncPtr glXGetProcAddress_no_lock(const GLubyte * _name) { static int nbElts = 0; static int tabSize = 0; static AssocProcAdress* tab_assoc = NULL; static void* handle = NULL; __GLXextFuncPtr ret = NULL; const char* name = (const char*)_name; if(debug_gl) log_gl(">>> looking for \"%s\",\n", name); int i; if (name == NULL) { goto end_of_glx_get_proc_address; } if (tabSize == 0) { tabSize = 2000; tab_assoc = calloc(tabSize, sizeof(AssocProcAdress)); handle = dlopen(getenv("REAL_LIBGL") ? getenv("REAL_LIBGL") : "libGL.so.1" ,RTLD_LAZY); if (!handle) { log_gl("%s\n", dlerror()); exit(1); } { if(debug_gl) log_gl("global_glXGetProcAddress request\n"); int sizeOfString = 0; int nbRequestElts = 0; int i = 0; while(1) { if (global_glXGetProcAddress_request[i] == '\0') { nbRequestElts++; if (global_glXGetProcAddress_request[i + 1] == '\0') { sizeOfString = i + 1; break; } } i++; } if(debug_gl) log_gl("nbRequestElts=%d\n", nbRequestElts); char* result = (char*)malloc(nbRequestElts); long args[] = { INT_TO_ARG(nbRequestElts), POINTER_TO_ARG(global_glXGetProcAddress_request), POINTER_TO_ARG(result) }; int args_size[] = { 0, sizeOfString, nbRequestElts }; do_opengl_call_no_lock(glXGetProcAddress_global_fake_func, NULL, CHECK_ARGS(args, args_size)); int offset = 0; for(i=0; i