glxcmds.c
来自「mesa-6.5-minigui源码」· C语言 代码 · 共 2,495 行 · 第 1/5 页
C
2,495 行
break; case GLX_RENDER_TYPE: *value = (int)(ctx->renderType); break; default: return GLX_BAD_ATTRIBUTE; } return Success;}PUBLIC GLX_ALIAS( int, glXQueryContextInfoEXT, (Display *dpy, GLXContext ctx, int attribute, int *value), (dpy, ctx, attribute, value), glXQueryContext )PUBLIC GLXContextID glXGetContextIDEXT(const GLXContext ctx){ return ctx->xid;}PUBLIC GLXContext glXImportContextEXT(Display *dpy, GLXContextID contextID){ GLXContext ctx; if (contextID == None) { return NULL; } if (__glXIsDirect(dpy, contextID)) { return NULL; } ctx = CreateContext(dpy, NULL, NULL, NULL, False, contextID, False, 0); if (NULL != ctx) { if (Success != __glXQueryContextInfo(dpy, ctx)) { return NULL; } } return ctx;}PUBLIC void glXFreeContextEXT(Display *dpy, GLXContext ctx){ DestroyContext(dpy, ctx);}/* * GLX 1.3 functions - these are just stubs for now! */PUBLIC GLXFBConfig *glXChooseFBConfig(Display *dpy, int screen, const int *attribList, int *nitems){ __GLcontextModes ** config_list; int list_size; config_list = (__GLcontextModes **) glXGetFBConfigs( dpy, screen, & list_size ); if ( (config_list != NULL) && (list_size > 0) && (attribList != NULL) ) { list_size = choose_visual( config_list, list_size, attribList, GL_TRUE ); if ( list_size == 0 ) { XFree( config_list ); config_list = NULL; } } *nitems = list_size; return (GLXFBConfig *) config_list;}PUBLIC GLXContext glXCreateNewContext(Display *dpy, GLXFBConfig config, int renderType, GLXContext shareList, Bool allowDirect){ return CreateContext( dpy, NULL, (__GLcontextModes *) config, shareList, allowDirect, None, True, renderType );}PUBLIC GLXDrawable glXGetCurrentReadDrawable(void){ GLXContext gc = __glXGetCurrentContext(); return gc->currentReadable;}PUBLIC GLXFBConfig *glXGetFBConfigs(Display *dpy, int screen, int *nelements){ __GLXdisplayPrivate *priv = __glXInitialize(dpy); __GLcontextModes ** config = NULL; int i; if ( (priv->screenConfigs != NULL) && (screen >= 0) && (screen <= ScreenCount(dpy)) && (priv->screenConfigs[screen].configs != NULL) && (priv->screenConfigs[screen].configs->fbconfigID != GLX_DONT_CARE) ) { unsigned num_configs = 0; __GLcontextModes * modes; for ( modes = priv->screenConfigs[screen].configs ; modes != NULL ; modes = modes->next ) { if ( modes->fbconfigID != GLX_DONT_CARE ) { num_configs++; } } config = (__GLcontextModes **) Xmalloc( sizeof(__GLcontextModes *) * num_configs ); if ( config != NULL ) { *nelements = num_configs; i = 0; for ( modes = priv->screenConfigs[screen].configs ; modes != NULL ; modes = modes->next ) { config[i] = modes; i++; } } } return (GLXFBConfig *) config;}PUBLIC int glXGetFBConfigAttrib(Display *dpy, GLXFBConfig config, int attribute, int *value){ __GLcontextModes * const modes = ValidateGLXFBConfig( dpy, config ); return (modes != NULL) ? _gl_get_context_mode_data( modes, attribute, value ) : GLXBadFBConfig;}PUBLIC XVisualInfo *glXGetVisualFromFBConfig(Display *dpy, GLXFBConfig config){ XVisualInfo visualTemplate; __GLcontextModes * fbconfig = (__GLcontextModes *) config; int count; /* ** Get a list of all visuals, return if list is empty */ visualTemplate.visualid = fbconfig->visualID; return XGetVisualInfo(dpy,VisualIDMask,&visualTemplate,&count);}/*** GLX_SGI_make_current_read*/PUBLIC GLX_ALIAS(GLXDrawable, glXGetCurrentReadDrawableSGI, (void), (), glXGetCurrentReadDrawable)/*** GLX_SGI_swap_control*/PUBLIC int glXSwapIntervalSGI(int interval){ xGLXVendorPrivateReq *req; GLXContext gc = __glXGetCurrentContext(); Display * dpy; CARD32 * interval_ptr; CARD8 opcode; if ( gc == NULL ) { return GLX_BAD_CONTEXT; } if ( interval <= 0 ) { return GLX_BAD_VALUE; }#ifdef GLX_DIRECT_RENDERING if ( gc->isDirect ) { __GLXscreenConfigs * const psc = GetGLXScreenConfigs( gc->currentDpy, gc->screen ); __DRIdrawable * const pdraw = GetDRIDrawable( gc->currentDpy, gc->currentDrawable, NULL ); if ( __glXExtensionBitIsEnabled( psc, SGI_swap_control_bit ) && (pdraw != NULL) ) { pdraw->swap_interval = interval; return 0; } else { return GLX_BAD_CONTEXT; } }#endif dpy = gc->currentDpy; opcode = __glXSetupForCommand(dpy); if (!opcode) { return 0; } /* Send the glXSwapIntervalSGI request */ LockDisplay(dpy); GetReqExtra(GLXVendorPrivate,sizeof(CARD32),req); req->reqType = opcode; req->glxCode = X_GLXVendorPrivate; req->vendorCode = X_GLXvop_SwapIntervalSGI; req->contextTag = gc->currentContextTag; interval_ptr = (CARD32 *) req + 1; *interval_ptr = interval; UnlockDisplay(dpy); SyncHandle(); XFlush(dpy); return 0;}/*** GLX_MESA_swap_control*/PUBLIC int glXSwapIntervalMESA(unsigned int interval){#ifdef GLX_DIRECT_RENDERING GLXContext gc = __glXGetCurrentContext(); if ( interval < 0 ) { return GLX_BAD_VALUE; } if ( (gc != NULL) && gc->isDirect ) { __GLXscreenConfigs * const psc = GetGLXScreenConfigs( gc->currentDpy, gc->screen ); if ( (psc != NULL) && (psc->driScreen.private != NULL) && __glXExtensionBitIsEnabled( psc, MESA_swap_control_bit ) ) { __DRIdrawable * const pdraw = (*psc->driScreen.getDrawable)(gc->currentDpy, gc->currentDrawable, psc->driScreen.private); if ( pdraw != NULL ) { pdraw->swap_interval = interval; return 0; } } }#else (void) interval;#endif return GLX_BAD_CONTEXT;} PUBLIC int glXGetSwapIntervalMESA(void){#ifdef GLX_DIRECT_RENDERING GLXContext gc = __glXGetCurrentContext(); if ( (gc != NULL) && gc->isDirect ) { __GLXscreenConfigs * const psc = GetGLXScreenConfigs( gc->currentDpy, gc->screen ); if ( (psc != NULL) && (psc->driScreen.private != NULL) && __glXExtensionBitIsEnabled( psc, MESA_swap_control_bit ) ) { __DRIdrawable * const pdraw = (*psc->driScreen.getDrawable)(gc->currentDpy, gc->currentDrawable, psc->driScreen.private); if ( pdraw != NULL ) { return pdraw->swap_interval; } } }#endif return 0;}/*** GLX_MESA_swap_frame_usage*/PUBLIC GLint glXBeginFrameTrackingMESA(Display *dpy, GLXDrawable drawable){ int status = GLX_BAD_CONTEXT;#ifdef GLX_DIRECT_RENDERING int screen; __DRIdrawable * const pdraw = GetDRIDrawable(dpy, drawable, & screen); __GLXscreenConfigs * const psc = GetGLXScreenConfigs(dpy, screen); if ( (pdraw != NULL) && (pdraw->frameTracking != NULL) && __glXExtensionBitIsEnabled( psc, MESA_swap_frame_usage_bit ) ) { status = pdraw->frameTracking( dpy, pdraw->private, GL_TRUE ); }#else (void) dpy; (void) drawable;#endif return status;} PUBLIC GLint glXEndFrameTrackingMESA(Display *dpy, GLXDrawable drawable){ int status = GLX_BAD_CONTEXT;#ifdef GLX_DIRECT_RENDERING int screen; __DRIdrawable * const pdraw = GetDRIDrawable(dpy, drawable, & screen); __GLXscreenConfigs * const psc = GetGLXScreenConfigs(dpy, screen); if ( (pdraw != NULL) && (pdraw->frameTracking != NULL) && __glXExtensionBitIsEnabled( psc, MESA_swap_frame_usage_bit ) ) { status = pdraw->frameTracking( dpy, pdraw->private, GL_FALSE ); }#else (void) dpy; (void) drawable;#endif return status;}PUBLIC GLint glXGetFrameUsageMESA(Display *dpy, GLXDrawable drawable, GLfloat *usage){ int status = GLX_BAD_CONTEXT;#ifdef GLX_DIRECT_RENDERING int screen; __DRIdrawable * const pdraw = GetDRIDrawable(dpy, drawable, & screen); __GLXscreenConfigs * const psc = GetGLXScreenConfigs(dpy, screen); if ( (pdraw != NULL ) && (pdraw->queryFrameTracking != NULL) && __glXExtensionBitIsEnabled( psc, MESA_swap_frame_usage_bit ) ) { int64_t sbc, missedFrames; float lastMissedUsage; status = pdraw->queryFrameTracking( dpy, pdraw->private, &sbc, &missedFrames, &lastMissedUsage, usage ); }#else (void) dpy; (void) drawable; (void) usage;#endif return status;}PUBLIC GLint glXQueryFrameTrackingMESA(Display *dpy, GLXDrawable drawable, int64_t *sbc, int64_t *missedFrames, GLfloat *lastMissedUsage){ int status = GLX_BAD_CONTEXT;#ifdef GLX_DIRECT_RENDERING int screen; __DRIdrawable * const pdraw = GetDRIDrawable(dpy, drawable, & screen); __GLXscreenConfigs * const psc = GetGLXScreenConfigs(dpy, screen); if ( (pdraw != NULL ) && (pdraw->queryFrameTracking != NULL) && __glXExtensionBitIsEnabled( psc, MESA_swap_frame_usage_bit ) ) { float usage; status = pdraw->queryFrameTracking( dpy, pdraw->private, sbc, missedFrames, lastMissedUsage, & usage ); }#else (void) dpy; (void) drawable; (void) sbc; (void) missedFrames; (void) lastMissedUsage;#endif return status;}/*** GLX_SGI_video_sync*/PUBLIC int glXGetVideoSyncSGI(unsigned int *count){ /* FIXME: Looking at the GLX_SGI_video_sync spec in the extension registry, * FIXME: there should be a GLX encoding for this call. I can find no * FIXME: documentation for the GLX encoding. */#ifdef GLX_DIRECT_RENDERING GLXContext gc = __glXGetCurrentContext(); if ( (gc != NULL) && gc->isDirect ) { __GLXscreenConfigs * const psc = GetGLXScreenConfigs( gc->currentDpy, gc->screen ); if ( __glXExtensionBitIsEnabled( psc, SGI_video_sync_bit ) && psc->driScreen.private && psc->driScreen.getMSC) { int ret; int64_t temp; ret = psc->driScreen.getMSC( psc->driScreen.private, & temp ); *count = (unsigned) temp; return (ret == 0) ? 0 : GLX_BAD_CONTEXT; } }#else (void) count;#endif return GLX_BAD_CONTEXT;}PUBLIC int glXWaitVideoSyncSGI(int divisor, int remainder, unsigned int *count){#ifdef GLX_DIRECT_RENDERING GLXContext gc = __glXGetCurrentContext(); if ( divisor <= 0 || remainder < 0 ) return GLX_BAD_VALUE; if ( (gc != NULL) && gc->isDirect ) { __GLXscreenConfigs * const psc = GetGLXScreenConfigs( gc->currentDpy, gc->screen ); if ( __glXExtensionBitIsEnabled( psc, SGI_video_sync_bit ) && psc->driScreen.private ) { __DRIdrawable * const pdraw = (*psc->driScreen.getDrawable)(gc->currentDpy, gc->currentDrawable, psc->driScreen.private); if ( (pdraw != NULL) && (pdraw->waitForMSC != NULL) ) { int ret; int64_t msc; int64_t sbc; ret = (*pdraw->waitForMSC)( gc->currentDpy, pdraw->private, 0, divisor, remainder, & msc, & sbc ); *count = (unsigned) msc; return (ret == 0) ? 0 : GLX_BAD_CONTEXT; } } }#else (void) count;#endif return GLX_BAD_CONTEXT;}/*** GLX_SGIS_video_source*/#if defined(_VL_H)PUBLIC GLXVideoSourceSGIX glXCreateGLXVideoSourceSGIX(Display *dpy, int screen, VLServer server, VLPath path, int nodeClass, VLNode drainNode){ (void) dpy; (void) screen; (void) server; (void) path; (void) nodeClass; (void) drainNode; return 0;}PUBLIC void glXDestroyGLXVideoSourceSGIX(Display *dpy, GLXVideoSourceSGIX src){ (void) dpy; (void) src;}#endif/*** GLX_SGIX_fbconfig** Many of these functions are aliased to GLX 1.3 entry points in the ** GLX_functions table.*/PUBLIC GLX_ALIAS(int, glXGetFBConfigAttribSGIX, (Display *dpy, GLXFBConfigSGIX config, int attribute, int *value), (dpy, config, attribute, value), glXGetFBConfigAttrib)PUBLIC GLX_ALIAS(GLXFBConfigSGIX *, glXChooseFBConfigSGIX, (Display *dpy, int screen, int *attrib_list, int *nelements), (dpy, screen, attrib_list, nelements), glXChooseFBConfig)PUBLIC GLX_ALIAS(XVisualInfo *, glXGetVisualFromFBConfigSGIX,
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?