⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 glxext.c

📁 mesa-6.5-minigui源码
💻 C
📖 第 1 页 / 共 4 页
字号:
    /*    ** Additional properties may be in a list at the end    ** of the reply.  They are in pairs of property type    ** and property value.    */#define FETCH_OR_SET(tag) \    config-> tag = ( fbconfig_style_tags ) ? *bp++ : 1    for (i = 0; i < count; i += 2 ) {	switch(*bp++) {	  case GLX_RGBA:	    FETCH_OR_SET( rgbMode );	    break;	  case GLX_BUFFER_SIZE:	    config->rgbBits = *bp++;	    break;	  case GLX_LEVEL:	    config->level = *bp++;	    break;	  case GLX_DOUBLEBUFFER:	    FETCH_OR_SET( doubleBufferMode );	    break;	  case GLX_STEREO:	    FETCH_OR_SET( stereoMode );	    break;	  case GLX_AUX_BUFFERS:	    config->numAuxBuffers = *bp++;	    break;	  case GLX_RED_SIZE:	    config->redBits = *bp++;	    break;	  case GLX_GREEN_SIZE:	    config->greenBits = *bp++;	    break;	  case GLX_BLUE_SIZE:	    config->blueBits = *bp++;	    break;	  case GLX_ALPHA_SIZE:	    config->alphaBits = *bp++;	    break;	  case GLX_DEPTH_SIZE:	    config->depthBits = *bp++;	    break;	  case GLX_STENCIL_SIZE:	    config->stencilBits = *bp++;	    break;	  case GLX_ACCUM_RED_SIZE:	    config->accumRedBits = *bp++;	    break;	  case GLX_ACCUM_GREEN_SIZE:	    config->accumGreenBits = *bp++;	    break;	  case GLX_ACCUM_BLUE_SIZE:	    config->accumBlueBits = *bp++;	    break;	  case GLX_ACCUM_ALPHA_SIZE:	    config->accumAlphaBits = *bp++;	    break;	  case GLX_VISUAL_CAVEAT_EXT:	    config->visualRating = *bp++;    	    break;	  case GLX_X_VISUAL_TYPE:	    config->visualType = *bp++;	    break;	  case GLX_TRANSPARENT_TYPE:	    config->transparentPixel = *bp++;    	    break;	  case GLX_TRANSPARENT_INDEX_VALUE:	    config->transparentIndex = *bp++;    	    break;	  case GLX_TRANSPARENT_RED_VALUE:	    config->transparentRed = *bp++;    	    break;	  case GLX_TRANSPARENT_GREEN_VALUE:	    config->transparentGreen = *bp++;    	    break;	  case GLX_TRANSPARENT_BLUE_VALUE:	    config->transparentBlue = *bp++;    	    break;	  case GLX_TRANSPARENT_ALPHA_VALUE:	    config->transparentAlpha = *bp++;    	    break;	  case GLX_VISUAL_ID:	    config->visualID = *bp++;	    break;	  case GLX_DRAWABLE_TYPE:	    config->drawableType = *bp++;	    break;	  case GLX_RENDER_TYPE:	    config->renderType = *bp++;	    break;	  case GLX_X_RENDERABLE:	    config->xRenderable = *bp++;	    break;	  case GLX_FBCONFIG_ID:	    config->fbconfigID = *bp++;	    break;	  case GLX_MAX_PBUFFER_WIDTH:	    config->maxPbufferWidth = *bp++;	    break;	  case GLX_MAX_PBUFFER_HEIGHT:	    config->maxPbufferHeight = *bp++;	    break;	  case GLX_MAX_PBUFFER_PIXELS:	    config->maxPbufferPixels = *bp++;	    break;	  case GLX_OPTIMAL_PBUFFER_WIDTH_SGIX:	    config->optimalPbufferWidth = *bp++;	    break;	  case GLX_OPTIMAL_PBUFFER_HEIGHT_SGIX:	    config->optimalPbufferHeight = *bp++;	    break;	  case GLX_VISUAL_SELECT_GROUP_SGIX:	    config->visualSelectGroup = *bp++;	    break;	  case GLX_SWAP_METHOD_OML:	    config->swapMethod = *bp++;	    break;	  case GLX_SAMPLE_BUFFERS_SGIS:	    config->sampleBuffers = *bp++;	    break;	  case GLX_SAMPLES_SGIS:	    config->samples = *bp++;	    break;	  case None:	    i = count;	    break;	  default:	    break;	}    }    config->renderType = (config->rgbMode) ? GLX_RGBA_BIT : GLX_COLOR_INDEX_BIT;    config->haveAccumBuffer = ((config->accumRedBits +			       config->accumGreenBits +			       config->accumBlueBits +			       config->accumAlphaBits) > 0);    config->haveDepthBuffer = (config->depthBits > 0);    config->haveStencilBuffer = (config->stencilBits > 0);}#ifdef GLX_DIRECT_RENDERINGstatic unsignedfilter_modes( __GLcontextModes ** server_modes,	      const __GLcontextModes * driver_modes ){    __GLcontextModes * m;    __GLcontextModes ** prev_next;    const __GLcontextModes * check;    unsigned modes_count = 0;    if ( driver_modes == NULL ) {	fprintf(stderr, "libGL warning: 3D driver returned no fbconfigs.\n");	return 0;    }    /* For each mode in server_modes, check to see if a matching mode exists     * in driver_modes.  If not, then the mode is not available.     */    prev_next = server_modes;    for ( m = *prev_next ; m != NULL ; m = *prev_next ) {	GLboolean do_delete = GL_TRUE;	for ( check = driver_modes ; check != NULL ; check = check->next ) {	    if ( _gl_context_modes_are_same( m, check ) ) {		do_delete = GL_FALSE;		break;	    }	}	/* The 3D has to support all the modes that match the GLX visuals	 * sent from the X server.	 */	if ( do_delete && (m->visualID != 0) ) {	    do_delete = GL_FALSE;	    fprintf(stderr, "libGL warning: 3D driver claims to not support "		    "visual 0x%02x\n", m->visualID);	}	if ( do_delete ) {	    *prev_next = m->next;	    m->next = NULL;	    _gl_context_modes_destroy( m );	}	else {	    modes_count++;	    prev_next = & m->next;	}    }    return modes_count;}/** * Implement \c __DRIinterfaceMethods::getProcAddress. */static __DRIfuncPtr get_proc_address( const char * proc_name ){    if (strcmp( proc_name, "glxEnableExtension" ) == 0) {	return (__DRIfuncPtr) __glXScrEnableExtension;    }        return NULL;}/** * Table of functions exported by the loader to the driver. */static const __DRIinterfaceMethods interface_methods = {    get_proc_address,    _gl_context_modes_create,    _gl_context_modes_destroy,          __glXFindDRIScreen,    __glXWindowExists,          XF86DRICreateContextWithConfig,    XF86DRIDestroyContext,    XF86DRICreateDrawable,    XF86DRIDestroyDrawable,    XF86DRIGetDrawableInfo,    __glXGetUST,    glXGetMscRateOML,};/** * Perform the required libGL-side initialization and call the client-side * driver's \c __driCreateNewScreen function. *  * \param dpy    Display pointer. * \param scrn   Screen number on the display. * \param psc    DRI screen information. * \param driDpy DRI display information. * \param createNewScreen  Pointer to the client-side driver's *               \c __driCreateNewScreen function. * \returns A pointer to the \c __DRIscreenPrivate structure returned by *          the client-side driver on success, or \c NULL on failure. *  * \todo This function needs to be modified to remove context-modes from the *       list stored in the \c __GLXscreenConfigsRec to match the list *       returned by the client-side driver. */static void *CallCreateNewScreen(Display *dpy, int scrn, __DRIscreen *psc,		    __DRIdisplay * driDpy,		    PFNCREATENEWSCREENFUNC createNewScreen){    __DRIscreenPrivate *psp = NULL;#ifndef GLX_USE_APPLEGL    drm_handle_t hSAREA;    drmAddress pSAREA = MAP_FAILED;    char *BusID;    __DRIversion   ddx_version;    __DRIversion   dri_version;    __DRIversion   drm_version;    __DRIframebuffer  framebuffer;    int   fd = -1;    int   status;    const char * err_msg;    const char * err_extra;    int api_ver = __glXGetInternalVersion();    dri_version.major = driDpy->private->driMajor;    dri_version.minor = driDpy->private->driMinor;    dri_version.patch = driDpy->private->driPatch;    err_msg = "XF86DRIOpenConnection";    err_extra = NULL;    framebuffer.base = MAP_FAILED;    framebuffer.dev_priv = NULL;    if (XF86DRIOpenConnection(dpy, scrn, &hSAREA, &BusID)) {	fd = drmOpen(NULL,BusID);	Xfree(BusID); /* No longer needed */	err_msg = "open DRM";	err_extra = strerror( -fd );	if (fd >= 0) {	    drm_magic_t magic;	    err_msg = "drmGetMagic";	    err_extra = NULL;	    if (!drmGetMagic(fd, &magic)) {		drmVersionPtr version = drmGetVersion(fd);		if (version) {		    drm_version.major = version->version_major;		    drm_version.minor = version->version_minor;		    drm_version.patch = version->version_patchlevel;		    drmFreeVersion(version);		}		else {		    drm_version.major = -1;		    drm_version.minor = -1;		    drm_version.patch = -1;		}		err_msg = "XF86DRIAuthConnection";		if (XF86DRIAuthConnection(dpy, scrn, magic)) {		    char *driverName;		    /*		     * Get device name (like "tdfx") and the ddx version		     * numbers.  We'll check the version in each DRI driver's		     * "createNewScreen" function.		     */		    err_msg = "XF86DRIGetClientDriverName";		    if (XF86DRIGetClientDriverName(dpy, scrn,						   &ddx_version.major,						   &ddx_version.minor,						   &ddx_version.patch,						   &driverName)) {			drm_handle_t  hFB;			int        junk;			/* No longer needed. */			Xfree( driverName );			/*			 * Get device-specific info.  pDevPriv will point to a struct			 * (such as DRIRADEONRec in xfree86/driver/ati/radeon_dri.h)			 * that has information about the screen size, depth, pitch,			 * ancilliary buffers, DRM mmap handles, etc.			 */			err_msg = "XF86DRIGetDeviceInfo";			if (XF86DRIGetDeviceInfo(dpy, scrn,						 &hFB,						 &junk,						 &framebuffer.size,						 &framebuffer.stride,						 &framebuffer.dev_priv_size,						 &framebuffer.dev_priv)) {			    framebuffer.width = DisplayWidth(dpy, scrn);			    framebuffer.height = DisplayHeight(dpy, scrn);			    /*			     * Map the framebuffer region.			     */			    status = drmMap(fd, hFB, framebuffer.size, 					    (drmAddressPtr)&framebuffer.base);			    err_msg = "drmMap of framebuffer";			    err_extra = strerror( -status );			    if ( status == 0 ) {				/*				 * Map the SAREA region.  Further mmap regions				 * may be setup in each DRI driver's				 * "createNewScreen" function.				 */				status = drmMap(fd, hSAREA, SAREA_MAX, 						&pSAREA);				err_msg = "drmMap of sarea";				err_extra = strerror( -status );				if ( status == 0 ) {				    __GLcontextModes * driver_modes = NULL;				    __GLXscreenConfigs *configs = psc->screenConfigs;				    err_msg = "InitDriver";				    err_extra = NULL;				    psp = (*createNewScreen)(dpy, scrn,							     psc,							     configs->configs,							     & ddx_version,							     & dri_version,							     & drm_version,							     & framebuffer,							     pSAREA,							     fd,							     api_ver,							     & interface_methods,							     & driver_modes );				    filter_modes( & configs->configs,						  driver_modes );				    _gl_context_modes_destroy( driver_modes );				}			    }			}		    }		}	    }	}    }    if ( psp == NULL ) {	if ( pSAREA != MAP_FAILED ) {	    (void)drmUnmap(pSAREA, SAREA_MAX);	}	if ( framebuffer.base != MAP_FAILED ) {	    (void)drmUnmap((drmAddress)framebuffer.base, framebuffer.size);	}	if ( framebuffer.dev_priv != NULL ) {	    Xfree(framebuffer.dev_priv);	}	if ( fd >= 0 ) {	    (void)drmClose(fd);	}	(void)XF86DRICloseConnection(dpy, scrn);	if ( err_extra != NULL ) {	    fprintf(stderr, "libGL error: %s failed (%s)\n", err_msg,		    err_extra);	}	else {	    fprintf(stderr, "libGL error: %s failed\n", err_msg );	}        fprintf(stderr, "libGL error: reverting to (slow) indirect rendering\n");    }#endif /* !GLX_USE_APPLEGL */    return psp;}#endif /* GLX_DIRECT_RENDERING *//*** Allocate the memory for the per screen configs for each screen.** If that works then fetch the per screen configs data.*/static Bool AllocAndFetchScreenConfigs(Display *dpy, __GLXdisplayPrivate *priv){    xGLXGetVisualConfigsReq *req;    xGLXGetFBConfigsReq *fb_req;    xGLXVendorPrivateWithReplyReq *vpreq;    xGLXGetFBConfigsSGIXReq *sgi_req;    xGLXGetVisualConfigsReply reply;    __GLXscreenConfigs *psc;    __GLcontextModes *config;    GLint i, j, nprops, screens;    INT32 buf[__GLX_TOTAL_CONFIG], *props;    unsigned supported_request = 0;    unsigned prop_size;    /*    ** First allocate memory for the array of per screen configs.    */    screens = ScreenCount(dpy);    psc = (__GLXscreenConfigs*) Xmalloc(screens * sizeof(__GLXscreenConfigs));    if (!psc) {	return GL_FALSE;    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -