📄 fakeglx.c
字号:
/* * GLX_EXT_visual_info extension */ case GLX_VISUAL_CAVEAT_EXT: /* test for zero, just in case */ if (xmvis->mesa_visual.visualRating > 0) *value = xmvis->mesa_visual.visualRating; else *value = GLX_NONE_EXT; return 0; /* * GLX_ARB_multisample */ case GLX_SAMPLE_BUFFERS_ARB: *value = 0; return 0; case GLX_SAMPLES_ARB: *value = 0; return 0; /* * For FBConfigs: */ case GLX_SCREEN_EXT: if (!fbconfig) return GLX_BAD_ATTRIBUTE; *value = xmvis->visinfo->screen; break; case GLX_DRAWABLE_TYPE: /*SGIX too */ if (!fbconfig) return GLX_BAD_ATTRIBUTE; *value = GLX_WINDOW_BIT | GLX_PIXMAP_BIT | GLX_PBUFFER_BIT; break; case GLX_RENDER_TYPE_SGIX: if (!fbconfig) return GLX_BAD_ATTRIBUTE; if (xmvis->mesa_visual.rgbMode) *value = GLX_RGBA_BIT; else *value = GLX_COLOR_INDEX_BIT; break; case GLX_X_RENDERABLE_SGIX: if (!fbconfig) return GLX_BAD_ATTRIBUTE; *value = True; /* XXX really? */ break; case GLX_FBCONFIG_ID_SGIX: if (!fbconfig) return GLX_BAD_ATTRIBUTE; *value = xmvis->visinfo->visualid; break; case GLX_MAX_PBUFFER_WIDTH: if (!fbconfig) return GLX_BAD_ATTRIBUTE; /* XXX or MAX_WIDTH? */ *value = DisplayWidth(xmvis->display, xmvis->visinfo->screen); break; case GLX_MAX_PBUFFER_HEIGHT: if (!fbconfig) return GLX_BAD_ATTRIBUTE; *value = DisplayHeight(xmvis->display, xmvis->visinfo->screen); break; case GLX_MAX_PBUFFER_PIXELS: if (!fbconfig) return GLX_BAD_ATTRIBUTE; *value = DisplayWidth(xmvis->display, xmvis->visinfo->screen) * DisplayHeight(xmvis->display, xmvis->visinfo->screen); break; case GLX_VISUAL_ID: if (!fbconfig) return GLX_BAD_ATTRIBUTE; *value = xmvis->visinfo->visualid; break;#ifdef GLX_EXT_texture_from_pixmap case GLX_BIND_TO_TEXTURE_RGB_EXT: *value = True; /*XXX*/ break; case GLX_BIND_TO_TEXTURE_RGBA_EXT: /* XXX review */ *value = xmvis->mesa_visual.alphaBits > 0 ? True : False; break; case GLX_BIND_TO_MIPMAP_TEXTURE_EXT: *value = True; /*XXX*/ break; case GLX_BIND_TO_TEXTURE_TARGETS_EXT: *value = (GLX_TEXTURE_1D_BIT_EXT | GLX_TEXTURE_2D_BIT_EXT | GLX_TEXTURE_RECTANGLE_BIT_EXT); /*XXX*/ break; case GLX_Y_INVERTED_EXT: *value = True; /*XXX*/ break;#endif default: return GLX_BAD_ATTRIBUTE; } return Success;}static intFake_glXGetConfig( Display *dpy, XVisualInfo *visinfo, int attrib, int *value ){ XMesaVisual xmvis; int k; if (!dpy || !visinfo) return GLX_BAD_ATTRIBUTE; xmvis = find_glx_visual( dpy, visinfo ); if (!xmvis) { /* this visual wasn't obtained with glXChooseVisual */ xmvis = create_glx_visual( dpy, visinfo ); if (!xmvis) { /* this visual can't be used for GL rendering */ if (attrib==GLX_USE_GL) { *value = (int) False; return 0; } else { return GLX_BAD_VISUAL; } } } k = get_config(xmvis, attrib, value, GL_FALSE); return k;}static voidFake_glXWaitGL( void ){ XMesaContext xmesa = XMesaGetCurrentContext(); XMesaFlush( xmesa );}static voidFake_glXWaitX( void ){ XMesaContext xmesa = XMesaGetCurrentContext(); XMesaFlush( xmesa );}static const char *get_extensions( void ){#ifdef FX const char *fx = _mesa_getenv("MESA_GLX_FX"); if (fx && fx[0] != 'd') { return EXTENSIONS; }#endif return EXTENSIONS + 23; /* skip "GLX_MESA_set_3dfx_mode" */}/* GLX 1.1 and later */static const char *Fake_glXQueryExtensionsString( Display *dpy, int screen ){ (void) dpy; (void) screen; return get_extensions();}/* GLX 1.1 and later */static const char *Fake_glXQueryServerString( Display *dpy, int screen, int name ){ static char version[1000]; _mesa_sprintf(version, "%d.%d %s", SERVER_MAJOR_VERSION, SERVER_MINOR_VERSION, MESA_GLX_VERSION); (void) dpy; (void) screen; switch (name) { case GLX_EXTENSIONS: return get_extensions(); case GLX_VENDOR: return VENDOR; case GLX_VERSION: return version; default: return NULL; }}/* GLX 1.1 and later */static const char *Fake_glXGetClientString( Display *dpy, int name ){ static char version[1000]; _mesa_sprintf(version, "%d.%d %s", CLIENT_MAJOR_VERSION, CLIENT_MINOR_VERSION, MESA_GLX_VERSION); (void) dpy; switch (name) { case GLX_EXTENSIONS: return get_extensions(); case GLX_VENDOR: return VENDOR; case GLX_VERSION: return version; default: return NULL; }}/* * GLX 1.3 and later */static intFake_glXGetFBConfigAttrib( Display *dpy, GLXFBConfig config, int attribute, int *value ){ XMesaVisual v = (XMesaVisual) config; (void) dpy; (void) config; if (!dpy || !config || !value) return -1; return get_config(v, attribute, value, GL_TRUE);}static GLXFBConfig *Fake_glXGetFBConfigs( Display *dpy, int screen, int *nelements ){ XVisualInfo *visuals, visTemplate; const long visMask = VisualScreenMask; int i; /* Get list of all X visuals */ visTemplate.screen = screen; visuals = XGetVisualInfo(dpy, visMask, &visTemplate, nelements); if (*nelements > 0) { XMesaVisual *results; results = (XMesaVisual *) _mesa_malloc(*nelements * sizeof(XMesaVisual)); if (!results) { *nelements = 0; return NULL; } for (i = 0; i < *nelements; i++) { results[i] = create_glx_visual(dpy, visuals + i); } return (GLXFBConfig *) results; } return NULL;}static GLXFBConfig *Fake_glXChooseFBConfig( Display *dpy, int screen, const int *attribList, int *nitems ){ XMesaVisual xmvis; if (!attribList || !attribList[0]) { /* return list of all configs (per GLX_SGIX_fbconfig spec) */ return Fake_glXGetFBConfigs(dpy, screen, nitems); } xmvis = choose_visual(dpy, screen, attribList, GL_TRUE); if (xmvis) { GLXFBConfig *config = (GLXFBConfig *) _mesa_malloc(sizeof(XMesaVisual)); if (!config) { *nitems = 0; return NULL; } *nitems = 1; config[0] = (GLXFBConfig) xmvis; return (GLXFBConfig *) config; } else { *nitems = 0; return NULL; }}static XVisualInfo *Fake_glXGetVisualFromFBConfig( Display *dpy, GLXFBConfig config ){ if (dpy && config) { XMesaVisual xmvis = (XMesaVisual) config;#if 0 return xmvis->vishandle;#else /* create a new vishandle - the cached one may be stale */ xmvis->vishandle = (XVisualInfo *) _mesa_malloc(sizeof(XVisualInfo)); if (xmvis->vishandle) { _mesa_memcpy(xmvis->vishandle, xmvis->visinfo, sizeof(XVisualInfo)); } return xmvis->vishandle;#endif } else { return NULL; }}static GLXWindowFake_glXCreateWindow( Display *dpy, GLXFBConfig config, Window win, const int *attribList ){ XMesaVisual xmvis = (XMesaVisual) config; XMesaBuffer xmbuf; if (!xmvis) return 0; xmbuf = XMesaCreateWindowBuffer(xmvis, win); if (!xmbuf) return 0;#ifdef FX /* XXX this will segfault if actually called */ FXcreateContext(xmvis, win, NULL, xmbuf);#endif (void) dpy; (void) attribList; /* Ignored in GLX 1.3 */ return win; /* A hack for now */}static voidFake_glXDestroyWindow( Display *dpy, GLXWindow window ){ XMesaBuffer b = XMesaFindBuffer(dpy, (XMesaDrawable) window); if (b) XMesaDestroyBuffer(b); /* don't destroy X window */}/* XXX untested */static GLXPixmapFake_glXCreatePixmap( Display *dpy, GLXFBConfig config, Pixmap pixmap, const int *attribList ){ XMesaVisual v = (XMesaVisual) config; XMesaBuffer b; const int *attr; int target = 0, format = 0, mipmap = 0; int value; if (!dpy || !config || !pixmap) return 0; for (attr = attribList; *attr; attr++) { switch (*attr) { case GLX_TEXTURE_FORMAT_EXT: attr++; switch (*attr) { case GLX_TEXTURE_FORMAT_NONE_EXT: case GLX_TEXTURE_FORMAT_RGB_EXT: case GLX_TEXTURE_FORMAT_RGBA_EXT: format = *attr; break; default: /* error */ return 0; } break; case GLX_TEXTURE_TARGET_EXT: attr++; switch (*attr) { case GLX_TEXTURE_1D_EXT: case GLX_TEXTURE_2D_EXT: case GLX_TEXTURE_RECTANGLE_EXT: target = *attr; break; default: /* error */ return 0; } break; case GLX_MIPMAP_TEXTURE_EXT: attr++; if (*attr) mipmap = 1; break; default: /* error */ return 0; } } if (format == GLX_TEXTURE_FORMAT_RGB_EXT) { if (get_config(v, GLX_BIND_TO_TEXTURE_RGB_EXT, &value, GL_TRUE) != Success || !value) { return 0; /* error! */ } } else if (format == GLX_TEXTURE_FORMAT_RGBA_EXT) { if (get_config(v, GLX_BIND_TO_TEXTURE_RGBA_EXT, &value, GL_TRUE) != Success || !value) { return 0; /* error! */ } } if (mipmap) { if (get_config(v, GLX_BIND_TO_MIPMAP_TEXTURE_EXT, &value, GL_TRUE) != Success || !value) { return 0; /* error! */ } } if (target == GLX_TEXTURE_1D_EXT) { if (get_config(v, GLX_BIND_TO_TEXTURE_TARGETS_EXT, &value, GL_TRUE) != Success || (value & GLX_TEXTURE_1D_BIT_EXT) == 0) { return 0; /* error! */ } } else if (target == GLX_TEXTURE_2D_EXT) { if (get_config(v, GLX_BIND_TO_TEXTURE_TARGETS_EXT, &value, GL_TRUE) != Success || (value & GLX_TEXTURE_2D_BIT_EXT) == 0) { return 0; /* error! */ } } if (target == GLX_TEXTURE_RECTANGLE_EXT) { if (get_config(v, GLX_BIND_TO_TEXTURE_TARGETS_EXT, &value, GL_TRUE) != Success || (value & GLX_TEXTURE_RECTANGLE_BIT_EXT) == 0) { return 0; /* error! */ } } if (format || target || mipmap) { /* texture from pixmap */ b = XMesaCrea
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -