📄 glxext.c
字号:
/* ** 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 + -