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

📄 glxext.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008) * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice including the dates of first publication and * either this permission notice or a reference to * http://oss.sgi.com/projects/FreeB/ * shall be included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * * Except as contained in this notice, the name of Silicon Graphics, Inc. * shall not be used in advertising or otherwise to promote the sale, use or * other dealings in this Software without prior written authorization from * Silicon Graphics, Inc. *//** * \file glxext.c * GLX protocol interface boot-strap code. * * Direct rendering support added by Precision Insight, Inc. * * \author Kevin E. Martin <kevin@precisioninsight.com> */     #include "glxclient.h"#include <X11/extensions/Xext.h>#include <X11/extensions/extutil.h>#include "glapi.h"#include "glxextensions.h"#include "glcontextmodes.h"#include "glheader.h"#ifdef USE_XCB#include <X11/Xlib-xcb.h>#include <xcb/xcb.h>#include <xcb/glx.h>#endif#ifdef DEBUGvoid __glXDumpDrawBuffer(__GLXcontext *ctx);#endif#ifdef USE_SPARC_ASMstatic void _glx_mesa_init_sparc_glapi_relocs(void);static int _mesa_sparc_needs_init = 1;#define INIT_MESA_SPARC { \    if(_mesa_sparc_needs_init) { \      _glx_mesa_init_sparc_glapi_relocs(); \      _mesa_sparc_needs_init = 0; \  } \}#else#define INIT_MESA_SPARC#endif/*** You can set this cell to 1 to force the gl drawing stuff to be** one command per packet*/_X_HIDDEN int __glXDebug = 0;/* Extension required boiler plate */static char *__glXExtensionName = GLX_EXTENSION_NAME;XExtensionInfo *__glXExtensionInfo = NULL;static /* const */ char *error_list[] = {    "GLXBadContext",    "GLXBadContextState",    "GLXBadDrawable",    "GLXBadPixmap",    "GLXBadContextTag",    "GLXBadCurrentWindow",    "GLXBadRenderRequest",    "GLXBadLargeRequest",    "GLXUnsupportedPrivateRequest",    "GLXBadFBConfig",    "GLXBadPbuffer",    "GLXBadCurrentDrawable",    "GLXBadWindow",};static int __glXCloseDisplay(Display *dpy, XExtCodes *codes){  GLXContext gc;  gc = __glXGetCurrentContext();  if (dpy == gc->currentDpy) {    __glXSetCurrentContextNull();    __glXFreeContext(gc);  }  return XextRemoveDisplay(__glXExtensionInfo, dpy);}static XEXT_GENERATE_ERROR_STRING(__glXErrorString, __glXExtensionName,				  __GLX_NUMBER_ERRORS, error_list)static /* const */ XExtensionHooks __glXExtensionHooks = {    NULL,				/* create_gc */    NULL,				/* copy_gc */    NULL,				/* flush_gc */    NULL,				/* free_gc */    NULL,				/* create_font */    NULL,				/* free_font */    __glXCloseDisplay,			/* close_display */    NULL,				/* wire_to_event */    NULL,				/* event_to_wire */    NULL,				/* error */    __glXErrorString,			/* error_string */};staticXEXT_GENERATE_FIND_DISPLAY(__glXFindDisplay, __glXExtensionInfo,			   __glXExtensionName, &__glXExtensionHooks,			   __GLX_NUMBER_EVENTS, NULL)/************************************************************************//*** Free the per screen configs data as well as the array of** __glXScreenConfigs.*/static void FreeScreenConfigs(__GLXdisplayPrivate *priv){    __GLXscreenConfigs *psc;    GLint i, screens;    /* Free screen configuration information */    psc = priv->screenConfigs;    screens = ScreenCount(priv->dpy);    for (i = 0; i < screens; i++, psc++) {	if (psc->configs) {	    _gl_context_modes_destroy( psc->configs );	    if (psc->effectiveGLXexts)		Xfree(psc->effectiveGLXexts);	    psc->configs = NULL;	/* NOTE: just for paranoia */	}        if (psc->visuals) {            _gl_context_modes_destroy( psc->visuals );            psc->visuals = NULL;  /* NOTE: just for paranoia */        } 	Xfree((char*) psc->serverGLXexts);#ifdef GLX_DIRECT_RENDERING	if (psc->driScreen) {	    psc->driScreen->destroyScreen(psc);	    __glxHashDestroy(psc->drawHash);            XFree(psc->driScreen);            psc->driScreen = NULL;	}#endif    }    XFree((char*) priv->screenConfigs);    priv->screenConfigs = NULL;}/*** Release the private memory referred to in a display private** structure.  The caller will free the extension structure.*/static int __glXFreeDisplayPrivate(XExtData *extension){    __GLXdisplayPrivate *priv;    priv = (__GLXdisplayPrivate*) extension->private_data;    FreeScreenConfigs(priv);    if(priv->serverGLXvendor) {	Xfree((char*)priv->serverGLXvendor);	priv->serverGLXvendor = 0x0; /* to protect against double free's */    }    if(priv->serverGLXversion) {	Xfree((char*)priv->serverGLXversion);	priv->serverGLXversion = 0x0; /* to protect against double free's */    }#ifdef GLX_DIRECT_RENDERING    /* Free the direct rendering per display data */    if (priv->driswDisplay)	(*priv->driswDisplay->destroyDisplay)(priv->driswDisplay);    priv->driswDisplay = NULL;    if (priv->driDisplay)	(*priv->driDisplay->destroyDisplay)(priv->driDisplay);    priv->driDisplay = NULL;#endif    Xfree((char*) priv);    return 0;}/************************************************************************//*** Query the version of the GLX extension.  This procedure works even if** the client extension is not completely set up.*/static Bool QueryVersion(Display *dpy, int opcode, int *major, int *minor){    xGLXQueryVersionReq *req;    xGLXQueryVersionReply reply;    /* Send the glXQueryVersion request */    LockDisplay(dpy);    GetReq(GLXQueryVersion,req);    req->reqType = opcode;    req->glxCode = X_GLXQueryVersion;    req->majorVersion = GLX_MAJOR_VERSION;    req->minorVersion = GLX_MINOR_VERSION;    _XReply(dpy, (xReply*) &reply, 0, False);    UnlockDisplay(dpy);    SyncHandle();    if (reply.majorVersion != GLX_MAJOR_VERSION) {	/*	** The server does not support the same major release as this	** client.	*/	return GL_FALSE;    }    *major = reply.majorVersion;    *minor = min(reply.minorVersion, GLX_MINOR_VERSION);    return GL_TRUE;}_X_HIDDEN void __glXInitializeVisualConfigFromTags( __GLcontextModes *config, int count, 				     const INT32 *bp, Bool tagged_only,				     Bool fbconfig_style_tags ){    int i;    if (!tagged_only) {	/* Copy in the first set of properties */	config->visualID = *bp++;	config->visualType = _gl_convert_from_x_visual_type( *bp++ );	config->rgbMode = *bp++;	config->redBits = *bp++;	config->greenBits = *bp++;	config->blueBits = *bp++;	config->alphaBits = *bp++;	config->accumRedBits = *bp++;	config->accumGreenBits = *bp++;	config->accumBlueBits = *bp++;	config->accumAlphaBits = *bp++;	config->doubleBufferMode = *bp++;	config->stereoMode = *bp++;	config->rgbBits = *bp++;	config->depthBits = *bp++;	config->stencilBits = *bp++;	config->numAuxBuffers = *bp++;	config->level = *bp++;	count -= __GLX_MIN_CONFIG_PROPS;    }    /*    ** 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 GLX_BIND_TO_TEXTURE_RGB_EXT:	    config->bindToTextureRgb = *bp++;	    break;	case GLX_BIND_TO_TEXTURE_RGBA_EXT:	    config->bindToTextureRgba = *bp++;	    break;	case GLX_BIND_TO_MIPMAP_TEXTURE_EXT:	    config->bindToMipmapTexture = *bp++;	    break;	case GLX_BIND_TO_TEXTURE_TARGETS_EXT:	    config->bindToTextureTargets = *bp++;	    break;	case GLX_Y_INVERTED_EXT:	    config->yInverted = *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);}static __GLcontextModes *createConfigsFromProperties(Display *dpy, int nvisuals, int nprops,			    int screen, GLboolean tagged_only){    INT32 buf[__GLX_TOTAL_CONFIG], *props;    unsigned prop_size;    __GLcontextModes *modes, *m;    int i;    if (nprops == 0)	return NULL;    /* FIXME: Is the __GLX_MIN_CONFIG_PROPS test correct for FBconfigs? */    /* Check number of properties */    if (nprops < __GLX_MIN_CONFIG_PROPS || nprops > __GLX_MAX_CONFIG_PROPS)	return NULL;    /* Allocate memory for our config structure */    modes = _gl_context_modes_create(nvisuals, sizeof(__GLcontextModes));    if (!modes)	return NULL;    prop_size = nprops * __GLX_SIZE_INT32;    if (prop_size <= sizeof(buf))	props = buf;    else	props = Xmalloc(prop_size);    /* Read each config structure and convert it into our format */    m = modes;    for (i = 0; i < nvisuals; i++) {	_XRead(dpy, (char *)props, prop_size);	/* Older X servers don't send this so we default it here. */	m->drawableType = GLX_WINDOW_BIT;	__glXInitializeVisualConfigFromTags(m, nprops, props,					    tagged_only, GL_TRUE);	m->screen = screen;	m = m->next;    }    if (props != buf)	Xfree(props);    return modes;}static GLbooleangetVisualConfigs(Display *dpy, __GLXdisplayPrivate *priv, int screen){    xGLXGetVisualConfigsReq *req;    __GLXscreenConfigs *psc;    xGLXGetVisualConfigsReply reply;        LockDisplay(dpy);    psc = priv->screenConfigs + screen;    psc->visuals = NULL;    GetReq(GLXGetVisualConfigs, req);    req->reqType = priv->majorOpcode;    req->glxCode = X_GLXGetVisualConfigs;    req->screen = screen;    if (!_XReply(dpy, (xReply*) &reply, 0, False))	goto out;    psc->visuals = createConfigsFromProperties(dpy,					       reply.numVisuals,					       reply.numProps,					       screen, GL_FALSE);

⌨️ 快捷键说明

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