📄 fakeglx.c
字号:
return True; } else { /* The args must either all be non-zero or all zero. * This is an error. */ return False; }}static BoolFake_glXMakeCurrent( Display *dpy, GLXDrawable drawable, GLXContext ctx ){ return Fake_glXMakeContextCurrent( dpy, drawable, drawable, ctx );}static GLXPixmapFake_glXCreateGLXPixmap( Display *dpy, XVisualInfo *visinfo, Pixmap pixmap ){ XMesaVisual v; XMesaBuffer b; v = find_glx_visual( dpy, visinfo ); if (!v) { v = create_glx_visual( dpy, visinfo ); if (!v) { /* unusable visual */ return 0; } } b = XMesaCreatePixmapBuffer( v, pixmap, 0 ); if (!b) { return 0; } return b->frontxrb->pixmap;}/*** GLX_MESA_pixmap_colormap ***/static GLXPixmapFake_glXCreateGLXPixmapMESA( Display *dpy, XVisualInfo *visinfo, Pixmap pixmap, Colormap cmap ){ XMesaVisual v; XMesaBuffer b; v = find_glx_visual( dpy, visinfo ); if (!v) { v = create_glx_visual( dpy, visinfo ); if (!v) { /* unusable visual */ return 0; } } b = XMesaCreatePixmapBuffer( v, pixmap, cmap ); if (!b) { return 0; } return b->frontxrb->pixmap;}static voidFake_glXDestroyGLXPixmap( Display *dpy, GLXPixmap pixmap ){ XMesaBuffer b = XMesaFindBuffer(dpy, pixmap); if (b) { XMesaDestroyBuffer(b); } else if (_mesa_getenv("MESA_DEBUG")) { _mesa_warning(NULL, "Mesa: glXDestroyGLXPixmap: invalid pixmap\n"); }}static voidFake_glXCopyContext( Display *dpy, GLXContext src, GLXContext dst, unsigned long mask ){ struct fake_glx_context *fakeSrc = (struct fake_glx_context *) src; struct fake_glx_context *fakeDst = (struct fake_glx_context *) dst; XMesaContext xm_src = fakeSrc->xmesaContext; XMesaContext xm_dst = fakeDst->xmesaContext; (void) dpy; if (MakeCurrent_PrevContext == src) { _mesa_Flush(); } _mesa_copy_context( &(xm_src->mesa), &(xm_dst->mesa), (GLuint) mask );}static BoolFake_glXQueryExtension( Display *dpy, int *errorb, int *event ){ /* Mesa's GLX isn't really an X extension but we try to act like one. */ (void) dpy; (void) errorb; (void) event; return True;}extern void _kw_ungrab_all( Display *dpy );void _kw_ungrab_all( Display *dpy ){ XUngrabPointer( dpy, CurrentTime ); XUngrabKeyboard( dpy, CurrentTime );}static voidFake_glXDestroyContext( Display *dpy, GLXContext ctx ){ struct fake_glx_context *glxCtx = (struct fake_glx_context *) ctx; (void) dpy; MakeCurrent_PrevContext = 0; MakeCurrent_PrevDrawable = 0; MakeCurrent_PrevReadable = 0; MakeCurrent_PrevDrawBuffer = 0; MakeCurrent_PrevReadBuffer = 0; XMesaDestroyContext( glxCtx->xmesaContext ); XMesaGarbageCollect();}static BoolFake_glXIsDirect( Display *dpy, GLXContext ctx ){ struct fake_glx_context *glxCtx = (struct fake_glx_context *) ctx; (void) dpy; return glxCtx->xmesaContext->direct;}static voidFake_glXSwapBuffers( Display *dpy, GLXDrawable drawable ){ XMesaBuffer buffer = XMesaFindBuffer( dpy, drawable ); if (buffer) { XMesaSwapBuffers(buffer); } else if (_mesa_getenv("MESA_DEBUG")) { _mesa_warning(NULL, "glXSwapBuffers: invalid drawable 0x%x\n", (int) drawable); }}/*** GLX_MESA_copy_sub_buffer ***/static voidFake_glXCopySubBufferMESA( Display *dpy, GLXDrawable drawable, int x, int y, int width, int height ){ XMesaBuffer buffer = XMesaFindBuffer( dpy, drawable ); if (buffer) { XMesaCopySubBuffer(buffer, x, y, width, height); } else if (_mesa_getenv("MESA_DEBUG")) { _mesa_warning(NULL, "Mesa: glXCopySubBufferMESA: invalid drawable\n"); }}static BoolFake_glXQueryVersion( Display *dpy, int *maj, int *min ){ (void) dpy; /* Return GLX version, not Mesa version */ assert(CLIENT_MAJOR_VERSION == SERVER_MAJOR_VERSION); *maj = CLIENT_MAJOR_VERSION; *min = MIN2( CLIENT_MINOR_VERSION, SERVER_MINOR_VERSION ); return True;}/* * Query the GLX attributes of the given XVisualInfo. */static intget_config( XMesaVisual xmvis, int attrib, int *value, GLboolean fbconfig ){ ASSERT(xmvis); switch(attrib) { case GLX_USE_GL: if (fbconfig) return GLX_BAD_ATTRIBUTE; *value = (int) True; return 0; case GLX_BUFFER_SIZE: *value = xmvis->visinfo->depth; return 0; case GLX_LEVEL: *value = xmvis->mesa_visual.level; return 0; case GLX_RGBA: if (fbconfig) return GLX_BAD_ATTRIBUTE; if (xmvis->mesa_visual.rgbMode) { *value = True; } else { *value = False; } return 0; case GLX_DOUBLEBUFFER: *value = (int) xmvis->mesa_visual.doubleBufferMode; return 0; case GLX_STEREO: *value = (int) xmvis->mesa_visual.stereoMode; return 0; case GLX_AUX_BUFFERS: *value = xmvis->mesa_visual.numAuxBuffers; return 0; case GLX_RED_SIZE: *value = xmvis->mesa_visual.redBits; return 0; case GLX_GREEN_SIZE: *value = xmvis->mesa_visual.greenBits; return 0; case GLX_BLUE_SIZE: *value = xmvis->mesa_visual.blueBits; return 0; case GLX_ALPHA_SIZE: *value = xmvis->mesa_visual.alphaBits; return 0; case GLX_DEPTH_SIZE: *value = xmvis->mesa_visual.depthBits; return 0; case GLX_STENCIL_SIZE: *value = xmvis->mesa_visual.stencilBits; return 0; case GLX_ACCUM_RED_SIZE: *value = xmvis->mesa_visual.accumRedBits; return 0; case GLX_ACCUM_GREEN_SIZE: *value = xmvis->mesa_visual.accumGreenBits; return 0; case GLX_ACCUM_BLUE_SIZE: *value = xmvis->mesa_visual.accumBlueBits; return 0; case GLX_ACCUM_ALPHA_SIZE: *value = xmvis->mesa_visual.accumAlphaBits; return 0; /* * GLX_EXT_visual_info extension */ case GLX_X_VISUAL_TYPE_EXT: switch (xmvis->visinfo->CLASS) { case StaticGray: *value = GLX_STATIC_GRAY_EXT; return 0; case GrayScale: *value = GLX_GRAY_SCALE_EXT; return 0; case StaticColor: *value = GLX_STATIC_GRAY_EXT; return 0; case PseudoColor: *value = GLX_PSEUDO_COLOR_EXT; return 0; case TrueColor: *value = GLX_TRUE_COLOR_EXT; return 0; case DirectColor: *value = GLX_DIRECT_COLOR_EXT; return 0; } return 0; case GLX_TRANSPARENT_TYPE_EXT: if (xmvis->mesa_visual.level==0) { /* normal planes */ *value = GLX_NONE_EXT; } else if (xmvis->mesa_visual.level>0) { /* overlay */ if (xmvis->mesa_visual.rgbMode) { *value = GLX_TRANSPARENT_RGB_EXT; } else { *value = GLX_TRANSPARENT_INDEX_EXT; } } else if (xmvis->mesa_visual.level<0) { /* underlay */ *value = GLX_NONE_EXT; } return 0; case GLX_TRANSPARENT_INDEX_VALUE_EXT: { int pixel = transparent_pixel( xmvis ); if (pixel>=0) { *value = pixel; } /* else undefined */ } return 0; case GLX_TRANSPARENT_RED_VALUE_EXT: /* undefined */ return 0; case GLX_TRANSPARENT_GREEN_VALUE_EXT: /* undefined */ return 0; case GLX_TRANSPARENT_BLUE_VALUE_EXT: /* undefined */ return 0; case GLX_TRANSPARENT_ALPHA_VALUE_EXT: /* undefined */ return 0; /* * 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; 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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -