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

📄 glx_pbuffer.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * (C) Copyright IBM Corporation 2004 * 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 * on the rights to use, copy, modify, merge, publish, distribute, sub * license, 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 and this permission notice (including the next * paragraph) 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 NON-INFRINGEMENT.  IN NO EVENT SHALL * IBM AND/OR THEIR SUPPLIERS 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. *//** * \file glx_pbuffer.c * Implementation of pbuffer related functions. *  * \author Ian Romanick <idr@us.ibm.com> */#include <inttypes.h>#include "glxclient.h"#include <X11/extensions/extutil.h>#include <X11/extensions/Xext.h>#include <assert.h>#include <string.h>#include "glapi.h"#include "glxextensions.h"#include "glcontextmodes.h"#include "glheader.h"/** * Change a drawable's attribute. * * This function is used to implement \c glXSelectEvent and * \c glXSelectEventSGIX. * * \note * This function dynamically determines whether to use the SGIX_pbuffer * version of the protocol or the GLX 1.3 version of the protocol. * * \todo * This function needs to be modified to work with direct-rendering drivers. */static voidChangeDrawableAttribute( Display * dpy, GLXDrawable drawable,			 const CARD32 * attribs, size_t num_attribs ){   __GLXdisplayPrivate *priv = __glXInitialize(dpy);   CARD32 * output;   CARD8 opcode;   if ( (dpy == NULL) || (drawable == 0) ) {      return;   }   opcode = __glXSetupForCommand(dpy);   if (!opcode)      return;   LockDisplay(dpy);   if ( (priv->majorVersion > 1) || (priv->minorVersion >= 3) ) {      xGLXChangeDrawableAttributesReq *req;      GetReqExtra( GLXChangeDrawableAttributes, 8 + (8 * num_attribs), req );      output = (CARD32 *) (req + 1);      req->reqType = opcode;      req->glxCode = X_GLXChangeDrawableAttributes;      req->drawable = drawable;      req->numAttribs = (CARD32) num_attribs;   }   else {      xGLXVendorPrivateWithReplyReq *vpreq;      GetReqExtra( GLXVendorPrivateWithReply, 4 + (8 * num_attribs), vpreq );      output = (CARD32 *) (vpreq + 1);      vpreq->reqType = opcode;      vpreq->glxCode = X_GLXVendorPrivateWithReply;      vpreq->vendorCode = X_GLXvop_ChangeDrawableAttributesSGIX;      output[0] = (CARD32) drawable;      output++;   }   (void) memcpy( output, attribs, sizeof( CARD32 ) * 2 * num_attribs );   UnlockDisplay(dpy);   SyncHandle();   return;}/** * Destroy a pbuffer. * * This function is used to implement \c glXDestroyPbuffer and * \c glXDestroyGLXPbufferSGIX. * * \note * This function dynamically determines whether to use the SGIX_pbuffer * version of the protocol or the GLX 1.3 version of the protocol. *  * \todo * This function needs to be modified to work with direct-rendering drivers. */static voidDestroyPbuffer( Display * dpy, GLXDrawable drawable ){   __GLXdisplayPrivate *priv = __glXInitialize(dpy);   CARD8 opcode;   if ( (dpy == NULL) || (drawable == 0) ) {      return;   }   opcode = __glXSetupForCommand(dpy);   if (!opcode)      return;   LockDisplay(dpy);   if ( (priv->majorVersion > 1) || (priv->minorVersion >= 3) ) {      xGLXDestroyPbufferReq * req;      GetReq( GLXDestroyPbuffer, req );      req->reqType = opcode;      req->glxCode = X_GLXDestroyPbuffer;      req->pbuffer = (GLXPbuffer) drawable;   }   else {      xGLXVendorPrivateWithReplyReq *vpreq;      CARD32 * data;      GetReqExtra( GLXVendorPrivateWithReply, 4, vpreq );      data = (CARD32 *) (vpreq + 1);      data[0] = (CARD32) drawable;      vpreq->reqType = opcode;      vpreq->glxCode = X_GLXVendorPrivateWithReply;      vpreq->vendorCode = X_GLXvop_DestroyGLXPbufferSGIX;   }   UnlockDisplay(dpy);   SyncHandle();   return;}#ifdef GLX_DIRECT_RENDERINGextern __GLXDRIdrawable *GetGLXDRIDrawable(Display *dpy, GLXDrawable drawable, int * const scrn_num);static GLenumdetermineTextureTarget(const int *attribs, int numAttribs){    GLenum target = 0;    int i;    for (i = 0; i < numAttribs; i++) {	if (attribs[2 * i] == GLX_TEXTURE_TARGET_EXT) {	    switch (attribs[2 * i + 1]) {	    case GLX_TEXTURE_2D_EXT:		target = GL_TEXTURE_2D;		break;	    case GLX_TEXTURE_RECTANGLE_EXT:		target = GL_TEXTURE_RECTANGLE_ARB;		break;	    }	}    }     return target;}#endif/** * Get a drawable's attribute. * * This function is used to implement \c glXGetSelectedEvent and * \c glXGetSelectedEventSGIX. * * \note * This function dynamically determines whether to use the SGIX_pbuffer * version of the protocol or the GLX 1.3 version of the protocol. * * \todo * The number of attributes returned is likely to be small, probably less than * 10.  Given that, this routine should try to use an array on the stack to * capture the reply rather than always calling Xmalloc. * * \todo * This function needs to be modified to work with direct-rendering drivers. */static intGetDrawableAttribute( Display *dpy, GLXDrawable drawable,		      int attribute, unsigned int *value ){   __GLXdisplayPrivate *priv;   xGLXGetDrawableAttributesReply reply;   CARD32 * data;   CARD8 opcode;   unsigned int length;   unsigned int i;   unsigned int num_attributes;   if ( (dpy == NULL) || (drawable == 0) ) {      return 0;   }   priv = __glXInitialize(dpy);   GLboolean use_glx_1_3 = ((priv->majorVersion > 1)			    || (priv->minorVersion >= 3));   *value = 0;   opcode = __glXSetupForCommand(dpy);   if (!opcode)      return 0;   LockDisplay(dpy);   if ( use_glx_1_3 ) {      xGLXGetDrawableAttributesReq *req;      GetReqExtra( GLXGetDrawableAttributes, 4, req );      req->reqType = opcode;      req->glxCode = X_GLXGetDrawableAttributes;      req->drawable = drawable;   }   else {      xGLXVendorPrivateWithReplyReq *vpreq;      GetReqExtra( GLXVendorPrivateWithReply, 4, vpreq );      data = (CARD32 *) (vpreq + 1);      data[0] = (CARD32) drawable;      vpreq->reqType = opcode;      vpreq->glxCode = X_GLXVendorPrivateWithReply;      vpreq->vendorCode = X_GLXvop_GetDrawableAttributesSGIX;   }   _XReply(dpy, (xReply*) &reply, 0, False);   if (reply.type == X_Error)   {       UnlockDisplay(dpy);       SyncHandle();       return 0;   }   length = reply.length;   if (length)   {       num_attributes = (use_glx_1_3) ? reply.numAttribs : length / 2;       data = (CARD32 *) Xmalloc( length * sizeof(CARD32) );       if ( data == NULL ) {	   /* Throw data on the floor */	   _XEatData(dpy, length);       } else {	   _XRead(dpy, (char *)data, length * sizeof(CARD32) );	   /* Search the set of returned attributes for the attribute requested by	    * the caller.	    */	   for ( i = 0 ; i < num_attributes ; i++ ) {	       if ( data[i*2] == attribute ) {		   *value = data[ (i*2) + 1 ];		   break;	       }	   }#ifdef GLX_DIRECT_RENDERING	   {		__GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable, NULL);		if (pdraw != NULL && !pdraw->textureTarget)		    pdraw->textureTarget = determineTextureTarget((const int *)data,								  num_attributes);	   }#endif	   Xfree( data );       }   }   UnlockDisplay(dpy);   SyncHandle();   return 0;}/** * Create a non-pbuffer GLX drawable. * * \todo * This function needs to be modified to work with direct-rendering drivers. */static GLXDrawableCreateDrawable( Display *dpy, const __GLcontextModes * fbconfig,		Drawable drawable, const int *attrib_list,		CARD8 glxCode ){   xGLXCreateWindowReq * req;   CARD32 * data;   unsigned int i;   CARD8 opcode;   i = 0;   if (attrib_list) {       while (attrib_list[i * 2] != None)	   i++;   }   opcode = __glXSetupForCommand(dpy);   if (!opcode)      return None;   LockDisplay(dpy);   GetReqExtra( GLXCreateWindow, 8 * i, req );   data = (CARD32 *) (req + 1);

⌨️ 快捷键说明

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