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 + -
显示快捷键?