5773 lines
		
	
	
		
			140 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			5773 lines
		
	
	
		
			140 KiB
		
	
	
	
		
			C
		
	
	
	
| /*
 | |
|  * Copyright © 2005 Novell, Inc.
 | |
|  *
 | |
|  * Permission to use, copy, modify, distribute, and sell this software
 | |
|  * and its documentation for any purpose is hereby granted without
 | |
|  * fee, provided that the above copyright notice appear in all copies
 | |
|  * and that both that copyright notice and this permission notice
 | |
|  * appear in supporting documentation, and that the name of
 | |
|  * Novell, Inc. not be used in advertising or publicity pertaining to
 | |
|  * distribution of the software without specific, written prior permission.
 | |
|  * Novell, Inc. makes no representations about the suitability of this
 | |
|  * software for any purpose. It is provided "as is" without express or
 | |
|  * implied warranty.
 | |
|  *
 | |
|  * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
 | |
|  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
 | |
|  * NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR
 | |
|  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
 | |
|  * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
 | |
|  * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
 | |
|  * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 | |
|  *
 | |
|  * Author: David Reveman <davidr@novell.com>
 | |
|  */
 | |
| 
 | |
| #include "xgl.h"
 | |
| #include "xglglx.h"
 | |
| #include "xglglxext.h"
 | |
| 
 | |
| #include <GL/gl.h>
 | |
| #include <GL/glext.h>
 | |
| #include <GL/internal/glcore.h>
 | |
| 
 | |
| #include "glxserver.h"
 | |
| #include "glxdrawable.h"
 | |
| #include "glxscreens.h"
 | |
| #include "glxutil.h"
 | |
| #include "unpack.h"
 | |
| #include "g_disptab.h"
 | |
| #include "glapitable.h"
 | |
| #include "glxext.h"
 | |
| #include "micmap.h"
 | |
| 
 | |
| #define XGL_MAX_TEXTURE_UNITS      8
 | |
| #define XGL_MAX_ATTRIB_STACK_DEPTH 16
 | |
| 
 | |
| #define XGL_TEXTURE_1D_BIT	  (1 << 0)
 | |
| #define XGL_TEXTURE_2D_BIT	  (1 << 1)
 | |
| #define XGL_TEXTURE_3D_BIT	  (1 << 2)
 | |
| #define XGL_TEXTURE_RECTANGLE_BIT (1 << 3)
 | |
| #define XGL_TEXTURE_CUBE_MAP_BIT  (1 << 4)
 | |
| 
 | |
| typedef Bool	      (*GLXScreenProbeProc)    (int screen);
 | |
| typedef __GLinterface *(*GLXCreateContextProc) (__GLimports      *imports,
 | |
| 						__GLcontextModes *modes,
 | |
| 						__GLinterface    *shareGC);
 | |
| typedef void	      (*GLXCreateBufferProc)   (__GLXdrawablePrivate *glxPriv);
 | |
| typedef GLboolean     (*GLXSwapBuffersProc)    (__GLXdrawablePrivate *glxPriv);
 | |
| typedef int	      (*GLXBindBuffersProc)    (__GLXdrawablePrivate *glxPriv,
 | |
| 						int		     buffer);
 | |
| typedef int	      (*GLXReleaseBuffersProc) (__GLXdrawablePrivate *glxPriv,
 | |
| 						int		     buffer);
 | |
| 
 | |
| typedef struct _xglGLXScreenInfo {
 | |
|     GLXScreenProbeProc   screenProbe;
 | |
|     GLXCreateContextProc createContext;
 | |
|     GLXCreateBufferProc  createBuffer;
 | |
| } xglGLXScreenInfoRec, *xglGLXScreenInfoPtr;
 | |
| 
 | |
| extern __GLXscreenInfo *__xglScreenInfoPtr;
 | |
| 
 | |
| static xglGLXScreenInfoRec screenInfoPriv;
 | |
| 
 | |
| //extern __GLXscreenInfo __glDDXScreenInfo;
 | |
| 
 | |
| typedef GLboolean (*GLResizeBuffersProc) (__GLdrawableBuffer   *buffer,
 | |
| 					  GLint		       x,
 | |
| 					  GLint		       y,
 | |
| 					  GLuint	       width,
 | |
| 					  GLuint	       height,
 | |
| 					  __GLdrawablePrivate  *glPriv,
 | |
| 					  GLuint	       bufferMask);
 | |
| typedef void	  (*GLFreeBuffersProc)   (__GLdrawablePrivate  *glPriv);
 | |
| 
 | |
| typedef struct _xglGLBuffer {
 | |
|     GLXSwapBuffersProc    swapBuffers;
 | |
|     GLXBindBuffersProc    bindBuffers;
 | |
|     GLXReleaseBuffersProc releaseBuffers;
 | |
|     GLResizeBuffersProc   resizeBuffers;
 | |
|     GLFreeBuffersProc     freeBuffers;
 | |
|     ScreenPtr		  pScreen;
 | |
|     DrawablePtr		  pDrawable;
 | |
|     xglVisualPtr	  pVisual;
 | |
|     glitz_drawable_t	  *drawable;
 | |
|     glitz_surface_t	  *backSurface;
 | |
|     PixmapPtr		  pPixmap;
 | |
|     GCPtr		  pGC;
 | |
|     RegionRec		  damage;
 | |
|     void	          *private;
 | |
|     int			  screenX, screenY;
 | |
|     int			  xOff, yOff;
 | |
|     int			  yFlip;
 | |
| } xglGLBufferRec, *xglGLBufferPtr;
 | |
| 
 | |
| typedef int xglGLXVisualConfigRec, *xglGLXVisualConfigPtr;
 | |
| typedef struct _xglDisplayList *xglDisplayListPtr;
 | |
| 
 | |
| #define XGL_LIST_OP_CALLS 0
 | |
| #define XGL_LIST_OP_DRAW  1
 | |
| #define XGL_LIST_OP_GL    2
 | |
| #define XGL_LIST_OP_LIST  3
 | |
| 
 | |
| typedef struct _xglGLOp {
 | |
|     void (*glProc) (struct _xglGLOp *pOp);
 | |
|     union {
 | |
| 	GLenum     enumeration;
 | |
| 	GLbitfield bitfield;
 | |
| 	GLsizei    size;
 | |
| 	struct {
 | |
| 	    GLint   x;
 | |
| 	    GLint   y;
 | |
| 	    GLsizei width;
 | |
| 	    GLsizei height;
 | |
| 	} rect;
 | |
| 	struct {
 | |
| 	    GLenum target;
 | |
| 	    GLuint texture;
 | |
| 	} bind_texture;
 | |
| 	struct {
 | |
| 	    GLenum  target;
 | |
| 	    GLenum  pname;
 | |
| 	    GLfloat params[4];
 | |
| 	} tex_parameter_fv;
 | |
| 	struct {
 | |
| 	    GLint   x;
 | |
| 	    GLint   y;
 | |
| 	    GLsizei width;
 | |
| 	    GLsizei height;
 | |
| 	    GLenum  type;
 | |
| 	} copy_pixels;
 | |
| 	struct {
 | |
| 	    GLenum  target;
 | |
| 	    GLint   level;
 | |
| 	    GLenum  internalformat;
 | |
| 	    GLint   x;
 | |
| 	    GLint   y;
 | |
| 	    GLsizei width;
 | |
| 	    GLint   border;
 | |
| 	} copy_tex_image_1d;
 | |
| 	struct {
 | |
| 	    GLenum  target;
 | |
| 	    GLint   level;
 | |
| 	    GLenum  internalformat;
 | |
| 	    GLint   x;
 | |
| 	    GLint   y;
 | |
| 	    GLsizei width;
 | |
| 	    GLsizei height;
 | |
| 	    GLint   border;
 | |
| 	} copy_tex_image_2d;
 | |
| 	struct {
 | |
| 	    GLenum  target;
 | |
| 	    GLint   level;
 | |
| 	    GLint   xoffset;
 | |
| 	    GLint   x;
 | |
| 	    GLint   y;
 | |
| 	    GLsizei width;
 | |
| 	} copy_tex_sub_image_1d;
 | |
| 	struct {
 | |
| 	    GLenum  target;
 | |
| 	    GLint   level;
 | |
| 	    GLint   xoffset;
 | |
| 	    GLint   yoffset;
 | |
| 	    GLint   x;
 | |
| 	    GLint   y;
 | |
| 	    GLsizei width;
 | |
| 	    GLsizei height;
 | |
| 	} copy_tex_sub_image_2d;
 | |
| 	struct {
 | |
| 	    GLenum  target;
 | |
| 	    GLenum  internalformat;
 | |
| 	    GLint   x;
 | |
| 	    GLint   y;
 | |
| 	    GLsizei width;
 | |
| 	} copy_color_table;
 | |
| 	struct {
 | |
| 	    GLenum  target;
 | |
| 	    GLsizei start;
 | |
| 	    GLint   x;
 | |
| 	    GLint   y;
 | |
| 	    GLsizei width;
 | |
| 	} copy_color_sub_table;
 | |
| 	struct {
 | |
| 	    GLenum  target;
 | |
| 	    GLenum  internalformat;
 | |
| 	    GLint   x;
 | |
| 	    GLint   y;
 | |
| 	    GLsizei width;
 | |
| 	} copy_convolution_filter_1d;
 | |
| 	struct {
 | |
| 	    GLenum  target;
 | |
| 	    GLenum  internalformat;
 | |
| 	    GLint   x;
 | |
| 	    GLint   y;
 | |
| 	    GLsizei width;
 | |
| 	    GLsizei height;
 | |
| 	} copy_convolution_filter_2d;
 | |
| 	struct {
 | |
| 	    GLenum  target;
 | |
| 	    GLint   level;
 | |
| 	    GLint   xoffset;
 | |
| 	    GLint   yoffset;
 | |
| 	    GLint   zoffset;
 | |
| 	    GLint   x;
 | |
| 	    GLint   y;
 | |
| 	    GLsizei width;
 | |
| 	    GLsizei height;
 | |
| 	} copy_tex_sub_image_3d;
 | |
| 	struct {
 | |
| 	    GLfloat x;
 | |
| 	    GLfloat y;
 | |
| 	    GLfloat z;
 | |
| 	} window_pos_3f;
 | |
|     } u;
 | |
| } xglGLOpRec, *xglGLOpPtr;
 | |
| 
 | |
| typedef struct _xglListOp {
 | |
|     int type;
 | |
|     union {
 | |
| 	GLuint	   list;
 | |
| 	xglGLOpPtr gl;
 | |
|     } u;
 | |
| } xglListOpRec, *xglListOpPtr;
 | |
| 
 | |
| typedef struct _xglDisplayList {
 | |
|     xglListOpPtr pOp;
 | |
|     int		 nOp;
 | |
|     int		 size;
 | |
| } xglDisplayListRec;
 | |
| 
 | |
| typedef struct _xglTexObj {
 | |
|     GLuint		   key;
 | |
|     GLuint		   name;
 | |
|     PixmapPtr		   pPixmap;
 | |
|     glitz_texture_object_t *object;
 | |
|     int			   refcnt;
 | |
| } xglTexObjRec, *xglTexObjPtr;
 | |
| 
 | |
| typedef struct _xglTexUnit {
 | |
|     GLbitfield   enabled;
 | |
|     xglTexObjPtr p1D;
 | |
|     xglTexObjPtr p2D;
 | |
|     xglTexObjPtr p3D;
 | |
|     xglTexObjPtr pRect;
 | |
|     xglTexObjPtr pCubeMap;
 | |
| } xglTexUnitRec, *xglTexUnitPtr;
 | |
| 
 | |
| typedef struct _xglGLAttributes {
 | |
|     GLbitfield	  mask;
 | |
|     GLenum	  drawBuffer;
 | |
|     GLenum	  readBuffer;
 | |
|     xRectangle	  viewport;
 | |
|     xRectangle	  scissor;
 | |
|     GLboolean	  scissorTest;
 | |
|     xglTexUnitRec texUnits[XGL_MAX_TEXTURE_UNITS];
 | |
| } xglGLAttributesRec, *xglGLAttributesPtr;
 | |
| 
 | |
| typedef struct _xglGLContext {
 | |
|     __GLinterface	      iface;
 | |
|     __GLinterface	      *mIface;
 | |
|     int			      refcnt;
 | |
|     struct _xglGLContext      *shared;
 | |
|     glitz_context_t	      *context;
 | |
|     struct _glapi_table	      glRenderTable;
 | |
|     PFNGLACTIVETEXTUREARBPROC ActiveTextureARB;
 | |
|     PFNGLWINDOWPOS3FMESAPROC  WindowPos3fMESA;
 | |
|     Bool		      needInit;
 | |
|     xglGLBufferPtr	      pDrawBuffer;
 | |
|     xglGLBufferPtr	      pReadBuffer;
 | |
|     int			      drawXoff, drawYoff;
 | |
|     __GLdrawablePrivate	      *readPriv;
 | |
|     __GLdrawablePrivate	      *drawPriv;
 | |
|     char		      *versionString;
 | |
|     GLenum		      errorValue;
 | |
|     GLboolean		      doubleBuffer;
 | |
|     GLint		      depthBits;
 | |
|     GLint		      stencilBits;
 | |
|     xglHashTablePtr	      texObjects;
 | |
|     xglHashTablePtr	      displayLists;
 | |
|     GLuint		      list;
 | |
|     GLenum		      listMode;
 | |
|     GLuint		      beginCnt;
 | |
|     xglDisplayListPtr	      pList;
 | |
|     GLuint		      groupList;
 | |
|     xglGLAttributesRec	      attrib;
 | |
|     xglGLAttributesRec	      attribStack[XGL_MAX_ATTRIB_STACK_DEPTH];
 | |
|     int			      nAttribStack;
 | |
|     int			      activeTexUnit;
 | |
|     GLint		      maxTexUnits;
 | |
|     GLint		      maxListNesting;
 | |
|     GLint		      maxAttribStackDepth;
 | |
| } xglGLContextRec, *xglGLContextPtr;
 | |
| 
 | |
| static xglGLContextPtr cctx = NULL;
 | |
| 
 | |
| static void
 | |
| xglSetCurrentContext (xglGLContextPtr pContext);
 | |
| 
 | |
| #define XGL_GLX_DRAW_PROLOGUE_WITHOUT_TEXTURES(pBox, nBox, pScissorBox)	  \
 | |
|     (pBox) = REGION_RECTS (cctx->pDrawBuffer->pGC->pCompositeClip);	  \
 | |
|     (nBox) = REGION_NUM_RECTS (cctx->pDrawBuffer->pGC->pCompositeClip);	  \
 | |
|     (pScissorBox)->x1 = cctx->attrib.scissor.x + cctx->pDrawBuffer->xOff; \
 | |
|     (pScissorBox)->x2 = (pScissorBox)->x1 + cctx->attrib.scissor.width;	  \
 | |
|     (pScissorBox)->y2 = cctx->attrib.scissor.y + cctx->pDrawBuffer->yOff; \
 | |
|     (pScissorBox)->y2 = cctx->pDrawBuffer->yFlip - (pScissorBox)->y2;	  \
 | |
|     (pScissorBox)->y1 = (pScissorBox)->y2 - cctx->attrib.scissor.height
 | |
| 
 | |
| #define XGL_GLX_DRAW_PROLOGUE(pBox, nBox, pScissorBox)		      \
 | |
|     XGL_GLX_DRAW_PROLOGUE_WITHOUT_TEXTURES (pBox, nBox, pScissorBox); \
 | |
|     xglSetupTextures ()
 | |
| 
 | |
| #define XGL_GLX_DRAW_BOX(pBox1, pBox2)			    \
 | |
|     (pBox1)->x1 = cctx->pDrawBuffer->screenX + (pBox2)->x1; \
 | |
|     (pBox1)->y1 = cctx->pDrawBuffer->screenY + (pBox2)->y1; \
 | |
|     (pBox1)->x2 = cctx->pDrawBuffer->screenX + (pBox2)->x2; \
 | |
|     (pBox1)->y2 = cctx->pDrawBuffer->screenY + (pBox2)->y2
 | |
| 
 | |
| #define XGL_GLX_INTERSECT_BOX(pBox1, pBox2) \
 | |
|     {					    \
 | |
| 	if ((pBox1)->x1 < (pBox2)->x1)	    \
 | |
| 	    (pBox1)->x1 = (pBox2)->x1;	    \
 | |
| 	if ((pBox1)->y1 < (pBox2)->y1)	    \
 | |
| 	    (pBox1)->y1 = (pBox2)->y1;	    \
 | |
| 	if ((pBox1)->x2 > (pBox2)->x2)	    \
 | |
| 	    (pBox1)->x2 = (pBox2)->x2;	    \
 | |
| 	if ((pBox1)->y2 > (pBox2)->y2)	    \
 | |
| 	    (pBox1)->y2 = (pBox2)->y2;	    \
 | |
|     }
 | |
| 
 | |
| #define XGL_GLX_SET_SCISSOR_BOX(pBox)		      \
 | |
|     glScissor ((pBox)->x1,			      \
 | |
| 	       cctx->pDrawBuffer->yFlip - (pBox)->y2, \
 | |
| 	       (pBox)->x2 - (pBox)->x1,		      \
 | |
| 	       (pBox)->y2 - (pBox)->y1)
 | |
| 
 | |
| #define XGL_GLX_DRAW_DAMAGE(pBox, pRegion)				 \
 | |
|     if (cctx->attrib.drawBuffer != GL_BACK)				 \
 | |
|     {									 \
 | |
| 	(pRegion)->extents.x1 = (pBox)->x1 - cctx->pDrawBuffer->screenX; \
 | |
| 	(pRegion)->extents.y1 = (pBox)->y1 - cctx->pDrawBuffer->screenY; \
 | |
| 	(pRegion)->extents.x2 = (pBox)->x2 - cctx->pDrawBuffer->screenX; \
 | |
| 	(pRegion)->extents.y2 = (pBox)->y2 - cctx->pDrawBuffer->screenY; \
 | |
| 	(pRegion)->data = (RegDataPtr) NULL;				 \
 | |
| 	REGION_UNION (cctx->pDrawBuffer->pGC->pScreen,			 \
 | |
| 		      &cctx->pDrawBuffer->damage,			 \
 | |
| 		      &cctx->pDrawBuffer->damage,			 \
 | |
| 		      pRegion);						 \
 | |
| 	xglAddBitDamage (cctx->pDrawBuffer->pDrawable, pRegion);	 \
 | |
|     }
 | |
| 
 | |
| static void
 | |
| xglRecordError (GLenum error)
 | |
| {
 | |
|     if (cctx->errorValue == GL_NO_ERROR)
 | |
| 	cctx->errorValue = error;
 | |
| }
 | |
| 
 | |
| static xglDisplayListPtr
 | |
| xglCreateList (void)
 | |
| {
 | |
|     xglDisplayListPtr pDisplayList;
 | |
| 
 | |
|     pDisplayList = xalloc (sizeof (xglDisplayListRec));
 | |
|     if (!pDisplayList)
 | |
| 	return NULL;
 | |
| 
 | |
|     pDisplayList->pOp  = NULL;
 | |
|     pDisplayList->nOp  = 0;
 | |
|     pDisplayList->size = 0;
 | |
| 
 | |
|     return pDisplayList;
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglDestroyList (xglDisplayListPtr pDisplayList)
 | |
| {
 | |
|     xglListOpPtr pOp = pDisplayList->pOp;
 | |
|     int		 nOp = pDisplayList->nOp;
 | |
| 
 | |
|     while (nOp--)
 | |
|     {
 | |
| 	switch (pOp->type) {
 | |
| 	case XGL_LIST_OP_CALLS:
 | |
| 	case XGL_LIST_OP_DRAW:
 | |
| 	    glDeleteLists (pOp->u.list, 1);
 | |
| 	    break;
 | |
| 	case XGL_LIST_OP_GL:
 | |
| 	    xfree (pOp->u.gl);
 | |
| 	    break;
 | |
| 	case XGL_LIST_OP_LIST:
 | |
| 	    break;
 | |
| 	}
 | |
| 
 | |
| 	pOp++;
 | |
|     }
 | |
| 
 | |
|     if (pDisplayList->pOp)
 | |
| 	xfree (pDisplayList->pOp);
 | |
| 
 | |
|     xfree (pDisplayList);
 | |
| }
 | |
| 
 | |
| static Bool
 | |
| xglResizeList (xglDisplayListPtr pDisplayList,
 | |
| 	       int		 nOp)
 | |
| {
 | |
|     if (pDisplayList->size < nOp)
 | |
|     {
 | |
| 	int size = pDisplayList->nOp ? pDisplayList->nOp : 4;
 | |
| 
 | |
| 	while (size < nOp)
 | |
| 	    size <<= 1;
 | |
| 
 | |
| 	pDisplayList->pOp = xrealloc (pDisplayList->pOp,
 | |
| 				      sizeof (xglListOpRec) * size);
 | |
| 	if (!pDisplayList->pOp)
 | |
| 	    return FALSE;
 | |
| 
 | |
| 	pDisplayList->size = size;
 | |
|     }
 | |
| 
 | |
|     return TRUE;
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglStartList (int    type,
 | |
| 	      GLenum mode)
 | |
| {
 | |
|     if (!xglResizeList (cctx->pList, cctx->pList->nOp + 1))
 | |
|     {
 | |
| 	xglRecordError (GL_OUT_OF_MEMORY);
 | |
| 	return;
 | |
|     }
 | |
| 
 | |
|     cctx->pList->pOp[cctx->pList->nOp].type   = type;
 | |
|     cctx->pList->pOp[cctx->pList->nOp].u.list = glGenLists (1);
 | |
| 
 | |
|     glNewList (cctx->pList->pOp[cctx->pList->nOp].u.list, mode);
 | |
| 
 | |
|     cctx->pList->nOp++;
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglGLOp (xglGLOpPtr pOp)
 | |
| {
 | |
|     if (cctx->list)
 | |
|     {
 | |
| 	xglGLOpPtr pGLOp;
 | |
| 
 | |
| 	pGLOp = xalloc (sizeof (xglGLOpRec));
 | |
| 	if (!pGLOp)
 | |
| 	{
 | |
| 	    xglRecordError (GL_OUT_OF_MEMORY);
 | |
| 	    return;
 | |
| 	}
 | |
| 
 | |
| 	if (!xglResizeList (cctx->pList, cctx->pList->nOp + 1))
 | |
| 	{
 | |
| 	    xfree (pGLOp);
 | |
| 	    xglRecordError (GL_OUT_OF_MEMORY);
 | |
| 	    return;
 | |
| 	}
 | |
| 
 | |
| 	glEndList ();
 | |
| 
 | |
| 	*pGLOp = *pOp;
 | |
| 
 | |
| 	cctx->pList->pOp[cctx->pList->nOp].type = XGL_LIST_OP_GL;
 | |
| 	cctx->pList->pOp[cctx->pList->nOp].u.gl = pGLOp;
 | |
| 	cctx->pList->nOp++;
 | |
| 
 | |
| 	if (cctx->listMode == GL_COMPILE_AND_EXECUTE)
 | |
| 	    (*pOp->glProc) (pOp);
 | |
| 
 | |
| 	xglStartList (XGL_LIST_OP_CALLS, cctx->listMode);
 | |
|     }
 | |
|     else
 | |
| 	(*pOp->glProc) (pOp);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglViewportProc (xglGLOpPtr pOp)
 | |
| {
 | |
|     cctx->attrib.viewport.x	 = pOp->u.rect.x;
 | |
|     cctx->attrib.viewport.y	 = pOp->u.rect.y;
 | |
|     cctx->attrib.viewport.width  = pOp->u.rect.width;
 | |
|     cctx->attrib.viewport.height = pOp->u.rect.height;
 | |
| 
 | |
|     glViewport (pOp->u.rect.x + cctx->pDrawBuffer->xOff,
 | |
| 		pOp->u.rect.y + cctx->pDrawBuffer->yOff,
 | |
| 		pOp->u.rect.width,
 | |
| 		pOp->u.rect.height);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglViewport (GLint   x,
 | |
| 	     GLint   y,
 | |
| 	     GLsizei width,
 | |
| 	     GLsizei height)
 | |
| {
 | |
|     xglGLOpRec gl;
 | |
| 
 | |
|     gl.glProc = xglViewportProc;
 | |
| 
 | |
|     gl.u.rect.x	     = x;
 | |
|     gl.u.rect.y	     = y;
 | |
|     gl.u.rect.width  = width;
 | |
|     gl.u.rect.height = height;
 | |
| 
 | |
|     xglGLOp (&gl);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglScissorProc (xglGLOpPtr pOp)
 | |
| {
 | |
|     cctx->attrib.scissor.x	= pOp->u.rect.x;
 | |
|     cctx->attrib.scissor.y	= pOp->u.rect.y;
 | |
|     cctx->attrib.scissor.width  = pOp->u.rect.width;
 | |
|     cctx->attrib.scissor.height = pOp->u.rect.height;
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglScissor (GLint   x,
 | |
| 	    GLint   y,
 | |
| 	    GLsizei width,
 | |
| 	    GLsizei height)
 | |
| {
 | |
|     xglGLOpRec gl;
 | |
| 
 | |
|     gl.glProc = xglScissorProc;
 | |
| 
 | |
|     gl.u.rect.x	     = x;
 | |
|     gl.u.rect.y	     = y;
 | |
|     gl.u.rect.width  = width;
 | |
|     gl.u.rect.height = height;
 | |
| 
 | |
|     xglGLOp (&gl);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglDrawBufferProc (xglGLOpPtr pOp)
 | |
| {
 | |
|     glitz_drawable_buffer_t buffers[2];
 | |
| 
 | |
|     switch (pOp->u.enumeration) {
 | |
|     case GL_FRONT:
 | |
| 	buffers[0] = GLITZ_DRAWABLE_BUFFER_FRONT_COLOR;
 | |
| 	glitz_context_draw_buffers (cctx->context, buffers, 1);
 | |
| 	break;
 | |
|     case GL_FRONT_AND_BACK:
 | |
| 	buffers[0] = GLITZ_DRAWABLE_BUFFER_FRONT_COLOR;
 | |
| 	if (cctx->doubleBuffer)
 | |
| 	{
 | |
| 	    buffers[1] = GLITZ_DRAWABLE_BUFFER_BACK_COLOR;
 | |
| 	    glitz_context_draw_buffers (cctx->context, buffers, 2);
 | |
| 	}
 | |
| 	else
 | |
| 	    glitz_context_draw_buffers (cctx->context, buffers, 1);
 | |
| 	break;
 | |
|     case GL_BACK:
 | |
| 	if (!cctx->doubleBuffer)
 | |
| 	{
 | |
| 	    xglRecordError (GL_INVALID_OPERATION);
 | |
| 	    return;
 | |
| 	}
 | |
| 	buffers[0] = GLITZ_DRAWABLE_BUFFER_BACK_COLOR;
 | |
| 	glitz_context_draw_buffers (cctx->context, buffers, 1);
 | |
| 	break;
 | |
|     default:
 | |
| 	xglRecordError (GL_INVALID_ENUM);
 | |
| 	return;
 | |
|     }
 | |
| 
 | |
|     cctx->attrib.drawBuffer = pOp->u.enumeration;
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglDrawBuffer (GLenum mode)
 | |
| {
 | |
|     xglGLOpRec gl;
 | |
| 
 | |
|     gl.glProc = xglDrawBufferProc;
 | |
| 
 | |
|     gl.u.enumeration = mode;
 | |
| 
 | |
|     xglGLOp (&gl);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglReadBufferProc (xglGLOpPtr pOp)
 | |
| {
 | |
|     switch (pOp->u.enumeration) {
 | |
|     case GL_FRONT:
 | |
| 	glitz_context_read_buffer (cctx->context,
 | |
| 				   GLITZ_DRAWABLE_BUFFER_FRONT_COLOR);
 | |
| 	break;
 | |
|     case GL_BACK:
 | |
| 	if (!cctx->doubleBuffer)
 | |
| 	{
 | |
| 	    xglRecordError (GL_INVALID_OPERATION);
 | |
| 	    return;
 | |
| 	}
 | |
| 	glitz_context_read_buffer (cctx->context,
 | |
| 				   GLITZ_DRAWABLE_BUFFER_BACK_COLOR);
 | |
| 	break;
 | |
|     default:
 | |
| 	xglRecordError (GL_INVALID_ENUM);
 | |
| 	return;
 | |
|     }
 | |
| 
 | |
|     cctx->attrib.readBuffer = pOp->u.enumeration;
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglReadBuffer (GLenum mode)
 | |
| {
 | |
|     xglGLOpRec gl;
 | |
| 
 | |
|     gl.glProc = xglReadBufferProc;
 | |
| 
 | |
|     gl.u.enumeration = mode;
 | |
| 
 | |
|     xglGLOp (&gl);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglDisableProc (xglGLOpPtr pOp)
 | |
| {
 | |
|     xglTexUnitPtr pTexUnit = &cctx->attrib.texUnits[cctx->activeTexUnit];
 | |
| 
 | |
|     switch (pOp->u.enumeration) {
 | |
|     case GL_SCISSOR_TEST:
 | |
| 	cctx->attrib.scissorTest = GL_FALSE;
 | |
| 	return;
 | |
|     case GL_TEXTURE_1D:
 | |
| 	pTexUnit->enabled &= ~XGL_TEXTURE_1D_BIT;
 | |
| 	break;
 | |
|     case GL_TEXTURE_2D:
 | |
| 	pTexUnit->enabled &= ~XGL_TEXTURE_2D_BIT;
 | |
| 	break;
 | |
|     case GL_TEXTURE_3D:
 | |
| 	pTexUnit->enabled &= ~XGL_TEXTURE_3D_BIT;
 | |
| 	break;
 | |
|     case GL_TEXTURE_RECTANGLE_NV:
 | |
| 	pTexUnit->enabled &= ~XGL_TEXTURE_RECTANGLE_BIT;
 | |
| 	break;
 | |
|     case GL_TEXTURE_CUBE_MAP_ARB:
 | |
| 	pTexUnit->enabled &= ~XGL_TEXTURE_CUBE_MAP_BIT;
 | |
| 	break;
 | |
|     default:
 | |
| 	break;
 | |
|     }
 | |
| 
 | |
|     glDisable (pOp->u.enumeration);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglDisable (GLenum cap)
 | |
| {
 | |
|     xglGLOpRec gl;
 | |
| 
 | |
|     gl.glProc = xglDisableProc;
 | |
| 
 | |
|     gl.u.enumeration = cap;
 | |
| 
 | |
|     xglGLOp (&gl);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglEnableProc (xglGLOpPtr pOp)
 | |
| {
 | |
|     xglTexUnitPtr pTexUnit = &cctx->attrib.texUnits[cctx->activeTexUnit];
 | |
| 
 | |
|     switch (pOp->u.enumeration) {
 | |
|     case GL_SCISSOR_TEST:
 | |
| 	cctx->attrib.scissorTest = GL_TRUE;
 | |
| 	return;
 | |
|     case GL_DEPTH_TEST:
 | |
| 	if (!cctx->depthBits)
 | |
| 	    return;
 | |
|     case GL_STENCIL_TEST:
 | |
| 	if (!cctx->stencilBits)
 | |
| 	    return;
 | |
|     case GL_TEXTURE_1D:
 | |
| 	pTexUnit->enabled |= XGL_TEXTURE_1D_BIT;
 | |
| 	break;
 | |
|     case GL_TEXTURE_2D:
 | |
| 	pTexUnit->enabled |= XGL_TEXTURE_2D_BIT;
 | |
| 	break;
 | |
|     case GL_TEXTURE_3D:
 | |
| 	pTexUnit->enabled |= XGL_TEXTURE_3D_BIT;
 | |
| 	break;
 | |
|     case GL_TEXTURE_RECTANGLE_NV:
 | |
| 	pTexUnit->enabled |= XGL_TEXTURE_RECTANGLE_BIT;
 | |
| 	break;
 | |
|     case GL_TEXTURE_CUBE_MAP_ARB:
 | |
| 	pTexUnit->enabled |= XGL_TEXTURE_CUBE_MAP_BIT;
 | |
| 	break;
 | |
|     default:
 | |
| 	break;
 | |
|     }
 | |
| 
 | |
|     glEnable (pOp->u.enumeration);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglEnable (GLenum cap)
 | |
| {
 | |
|     xglGLOpRec gl;
 | |
| 
 | |
|     gl.glProc = xglEnableProc;
 | |
| 
 | |
|     gl.u.enumeration = cap;
 | |
| 
 | |
|     xglGLOp (&gl);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglDeleteTexObj (xglTexObjPtr pTexObj)
 | |
| {
 | |
|     if (pTexObj->pPixmap)
 | |
|     {
 | |
| 	ScreenPtr pScreen = pTexObj->pPixmap->drawable.pScreen;
 | |
| 
 | |
| 	(*pScreen->DestroyPixmap) (pTexObj->pPixmap);
 | |
| 
 | |
| 	glitz_texture_object_destroy (pTexObj->object);
 | |
|     }
 | |
| 
 | |
|     if (pTexObj->name)
 | |
|     {
 | |
| 	glDeleteTextures (1, &pTexObj->name);
 | |
|     }
 | |
| 
 | |
|     pTexObj->key     = 0;
 | |
|     pTexObj->name    = 0;
 | |
|     pTexObj->pPixmap = NULL;
 | |
|     pTexObj->object  = NULL;
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglRefTexObj (xglTexObjPtr pTexObj)
 | |
| {
 | |
|     if (!pTexObj)
 | |
| 	return;
 | |
| 
 | |
|     pTexObj->refcnt++;
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglUnrefTexObj (xglTexObjPtr pTexObj)
 | |
| {
 | |
|     if (!pTexObj)
 | |
| 	return;
 | |
| 
 | |
|     pTexObj->refcnt--;
 | |
|     if (pTexObj->refcnt)
 | |
| 	return;
 | |
| 
 | |
|     xglDeleteTexObj (pTexObj);
 | |
| 
 | |
|     xfree (pTexObj);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglPushAttribProc (xglGLOpPtr pOp)
 | |
| {
 | |
|     xglGLAttributesPtr pAttrib;
 | |
| 
 | |
|     if (cctx->nAttribStack == cctx->maxAttribStackDepth)
 | |
|     {
 | |
| 	xglRecordError (GL_STACK_OVERFLOW);
 | |
| 	return;
 | |
|     }
 | |
| 
 | |
|     pAttrib = &cctx->attribStack[cctx->nAttribStack];
 | |
| 
 | |
|     *pAttrib = cctx->attrib;
 | |
|     pAttrib->mask = pOp->u.bitfield;
 | |
| 
 | |
|     if (pOp->u.bitfield & GL_TEXTURE_BIT)
 | |
|     {
 | |
| 	int i;
 | |
| 
 | |
| 	for (i = 0; i < cctx->maxTexUnits; i++)
 | |
| 	{
 | |
| 	    xglRefTexObj (pAttrib->texUnits[i].p1D);
 | |
| 	    xglRefTexObj (pAttrib->texUnits[i].p2D);
 | |
| 	    xglRefTexObj (pAttrib->texUnits[i].p3D);
 | |
| 	    xglRefTexObj (pAttrib->texUnits[i].pRect);
 | |
| 	    xglRefTexObj (pAttrib->texUnits[i].pCubeMap);
 | |
| 	}
 | |
|     }
 | |
| 
 | |
|     cctx->nAttribStack++;
 | |
| 
 | |
|     glPushAttrib (pOp->u.bitfield);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglPushAttrib (GLbitfield mask)
 | |
| {
 | |
|     xglGLOpRec gl;
 | |
| 
 | |
|     gl.glProc = xglPushAttribProc;
 | |
| 
 | |
|     gl.u.bitfield = mask;
 | |
| 
 | |
|     xglGLOp (&gl);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglPopAttribProc (xglGLOpPtr pOp)
 | |
| {
 | |
|     xglGLAttributesPtr pAttrib;
 | |
|     GLbitfield	       mask;
 | |
| 
 | |
|     if (!cctx->nAttribStack)
 | |
|     {
 | |
| 	xglRecordError (GL_STACK_UNDERFLOW);
 | |
| 	return;
 | |
|     }
 | |
| 
 | |
|     cctx->nAttribStack--;
 | |
| 
 | |
|     pAttrib = &cctx->attribStack[cctx->nAttribStack];
 | |
|     mask = pAttrib->mask;
 | |
| 
 | |
|     if (mask & GL_COLOR_BUFFER_BIT)
 | |
| 	xglDrawBuffer (pAttrib->drawBuffer);
 | |
| 
 | |
|     if (mask & GL_PIXEL_MODE_BIT)
 | |
| 	xglReadBuffer (pAttrib->readBuffer);
 | |
| 
 | |
|     if (mask & GL_SCISSOR_BIT)
 | |
|     {
 | |
| 	xglScissor (pAttrib->scissor.x,
 | |
| 		    pAttrib->scissor.y,
 | |
| 		    pAttrib->scissor.width,
 | |
| 		    pAttrib->scissor.height);
 | |
| 
 | |
| 	if (pAttrib->scissorTest)
 | |
| 	    xglEnable (GL_SCISSOR_TEST);
 | |
| 	else
 | |
| 	    xglDisable (GL_SCISSOR_TEST);
 | |
|     }
 | |
|     else if (mask & GL_ENABLE_BIT)
 | |
|     {
 | |
| 	if (pAttrib->scissorTest)
 | |
| 	    xglEnable (GL_SCISSOR_TEST);
 | |
| 	else
 | |
| 	    xglDisable (GL_SCISSOR_TEST);
 | |
|     }
 | |
| 
 | |
|     if (mask & GL_VIEWPORT_BIT)
 | |
| 	xglViewport (pAttrib->viewport.x,
 | |
| 		     pAttrib->viewport.y,
 | |
| 		     pAttrib->viewport.width,
 | |
| 		     pAttrib->viewport.height);
 | |
| 
 | |
|     if (mask & GL_TEXTURE_BIT)
 | |
|     {
 | |
| 	int i;
 | |
| 
 | |
| 	for (i = 0; i < cctx->maxTexUnits; i++)
 | |
| 	{
 | |
| 	    xglUnrefTexObj (cctx->attrib.texUnits[i].p1D);
 | |
| 	    xglUnrefTexObj (cctx->attrib.texUnits[i].p2D);
 | |
| 	    xglUnrefTexObj (cctx->attrib.texUnits[i].p3D);
 | |
| 	    xglUnrefTexObj (cctx->attrib.texUnits[i].pRect);
 | |
| 	    xglUnrefTexObj (cctx->attrib.texUnits[i].pCubeMap);
 | |
| 
 | |
| 	    cctx->attrib.texUnits[i] = pAttrib->texUnits[i];
 | |
| 	}
 | |
|     }
 | |
|     else if (mask & GL_ENABLE_BIT)
 | |
|     {
 | |
| 	int i;
 | |
| 
 | |
| 	for (i = 0; i < cctx->maxTexUnits; i++)
 | |
| 	    cctx->attrib.texUnits[i].enabled = pAttrib->texUnits[i].enabled;
 | |
|     }
 | |
| 
 | |
|     glPopAttrib ();
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglPopAttrib (void)
 | |
| {
 | |
|     xglGLOpRec gl;
 | |
| 
 | |
|     gl.glProc = xglPopAttribProc;
 | |
| 
 | |
|     xglGLOp (&gl);
 | |
| }
 | |
| 
 | |
| static GLuint
 | |
| xglActiveTextureBinding (GLenum target)
 | |
| {
 | |
|     xglTexObjPtr pTexObj;
 | |
| 
 | |
|     switch (target) {
 | |
|     case GL_TEXTURE_BINDING_1D:
 | |
| 	pTexObj = cctx->attrib.texUnits[cctx->activeTexUnit].p1D;
 | |
| 	break;
 | |
|     case GL_TEXTURE_BINDING_2D:
 | |
| 	pTexObj = cctx->attrib.texUnits[cctx->activeTexUnit].p2D;
 | |
| 	break;
 | |
|     case GL_TEXTURE_BINDING_3D:
 | |
| 	pTexObj = cctx->attrib.texUnits[cctx->activeTexUnit].p3D;
 | |
| 	break;
 | |
|     case GL_TEXTURE_BINDING_RECTANGLE_NV:
 | |
| 	pTexObj = cctx->attrib.texUnits[cctx->activeTexUnit].pRect;
 | |
| 	break;
 | |
|     case GL_TEXTURE_BINDING_CUBE_MAP_ARB:
 | |
| 	pTexObj = cctx->attrib.texUnits[cctx->activeTexUnit].pCubeMap;
 | |
| 	break;
 | |
|     default:
 | |
| 	return 0;
 | |
|     }
 | |
| 
 | |
|     if (pTexObj)
 | |
| 	return pTexObj->key;
 | |
| 
 | |
|     return 0;
 | |
| }
 | |
| 
 | |
| #define DOUBLE_TO_BOOLEAN(X) ((X) ? GL_TRUE : GL_FALSE)
 | |
| #define INT_TO_BOOLEAN(I)    ((I) ? GL_TRUE : GL_FALSE)
 | |
| #define ENUM_TO_BOOLEAN(E)   ((E) ? GL_TRUE : GL_FALSE)
 | |
| 
 | |
| static void
 | |
| xglGetBooleanv (GLenum	  pname,
 | |
| 		GLboolean *params)
 | |
| {
 | |
|     switch (pname) {
 | |
|     case GL_CURRENT_RASTER_POSITION:
 | |
|     {
 | |
| 	GLdouble v[4];
 | |
| 
 | |
| 	glGetDoublev (GL_CURRENT_RASTER_POSITION, v);
 | |
| 
 | |
| 	params[0] = DOUBLE_TO_BOOLEAN (v[0] - (GLdouble) cctx->drawXoff);
 | |
| 	params[1] = DOUBLE_TO_BOOLEAN (v[1] - (GLdouble) cctx->drawYoff);
 | |
| 	params[2] = DOUBLE_TO_BOOLEAN (v[2]);
 | |
| 	params[3] = DOUBLE_TO_BOOLEAN (v[3]);
 | |
|     } break;
 | |
|     case GL_DOUBLEBUFFER:
 | |
| 	params[0] = cctx->doubleBuffer;
 | |
| 	break;
 | |
|     case GL_DEPTH_BITS:
 | |
| 	params[0] = INT_TO_BOOLEAN (cctx->depthBits);
 | |
| 	break;
 | |
|     case GL_STENCIL_BITS:
 | |
| 	params[0] = INT_TO_BOOLEAN (cctx->stencilBits);
 | |
| 	break;
 | |
|     case GL_DRAW_BUFFER:
 | |
| 	params[0] = ENUM_TO_BOOLEAN (cctx->attrib.drawBuffer);
 | |
| 	break;
 | |
|     case GL_READ_BUFFER:
 | |
| 	params[0] = ENUM_TO_BOOLEAN (cctx->attrib.readBuffer);
 | |
| 	break;
 | |
|     case GL_SCISSOR_BOX:
 | |
| 	params[0] = INT_TO_BOOLEAN (cctx->attrib.scissor.x);
 | |
| 	params[1] = INT_TO_BOOLEAN (cctx->attrib.scissor.y);
 | |
| 	params[2] = INT_TO_BOOLEAN (cctx->attrib.scissor.width);
 | |
| 	params[3] = INT_TO_BOOLEAN (cctx->attrib.scissor.height);
 | |
| 	break;
 | |
|     case GL_SCISSOR_TEST:
 | |
| 	params[0] = cctx->attrib.scissorTest;
 | |
| 	break;
 | |
|     case GL_VIEWPORT:
 | |
| 	params[0] = INT_TO_BOOLEAN (cctx->attrib.viewport.x);
 | |
| 	params[1] = INT_TO_BOOLEAN (cctx->attrib.viewport.y);
 | |
| 	params[2] = INT_TO_BOOLEAN (cctx->attrib.viewport.width);
 | |
| 	params[3] = INT_TO_BOOLEAN (cctx->attrib.viewport.height);
 | |
| 	break;
 | |
|     case GL_TEXTURE_BINDING_1D:
 | |
|     case GL_TEXTURE_BINDING_2D:
 | |
|     case GL_TEXTURE_BINDING_3D:
 | |
|     case GL_TEXTURE_BINDING_RECTANGLE_NV:
 | |
|     case GL_TEXTURE_BINDING_CUBE_MAP_ARB:
 | |
| 	/* should be safe to fall-through here */
 | |
|     default:
 | |
| 	glGetBooleanv (pname, params);
 | |
|     }
 | |
| }
 | |
| 
 | |
| #define INT_TO_DOUBLE(I)     ((GLdouble) (I))
 | |
| #define ENUM_TO_DOUBLE(E)    ((GLdouble) (E))
 | |
| #define BOOLEAN_TO_DOUBLE(B) ((B) ? 1.0F : 0.0F)
 | |
| 
 | |
| static void
 | |
| xglGetDoublev (GLenum	pname,
 | |
| 	       GLdouble *params)
 | |
| {
 | |
|     switch (pname) {
 | |
|     case GL_CURRENT_RASTER_POSITION:
 | |
| 	glGetDoublev (GL_CURRENT_RASTER_POSITION, params);
 | |
| 
 | |
| 	params[0] -= (GLdouble) cctx->drawXoff;
 | |
| 	params[1] -= (GLdouble) cctx->drawYoff;
 | |
| 	break;
 | |
|     case GL_DOUBLEBUFFER:
 | |
| 	params[0] = BOOLEAN_TO_DOUBLE (cctx->doubleBuffer);
 | |
| 	break;
 | |
|     case GL_DEPTH_BITS:
 | |
| 	params[0] = INT_TO_DOUBLE (cctx->depthBits);
 | |
| 	break;
 | |
|     case GL_STENCIL_BITS:
 | |
| 	params[0] = INT_TO_DOUBLE (cctx->stencilBits);
 | |
| 	break;
 | |
|     case GL_DRAW_BUFFER:
 | |
| 	params[0] = ENUM_TO_DOUBLE (cctx->attrib.drawBuffer);
 | |
| 	break;
 | |
|     case GL_READ_BUFFER:
 | |
| 	params[0] = ENUM_TO_DOUBLE (cctx->attrib.readBuffer);
 | |
| 	break;
 | |
|     case GL_SCISSOR_BOX:
 | |
| 	params[0] = cctx->attrib.scissor.x;
 | |
| 	params[1] = cctx->attrib.scissor.y;
 | |
| 	params[2] = cctx->attrib.scissor.width;
 | |
| 	params[3] = cctx->attrib.scissor.height;
 | |
| 	break;
 | |
|     case GL_SCISSOR_TEST:
 | |
| 	params[0] = BOOLEAN_TO_DOUBLE (cctx->attrib.scissorTest);
 | |
| 	break;
 | |
|     case GL_VIEWPORT:
 | |
| 	params[0] = cctx->attrib.viewport.x;
 | |
| 	params[1] = cctx->attrib.viewport.y;
 | |
| 	params[2] = cctx->attrib.viewport.width;
 | |
| 	params[3] = cctx->attrib.viewport.height;
 | |
| 	break;
 | |
|     case GL_TEXTURE_BINDING_1D:
 | |
|     case GL_TEXTURE_BINDING_2D:
 | |
|     case GL_TEXTURE_BINDING_3D:
 | |
|     case GL_TEXTURE_BINDING_RECTANGLE_NV:
 | |
|     case GL_TEXTURE_BINDING_CUBE_MAP_ARB:
 | |
| 	params[0] = xglActiveTextureBinding (pname);
 | |
| 	break;
 | |
|     case GL_MAX_TEXTURE_UNITS_ARB:
 | |
| 	params[0] = cctx->maxTexUnits;
 | |
| 	break;
 | |
|     case GL_MAX_ATTRIB_STACK_DEPTH:
 | |
| 	params[0] = cctx->maxAttribStackDepth;
 | |
| 	break;
 | |
|     default:
 | |
| 	glGetDoublev (pname, params);
 | |
|     }
 | |
| }
 | |
| 
 | |
| #define INT_TO_FLOAT(I)     ((GLfloat) (I))
 | |
| #define ENUM_TO_FLOAT(E)    ((GLfloat) (E))
 | |
| #define BOOLEAN_TO_FLOAT(B) ((B) ? 1.0F : 0.0F)
 | |
| 
 | |
| static void
 | |
| xglGetFloatv (GLenum  pname,
 | |
| 	      GLfloat *params)
 | |
| {
 | |
|     switch (pname) {
 | |
|     case GL_CURRENT_RASTER_POSITION:
 | |
| 	glGetFloatv (GL_CURRENT_RASTER_POSITION, params);
 | |
| 
 | |
| 	params[0] -= (GLfloat) cctx->drawXoff;
 | |
| 	params[1] -= (GLfloat) cctx->drawYoff;
 | |
| 	break;
 | |
|     case GL_DOUBLEBUFFER:
 | |
| 	params[0] = BOOLEAN_TO_FLOAT (cctx->doubleBuffer);
 | |
| 	break;
 | |
|     case GL_DEPTH_BITS:
 | |
| 	params[0] = INT_TO_FLOAT (cctx->depthBits);
 | |
| 	break;
 | |
|     case GL_STENCIL_BITS:
 | |
| 	params[0] = INT_TO_FLOAT (cctx->stencilBits);
 | |
| 	break;
 | |
|     case GL_DRAW_BUFFER:
 | |
| 	params[0] = ENUM_TO_FLOAT (cctx->attrib.drawBuffer);
 | |
| 	break;
 | |
|     case GL_READ_BUFFER:
 | |
| 	params[0] = ENUM_TO_FLOAT (cctx->attrib.readBuffer);
 | |
| 	break;
 | |
|     case GL_SCISSOR_BOX:
 | |
| 	params[0] = cctx->attrib.scissor.x;
 | |
| 	params[1] = cctx->attrib.scissor.y;
 | |
| 	params[2] = cctx->attrib.scissor.width;
 | |
| 	params[3] = cctx->attrib.scissor.height;
 | |
| 	break;
 | |
|     case GL_SCISSOR_TEST:
 | |
| 	params[0] = BOOLEAN_TO_FLOAT (cctx->attrib.scissorTest);
 | |
| 	break;
 | |
|     case GL_VIEWPORT:
 | |
| 	params[0] = cctx->attrib.viewport.x;
 | |
| 	params[1] = cctx->attrib.viewport.y;
 | |
| 	params[2] = cctx->attrib.viewport.width;
 | |
| 	params[3] = cctx->attrib.viewport.height;
 | |
| 	break;
 | |
|     case GL_TEXTURE_BINDING_1D:
 | |
|     case GL_TEXTURE_BINDING_2D:
 | |
|     case GL_TEXTURE_BINDING_3D:
 | |
|     case GL_TEXTURE_BINDING_RECTANGLE_NV:
 | |
|     case GL_TEXTURE_BINDING_CUBE_MAP_ARB:
 | |
| 	params[0] = xglActiveTextureBinding (pname);
 | |
| 	break;
 | |
|     case GL_MAX_TEXTURE_UNITS_ARB:
 | |
| 	params[0] = cctx->maxTexUnits;
 | |
| 	break;
 | |
|     case GL_MAX_ATTRIB_STACK_DEPTH:
 | |
| 	params[0] = cctx->maxAttribStackDepth;
 | |
| 	break;
 | |
|     default:
 | |
| 	glGetFloatv (pname, params);
 | |
|     }
 | |
| }
 | |
| 
 | |
| #define ENUM_TO_INT(E)    ((GLint) (E))
 | |
| #define BOOLEAN_TO_INT(B) ((GLint) (B))
 | |
| 
 | |
| static void
 | |
| xglGetIntegerv (GLenum pname,
 | |
| 		GLint  *params)
 | |
| {
 | |
|     switch (pname) {
 | |
|     case GL_CURRENT_RASTER_POSITION:
 | |
| 	glGetIntegerv (GL_CURRENT_RASTER_POSITION, params);
 | |
| 
 | |
| 	params[0] -= (GLint) cctx->drawXoff;
 | |
| 	params[1] -= (GLint) cctx->drawYoff;
 | |
| 	break;
 | |
|     case GL_DOUBLEBUFFER:
 | |
| 	params[0] = BOOLEAN_TO_INT (cctx->doubleBuffer);
 | |
| 	break;
 | |
|     case GL_DEPTH_BITS:
 | |
| 	params[0] = cctx->depthBits;
 | |
| 	break;
 | |
|     case GL_STENCIL_BITS:
 | |
| 	params[0] = cctx->stencilBits;
 | |
| 	break;
 | |
|     case GL_DRAW_BUFFER:
 | |
| 	params[0] = ENUM_TO_INT (cctx->attrib.drawBuffer);
 | |
| 	break;
 | |
|     case GL_READ_BUFFER:
 | |
| 	params[0] = ENUM_TO_INT (cctx->attrib.readBuffer);
 | |
| 	break;
 | |
|     case GL_SCISSOR_BOX:
 | |
| 	params[0] = cctx->attrib.scissor.x;
 | |
| 	params[1] = cctx->attrib.scissor.y;
 | |
| 	params[2] = cctx->attrib.scissor.width;
 | |
| 	params[3] = cctx->attrib.scissor.height;
 | |
| 	break;
 | |
|     case GL_SCISSOR_TEST:
 | |
| 	params[0] = BOOLEAN_TO_INT (cctx->attrib.scissorTest);
 | |
| 	break;
 | |
|     case GL_VIEWPORT:
 | |
| 	params[0] = cctx->attrib.viewport.x;
 | |
| 	params[1] = cctx->attrib.viewport.y;
 | |
| 	params[2] = cctx->attrib.viewport.width;
 | |
| 	params[3] = cctx->attrib.viewport.height;
 | |
| 	break;
 | |
|     case GL_TEXTURE_BINDING_1D:
 | |
|     case GL_TEXTURE_BINDING_2D:
 | |
|     case GL_TEXTURE_BINDING_3D:
 | |
|     case GL_TEXTURE_BINDING_RECTANGLE_NV:
 | |
|     case GL_TEXTURE_BINDING_CUBE_MAP_ARB:
 | |
| 	params[0] = xglActiveTextureBinding (pname);
 | |
| 	break;
 | |
|     case GL_MAX_TEXTURE_UNITS_ARB:
 | |
| 	params[0] = cctx->maxTexUnits;
 | |
| 	break;
 | |
|     case GL_MAX_ATTRIB_STACK_DEPTH:
 | |
| 	params[0] = cctx->maxAttribStackDepth;
 | |
| 	break;
 | |
|     default:
 | |
| 	glGetIntegerv (pname, params);
 | |
|     }
 | |
| }
 | |
| 
 | |
| static GLboolean
 | |
| xglIsEnabled (GLenum cap)
 | |
| {
 | |
|     switch (cap) {
 | |
|     case GL_SCISSOR_TEST:
 | |
| 	return cctx->attrib.scissorTest;
 | |
|     default:
 | |
| 	return glIsEnabled (cap);
 | |
|     }
 | |
| }
 | |
| 
 | |
| static GLenum
 | |
| xglGetError (void)
 | |
| {
 | |
|     GLenum error = cctx->errorValue;
 | |
| 
 | |
|     if (error != GL_NO_ERROR)
 | |
|     {
 | |
| 	cctx->errorValue = GL_NO_ERROR;
 | |
| 	return error;
 | |
|     }
 | |
| 
 | |
|     return glGetError ();
 | |
| }
 | |
| 
 | |
| static const GLubyte *
 | |
| xglGetString (GLenum name)
 | |
| {
 | |
|     switch (name) {
 | |
|     case GL_VERSION:
 | |
| 	if (!cctx->versionString)
 | |
| 	{
 | |
| 	    static char *version = "1.2 (%s)";
 | |
| 	    char	*nativeVersion = (char *) glGetString (GL_VERSION);
 | |
| 
 | |
| 	    cctx->versionString = xalloc (strlen (version) +
 | |
| 					  strlen (nativeVersion));
 | |
| 	    if (cctx->versionString)
 | |
| 		sprintf (cctx->versionString, version, nativeVersion);
 | |
| 	}
 | |
| 	return (GLubyte *) cctx->versionString;
 | |
|     default:
 | |
| 	return glGetString (name);
 | |
|     }
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglGenTextures (GLsizei n,
 | |
| 		GLuint  *textures)
 | |
| {
 | |
|     xglTexObjPtr pTexObj;
 | |
|     GLuint	 name;
 | |
| 
 | |
|     name = xglHashFindFreeKeyBlock (cctx->shared->texObjects, n);
 | |
| 
 | |
|     glGenTextures (n, textures);
 | |
| 
 | |
|     while (n--)
 | |
|     {
 | |
| 	pTexObj = xalloc (sizeof (xglTexObjRec));
 | |
| 	if (pTexObj)
 | |
| 	{
 | |
| 	    pTexObj->key     = name;
 | |
| 	    pTexObj->name    = *textures;
 | |
| 	    pTexObj->pPixmap = NULL;
 | |
| 	    pTexObj->object  = NULL;
 | |
| 	    pTexObj->refcnt  = 1;
 | |
| 
 | |
| 	    xglHashInsert (cctx->shared->texObjects, name, pTexObj);
 | |
| 	}
 | |
| 	else
 | |
| 	{
 | |
| 	    xglRecordError (GL_OUT_OF_MEMORY);
 | |
| 	}
 | |
| 
 | |
| 	*textures++ = name++;
 | |
|     }
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglBindTextureProc (xglGLOpPtr pOp)
 | |
| {
 | |
|     xglTexObjPtr *ppTexObj;
 | |
| 
 | |
|     switch (pOp->u.bind_texture.target) {
 | |
|     case GL_TEXTURE_1D:
 | |
| 	ppTexObj = &cctx->attrib.texUnits[cctx->activeTexUnit].p1D;
 | |
| 	break;
 | |
|     case GL_TEXTURE_2D:
 | |
| 	ppTexObj = &cctx->attrib.texUnits[cctx->activeTexUnit].p2D;
 | |
| 	break;
 | |
|     case GL_TEXTURE_3D:
 | |
| 	ppTexObj = &cctx->attrib.texUnits[cctx->activeTexUnit].p3D;
 | |
| 	break;
 | |
|     case GL_TEXTURE_RECTANGLE_NV:
 | |
| 	ppTexObj = &cctx->attrib.texUnits[cctx->activeTexUnit].pRect;
 | |
| 	break;
 | |
|     case GL_TEXTURE_CUBE_MAP_ARB:
 | |
| 	ppTexObj = &cctx->attrib.texUnits[cctx->activeTexUnit].pCubeMap;
 | |
| 	break;
 | |
|     default:
 | |
| 	xglRecordError (GL_INVALID_ENUM);
 | |
| 	return;
 | |
|     }
 | |
| 
 | |
|     if (pOp->u.bind_texture.texture)
 | |
|     {
 | |
| 	if (!*ppTexObj || pOp->u.bind_texture.texture != (*ppTexObj)->key)
 | |
| 	{
 | |
| 	    xglTexObjPtr pTexObj;
 | |
| 
 | |
| 	    pTexObj = (xglTexObjPtr)
 | |
| 		xglHashLookup (cctx->shared->texObjects,
 | |
| 			       pOp->u.bind_texture.texture);
 | |
| 	    if (!pTexObj)
 | |
| 	    {
 | |
| 		pTexObj = xalloc (sizeof (xglTexObjRec));
 | |
| 		if (!pTexObj)
 | |
| 		{
 | |
| 		    xglRecordError (GL_OUT_OF_MEMORY);
 | |
| 		    return;
 | |
| 		}
 | |
| 
 | |
| 		pTexObj->key     = pOp->u.bind_texture.texture;
 | |
| 		pTexObj->pPixmap = NULL;
 | |
| 		pTexObj->object  = NULL;
 | |
| 		pTexObj->refcnt  = 1;
 | |
| 
 | |
| 		glGenTextures (1, &pTexObj->name);
 | |
| 
 | |
| 		xglHashInsert (cctx->shared->texObjects,
 | |
| 			       pOp->u.bind_texture.texture,
 | |
| 			       pTexObj);
 | |
| 	    }
 | |
| 
 | |
| 	    xglRefTexObj (pTexObj);
 | |
| 	    xglUnrefTexObj (*ppTexObj);
 | |
| 	    *ppTexObj = pTexObj;
 | |
| 
 | |
| 	    glBindTexture (pOp->u.bind_texture.target, pTexObj->name);
 | |
| 	}
 | |
|     }
 | |
|     else
 | |
|     {
 | |
| 	xglUnrefTexObj (*ppTexObj);
 | |
| 	*ppTexObj = NULL;
 | |
| 
 | |
| 	glBindTexture (pOp->u.bind_texture.target, 0);
 | |
|     }
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglBindTexture (GLenum target,
 | |
| 		GLuint texture)
 | |
| {
 | |
|     xglGLOpRec gl;
 | |
| 
 | |
|     gl.glProc = xglBindTextureProc;
 | |
| 
 | |
|     gl.u.bind_texture.target  = target;
 | |
|     gl.u.bind_texture.texture = texture;
 | |
| 
 | |
|     xglGLOp (&gl);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglSetupTextures (void)
 | |
| {
 | |
|     xglGLContextPtr pContext = cctx;
 | |
|     xglTexUnitPtr   pTexUnit;
 | |
|     xglTexObjPtr    pTexObj[XGL_MAX_TEXTURE_UNITS];
 | |
|     int		    i, activeTexUnit;
 | |
| 
 | |
|     for (i = 0; i < pContext->maxTexUnits; i++)
 | |
|     {
 | |
| 	pTexObj[i] = NULL;
 | |
| 
 | |
| 	pTexUnit = &pContext->attrib.texUnits[i];
 | |
| 	if (pTexUnit->enabled)
 | |
| 	{
 | |
| 	    if (pTexUnit->enabled & XGL_TEXTURE_RECTANGLE_BIT)
 | |
| 		pTexObj[i] = pTexUnit->pRect;
 | |
| 	    else if (pTexUnit->enabled & XGL_TEXTURE_2D_BIT)
 | |
| 		pTexObj[i] = pTexUnit->p2D;
 | |
| 
 | |
| 	    if (pTexObj[i] && pTexObj[i]->pPixmap)
 | |
| 	    {
 | |
| 		if (!xglSyncSurface (&pTexObj[i]->pPixmap->drawable))
 | |
| 		    pTexObj[i] = NULL;
 | |
| 	    }
 | |
| 	    else
 | |
| 		pTexObj[i] = NULL;
 | |
| 	}
 | |
|     }
 | |
| 
 | |
|     if (pContext != cctx)
 | |
|     {
 | |
| 	XGL_SCREEN_PRIV (pContext->pDrawBuffer->pGC->pScreen);
 | |
| 
 | |
| 	glitz_drawable_finish (pScreenPriv->drawable);
 | |
| 
 | |
| 	xglSetCurrentContext (pContext);
 | |
|     }
 | |
| 
 | |
|     activeTexUnit = cctx->activeTexUnit;
 | |
|     for (i = 0; i < pContext->maxTexUnits; i++)
 | |
|     {
 | |
| 	if (pTexObj[i])
 | |
| 	{
 | |
| 	    if (i != activeTexUnit)
 | |
| 	    {
 | |
| 		cctx->ActiveTextureARB (GL_TEXTURE0_ARB + i);
 | |
| 		activeTexUnit = i;
 | |
| 	    }
 | |
| 	    glitz_context_bind_texture (cctx->context, pTexObj[i]->object);
 | |
| 	}
 | |
|     }
 | |
| 
 | |
|     if (activeTexUnit != cctx->activeTexUnit)
 | |
| 	cctx->ActiveTextureARB (cctx->activeTexUnit);
 | |
| }
 | |
| 
 | |
| static GLboolean
 | |
| xglAreTexturesResident (GLsizei	     n,
 | |
| 			const GLuint *textures,
 | |
| 			GLboolean    *residences)
 | |
| {
 | |
|     GLboolean allResident = GL_TRUE;
 | |
|     int	      i, j;
 | |
| 
 | |
|     if (n < 0)
 | |
|     {
 | |
| 	xglRecordError (GL_INVALID_VALUE);
 | |
| 	return GL_FALSE;
 | |
|     }
 | |
| 
 | |
|     if (!textures || !residences)
 | |
| 	return GL_FALSE;
 | |
| 
 | |
|     for (i = 0; i < n; i++)
 | |
|     {
 | |
| 	xglTexObjPtr pTexObj;
 | |
| 	GLboolean    resident;
 | |
| 
 | |
| 	if (!textures[i])
 | |
| 	{
 | |
| 	    xglRecordError (GL_INVALID_VALUE);
 | |
| 	    return GL_FALSE;
 | |
| 	}
 | |
| 
 | |
| 	pTexObj = (xglTexObjPtr) xglHashLookup (cctx->shared->texObjects,
 | |
| 						textures[i]);
 | |
| 	if (!pTexObj)
 | |
| 	{
 | |
| 	    xglRecordError (GL_INVALID_VALUE);
 | |
| 	    return GL_FALSE;
 | |
| 	}
 | |
| 
 | |
| 	if (pTexObj->name == 0 ||
 | |
| 	    glAreTexturesResident (1, &pTexObj->name, &resident))
 | |
| 	{
 | |
| 	    if (!allResident)
 | |
| 		residences[i] = GL_TRUE;
 | |
| 	}
 | |
| 	else
 | |
| 	{
 | |
| 	    if (allResident)
 | |
| 	    {
 | |
| 		allResident = GL_FALSE;
 | |
| 
 | |
| 		for (j = 0; j < i; j++)
 | |
| 		    residences[j] = GL_TRUE;
 | |
| 	    }
 | |
| 	    residences[i] = GL_FALSE;
 | |
| 	}
 | |
|     }
 | |
| 
 | |
|     return allResident;
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglDeleteTextures (GLsizei	n,
 | |
| 		   const GLuint *textures)
 | |
| {
 | |
|     xglTexObjPtr pTexObj;
 | |
| 
 | |
|     while (n--)
 | |
|     {
 | |
| 	if (!*textures)
 | |
| 	    continue;
 | |
| 
 | |
| 	pTexObj = (xglTexObjPtr) xglHashLookup (cctx->shared->texObjects,
 | |
| 						*textures);
 | |
| 	if (pTexObj)
 | |
| 	{
 | |
| 	    xglDeleteTexObj (pTexObj);
 | |
| 	    xglUnrefTexObj (pTexObj);
 | |
| 	    xglHashRemove (cctx->shared->texObjects, *textures);
 | |
| 	}
 | |
| 	textures++;
 | |
|     }
 | |
| }
 | |
| 
 | |
| static GLboolean
 | |
| xglIsTexture (GLuint texture)
 | |
| {
 | |
|     xglTexObjPtr pTexObj;
 | |
| 
 | |
|     if (!texture)
 | |
| 	return GL_FALSE;
 | |
| 
 | |
|     pTexObj = (xglTexObjPtr) xglHashLookup (cctx->shared->texObjects, texture);
 | |
|     if (pTexObj)
 | |
| 	return GL_TRUE;
 | |
| 
 | |
|     return GL_FALSE;
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglPrioritizeTextures (GLsizei	      n,
 | |
| 		       const GLuint   *textures,
 | |
| 		       const GLclampf *priorities)
 | |
| {
 | |
|     xglTexObjPtr pTexObj;
 | |
|     int		 i;
 | |
| 
 | |
|     if (n < 0)
 | |
|     {
 | |
| 	xglRecordError (GL_INVALID_VALUE);
 | |
| 	return;
 | |
|     }
 | |
| 
 | |
|     if (!priorities)
 | |
| 	return;
 | |
| 
 | |
|     for (i = 0; i < n; i++)
 | |
|     {
 | |
| 	if (!textures[i])
 | |
| 	    continue;
 | |
| 
 | |
| 	pTexObj = (xglTexObjPtr) xglHashLookup (cctx->shared->texObjects,
 | |
| 						textures[i]);
 | |
| 	if (pTexObj && pTexObj->name)
 | |
| 	    glPrioritizeTextures (1, &pTexObj->name, &priorities[i]);
 | |
|     }
 | |
| }
 | |
| 
 | |
| static glitz_texture_filter_t
 | |
| xglTextureFilter (GLenum param)
 | |
| {
 | |
|     switch (param) {
 | |
|     case GL_LINEAR:
 | |
| 	return GLITZ_TEXTURE_FILTER_LINEAR;
 | |
|     case GL_NEAREST:
 | |
|     default:
 | |
| 	return GLITZ_TEXTURE_FILTER_NEAREST;
 | |
|     }
 | |
| }
 | |
| 
 | |
| static glitz_texture_wrap_t
 | |
| xglTextureWrap (GLenum param)
 | |
| {
 | |
|     switch (param) {
 | |
|     case GL_CLAMP_TO_EDGE:
 | |
| 	return GLITZ_TEXTURE_WRAP_CLAMP_TO_EDGE;
 | |
|     case GL_CLAMP_TO_BORDER:
 | |
| 	return GLITZ_TEXTURE_WRAP_CLAMP_TO_BORDER;
 | |
|     case GL_REPEAT:
 | |
| 	return GLITZ_TEXTURE_WRAP_REPEAT;
 | |
|     case GL_MIRRORED_REPEAT:
 | |
| 	return GLITZ_TEXTURE_WRAP_MIRRORED_REPEAT;
 | |
|     case GL_CLAMP:
 | |
|     default:
 | |
| 	return GLITZ_TEXTURE_WRAP_CLAMP;
 | |
|     }
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglTexParameterfvProc (xglGLOpPtr pOp)
 | |
| {
 | |
|     xglTexObjPtr pTexObj;
 | |
| 
 | |
|     glTexParameterfv (pOp->u.tex_parameter_fv.target,
 | |
| 		      pOp->u.tex_parameter_fv.pname,
 | |
| 		      pOp->u.tex_parameter_fv.params);
 | |
| 
 | |
|     switch (pOp->u.tex_parameter_fv.target) {
 | |
|     case GL_TEXTURE_2D:
 | |
| 	pTexObj = cctx->attrib.texUnits[cctx->activeTexUnit].p2D;
 | |
| 	break;
 | |
|     case GL_TEXTURE_RECTANGLE_NV:
 | |
| 	pTexObj = cctx->attrib.texUnits[cctx->activeTexUnit].pRect;
 | |
| 	break;
 | |
|     default:
 | |
| 	pTexObj = NULL;
 | |
| 	break;
 | |
|     }
 | |
| 
 | |
|     if (pTexObj && pTexObj->pPixmap)
 | |
|     {
 | |
| 	GLfloat *params = pOp->u.tex_parameter_fv.params;
 | |
| 
 | |
| 	switch (pOp->u.tex_parameter_fv.pname) {
 | |
| 	case GL_TEXTURE_MIN_FILTER:
 | |
| 	    glitz_texture_object_set_filter (pTexObj->object,
 | |
| 					     GLITZ_TEXTURE_FILTER_TYPE_MIN,
 | |
| 					     xglTextureFilter (params[0]));
 | |
| 	    break;
 | |
| 	case GL_TEXTURE_MAG_FILTER:
 | |
| 	    glitz_texture_object_set_filter (pTexObj->object,
 | |
| 					     GLITZ_TEXTURE_FILTER_TYPE_MAG,
 | |
| 					     xglTextureFilter (params[0]));
 | |
| 	    break;
 | |
| 	case GL_TEXTURE_WRAP_S:
 | |
| 	    glitz_texture_object_set_wrap (pTexObj->object,
 | |
| 					   GLITZ_TEXTURE_WRAP_TYPE_S,
 | |
| 					   xglTextureWrap (params[0]));
 | |
| 	    break;
 | |
| 	case GL_TEXTURE_WRAP_T:
 | |
| 	    glitz_texture_object_set_wrap (pTexObj->object,
 | |
| 					   GLITZ_TEXTURE_WRAP_TYPE_T,
 | |
| 					   xglTextureWrap (params[0]));
 | |
| 	    break;
 | |
| 	case GL_TEXTURE_BORDER_COLOR: {
 | |
| 	    glitz_color_t color;
 | |
| 
 | |
| 	    color.red   = params[0] * 0xffff;
 | |
| 	    color.green = params[1] * 0xffff;
 | |
| 	    color.blue  = params[2] * 0xffff;
 | |
| 	    color.alpha = params[3] * 0xffff;
 | |
| 
 | |
| 	    glitz_texture_object_set_border_color (pTexObj->object, &color);
 | |
| 	}
 | |
| 	default:
 | |
| 	    break;
 | |
| 	}
 | |
|     }
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglTexParameterfv (GLenum	 target,
 | |
| 		   GLenum	 pname,
 | |
| 		   const GLfloat *params)
 | |
| {
 | |
|     xglGLOpRec gl;
 | |
| 
 | |
|     gl.glProc = xglTexParameterfvProc;
 | |
| 
 | |
|     gl.u.tex_parameter_fv.target = target;
 | |
|     gl.u.tex_parameter_fv.pname  = pname;
 | |
| 
 | |
|     switch (pname) {
 | |
|     case GL_TEXTURE_BORDER_COLOR:
 | |
| 	gl.u.tex_parameter_fv.params[3] = params[3];
 | |
| 	gl.u.tex_parameter_fv.params[2] = params[2];
 | |
| 	gl.u.tex_parameter_fv.params[1] = params[1];
 | |
| 	/* fall-through */
 | |
|     default:
 | |
| 	gl.u.tex_parameter_fv.params[0] = params[0];
 | |
| 	break;
 | |
|     }
 | |
| 
 | |
|     xglGLOp (&gl);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglTexParameteriv (GLenum      target,
 | |
| 		   GLenum      pname,
 | |
| 		   const GLint *params)
 | |
| {
 | |
|     xglGLOpRec gl;
 | |
| 
 | |
|     gl.glProc = xglTexParameterfvProc;
 | |
| 
 | |
|     gl.u.tex_parameter_fv.target = target;
 | |
|     gl.u.tex_parameter_fv.pname  = pname;
 | |
| 
 | |
|     switch (pname) {
 | |
|     case GL_TEXTURE_BORDER_COLOR:
 | |
| 	gl.u.tex_parameter_fv.params[3] = (GLfloat) params[3] / INT_MAX;
 | |
| 	gl.u.tex_parameter_fv.params[2] = (GLfloat) params[2] / INT_MAX;
 | |
| 	gl.u.tex_parameter_fv.params[1] = (GLfloat) params[1] / INT_MAX;
 | |
| 	gl.u.tex_parameter_fv.params[0] = (GLfloat) params[0] / INT_MAX;
 | |
| 	break;
 | |
|     default:
 | |
| 	gl.u.tex_parameter_fv.params[0] = params[0];
 | |
| 	break;
 | |
|     }
 | |
| 
 | |
|     xglGLOp (&gl);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglTexParameterf (GLenum  target,
 | |
| 		  GLenum  pname,
 | |
| 		  GLfloat param)
 | |
| {
 | |
|     xglTexParameterfv (target, pname, (const GLfloat *) ¶m);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglTexParameteri (GLenum target,
 | |
| 		  GLenum pname,
 | |
| 		  GLint  param)
 | |
| {
 | |
|     xglTexParameteriv (target, pname, (const GLint *) ¶m);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglGetTexLevelParameterfv (GLenum  target,
 | |
| 			   GLint   level,
 | |
| 			   GLenum  pname,
 | |
| 			   GLfloat *params)
 | |
| {
 | |
|     xglTexObjPtr pTexObj;
 | |
| 
 | |
|     switch (target) {
 | |
|     case GL_TEXTURE_2D:
 | |
| 	pTexObj = cctx->attrib.texUnits[cctx->activeTexUnit].p2D;
 | |
| 	break;
 | |
|     case GL_TEXTURE_RECTANGLE_NV:
 | |
| 	pTexObj = cctx->attrib.texUnits[cctx->activeTexUnit].pRect;
 | |
| 	break;
 | |
|     default:
 | |
| 	pTexObj = NULL;
 | |
| 	break;
 | |
|     }
 | |
| 
 | |
|     if (pTexObj && pTexObj->pPixmap)
 | |
|     {
 | |
| 	glitz_context_bind_texture (cctx->context, pTexObj->object);
 | |
| 
 | |
| 	glGetTexLevelParameterfv (target, level, pname, params);
 | |
| 	glBindTexture (target, pTexObj->name);
 | |
|     }
 | |
|     else
 | |
| 	glGetTexLevelParameterfv (target, level, pname, params);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglGetTexLevelParameteriv (GLenum target,
 | |
| 			   GLint  level,
 | |
| 			   GLenum pname,
 | |
| 			   GLint  *params)
 | |
| {
 | |
|     xglTexObjPtr pTexObj;
 | |
| 
 | |
|     switch (target) {
 | |
|     case GL_TEXTURE_2D:
 | |
| 	pTexObj = cctx->attrib.texUnits[cctx->activeTexUnit].p2D;
 | |
| 	break;
 | |
|     case GL_TEXTURE_RECTANGLE_NV:
 | |
| 	pTexObj = cctx->attrib.texUnits[cctx->activeTexUnit].pRect;
 | |
| 	break;
 | |
|     default:
 | |
| 	pTexObj = NULL;
 | |
| 	break;
 | |
|     }
 | |
| 
 | |
|     if (pTexObj && pTexObj->pPixmap)
 | |
|     {
 | |
| 	glitz_context_bind_texture (cctx->context, pTexObj->object);
 | |
| 
 | |
| 	glGetTexLevelParameteriv (target, level, pname, params);
 | |
| 	glBindTexture (target, pTexObj->name);
 | |
|     }
 | |
|     else
 | |
| 	glGetTexLevelParameteriv (target, level, pname, params);
 | |
| }
 | |
| 
 | |
| static GLuint
 | |
| xglGenLists (GLsizei range)
 | |
| {
 | |
|     xglDisplayListPtr pDisplayList;
 | |
|     GLuint	      first, name;
 | |
| 
 | |
|     first = xglHashFindFreeKeyBlock (cctx->shared->displayLists, range);
 | |
| 
 | |
|     name = first;
 | |
|     for (name = first; range--; name++)
 | |
|     {
 | |
| 	pDisplayList = xglCreateList ();
 | |
| 	if (pDisplayList)
 | |
| 	{
 | |
| 	    xglHashInsert (cctx->shared->displayLists, name, pDisplayList);
 | |
| 	}
 | |
| 	else
 | |
| 	{
 | |
| 	    xglRecordError (GL_OUT_OF_MEMORY);
 | |
| 	}
 | |
|     }
 | |
| 
 | |
|     return first;
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglNewList (GLuint list,
 | |
| 	    GLenum mode)
 | |
| {
 | |
|     if (!list)
 | |
|     {
 | |
| 	xglRecordError (GL_INVALID_VALUE);
 | |
| 	return;
 | |
|     }
 | |
| 
 | |
|     if (cctx->list)
 | |
|     {
 | |
| 	xglRecordError (GL_INVALID_OPERATION);
 | |
| 	return;
 | |
|     }
 | |
| 
 | |
|     cctx->pList = xglCreateList ();
 | |
|     if (!cctx->pList)
 | |
|     {
 | |
| 	xglRecordError (GL_OUT_OF_MEMORY);
 | |
| 	return;
 | |
|     }
 | |
| 
 | |
|     cctx->list     = list;
 | |
|     cctx->listMode = mode;
 | |
| 
 | |
|     xglStartList (XGL_LIST_OP_CALLS, mode);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglEndList (void)
 | |
| {
 | |
|     xglDisplayListPtr pDisplayList;
 | |
| 
 | |
|     if (!cctx->list)
 | |
|     {
 | |
| 	xglRecordError (GL_INVALID_OPERATION);
 | |
| 	return;
 | |
|     }
 | |
| 
 | |
|     glEndList ();
 | |
| 
 | |
|     pDisplayList = (xglDisplayListPtr)
 | |
| 	xglHashLookup (cctx->shared->displayLists, cctx->list);
 | |
|     if (pDisplayList)
 | |
|     {
 | |
| 	xglHashRemove (cctx->shared->displayLists, cctx->list);
 | |
| 	xglDestroyList (pDisplayList);
 | |
|     }
 | |
| 
 | |
|     xglHashInsert (cctx->shared->displayLists, cctx->list, cctx->pList);
 | |
| 
 | |
|     cctx->list = 0;
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglDrawList (GLuint list)
 | |
| {
 | |
|     RegionRec region;
 | |
|     BoxRec    scissor, box;
 | |
|     BoxPtr    pBox;
 | |
|     int	      nBox;
 | |
| 
 | |
|     XGL_GLX_DRAW_PROLOGUE (pBox, nBox, &scissor);
 | |
| 
 | |
|     while (nBox--)
 | |
|     {
 | |
| 	XGL_GLX_DRAW_BOX (&box, pBox);
 | |
| 
 | |
| 	pBox++;
 | |
| 
 | |
| 	if (cctx->attrib.scissorTest)
 | |
| 	    XGL_GLX_INTERSECT_BOX (&box, &scissor);
 | |
| 
 | |
| 	if (box.x1 < box.x2 && box.y1 < box.y2)
 | |
| 	{
 | |
| 	    XGL_GLX_SET_SCISSOR_BOX (&box);
 | |
| 
 | |
| 	    glCallList (list);
 | |
| 
 | |
| 	    XGL_GLX_DRAW_DAMAGE (&box, ®ion);
 | |
| 	}
 | |
|     }
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglCallDisplayList (GLuint list,
 | |
| 		    int	   nesting)
 | |
| {
 | |
|     if (nesting > cctx->maxListNesting)
 | |
| 	return;
 | |
| 
 | |
|     if (!list)
 | |
|     {
 | |
| 	xglRecordError (GL_INVALID_VALUE);
 | |
| 	return;
 | |
|     }
 | |
| 
 | |
|     if (cctx->list)
 | |
|     {
 | |
| 	if (!xglResizeList (cctx->pList, cctx->pList->nOp + 1))
 | |
| 	{
 | |
| 	    xglRecordError (GL_OUT_OF_MEMORY);
 | |
| 	    return;
 | |
| 	}
 | |
| 
 | |
| 	cctx->pList->pOp[cctx->pList->nOp].type   = XGL_LIST_OP_LIST;
 | |
| 	cctx->pList->pOp[cctx->pList->nOp].u.list = list;
 | |
| 	cctx->pList->nOp++;
 | |
|     }
 | |
|     else
 | |
|     {
 | |
| 	xglDisplayListPtr pDisplayList;
 | |
| 
 | |
| 	pDisplayList = (xglDisplayListPtr)
 | |
| 	    xglHashLookup (cctx->shared->displayLists, list);
 | |
| 	if (pDisplayList)
 | |
| 	{
 | |
| 	    xglListOpPtr pOp = pDisplayList->pOp;
 | |
| 	    int		 nOp = pDisplayList->nOp;
 | |
| 
 | |
| 	    while (nOp--)
 | |
| 	    {
 | |
| 		switch (pOp->type) {
 | |
| 		case XGL_LIST_OP_CALLS:
 | |
| 		    glCallList (pOp->u.list);
 | |
| 		    break;
 | |
| 		case XGL_LIST_OP_DRAW:
 | |
| 		    xglDrawList (pOp->u.list);
 | |
| 		    break;
 | |
| 		case XGL_LIST_OP_GL:
 | |
| 		    (*pOp->u.gl->glProc) (pOp->u.gl);
 | |
| 		    break;
 | |
| 		case XGL_LIST_OP_LIST:
 | |
| 		    xglCallDisplayList (pOp->u.list, nesting + 1);
 | |
| 		    break;
 | |
| 		}
 | |
| 
 | |
| 		pOp++;
 | |
| 	    }
 | |
| 	}
 | |
|     }
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglCallList (GLuint list)
 | |
| {
 | |
|     xglCallDisplayList (list, 1);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglCallLists (GLsizei	   n,
 | |
| 	      GLenum	   type,
 | |
| 	      const GLvoid *lists)
 | |
| {
 | |
|     GLuint list;
 | |
|     GLint  base, i;
 | |
| 
 | |
|     glGetIntegerv (GL_LIST_BASE, &base);
 | |
| 
 | |
|     for (i = 0; i < n; i++)
 | |
|     {
 | |
| 	switch (type) {
 | |
| 	case GL_BYTE:
 | |
| 	    list = (GLuint) *(((GLbyte *) lists) + n);
 | |
| 	    break;
 | |
| 	case GL_UNSIGNED_BYTE:
 | |
| 	    list = (GLuint) *(((GLubyte *) lists) + n);
 | |
| 	    break;
 | |
| 	case GL_SHORT:
 | |
| 	    list = (GLuint) *(((GLshort *) lists) + n);
 | |
| 	    break;
 | |
| 	case GL_UNSIGNED_SHORT:
 | |
| 	    list = (GLuint) *(((GLushort *) lists) + n);
 | |
| 	    break;
 | |
| 	case GL_INT:
 | |
| 	    list = (GLuint) *(((GLint *) lists) + n);
 | |
| 	    break;
 | |
| 	case GL_UNSIGNED_INT:
 | |
| 	    list = (GLuint) *(((GLuint *) lists) + n);
 | |
| 	    break;
 | |
| 	case GL_FLOAT:
 | |
| 	    list = (GLuint) *(((GLfloat *) lists) + n);
 | |
| 	    break;
 | |
| 	case GL_2_BYTES:
 | |
| 	{
 | |
| 	    GLubyte *ubptr = ((GLubyte *) lists) + 2 * n;
 | |
| 	    list = (GLuint) *ubptr * 256 + (GLuint) *(ubptr + 1);
 | |
| 	} break;
 | |
| 	case GL_3_BYTES:
 | |
| 	{
 | |
| 	    GLubyte *ubptr = ((GLubyte *) lists) + 3 * n;
 | |
| 	    list = (GLuint) * ubptr * 65536
 | |
| 		+ (GLuint) * (ubptr + 1) * 256
 | |
| 		+ (GLuint) * (ubptr + 2);
 | |
| 	} break;
 | |
| 	case GL_4_BYTES:
 | |
| 	{
 | |
| 	    GLubyte *ubptr = ((GLubyte *) lists) + 4 * n;
 | |
| 	    list = (GLuint) * ubptr * 16777216
 | |
| 		+ (GLuint) * (ubptr + 1) * 65536
 | |
| 		+ (GLuint) * (ubptr + 2) * 256
 | |
| 		+ (GLuint) * (ubptr + 3);
 | |
| 	} break;
 | |
| 	default:
 | |
| 	    xglRecordError (GL_INVALID_ENUM);
 | |
| 	    return;
 | |
| 	}
 | |
| 
 | |
| 	xglCallDisplayList (base + list, 1);
 | |
|     }
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglDeleteLists (GLuint  list,
 | |
| 		GLsizei range)
 | |
| {
 | |
|     xglDisplayListPtr pDisplayList;
 | |
|     GLint	      i;
 | |
| 
 | |
|     if (range < 0)
 | |
|     {
 | |
| 	xglRecordError (GL_INVALID_VALUE);
 | |
| 	return;
 | |
|     }
 | |
| 
 | |
|     for (i = list; i < list + range; i++)
 | |
|     {
 | |
| 	if (!i)
 | |
| 	    continue;
 | |
| 
 | |
| 	pDisplayList = (xglDisplayListPtr)
 | |
| 	    xglHashLookup (cctx->shared->displayLists, i);
 | |
| 	if (pDisplayList)
 | |
| 	{
 | |
| 	    xglHashRemove (cctx->shared->displayLists, i);
 | |
| 	    xglDestroyList (pDisplayList);
 | |
| 	}
 | |
|     }
 | |
| }
 | |
| 
 | |
| static GLboolean
 | |
| xglIsList (GLuint list)
 | |
| {
 | |
|     xglDisplayListPtr pDisplayList;
 | |
| 
 | |
|     if (!list)
 | |
| 	return GL_FALSE;
 | |
| 
 | |
|     pDisplayList = (xglDisplayListPtr)
 | |
| 	xglHashLookup (cctx->shared->displayLists, list);
 | |
|     if (pDisplayList)
 | |
| 	return GL_TRUE;
 | |
| 
 | |
|     return GL_FALSE;
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglFlush (void)
 | |
| {
 | |
|     glFlush ();
 | |
| 
 | |
|     if (cctx && cctx->pDrawBuffer->pDrawable)
 | |
|     {
 | |
| 	xglGLBufferPtr pBuffer = cctx->pDrawBuffer;
 | |
| 
 | |
| 	if (REGION_NOTEMPTY (pBuffer->pDrawable->pScreen, &pBuffer->damage))
 | |
| 	{
 | |
| 	    XGL_DRAWABLE_PIXMAP_PRIV (pBuffer->pDrawable);
 | |
| 
 | |
| 	    DamageDamageRegion (pBuffer->pDrawable, &pBuffer->damage);
 | |
| 	    REGION_EMPTY (pBuffer->pDrawable->pScreen, &pBuffer->damage);
 | |
| 
 | |
| 	    pPixmapPriv->damageBox = miEmptyBox;
 | |
| 	}
 | |
|     }
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglFinish (void)
 | |
| {
 | |
|     glFinish ();
 | |
| 
 | |
|     if (cctx && cctx->pDrawBuffer->pDrawable)
 | |
|     {
 | |
| 	xglGLBufferPtr pBuffer = cctx->pDrawBuffer;
 | |
| 
 | |
| 	if (REGION_NOTEMPTY (pBuffer->pDrawable->pScreen, &pBuffer->damage))
 | |
| 	{
 | |
| 	    XGL_DRAWABLE_PIXMAP_PRIV (pBuffer->pDrawable);
 | |
| 
 | |
| 	    DamageDamageRegion (pBuffer->pDrawable, &pBuffer->damage);
 | |
| 	    REGION_EMPTY (pBuffer->pDrawable->pScreen, &pBuffer->damage);
 | |
| 
 | |
| 	    pPixmapPriv->damageBox = miEmptyBox;
 | |
| 	}
 | |
|     }
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglClear (GLbitfield mask)
 | |
| {
 | |
|     GLenum mode;
 | |
| 
 | |
|     if (cctx->list)
 | |
|     {
 | |
| 	glEndList ();
 | |
| 	xglStartList (XGL_LIST_OP_DRAW, GL_COMPILE);
 | |
| 	glClear (mask);
 | |
| 	glEndList ();
 | |
| 
 | |
| 	mode = cctx->listMode;
 | |
|     }
 | |
|     else
 | |
| 	mode = GL_COMPILE_AND_EXECUTE;
 | |
| 
 | |
|     if (mode == GL_COMPILE_AND_EXECUTE)
 | |
|     {
 | |
| 	RegionRec region;
 | |
| 	BoxRec    scissor, box;
 | |
| 	BoxPtr    pBox;
 | |
| 	int	  nBox;
 | |
| 
 | |
| 	XGL_GLX_DRAW_PROLOGUE_WITHOUT_TEXTURES (pBox, nBox, &scissor);
 | |
| 
 | |
| 	while (nBox--)
 | |
| 	{
 | |
| 	    XGL_GLX_DRAW_BOX (&box, pBox);
 | |
| 
 | |
| 	    pBox++;
 | |
| 
 | |
| 	    if (cctx->attrib.scissorTest)
 | |
| 		XGL_GLX_INTERSECT_BOX (&box, &scissor);
 | |
| 
 | |
| 	    if (box.x1 < box.x2 && box.y1 < box.y2)
 | |
| 	    {
 | |
| 		XGL_GLX_SET_SCISSOR_BOX (&box);
 | |
| 
 | |
| 		glClear (mask);
 | |
| 
 | |
| 		if (mask & GL_COLOR_BUFFER_BIT)
 | |
| 		    XGL_GLX_DRAW_DAMAGE (&box, ®ion);
 | |
| 	    }
 | |
| 	}
 | |
|     }
 | |
| 
 | |
|     if (cctx->list)
 | |
| 	xglStartList (XGL_LIST_OP_CALLS, cctx->listMode);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglAccum (GLenum  op,
 | |
| 	  GLfloat value)
 | |
| {
 | |
|     if (op == GL_RETURN)
 | |
|     {
 | |
| 	GLenum listMode;
 | |
| 
 | |
| 	if (cctx->list)
 | |
| 	{
 | |
| 	    glEndList ();
 | |
| 	    xglStartList (XGL_LIST_OP_DRAW, GL_COMPILE);
 | |
| 	    glAccum (GL_RETURN, value);
 | |
| 	    glEndList ();
 | |
| 
 | |
| 	    listMode = cctx->listMode;
 | |
| 	}
 | |
| 	else
 | |
| 	    listMode = GL_COMPILE_AND_EXECUTE;
 | |
| 
 | |
| 	if (listMode == GL_COMPILE_AND_EXECUTE)
 | |
| 	{
 | |
| 	    RegionRec region;
 | |
| 	    BoxRec    scissor, box;
 | |
| 	    BoxPtr    pBox;
 | |
| 	    int	      nBox;
 | |
| 
 | |
| 	    XGL_GLX_DRAW_PROLOGUE_WITHOUT_TEXTURES (pBox, nBox, &scissor);
 | |
| 
 | |
| 	    while (nBox--)
 | |
| 	    {
 | |
| 		XGL_GLX_DRAW_BOX (&box, pBox);
 | |
| 
 | |
| 		pBox++;
 | |
| 
 | |
| 		if (cctx->attrib.scissorTest)
 | |
| 		    XGL_GLX_INTERSECT_BOX (&box, &scissor);
 | |
| 
 | |
| 		if (box.x1 < box.x2 && box.y1 < box.y2)
 | |
| 		{
 | |
| 		    XGL_GLX_SET_SCISSOR_BOX (&box);
 | |
| 
 | |
| 		    glAccum (GL_RETURN, value);
 | |
| 
 | |
| 		    XGL_GLX_DRAW_DAMAGE (&box, ®ion);
 | |
| 		}
 | |
| 	    }
 | |
| 	}
 | |
| 
 | |
| 	if (cctx->list)
 | |
| 	    xglStartList (XGL_LIST_OP_CALLS, cctx->listMode);
 | |
|     }
 | |
|     else
 | |
| 	glAccum (op, value);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglDrawArrays (GLenum  mode,
 | |
| 	       GLint   first,
 | |
| 	       GLsizei count)
 | |
| {
 | |
|     GLenum listMode;
 | |
| 
 | |
|     if (cctx->list)
 | |
|     {
 | |
| 	glEndList ();
 | |
| 	xglStartList (XGL_LIST_OP_DRAW, GL_COMPILE);
 | |
| 	glDrawArrays (mode, first, count);
 | |
| 	glEndList ();
 | |
| 
 | |
| 	listMode = cctx->listMode;
 | |
|     }
 | |
|     else
 | |
| 	listMode = GL_COMPILE_AND_EXECUTE;
 | |
| 
 | |
|     if (listMode == GL_COMPILE_AND_EXECUTE)
 | |
|     {
 | |
| 	RegionRec region;
 | |
| 	BoxRec    scissor, box;
 | |
| 	BoxPtr    pBox;
 | |
| 	int	  nBox;
 | |
| 
 | |
| 	XGL_GLX_DRAW_PROLOGUE (pBox, nBox, &scissor);
 | |
| 
 | |
| 	while (nBox--)
 | |
| 	{
 | |
| 	    XGL_GLX_DRAW_BOX (&box, pBox);
 | |
| 
 | |
| 	    pBox++;
 | |
| 
 | |
| 	    if (cctx->attrib.scissorTest)
 | |
| 		XGL_GLX_INTERSECT_BOX (&box, &scissor);
 | |
| 
 | |
| 	    if (box.x1 < box.x2 && box.y1 < box.y2)
 | |
| 	    {
 | |
| 		XGL_GLX_SET_SCISSOR_BOX (&box);
 | |
| 
 | |
| 		glDrawArrays (mode, first, count);
 | |
| 
 | |
| 		XGL_GLX_DRAW_DAMAGE (&box, ®ion);
 | |
| 	    }
 | |
| 	}
 | |
|     }
 | |
| 
 | |
|     if (cctx->list)
 | |
| 	xglStartList (XGL_LIST_OP_CALLS, cctx->listMode);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglDrawElements (GLenum	      mode,
 | |
| 		 GLsizei      count,
 | |
| 		 GLenum	      type,
 | |
| 		 const GLvoid *indices)
 | |
| {
 | |
|     GLenum listMode;
 | |
| 
 | |
|     if (cctx->list)
 | |
|     {
 | |
| 	glEndList ();
 | |
| 	xglStartList (XGL_LIST_OP_DRAW, GL_COMPILE);
 | |
| 	glDrawElements (mode, count, type, indices);
 | |
| 	glEndList ();
 | |
| 
 | |
| 	listMode = cctx->listMode;
 | |
|     }
 | |
|     else
 | |
| 	listMode = GL_COMPILE_AND_EXECUTE;
 | |
| 
 | |
|     if (listMode == GL_COMPILE_AND_EXECUTE)
 | |
|     {
 | |
| 	RegionRec region;
 | |
| 	BoxRec    scissor, box;
 | |
| 	BoxPtr    pBox;
 | |
| 	int	  nBox;
 | |
| 
 | |
| 	XGL_GLX_DRAW_PROLOGUE (pBox, nBox, &scissor);
 | |
| 
 | |
| 	while (nBox--)
 | |
| 	{
 | |
| 	    XGL_GLX_DRAW_BOX (&box, pBox);
 | |
| 
 | |
| 	    pBox++;
 | |
| 
 | |
| 	    if (cctx->attrib.scissorTest)
 | |
| 		XGL_GLX_INTERSECT_BOX (&box, &scissor);
 | |
| 
 | |
| 	    if (box.x1 < box.x2 && box.y1 < box.y2)
 | |
| 	    {
 | |
| 		XGL_GLX_SET_SCISSOR_BOX (&box);
 | |
| 
 | |
| 		glDrawElements (mode, count, type, indices);
 | |
| 
 | |
| 		XGL_GLX_DRAW_DAMAGE (&box, ®ion);
 | |
| 	    }
 | |
| 	}
 | |
|     }
 | |
| 
 | |
|     if (cctx->list)
 | |
| 	xglStartList (XGL_LIST_OP_CALLS, cctx->listMode);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglDrawPixels (GLsizei	    width,
 | |
| 	       GLsizei	    height,
 | |
| 	       GLenum	    format,
 | |
| 	       GLenum	    type,
 | |
| 	       const GLvoid *pixels)
 | |
| {
 | |
|     GLenum listMode;
 | |
| 
 | |
|     if (cctx->list)
 | |
|     {
 | |
| 	glEndList ();
 | |
| 	xglStartList (XGL_LIST_OP_DRAW, GL_COMPILE);
 | |
| 	glDrawPixels (width, height, format, type, pixels);
 | |
| 	glEndList ();
 | |
| 
 | |
| 	listMode = cctx->listMode;
 | |
|     }
 | |
|     else
 | |
| 	listMode = GL_COMPILE_AND_EXECUTE;
 | |
| 
 | |
|     if (listMode == GL_COMPILE_AND_EXECUTE)
 | |
|     {
 | |
| 	RegionRec region;
 | |
| 	BoxRec    scissor, box;
 | |
| 	BoxPtr    pBox;
 | |
| 	int	  nBox;
 | |
| 
 | |
| 	XGL_GLX_DRAW_PROLOGUE (pBox, nBox, &scissor);
 | |
| 
 | |
| 	while (nBox--)
 | |
| 	{
 | |
| 	    XGL_GLX_DRAW_BOX (&box, pBox);
 | |
| 
 | |
| 	    pBox++;
 | |
| 
 | |
| 	    if (cctx->attrib.scissorTest)
 | |
| 		XGL_GLX_INTERSECT_BOX (&box, &scissor);
 | |
| 
 | |
| 	    if (box.x1 < box.x2 && box.y1 < box.y2)
 | |
| 	    {
 | |
| 		XGL_GLX_SET_SCISSOR_BOX (&box);
 | |
| 
 | |
| 		glDrawPixels (width, height, format, type, pixels);
 | |
| 
 | |
| 		if (format != GL_STENCIL_INDEX)
 | |
| 		    XGL_GLX_DRAW_DAMAGE (&box, ®ion);
 | |
| 	    }
 | |
| 	}
 | |
|     }
 | |
| 
 | |
|     if (cctx->list)
 | |
| 	xglStartList (XGL_LIST_OP_CALLS, cctx->listMode);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglBitmap (GLsizei	 width,
 | |
| 	   GLsizei	 height,
 | |
| 	   GLfloat	 xorig,
 | |
| 	   GLfloat	 yorig,
 | |
| 	   GLfloat	 xmove,
 | |
| 	   GLfloat	 ymove,
 | |
| 	   const GLubyte *bitmap)
 | |
| {
 | |
|     GLenum listMode;
 | |
| 
 | |
|     if (cctx->list)
 | |
|     {
 | |
| 	glEndList ();
 | |
| 	xglStartList (XGL_LIST_OP_DRAW, GL_COMPILE);
 | |
| 	glBitmap (width, height, xorig, yorig, 0, 0, bitmap);
 | |
| 	glEndList ();
 | |
| 
 | |
| 	listMode = cctx->listMode;
 | |
|     }
 | |
|     else
 | |
| 	listMode = GL_COMPILE_AND_EXECUTE;
 | |
| 
 | |
|     if (listMode == GL_COMPILE_AND_EXECUTE && width && height)
 | |
|     {
 | |
| 	RegionRec region;
 | |
| 	BoxRec    scissor, box;
 | |
| 	BoxPtr    pBox;
 | |
| 	int	  nBox;
 | |
| 
 | |
| 	XGL_GLX_DRAW_PROLOGUE (pBox, nBox, &scissor);
 | |
| 
 | |
| 	while (nBox--)
 | |
| 	{
 | |
| 	    XGL_GLX_DRAW_BOX (&box, pBox);
 | |
| 
 | |
| 	    pBox++;
 | |
| 
 | |
| 	    if (cctx->attrib.scissorTest)
 | |
| 		XGL_GLX_INTERSECT_BOX (&box, &scissor);
 | |
| 
 | |
| 	    if (box.x1 < box.x2 && box.y1 < box.y2)
 | |
| 	    {
 | |
| 		XGL_GLX_SET_SCISSOR_BOX (&box);
 | |
| 
 | |
| 		glBitmap (width, height, xorig, yorig, 0, 0, bitmap);
 | |
| 
 | |
| 		XGL_GLX_DRAW_DAMAGE (&box, ®ion);
 | |
| 	    }
 | |
| 	}
 | |
|     }
 | |
| 
 | |
|     if (cctx->list)
 | |
| 	xglStartList (XGL_LIST_OP_CALLS, cctx->listMode);
 | |
| 
 | |
|     glBitmap (0, 0, 0, 0, xmove, ymove, NULL);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglRectdv (const GLdouble *v1,
 | |
| 	   const GLdouble *v2)
 | |
| {
 | |
|     GLenum listMode;
 | |
| 
 | |
|     if (cctx->list)
 | |
|     {
 | |
| 	glEndList ();
 | |
| 	xglStartList (XGL_LIST_OP_DRAW, GL_COMPILE);
 | |
| 	glRectdv (v1, v2);
 | |
| 	glEndList ();
 | |
| 
 | |
| 	listMode = cctx->listMode;
 | |
|     }
 | |
|     else
 | |
| 	listMode = GL_COMPILE_AND_EXECUTE;
 | |
| 
 | |
|     if (listMode == GL_COMPILE_AND_EXECUTE)
 | |
|     {
 | |
| 	RegionRec region;
 | |
| 	BoxRec    scissor, box;
 | |
| 	BoxPtr    pBox;
 | |
| 	int	  nBox;
 | |
| 
 | |
| 	XGL_GLX_DRAW_PROLOGUE (pBox, nBox, &scissor);
 | |
| 
 | |
| 	while (nBox--)
 | |
| 	{
 | |
| 	    XGL_GLX_DRAW_BOX (&box, pBox);
 | |
| 
 | |
| 	    pBox++;
 | |
| 
 | |
| 	    if (cctx->attrib.scissorTest)
 | |
| 		XGL_GLX_INTERSECT_BOX (&box, &scissor);
 | |
| 
 | |
| 	    if (box.x1 < box.x2 && box.y1 < box.y2)
 | |
| 	    {
 | |
| 		XGL_GLX_SET_SCISSOR_BOX (&box);
 | |
| 
 | |
| 		glRectdv (v1, v2);
 | |
| 
 | |
| 		XGL_GLX_DRAW_DAMAGE (&box, ®ion);
 | |
| 	    }
 | |
| 	}
 | |
|     }
 | |
| 
 | |
|     if (cctx->list)
 | |
| 	xglStartList (XGL_LIST_OP_CALLS, cctx->listMode);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglRectfv (const GLfloat *v1,
 | |
| 	   const GLfloat *v2)
 | |
| {
 | |
|     GLdouble dv1[2];
 | |
|     GLdouble dv2[2];
 | |
| 
 | |
|     dv1[0] = (GLdouble) v1[0];
 | |
|     dv1[1] = (GLdouble) v1[1];
 | |
|     dv2[0] = (GLdouble) v2[0];
 | |
|     dv2[1] = (GLdouble) v2[1];
 | |
| 
 | |
|     xglRectdv (dv1, dv2);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglRectiv (const GLint *v1,
 | |
| 	   const GLint *v2)
 | |
| {
 | |
|     GLdouble dv1[2];
 | |
|     GLdouble dv2[2];
 | |
| 
 | |
|     dv1[0] = (GLdouble) v1[0];
 | |
|     dv1[1] = (GLdouble) v1[1];
 | |
|     dv2[0] = (GLdouble) v2[0];
 | |
|     dv2[1] = (GLdouble) v2[1];
 | |
| 
 | |
|     xglRectdv (dv1, dv2);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglRectsv (const GLshort *v1,
 | |
| 	   const GLshort *v2)
 | |
| {
 | |
|     GLdouble dv1[2];
 | |
|     GLdouble dv2[2];
 | |
| 
 | |
|     dv1[0] = (GLdouble) v1[0];
 | |
|     dv1[1] = (GLdouble) v1[1];
 | |
|     dv2[0] = (GLdouble) v2[0];
 | |
|     dv2[1] = (GLdouble) v2[1];
 | |
| 
 | |
|     xglRectdv (dv1, dv2);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglBegin (GLenum mode)
 | |
| {
 | |
|     if (mode > GL_POLYGON)
 | |
|     {
 | |
| 	xglRecordError (GL_INVALID_ENUM);
 | |
| 	return;
 | |
|     }
 | |
| 
 | |
|     if (cctx->beginCnt)
 | |
|     {
 | |
| 	xglRecordError (GL_INVALID_OPERATION);
 | |
| 	return;
 | |
|     }
 | |
| 
 | |
|     cctx->beginCnt++;
 | |
| 
 | |
|     if (cctx->list)
 | |
|     {
 | |
| 	glEndList ();
 | |
| 	xglStartList (XGL_LIST_OP_DRAW, GL_COMPILE);
 | |
|     }
 | |
|     else
 | |
|     {
 | |
| 	if (REGION_NUM_RECTS (cctx->pDrawBuffer->pGC->pCompositeClip) == 1)
 | |
| 	{
 | |
| 	    BoxRec scissor, box;
 | |
| 	    BoxPtr pBox;
 | |
| 	    int    nBox;
 | |
| 
 | |
| 	    XGL_GLX_DRAW_PROLOGUE (pBox, nBox, &scissor);
 | |
| 
 | |
| 	    XGL_GLX_DRAW_BOX (&box, pBox);
 | |
| 
 | |
| 	    if (cctx->attrib.scissorTest)
 | |
| 		XGL_GLX_INTERSECT_BOX (&box, &scissor);
 | |
| 
 | |
| 	    XGL_GLX_SET_SCISSOR_BOX (&box);
 | |
| 	}
 | |
| 	else
 | |
| 	{
 | |
| 	    if (!cctx->groupList)
 | |
| 		cctx->groupList = glGenLists (1);
 | |
| 
 | |
| 	    glNewList (cctx->groupList, GL_COMPILE);
 | |
| 	}
 | |
|     }
 | |
| 
 | |
|     glBegin (mode);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglEnd (void)
 | |
| {
 | |
|     if (!cctx->beginCnt)
 | |
|     {
 | |
| 	xglRecordError (GL_INVALID_OPERATION);
 | |
| 	return;
 | |
|     }
 | |
| 
 | |
|     cctx->beginCnt--;
 | |
| 
 | |
|     glEnd ();
 | |
| 
 | |
|     if (!cctx->list || cctx->listMode == GL_COMPILE_AND_EXECUTE)
 | |
|     {
 | |
| 	RegionRec region;
 | |
| 	BoxRec    scissor, box;
 | |
| 	BoxPtr    pBox;
 | |
| 	int	  nBox;
 | |
| 	GLuint	  list = 0;
 | |
| 
 | |
| 	if (cctx->list)
 | |
| 	{
 | |
| 	    XGL_GLX_DRAW_PROLOGUE (pBox, nBox, &scissor);
 | |
| 
 | |
| 	    list = cctx->pList->pOp[cctx->pList->nOp - 1].u.list;
 | |
| 	}
 | |
| 	else
 | |
| 	{
 | |
| 	    if (REGION_NUM_RECTS (cctx->pDrawBuffer->pGC->pCompositeClip) == 1)
 | |
| 	    {
 | |
| 		XGL_GLX_DRAW_PROLOGUE_WITHOUT_TEXTURES (pBox, nBox, &scissor);
 | |
| 	    }
 | |
| 	    else
 | |
| 	    {
 | |
| 		XGL_GLX_DRAW_PROLOGUE (pBox, nBox, &scissor);
 | |
| 
 | |
| 		list = cctx->groupList;
 | |
| 	    }
 | |
| 	}
 | |
| 
 | |
| 	if (list)
 | |
| 	    glEndList ();
 | |
| 
 | |
| 	while (nBox--)
 | |
| 	{
 | |
| 	    XGL_GLX_DRAW_BOX (&box, pBox);
 | |
| 
 | |
| 	    pBox++;
 | |
| 
 | |
| 	    if (cctx->attrib.scissorTest)
 | |
| 		XGL_GLX_INTERSECT_BOX (&box, &scissor);
 | |
| 
 | |
| 	    if (box.x1 < box.x2 && box.y1 < box.y2)
 | |
| 	    {
 | |
| 		if (list)
 | |
| 		{
 | |
| 		    XGL_GLX_SET_SCISSOR_BOX (&box);
 | |
| 
 | |
| 		    glCallList (list);
 | |
| 		}
 | |
| 
 | |
| 		XGL_GLX_DRAW_DAMAGE (&box, ®ion);
 | |
| 	    }
 | |
| 	}
 | |
|     }
 | |
|     else
 | |
|     {
 | |
| 	glEndList ();
 | |
|     }
 | |
| 
 | |
|     if (cctx->list)
 | |
| 	xglStartList (XGL_LIST_OP_CALLS, cctx->listMode);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglCopyPixelsProc (xglGLOpPtr pOp)
 | |
| {
 | |
|     RegionRec region;
 | |
|     BoxRec    scissor, box;
 | |
|     BoxPtr    pBox;
 | |
|     int	      nBox;
 | |
| 
 | |
|     XGL_GLX_DRAW_PROLOGUE (pBox, nBox, &scissor);
 | |
| 
 | |
|     while (nBox--)
 | |
|     {
 | |
| 	XGL_GLX_DRAW_BOX (&box, pBox);
 | |
| 
 | |
| 	pBox++;
 | |
| 
 | |
| 	if (cctx->attrib.scissorTest)
 | |
| 	    XGL_GLX_INTERSECT_BOX (&box, &scissor);
 | |
| 
 | |
| 	if (box.x1 < box.x2 && box.y1 < box.y2)
 | |
| 	{
 | |
| 	    XGL_GLX_SET_SCISSOR_BOX (&box);
 | |
| 
 | |
| 	    glCopyPixels (pOp->u.copy_pixels.x + cctx->pReadBuffer->xOff,
 | |
| 			  pOp->u.copy_pixels.y + cctx->pReadBuffer->yOff,
 | |
| 			  pOp->u.copy_pixels.width,
 | |
| 			  pOp->u.copy_pixels.height,
 | |
| 			  pOp->u.copy_pixels.type);
 | |
| 
 | |
| 	    if (pOp->u.copy_pixels.type == GL_COLOR)
 | |
| 		XGL_GLX_DRAW_DAMAGE (&box, ®ion);
 | |
| 	}
 | |
|     }
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglCopyPixels (GLint   x,
 | |
| 	       GLint   y,
 | |
| 	       GLsizei width,
 | |
| 	       GLsizei height,
 | |
| 	       GLenum  type)
 | |
| {
 | |
|     xglGLOpRec gl;
 | |
| 
 | |
|     gl.glProc = xglCopyPixelsProc;
 | |
| 
 | |
|     gl.u.copy_pixels.x	    = x;
 | |
|     gl.u.copy_pixels.y	    = y;
 | |
|     gl.u.copy_pixels.width  = width;
 | |
|     gl.u.copy_pixels.height = height;
 | |
|     gl.u.copy_pixels.type   = type;
 | |
| 
 | |
|     xglGLOp (&gl);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglReadPixels (GLint   x,
 | |
| 	       GLint   y,
 | |
| 	       GLsizei width,
 | |
| 	       GLsizei height,
 | |
| 	       GLenum  format,
 | |
| 	       GLenum  type,
 | |
| 	       GLvoid  *pixels)
 | |
| {
 | |
|     glReadPixels (x + cctx->pReadBuffer->xOff,
 | |
| 		  y + cctx->pReadBuffer->yOff,
 | |
| 		  width, height, format, type, pixels);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglCopyTexImage1DProc (xglGLOpPtr pOp)
 | |
| {
 | |
|     glCopyTexImage1D (pOp->u.copy_tex_image_1d.target,
 | |
| 		      pOp->u.copy_tex_image_1d.level,
 | |
| 		      pOp->u.copy_tex_image_1d.internalformat,
 | |
| 		      pOp->u.copy_tex_image_1d.x + cctx->pReadBuffer->xOff,
 | |
| 		      pOp->u.copy_tex_image_1d.y + cctx->pReadBuffer->yOff,
 | |
| 		      pOp->u.copy_tex_image_1d.width,
 | |
| 		      pOp->u.copy_tex_image_1d.border);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglCopyTexImage1D (GLenum  target,
 | |
| 		   GLint   level,
 | |
| 		   GLenum  internalformat,
 | |
| 		   GLint   x,
 | |
| 		   GLint   y,
 | |
| 		   GLsizei width,
 | |
| 		   GLint   border)
 | |
| {
 | |
|     xglGLOpRec gl;
 | |
| 
 | |
|     gl.glProc = xglCopyTexImage1DProc;
 | |
| 
 | |
|     gl.u.copy_tex_image_1d.target	  = target;
 | |
|     gl.u.copy_tex_image_1d.level	  = level;
 | |
|     gl.u.copy_tex_image_1d.internalformat = internalformat;
 | |
|     gl.u.copy_tex_image_1d.x		  = x;
 | |
|     gl.u.copy_tex_image_1d.y		  = y;
 | |
|     gl.u.copy_tex_image_1d.width	  = width;
 | |
|     gl.u.copy_tex_image_1d.border	  = border;
 | |
| 
 | |
|     xglGLOp (&gl);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglCopyTexImage2DProc (xglGLOpPtr pOp)
 | |
| {
 | |
|     glCopyTexImage2D (pOp->u.copy_tex_image_2d.target,
 | |
| 		      pOp->u.copy_tex_image_2d.level,
 | |
| 		      pOp->u.copy_tex_image_2d.internalformat,
 | |
| 		      pOp->u.copy_tex_image_2d.x + cctx->pReadBuffer->xOff,
 | |
| 		      pOp->u.copy_tex_image_2d.y + cctx->pReadBuffer->yOff,
 | |
| 		      pOp->u.copy_tex_image_2d.width,
 | |
| 		      pOp->u.copy_tex_image_2d.height,
 | |
| 		      pOp->u.copy_tex_image_2d.border);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglCopyTexImage2D (GLenum  target,
 | |
| 		   GLint   level,
 | |
| 		   GLenum  internalformat,
 | |
| 		   GLint   x,
 | |
| 		   GLint   y,
 | |
| 		   GLsizei width,
 | |
| 		   GLsizei height,
 | |
| 		   GLint   border)
 | |
| {
 | |
|     xglGLOpRec gl;
 | |
| 
 | |
|     gl.glProc = xglCopyTexImage2DProc;
 | |
| 
 | |
|     gl.u.copy_tex_image_2d.target	  = target;
 | |
|     gl.u.copy_tex_image_2d.level	  = level;
 | |
|     gl.u.copy_tex_image_2d.internalformat = internalformat;
 | |
|     gl.u.copy_tex_image_2d.x		  = x;
 | |
|     gl.u.copy_tex_image_2d.y		  = y;
 | |
|     gl.u.copy_tex_image_2d.width	  = width;
 | |
|     gl.u.copy_tex_image_2d.height	  = height;
 | |
|     gl.u.copy_tex_image_2d.border	  = border;
 | |
| 
 | |
|     xglGLOp (&gl);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglCopyTexSubImage1DProc (xglGLOpPtr pOp)
 | |
| {
 | |
|     glCopyTexSubImage1D (pOp->u.copy_tex_sub_image_1d.target,
 | |
| 			 pOp->u.copy_tex_sub_image_1d.level,
 | |
| 			 pOp->u.copy_tex_sub_image_1d.xoffset,
 | |
| 			 pOp->u.copy_tex_sub_image_1d.x +
 | |
| 			 cctx->pReadBuffer->xOff,
 | |
| 			 pOp->u.copy_tex_sub_image_1d.y +
 | |
| 			 cctx->pReadBuffer->yOff,
 | |
| 			 pOp->u.copy_tex_sub_image_1d.width);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglCopyTexSubImage1D (GLenum  target,
 | |
| 		      GLint   level,
 | |
| 		      GLint   xoffset,
 | |
| 		      GLint   x,
 | |
| 		      GLint   y,
 | |
| 		      GLsizei width)
 | |
| {
 | |
|     xglGLOpRec gl;
 | |
| 
 | |
|     gl.glProc = xglCopyTexSubImage1DProc;
 | |
| 
 | |
|     gl.u.copy_tex_sub_image_1d.target  = target;
 | |
|     gl.u.copy_tex_sub_image_1d.level   = level;
 | |
|     gl.u.copy_tex_sub_image_1d.xoffset = xoffset;
 | |
|     gl.u.copy_tex_sub_image_1d.x       = x;
 | |
|     gl.u.copy_tex_sub_image_1d.y       = y;
 | |
|     gl.u.copy_tex_sub_image_1d.width   = width;
 | |
| 
 | |
|     xglGLOp (&gl);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglCopyTexSubImage2DProc (xglGLOpPtr pOp)
 | |
| {
 | |
|     glCopyTexSubImage2D (pOp->u.copy_tex_sub_image_2d.target,
 | |
| 			 pOp->u.copy_tex_sub_image_2d.level,
 | |
| 			 pOp->u.copy_tex_sub_image_2d.xoffset,
 | |
| 			 pOp->u.copy_tex_sub_image_2d.yoffset,
 | |
| 			 pOp->u.copy_tex_sub_image_2d.x +
 | |
| 			 cctx->pReadBuffer->xOff,
 | |
| 			 pOp->u.copy_tex_sub_image_2d.y +
 | |
| 			 cctx->pReadBuffer->yOff,
 | |
| 			 pOp->u.copy_tex_sub_image_2d.width,
 | |
| 			 pOp->u.copy_tex_sub_image_2d.height);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglCopyTexSubImage2D (GLenum  target,
 | |
| 		      GLint   level,
 | |
| 		      GLint   xoffset,
 | |
| 		      GLint   yoffset,
 | |
| 		      GLint   x,
 | |
| 		      GLint   y,
 | |
| 		      GLsizei width,
 | |
| 		      GLsizei height)
 | |
| {
 | |
|     xglGLOpRec gl;
 | |
| 
 | |
|     gl.glProc = xglCopyTexSubImage2DProc;
 | |
| 
 | |
|     gl.u.copy_tex_sub_image_2d.target  = target;
 | |
|     gl.u.copy_tex_sub_image_2d.level   = level;
 | |
|     gl.u.copy_tex_sub_image_2d.xoffset = xoffset;
 | |
|     gl.u.copy_tex_sub_image_2d.yoffset = yoffset;
 | |
|     gl.u.copy_tex_sub_image_2d.x       = x;
 | |
|     gl.u.copy_tex_sub_image_2d.y       = y;
 | |
|     gl.u.copy_tex_sub_image_2d.width   = width;
 | |
|     gl.u.copy_tex_sub_image_2d.height  = height;
 | |
| 
 | |
|     xglGLOp (&gl);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglCopyColorTableProc (xglGLOpPtr pOp)
 | |
| {
 | |
|     glCopyColorTable (pOp->u.copy_color_table.target,
 | |
| 		      pOp->u.copy_color_table.internalformat,
 | |
| 		      pOp->u.copy_color_table.x + cctx->pReadBuffer->xOff,
 | |
| 		      pOp->u.copy_color_table.y + cctx->pReadBuffer->yOff,
 | |
| 		      pOp->u.copy_color_table.width);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglCopyColorTable (GLenum  target,
 | |
| 		   GLenum  internalformat,
 | |
| 		   GLint   x,
 | |
| 		   GLint   y,
 | |
| 		   GLsizei width)
 | |
| {
 | |
|     xglGLOpRec gl;
 | |
| 
 | |
|     gl.glProc = xglCopyColorTableProc;
 | |
| 
 | |
|     gl.u.copy_color_table.target	 = target;
 | |
|     gl.u.copy_color_table.internalformat = internalformat;
 | |
|     gl.u.copy_color_table.x		 = x;
 | |
|     gl.u.copy_color_table.y		 = y;
 | |
|     gl.u.copy_color_table.width		 = width;
 | |
| 
 | |
|     xglGLOp (&gl);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglCopyColorSubTableProc (xglGLOpPtr pOp)
 | |
| {
 | |
|     glCopyColorTable (pOp->u.copy_color_sub_table.target,
 | |
| 		      pOp->u.copy_color_sub_table.start,
 | |
| 		      pOp->u.copy_color_sub_table.x + cctx->pReadBuffer->xOff,
 | |
| 		      pOp->u.copy_color_sub_table.y + cctx->pReadBuffer->yOff,
 | |
| 		      pOp->u.copy_color_sub_table.width);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglCopyColorSubTable (GLenum  target,
 | |
| 		      GLsizei start,
 | |
| 		      GLint   x,
 | |
| 		      GLint   y,
 | |
| 		      GLsizei width)
 | |
| {
 | |
|     xglGLOpRec gl;
 | |
| 
 | |
|     gl.glProc = xglCopyColorSubTableProc;
 | |
| 
 | |
|     gl.u.copy_color_sub_table.target = target;
 | |
|     gl.u.copy_color_sub_table.start  = start;
 | |
|     gl.u.copy_color_sub_table.x	     = x;
 | |
|     gl.u.copy_color_sub_table.y	     = y;
 | |
|     gl.u.copy_color_sub_table.width  = width;
 | |
| 
 | |
|     xglGLOp (&gl);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglCopyConvolutionFilter1DProc (xglGLOpPtr pOp)
 | |
| {
 | |
|     GLenum internalformat = pOp->u.copy_convolution_filter_1d.internalformat;
 | |
| 
 | |
|     glCopyConvolutionFilter1D (pOp->u.copy_convolution_filter_1d.target,
 | |
| 			       internalformat,
 | |
| 			       pOp->u.copy_convolution_filter_1d.x +
 | |
| 			       cctx->pReadBuffer->xOff,
 | |
| 			       pOp->u.copy_convolution_filter_1d.y +
 | |
| 			       cctx->pReadBuffer->yOff,
 | |
| 			       pOp->u.copy_convolution_filter_1d.width);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglCopyConvolutionFilter1D (GLenum  target,
 | |
| 			    GLenum  internalformat,
 | |
| 			    GLint   x,
 | |
| 			    GLint   y,
 | |
| 			    GLsizei width)
 | |
| {
 | |
|     xglGLOpRec gl;
 | |
| 
 | |
|     gl.glProc = xglCopyConvolutionFilter1DProc;
 | |
| 
 | |
|     gl.u.copy_convolution_filter_1d.target	   = target;
 | |
|     gl.u.copy_convolution_filter_1d.internalformat = internalformat;
 | |
|     gl.u.copy_convolution_filter_1d.x		   = x;
 | |
|     gl.u.copy_convolution_filter_1d.y		   = y;
 | |
|     gl.u.copy_convolution_filter_1d.width	   = width;
 | |
| 
 | |
|     xglGLOp (&gl);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglCopyConvolutionFilter2DProc (xglGLOpPtr pOp)
 | |
| {
 | |
|     GLenum internalformat = pOp->u.copy_convolution_filter_2d.internalformat;
 | |
| 
 | |
|     glCopyConvolutionFilter2D (pOp->u.copy_convolution_filter_2d.target,
 | |
| 			       internalformat,
 | |
| 			       pOp->u.copy_convolution_filter_2d.x +
 | |
| 			       cctx->pReadBuffer->xOff,
 | |
| 			       pOp->u.copy_convolution_filter_2d.y +
 | |
| 			       cctx->pReadBuffer->yOff,
 | |
| 			       pOp->u.copy_convolution_filter_2d.width,
 | |
| 			       pOp->u.copy_convolution_filter_2d.height);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglCopyConvolutionFilter2D (GLenum  target,
 | |
| 			    GLenum  internalformat,
 | |
| 			    GLint   x,
 | |
| 			    GLint   y,
 | |
| 			    GLsizei width,
 | |
| 			    GLsizei height)
 | |
| {
 | |
|     xglGLOpRec gl;
 | |
| 
 | |
|     gl.glProc = xglCopyConvolutionFilter2DProc;
 | |
| 
 | |
|     gl.u.copy_convolution_filter_2d.target	   = target;
 | |
|     gl.u.copy_convolution_filter_2d.internalformat = internalformat;
 | |
|     gl.u.copy_convolution_filter_2d.x		   = x;
 | |
|     gl.u.copy_convolution_filter_2d.y		   = y;
 | |
|     gl.u.copy_convolution_filter_2d.width	   = width;
 | |
|     gl.u.copy_convolution_filter_2d.height	   = height;
 | |
| 
 | |
|     xglGLOp (&gl);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglCopyTexSubImage3DProc (xglGLOpPtr pOp)
 | |
| {
 | |
|     glCopyTexSubImage3D (pOp->u.copy_tex_sub_image_3d.target,
 | |
| 			 pOp->u.copy_tex_sub_image_3d.level,
 | |
| 			 pOp->u.copy_tex_sub_image_3d.xoffset,
 | |
| 			 pOp->u.copy_tex_sub_image_3d.yoffset,
 | |
| 			 pOp->u.copy_tex_sub_image_3d.zoffset,
 | |
| 			 pOp->u.copy_tex_sub_image_3d.x +
 | |
| 			 cctx->pReadBuffer->xOff,
 | |
| 			 pOp->u.copy_tex_sub_image_3d.y +
 | |
| 			 cctx->pReadBuffer->yOff,
 | |
| 			 pOp->u.copy_tex_sub_image_3d.width,
 | |
| 			 pOp->u.copy_tex_sub_image_3d.height);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglCopyTexSubImage3D (GLenum  target,
 | |
| 		      GLint   level,
 | |
| 		      GLint   xoffset,
 | |
| 		      GLint   yoffset,
 | |
| 		      GLint   zoffset,
 | |
| 		      GLint   x,
 | |
| 		      GLint   y,
 | |
| 		      GLsizei width,
 | |
| 		      GLsizei height)
 | |
| {
 | |
|     xglGLOpRec gl;
 | |
| 
 | |
|     gl.glProc = xglCopyTexSubImage3DProc;
 | |
| 
 | |
|     gl.u.copy_tex_sub_image_3d.target  = target;
 | |
|     gl.u.copy_tex_sub_image_3d.level   = level;
 | |
|     gl.u.copy_tex_sub_image_3d.xoffset = xoffset;
 | |
|     gl.u.copy_tex_sub_image_3d.yoffset = yoffset;
 | |
|     gl.u.copy_tex_sub_image_3d.zoffset = zoffset;
 | |
|     gl.u.copy_tex_sub_image_3d.x       = x;
 | |
|     gl.u.copy_tex_sub_image_3d.y       = y;
 | |
|     gl.u.copy_tex_sub_image_3d.width   = width;
 | |
|     gl.u.copy_tex_sub_image_3d.height  = height;
 | |
| 
 | |
|     xglGLOp (&gl);
 | |
| }
 | |
| 
 | |
| /* GL_ARB_multitexture */
 | |
| static void
 | |
| xglNoOpActiveTextureARB (GLenum texture) {}
 | |
| static void
 | |
| xglActiveTextureARBProc (xglGLOpPtr pOp)
 | |
| {
 | |
|     GLenum texUnit;
 | |
| 
 | |
|     texUnit = pOp->u.enumeration - GL_TEXTURE0;
 | |
|     if (texUnit < 0 || texUnit >= cctx->maxTexUnits)
 | |
|     {
 | |
| 	xglRecordError (GL_INVALID_ENUM);
 | |
|     }
 | |
|     else
 | |
|     {
 | |
| 	cctx->activeTexUnit = texUnit;
 | |
| 	(*cctx->ActiveTextureARB) (pOp->u.enumeration);
 | |
|     }
 | |
| }
 | |
| static void
 | |
| xglActiveTextureARB (GLenum texture)
 | |
| {
 | |
|     xglGLOpRec gl;
 | |
| 
 | |
|     gl.glProc = xglActiveTextureARBProc;
 | |
| 
 | |
|     gl.u.enumeration = texture;
 | |
| 
 | |
|     xglGLOp (&gl);
 | |
| }
 | |
| static void
 | |
| xglNoOpClientActiveTextureARB (GLenum texture) {}
 | |
| static void
 | |
| xglNoOpMultiTexCoord1dvARB (GLenum target, const GLdouble *v) {}
 | |
| static void
 | |
| xglNoOpMultiTexCoord1fvARB (GLenum target, const GLfloat *v) {}
 | |
| static void
 | |
| xglNoOpMultiTexCoord1ivARB (GLenum target, const GLint *v) {}
 | |
| static void
 | |
| xglNoOpMultiTexCoord1svARB (GLenum target, const GLshort *v) {}
 | |
| static void
 | |
| xglNoOpMultiTexCoord2dvARB (GLenum target, const GLdouble *v) {}
 | |
| static void
 | |
| xglNoOpMultiTexCoord2fvARB (GLenum target, const GLfloat *v) {}
 | |
| static void
 | |
| xglNoOpMultiTexCoord2ivARB (GLenum target, const GLint *v) {}
 | |
| static void
 | |
| xglNoOpMultiTexCoord2svARB (GLenum target, const GLshort *v) {}
 | |
| static void
 | |
| xglNoOpMultiTexCoord3dvARB (GLenum target, const GLdouble *v) {}
 | |
| static void
 | |
| xglNoOpMultiTexCoord3fvARB (GLenum target, const GLfloat *v) {}
 | |
| static void
 | |
| xglNoOpMultiTexCoord3ivARB (GLenum target, const GLint *v) {}
 | |
| static void
 | |
| xglNoOpMultiTexCoord3svARB (GLenum target, const GLshort *v) {}
 | |
| static void
 | |
| xglNoOpMultiTexCoord4dvARB (GLenum target, const GLdouble *v) {}
 | |
| static void
 | |
| xglNoOpMultiTexCoord4fvARB (GLenum target, const GLfloat *v) {}
 | |
| static void
 | |
| xglNoOpMultiTexCoord4ivARB (GLenum target, const GLint *v) {}
 | |
| static void
 | |
| xglNoOpMultiTexCoord4svARB (GLenum target, const GLshort *v) {}
 | |
| 
 | |
| /* GL_ARB_multisample */
 | |
| static void
 | |
| xglNoOpSampleCoverageARB (GLclampf value, GLboolean invert) {}
 | |
| 
 | |
| /* GL_EXT_texture_object */
 | |
| static GLboolean
 | |
| xglNoOpAreTexturesResidentEXT (GLsizei n,
 | |
| 			       const GLuint *textures,
 | |
| 			       GLboolean *residences)
 | |
| {
 | |
|     return GL_FALSE;
 | |
| }
 | |
| static void
 | |
| xglNoOpGenTexturesEXT (GLsizei n, GLuint *textures) {}
 | |
| static GLboolean
 | |
| xglNoOpIsTextureEXT (GLuint texture)
 | |
| {
 | |
|     return GL_FALSE;
 | |
| }
 | |
| 
 | |
| /* GL_SGIS_multisample */
 | |
| static void
 | |
| xglNoOpSampleMaskSGIS (GLclampf value, GLboolean invert) {}
 | |
| static void
 | |
| xglNoOpSamplePatternSGIS (GLenum pattern) {}
 | |
| 
 | |
| /* GL_EXT_point_parameters */
 | |
| static void
 | |
| xglNoOpPointParameterfEXT (GLenum pname, GLfloat param) {}
 | |
| static void
 | |
| xglNoOpPointParameterfvEXT (GLenum pname, const GLfloat *params) {}
 | |
| 
 | |
| /* GL_MESA_window_pos */
 | |
| static void
 | |
| xglNoOpWindowPos3fMESA (GLfloat x, GLfloat y, GLfloat z) {}
 | |
| static void
 | |
| xglWindowPos3fMESAProc (xglGLOpPtr pOp)
 | |
| {
 | |
|     (*cctx->WindowPos3fMESA) (pOp->u.window_pos_3f.x + cctx->pDrawBuffer->xOff,
 | |
| 			      pOp->u.window_pos_3f.y + cctx->pDrawBuffer->yOff,
 | |
| 			      pOp->u.window_pos_3f.z);
 | |
| }
 | |
| static void
 | |
| xglWindowPos3fMESA (GLfloat x, GLfloat y, GLfloat z)
 | |
| {
 | |
|     xglGLOpRec gl;
 | |
| 
 | |
|     gl.glProc = xglWindowPos3fMESAProc;
 | |
| 
 | |
|     gl.u.window_pos_3f.x = x;
 | |
|     gl.u.window_pos_3f.y = y;
 | |
|     gl.u.window_pos_3f.z = z;
 | |
| 
 | |
|     xglGLOp (&gl);
 | |
| }
 | |
| 
 | |
| /* GL_EXT_blend_func_separate */
 | |
| static void
 | |
| xglNoOpBlendFuncSeparateEXT (GLenum sfactorRGB, GLenum dfactorRGB,
 | |
| 			     GLenum sfactorAlpha, GLenum dfactorAlpha) {}
 | |
| 
 | |
| /* GL_EXT_fog_coord */
 | |
| static void
 | |
| xglNoOpFogCoordfvEXT (const GLfloat *coord) {}
 | |
| static void
 | |
| xglNoOpFogCoorddvEXT (const GLdouble *coord) {}
 | |
| static void
 | |
| xglNoOpFogCoordPointerEXT (GLenum type, GLsizei stride,
 | |
| 			   const GLvoid *pointer) {}
 | |
| 
 | |
| /* GL_EXT_secondary_color */
 | |
| static void
 | |
| xglNoOpSecondaryColor3bvEXT (const GLbyte *v) {}
 | |
| static void
 | |
| xglNoOpSecondaryColor3dvEXT (const GLdouble *v) {}
 | |
| static void
 | |
| xglNoOpSecondaryColor3fvEXT (const GLfloat *v) {}
 | |
| static void
 | |
| xglNoOpSecondaryColor3ivEXT (const GLint *v) {}
 | |
| static void
 | |
| xglNoOpSecondaryColor3svEXT (const GLshort *v) {}
 | |
| static void
 | |
| xglNoOpSecondaryColor3ubvEXT (const GLubyte *v) {}
 | |
| static void
 | |
| xglNoOpSecondaryColor3uivEXT (const GLuint *v) {}
 | |
| static void
 | |
| xglNoOpSecondaryColor3usvEXT (const GLushort *v) {}
 | |
| static void
 | |
| xglNoOpSecondaryColorPointerEXT (GLint size, GLenum type, GLsizei stride,
 | |
| 				 const GLvoid *pointer) {}
 | |
| 
 | |
| /* GL_NV_point_sprite */
 | |
| static void
 | |
| xglNoOpPointParameteriNV (GLenum pname, GLint params) {}
 | |
| static void
 | |
| xglNoOpPointParameterivNV (GLenum pname, const GLint *params) {}
 | |
| 
 | |
| /* GL_EXT_stencil_two_side */
 | |
| static void
 | |
| xglNoOpActiveStencilFaceEXT (GLenum face) {}
 | |
| 
 | |
| /* GL_EXT_framebuffer_object */
 | |
| static GLboolean
 | |
| xglNoOpIsRenderbufferEXT (GLuint renderbuffer)
 | |
| {
 | |
|     return FALSE;
 | |
| }
 | |
| static void
 | |
| xglNoOpBindRenderbufferEXT (GLenum target, GLuint renderbuffer) {}
 | |
| static void
 | |
| xglNoOpDeleteRenderbuffersEXT (GLsizei n, const GLuint *renderbuffers) {}
 | |
| static void
 | |
| xglNoOpGenRenderbuffersEXT (GLsizei n, GLuint *renderbuffers) {}
 | |
| static void
 | |
| xglNoOpRenderbufferStorageEXT (GLenum target, GLenum internalformat,
 | |
| 			       GLsizei width, GLsizei height) {}
 | |
| static void
 | |
| xglNoOpGetRenderbufferParameterivEXT (GLenum target, GLenum pname,
 | |
| 				      GLint *params) {}
 | |
| static GLboolean
 | |
| xglNoOpIsFramebufferEXT (GLuint framebuffer)
 | |
| {
 | |
|     return FALSE;
 | |
| }
 | |
| static void
 | |
| xglNoOpBindFramebufferEXT (GLenum target, GLuint framebuffer) {}
 | |
| static void
 | |
| xglNoOpDeleteFramebuffersEXT (GLsizei n, const GLuint *framebuffers) {}
 | |
| static void
 | |
| xglNoOpGenFramebuffersEXT (GLsizei n, GLuint *framebuffers) {}
 | |
| static GLenum
 | |
| xglNoOpCheckFramebufferStatusEXT (GLenum target)
 | |
| {
 | |
|     return GL_FRAMEBUFFER_UNSUPPORTED_EXT;
 | |
| }
 | |
| static void
 | |
| xglNoOpFramebufferTexture1DEXT (GLenum target, GLenum attachment,
 | |
| 				GLenum textarget, GLuint texture,
 | |
| 				GLint level) {}
 | |
| static void
 | |
| xglNoOpFramebufferTexture2DEXT (GLenum target, GLenum attachment,
 | |
| 				GLenum textarget, GLuint texture,
 | |
| 				GLint level) {}
 | |
| static void
 | |
| xglNoOpFramebufferTexture3DEXT (GLenum target, GLenum attachment,
 | |
| 				GLenum textarget, GLuint texture,
 | |
| 				GLint level, GLint zoffset) {}
 | |
| static void
 | |
| xglNoOpFramebufferRenderbufferEXT (GLenum target, GLenum attachment,
 | |
| 				   GLenum renderbuffertarget,
 | |
| 				   GLuint renderbuffer) {}
 | |
| static void
 | |
| xglNoOpGetFramebufferAttachmentParameterivEXT (GLenum target,
 | |
| 					       GLenum attachment,
 | |
| 					       GLenum pname,
 | |
| 					       GLint *params) {}
 | |
| static void
 | |
| xglNoOpGenerateMipmapEXT (GLenum target) {}
 | |
| 
 | |
| static struct _glapi_table __glNativeRenderTable = {
 | |
|     xglNewList,
 | |
|     xglEndList,
 | |
|     xglCallList,
 | |
|     xglCallLists,
 | |
|     xglDeleteLists,
 | |
|     xglGenLists,
 | |
|     glListBase,
 | |
|     xglBegin,
 | |
|     xglBitmap,
 | |
|     0, /* glColor3b */
 | |
|     glColor3bv,
 | |
|     0, /* glColor3d */
 | |
|     glColor3dv,
 | |
|     0, /* glColor3f */
 | |
|     glColor3fv,
 | |
|     0, /* glColor3i */
 | |
|     glColor3iv,
 | |
|     0, /* glColor3s */
 | |
|     glColor3sv,
 | |
|     0, /* glColor3ub */
 | |
|     glColor3ubv,
 | |
|     0, /* glColor3ui */
 | |
|     glColor3uiv,
 | |
|     0, /* glColor3us */
 | |
|     glColor3usv,
 | |
|     0, /* glColor4b */
 | |
|     glColor4bv,
 | |
|     0, /* glColor4d */
 | |
|     glColor4dv,
 | |
|     0, /* glColor4f */
 | |
|     glColor4fv,
 | |
|     0, /* glColor4i */
 | |
|     glColor4iv,
 | |
|     0, /* glColor4s */
 | |
|     glColor4sv,
 | |
|     0, /* glColor4ub */
 | |
|     glColor4ubv,
 | |
|     0, /* glColor4ui */
 | |
|     glColor4uiv,
 | |
|     0, /* glColor4us */
 | |
|     glColor4usv,
 | |
|     0, /* glEdgeFlag */
 | |
|     glEdgeFlagv,
 | |
|     xglEnd,
 | |
|     0, /* glIndexd */
 | |
|     glIndexdv,
 | |
|     0, /* glIndexf */
 | |
|     glIndexfv,
 | |
|     0, /* glIndexi */
 | |
|     glIndexiv,
 | |
|     0, /* glIndexs */
 | |
|     glIndexsv,
 | |
|     0, /* glNormal3b */
 | |
|     glNormal3bv,
 | |
|     0, /* glNormal3d */
 | |
|     glNormal3dv,
 | |
|     0, /* glNormal3f */
 | |
|     glNormal3fv,
 | |
|     0, /* glNormal3i */
 | |
|     glNormal3iv,
 | |
|     0, /* glNormal3s */
 | |
|     glNormal3sv,
 | |
|     0, /* glRasterPos2d */
 | |
|     glRasterPos2dv,
 | |
|     0, /* glRasterPos2f */
 | |
|     glRasterPos2fv,
 | |
|     0, /* glRasterPos2i */
 | |
|     glRasterPos2iv,
 | |
|     0, /* glRasterPos2s */
 | |
|     glRasterPos2sv,
 | |
|     0, /* glRasterPos3d */
 | |
|     glRasterPos3dv,
 | |
|     0, /* glRasterPos3f */
 | |
|     glRasterPos3fv,
 | |
|     0, /* glRasterPos3i */
 | |
|     glRasterPos3iv,
 | |
|     0, /* glRasterPos3s */
 | |
|     glRasterPos3sv,
 | |
|     0, /* glRasterPos4d */
 | |
|     glRasterPos4dv,
 | |
|     0, /* glRasterPos4f */
 | |
|     glRasterPos4fv,
 | |
|     0, /* glRasterPos4i */
 | |
|     glRasterPos4iv,
 | |
|     0, /* glRasterPos4s */
 | |
|     glRasterPos4sv,
 | |
|     0, /* glRectd */
 | |
|     xglRectdv,
 | |
|     0, /* glRectf */
 | |
|     xglRectfv,
 | |
|     0, /* glRecti */
 | |
|     xglRectiv,
 | |
|     0, /* glRects */
 | |
|     xglRectsv,
 | |
|     0, /* glTexCoord1d */
 | |
|     glTexCoord1dv,
 | |
|     0, /* glTexCoord1f */
 | |
|     glTexCoord1fv,
 | |
|     0, /* glTexCoord1i */
 | |
|     glTexCoord1iv,
 | |
|     0, /* glTexCoord1s */
 | |
|     glTexCoord1sv,
 | |
|     0, /* glTexCoord2d */
 | |
|     glTexCoord2dv,
 | |
|     0, /* glTexCoord2f */
 | |
|     glTexCoord2fv,
 | |
|     0, /* glTexCoord2i */
 | |
|     glTexCoord2iv,
 | |
|     0, /* glTexCoord2s */
 | |
|     glTexCoord2sv,
 | |
|     0, /* glTexCoord3d */
 | |
|     glTexCoord3dv,
 | |
|     0, /* glTexCoord3f */
 | |
|     glTexCoord3fv,
 | |
|     0, /* glTexCoord3i */
 | |
|     glTexCoord3iv,
 | |
|     0, /* glTexCoord3s */
 | |
|     glTexCoord3sv,
 | |
|     0, /* glTexCoord4d */
 | |
|     glTexCoord4dv,
 | |
|     0, /* glTexCoord4f */
 | |
|     glTexCoord4fv,
 | |
|     0, /* glTexCoord4i */
 | |
|     glTexCoord4iv,
 | |
|     0, /* glTexCoord4s */
 | |
|     glTexCoord4sv,
 | |
|     0, /* glVertex2d */
 | |
|     glVertex2dv,
 | |
|     0, /* glVertex2f */
 | |
|     glVertex2fv,
 | |
|     0, /* glVertex2i */
 | |
|     glVertex2iv,
 | |
|     0, /* glVertex2s */
 | |
|     glVertex2sv,
 | |
|     0, /* glVertex3d */
 | |
|     glVertex3dv,
 | |
|     0, /* glVertex3f */
 | |
|     glVertex3fv,
 | |
|     0, /* glVertex3i */
 | |
|     glVertex3iv,
 | |
|     0, /* glVertex3s */
 | |
|     glVertex3sv,
 | |
|     0, /* glVertex4d */
 | |
|     glVertex4dv,
 | |
|     0, /* glVertex4f */
 | |
|     glVertex4fv,
 | |
|     0, /* glVertex4i */
 | |
|     glVertex4iv,
 | |
|     0, /* glVertex4s */
 | |
|     glVertex4sv,
 | |
|     glClipPlane,
 | |
|     glColorMaterial,
 | |
|     glCullFace,
 | |
|     glFogf,
 | |
|     glFogfv,
 | |
|     glFogi,
 | |
|     glFogiv,
 | |
|     glFrontFace,
 | |
|     glHint,
 | |
|     glLightf,
 | |
|     glLightfv,
 | |
|     glLighti,
 | |
|     glLightiv,
 | |
|     glLightModelf,
 | |
|     glLightModelfv,
 | |
|     glLightModeli,
 | |
|     glLightModeliv,
 | |
|     glLineStipple,
 | |
|     glLineWidth,
 | |
|     glMaterialf,
 | |
|     glMaterialfv,
 | |
|     glMateriali,
 | |
|     glMaterialiv,
 | |
|     glPointSize,
 | |
|     glPolygonMode,
 | |
|     glPolygonStipple,
 | |
|     xglScissor,
 | |
|     glShadeModel,
 | |
|     xglTexParameterf,
 | |
|     xglTexParameterfv,
 | |
|     xglTexParameteri,
 | |
|     xglTexParameteriv,
 | |
|     glTexImage1D,
 | |
|     glTexImage2D,
 | |
|     glTexEnvf,
 | |
|     glTexEnvfv,
 | |
|     glTexEnvi,
 | |
|     glTexEnviv,
 | |
|     glTexGend,
 | |
|     glTexGendv,
 | |
|     glTexGenf,
 | |
|     glTexGenfv,
 | |
|     glTexGeni,
 | |
|     glTexGeniv,
 | |
|     glFeedbackBuffer,
 | |
|     glSelectBuffer,
 | |
|     glRenderMode,
 | |
|     glInitNames,
 | |
|     glLoadName,
 | |
|     glPassThrough,
 | |
|     glPopName,
 | |
|     glPushName,
 | |
|     xglDrawBuffer,
 | |
|     xglClear,
 | |
|     glClearAccum,
 | |
|     glClearIndex,
 | |
|     glClearColor,
 | |
|     glClearStencil,
 | |
|     glClearDepth,
 | |
|     glStencilMask,
 | |
|     glColorMask,
 | |
|     glDepthMask,
 | |
|     glIndexMask,
 | |
|     xglAccum,
 | |
|     xglDisable,
 | |
|     xglEnable,
 | |
|     xglFinish,
 | |
|     xglFlush,
 | |
|     xglPopAttrib,
 | |
|     xglPushAttrib,
 | |
|     glMap1d,
 | |
|     glMap1f,
 | |
|     glMap2d,
 | |
|     glMap2f,
 | |
|     glMapGrid1d,
 | |
|     glMapGrid1f,
 | |
|     glMapGrid2d,
 | |
|     glMapGrid2f,
 | |
|     0, /* glEvalCoord1d */
 | |
|     glEvalCoord1dv,
 | |
|     0, /* glEvalCoord1f */
 | |
|     glEvalCoord1fv,
 | |
|     0, /* glEvalCoord2d */
 | |
|     glEvalCoord2dv,
 | |
|     0, /* glEvalCoord2f */
 | |
|     glEvalCoord2fv,
 | |
|     glEvalMesh1,
 | |
|     glEvalPoint1,
 | |
|     glEvalMesh2,
 | |
|     glEvalPoint2,
 | |
|     glAlphaFunc,
 | |
|     glBlendFunc,
 | |
|     glLogicOp,
 | |
|     glStencilFunc,
 | |
|     glStencilOp,
 | |
|     glDepthFunc,
 | |
|     glPixelZoom,
 | |
|     glPixelTransferf,
 | |
|     glPixelTransferi,
 | |
|     glPixelStoref,
 | |
|     glPixelStorei,
 | |
|     glPixelMapfv,
 | |
|     glPixelMapuiv,
 | |
|     glPixelMapusv,
 | |
|     xglReadBuffer,
 | |
|     xglCopyPixels,
 | |
|     xglReadPixels,
 | |
|     xglDrawPixels,
 | |
|     xglGetBooleanv,
 | |
|     glGetClipPlane,
 | |
|     xglGetDoublev,
 | |
|     xglGetError,
 | |
|     xglGetFloatv,
 | |
|     xglGetIntegerv,
 | |
|     glGetLightfv,
 | |
|     glGetLightiv,
 | |
|     glGetMapdv,
 | |
|     glGetMapfv,
 | |
|     glGetMapiv,
 | |
|     glGetMaterialfv,
 | |
|     glGetMaterialiv,
 | |
|     glGetPixelMapfv,
 | |
|     glGetPixelMapuiv,
 | |
|     glGetPixelMapusv,
 | |
|     glGetPolygonStipple,
 | |
|     xglGetString,
 | |
|     glGetTexEnvfv,
 | |
|     glGetTexEnviv,
 | |
|     glGetTexGendv,
 | |
|     glGetTexGenfv,
 | |
|     glGetTexGeniv,
 | |
|     glGetTexImage,
 | |
|     glGetTexParameterfv,
 | |
|     glGetTexParameteriv,
 | |
|     xglGetTexLevelParameterfv,
 | |
|     xglGetTexLevelParameteriv,
 | |
|     xglIsEnabled,
 | |
|     xglIsList,
 | |
|     glDepthRange,
 | |
|     glFrustum,
 | |
|     glLoadIdentity,
 | |
|     glLoadMatrixf,
 | |
|     glLoadMatrixd,
 | |
|     glMatrixMode,
 | |
|     glMultMatrixf,
 | |
|     glMultMatrixd,
 | |
|     glOrtho,
 | |
|     glPopMatrix,
 | |
|     glPushMatrix,
 | |
|     glRotated,
 | |
|     glRotatef,
 | |
|     glScaled,
 | |
|     glScalef,
 | |
|     glTranslated,
 | |
|     glTranslatef,
 | |
|     xglViewport,
 | |
|     glArrayElement,
 | |
|     xglBindTexture,
 | |
|     glColorPointer,
 | |
|     glDisableClientState,
 | |
|     xglDrawArrays,
 | |
|     xglDrawElements,
 | |
|     glEdgeFlagPointer,
 | |
|     glEnableClientState,
 | |
|     glIndexPointer,
 | |
|     0, /* glIndexub */
 | |
|     glIndexubv,
 | |
|     glInterleavedArrays,
 | |
|     glNormalPointer,
 | |
|     glPolygonOffset,
 | |
|     glTexCoordPointer,
 | |
|     glVertexPointer,
 | |
|     xglAreTexturesResident,
 | |
|     xglCopyTexImage1D,
 | |
|     xglCopyTexImage2D,
 | |
|     xglCopyTexSubImage1D,
 | |
|     xglCopyTexSubImage2D,
 | |
|     xglDeleteTextures,
 | |
|     xglGenTextures,
 | |
|     glGetPointerv,
 | |
|     xglIsTexture,
 | |
|     xglPrioritizeTextures,
 | |
|     glTexSubImage1D,
 | |
|     glTexSubImage2D,
 | |
|     glPopClientAttrib,
 | |
|     glPushClientAttrib,
 | |
|     glBlendColor,
 | |
|     glBlendEquation,
 | |
|     0, /* glDrawRangeElements */
 | |
|     glColorTable,
 | |
|     glColorTableParameterfv,
 | |
|     glColorTableParameteriv,
 | |
|     xglCopyColorTable,
 | |
|     glGetColorTable,
 | |
|     glGetColorTableParameterfv,
 | |
|     glGetColorTableParameteriv,
 | |
|     glColorSubTable,
 | |
|     xglCopyColorSubTable,
 | |
|     glConvolutionFilter1D,
 | |
|     glConvolutionFilter2D,
 | |
|     glConvolutionParameterf,
 | |
|     glConvolutionParameterfv,
 | |
|     glConvolutionParameteri,
 | |
|     glConvolutionParameteriv,
 | |
|     xglCopyConvolutionFilter1D,
 | |
|     xglCopyConvolutionFilter2D,
 | |
|     glGetConvolutionFilter,
 | |
|     glGetConvolutionParameterfv,
 | |
|     glGetConvolutionParameteriv,
 | |
|     glGetSeparableFilter,
 | |
|     glSeparableFilter2D,
 | |
|     glGetHistogram,
 | |
|     glGetHistogramParameterfv,
 | |
|     glGetHistogramParameteriv,
 | |
|     glGetMinmax,
 | |
|     glGetMinmaxParameterfv,
 | |
|     glGetMinmaxParameteriv,
 | |
|     glHistogram,
 | |
|     glMinmax,
 | |
|     glResetHistogram,
 | |
|     glResetMinmax,
 | |
|     glTexImage3D,
 | |
|     glTexSubImage3D,
 | |
|     xglCopyTexSubImage3D,
 | |
|     xglNoOpActiveTextureARB,
 | |
|     xglNoOpClientActiveTextureARB,
 | |
|     0, /* glMultiTexCoord1dARB */
 | |
|     xglNoOpMultiTexCoord1dvARB,
 | |
|     0, /* glMultiTexCoord1fARB */
 | |
|     xglNoOpMultiTexCoord1fvARB,
 | |
|     0, /* glMultiTexCoord1iARB */
 | |
|     xglNoOpMultiTexCoord1ivARB,
 | |
|     0, /* glMultiTexCoord1sARB */
 | |
|     xglNoOpMultiTexCoord1svARB,
 | |
|     0, /* glMultiTexCoord2dARB */
 | |
|     xglNoOpMultiTexCoord2dvARB,
 | |
|     0, /* glMultiTexCoord2fARB */
 | |
|     xglNoOpMultiTexCoord2fvARB,
 | |
|     0, /* glMultiTexCoord2iARB */
 | |
|     xglNoOpMultiTexCoord2ivARB,
 | |
|     0, /* glMultiTexCoord2sARB */
 | |
|     xglNoOpMultiTexCoord2svARB,
 | |
|     0, /* glMultiTexCoord3dARB */
 | |
|     xglNoOpMultiTexCoord3dvARB,
 | |
|     0, /* glMultiTexCoord3fARB */
 | |
|     xglNoOpMultiTexCoord3fvARB,
 | |
|     0, /* glMultiTexCoord3iARB */
 | |
|     xglNoOpMultiTexCoord3ivARB,
 | |
|     0, /* glMultiTexCoord3sARB */
 | |
|     xglNoOpMultiTexCoord3svARB,
 | |
|     0, /* glMultiTexCoord4dARB */
 | |
|     xglNoOpMultiTexCoord4dvARB,
 | |
|     0, /* glMultiTexCoord4fARB */
 | |
|     xglNoOpMultiTexCoord4fvARB,
 | |
|     0, /* glMultiTexCoord4iARB */
 | |
|     xglNoOpMultiTexCoord4ivARB,
 | |
|     0, /* glMultiTexCoord4sARB */
 | |
|     xglNoOpMultiTexCoord4svARB,
 | |
|     0, /* glLoadTransposeMatrixfARB */
 | |
|     0, /* glLoadTransposeMatrixdARB */
 | |
|     0, /* glMultTransposeMatrixfARB */
 | |
|     0, /* glMultTransposeMatrixdARB */
 | |
|     xglNoOpSampleCoverageARB,
 | |
|     0, /* glDrawBuffersARB */
 | |
|     0, /* glPolygonOffsetEXT */
 | |
|     0, /* glGetTexFilterFuncSGIS */
 | |
|     0, /* glTexFilterFuncSGIS */
 | |
|     0, /* glGetHistogramEXT */
 | |
|     0, /* glGetHistogramParameterfvEXT */
 | |
|     0, /* glGetHistogramParameterivEXT */
 | |
|     0, /* glGetMinmaxEXT */
 | |
|     0, /* glGetMinmaxParameterfvEXT */
 | |
|     0, /* glGetMinmaxParameterivEXT */
 | |
|     0, /* glGetConvolutionFilterEXT */
 | |
|     0, /* glGetConvolutionParameterfvEXT */
 | |
|     0, /* glGetConvolutionParameterivEXT */
 | |
|     0, /* glGetSeparableFilterEXT */
 | |
|     0, /* glGetColorTableSGI */
 | |
|     0, /* glGetColorTableParameterfvSGI */
 | |
|     0, /* glGetColorTableParameterivSGI */
 | |
|     0, /* glPixelTexGenSGIX */
 | |
|     0, /* glPixelTexGenParameteriSGIS */
 | |
|     0, /* glPixelTexGenParameterivSGIS */
 | |
|     0, /* glPixelTexGenParameterfSGIS */
 | |
|     0, /* glPixelTexGenParameterfvSGIS */
 | |
|     0, /* glGetPixelTexGenParameterivSGIS */
 | |
|     0, /* glGetPixelTexGenParameterfvSGIS */
 | |
|     0, /* glTexImage4DSGIS */
 | |
|     0, /* glTexSubImage4DSGIS */
 | |
|     xglNoOpAreTexturesResidentEXT,
 | |
|     xglNoOpGenTexturesEXT,
 | |
|     xglNoOpIsTextureEXT,
 | |
|     0, /* glDetailTexFuncSGIS */
 | |
|     0, /* glGetDetailTexFuncSGIS */
 | |
|     0, /* glSharpenTexFuncSGIS */
 | |
|     0, /* glGetSharpenTexFuncSGIS */
 | |
|     xglNoOpSampleMaskSGIS,
 | |
|     xglNoOpSamplePatternSGIS,
 | |
|     0, /* glColorPointerEXT */
 | |
|     0, /* glEdgeFlagPointerEXT */
 | |
|     0, /* glIndexPointerEXT */
 | |
|     0, /* glNormalPointerEXT */
 | |
|     0, /* glTexCoordPointerEXT */
 | |
|     0, /* glVertexPointerEXT */
 | |
|     0, /* glSpriteParameterfSGIX */
 | |
|     0, /* glSpriteParameterfvSGIX */
 | |
|     0, /* glSpriteParameteriSGIX */
 | |
|     0, /* glSpriteParameterivSGIX */
 | |
|     xglNoOpPointParameterfEXT,
 | |
|     xglNoOpPointParameterfvEXT,
 | |
|     0, /* glGetInstrumentsSGIX */
 | |
|     0, /* glInstrumentsBufferSGIX */
 | |
|     0, /* glPollInstrumentsSGIX */
 | |
|     0, /* glReadInstrumentsSGIX */
 | |
|     0, /* glStartInstrumentsSGIX */
 | |
|     0, /* glStopInstrumentsSGIX */
 | |
|     0, /* glFrameZoomSGIX */
 | |
|     0, /* glTagSampleBufferSGIX */
 | |
|     0, /* glReferencePlaneSGIX */
 | |
|     0, /* glFlushRasterSGIX */
 | |
|     0, /* glGetListParameterfvSGIX */
 | |
|     0, /* glGetListParameterivSGIX */
 | |
|     0, /* glListParameterfSGIX */
 | |
|     0, /* glListParameterfvSGIX */
 | |
|     0, /* glListParameteriSGIX */
 | |
|     0, /* glListParameterivSGIX */
 | |
|     0, /* glFragmentColorMaterialSGIX */
 | |
|     0, /* glFragmentLightfSGIX */
 | |
|     0, /* glFragmentLightfvSGIX */
 | |
|     0, /* glFragmentLightiSGIX */
 | |
|     0, /* glFragmentLightivSGIX */
 | |
|     0, /* glFragmentLightModelfSGIX */
 | |
|     0, /* glFragmentLightModelfvSGIX */
 | |
|     0, /* glFragmentLightModeliSGIX */
 | |
|     0, /* glFragmentLightModelivSGIX */
 | |
|     0, /* glFragmentMaterialfSGIX */
 | |
|     0, /* glFragmentMaterialfvSGIX */
 | |
|     0, /* glFragmentMaterialiSGIX */
 | |
|     0, /* glFragmentMaterialivSGIX */
 | |
|     0, /* glGetFragmentLightfvSGIX */
 | |
|     0, /* glGetFragmentLightivSGIX */
 | |
|     0, /* glGetFragmentMaterialfvSGIX */
 | |
|     0, /* glGetFragmentMaterialivSGIX */
 | |
|     0, /* glLightEnviSGIX */
 | |
|     0, /* glVertexWeightfEXT */
 | |
|     0, /* glVertexWeightfvEXT */
 | |
|     0, /* glVertexWeightPointerEXT */
 | |
|     0, /* glFlushVertexArrayRangeNV */
 | |
|     0, /* glVertexArrayRangeNV */
 | |
|     0, /* glCombinerParameterfvNV */
 | |
|     0, /* glCombinerParameterfNV */
 | |
|     0, /* glCombinerParameterivNV */
 | |
|     0, /* glCombinerParameteriNV */
 | |
|     0, /* glCombinerInputNV */
 | |
|     0, /* glCombinerOutputNV */
 | |
|     0, /* glFinalCombinerInputNV */
 | |
|     0, /* glGetCombinerInputParameterfvNV */
 | |
|     0, /* glGetCombinerInputParameterivNV */
 | |
|     0, /* glGetCombinerOutputParameterfvNV */
 | |
|     0, /* glGetCombinerOutputParameterivNV */
 | |
|     0, /* glGetFinalCombinerInputParameterfvNV */
 | |
|     0, /* glGetFinalCombinerInputParameterivNV */
 | |
|     0, /* glResizeBuffersMESA */
 | |
|     0, /* glWindowPos2dMESA */
 | |
|     0, /* glWindowPos2dvMESA */
 | |
|     0, /* glWindowPos2fMESA */
 | |
|     0, /* glWindowPos2fvMESA */
 | |
|     0, /* glWindowPos2iMESA */
 | |
|     0, /* glWindowPos2ivMESA */
 | |
|     0, /* glWindowPos2sMESA */
 | |
|     0, /* glWindowPos2svMESA */
 | |
|     0, /* glWindowPos3dMESA */
 | |
|     0, /* glWindowPos3dvMESA */
 | |
|     xglNoOpWindowPos3fMESA,
 | |
|     0, /* glWindowPos3fvMESA */
 | |
|     0, /* glWindowPos3iMESA */
 | |
|     0, /* glWindowPos3ivMESA */
 | |
|     0, /* glWindowPos3sMESA */
 | |
|     0, /* glWindowPos3svMESA */
 | |
|     0, /* glWindowPos4dMESA */
 | |
|     0, /* glWindowPos4dvMESA */
 | |
|     0, /* glWindowPos4fMESA */
 | |
|     0, /* glWindowPos4fvMESA */
 | |
|     0, /* glWindowPos4iMESA */
 | |
|     0, /* glWindowPos4ivMESA */
 | |
|     0, /* glWindowPos4sMESA */
 | |
|     0, /* glWindowPos4svMESA */
 | |
|     xglNoOpBlendFuncSeparateEXT,
 | |
|     0, /* glIndexMaterialEXT */
 | |
|     0, /* glIndexFuncEXT */
 | |
|     0, /* glLockArraysEXT */
 | |
|     0, /* glUnlockArraysEXT */
 | |
|     0, /* glCullParameterdvEXT */
 | |
|     0, /* glCullParameterfvEXT */
 | |
|     0, /* glHintPGI */
 | |
|     0, /* glFogCoordfEXT */
 | |
|     xglNoOpFogCoordfvEXT,
 | |
|     0, /* glFogCoorddEXT */
 | |
|     xglNoOpFogCoorddvEXT,
 | |
|     xglNoOpFogCoordPointerEXT,
 | |
|     0, /* glGetColorTableEXT */
 | |
|     0, /* glGetColorTableParameterivEXT */
 | |
|     0, /* glGetColorTableParameterfvEXT */
 | |
|     0, /* glTbufferMask3DFX */
 | |
|     0, /* glCompressedTexImage3DARB */
 | |
|     0, /* glCompressedTexImage2DARB */
 | |
|     0, /* glCompressedTexImage1DARB */
 | |
|     0, /* glCompressedTexSubImage3DARB */
 | |
|     0, /* glCompressedTexSubImage2DARB */
 | |
|     0, /* glCompressedTexSubImage1DARB */
 | |
|     0, /* glGetCompressedTexImageARB */
 | |
|     0, /* glSecondaryColor3bEXT */
 | |
|     xglNoOpSecondaryColor3bvEXT,
 | |
|     0, /* glSecondaryColor3dEXT */
 | |
|     xglNoOpSecondaryColor3dvEXT,
 | |
|     0, /* glSecondaryColor3fEXT */
 | |
|     xglNoOpSecondaryColor3fvEXT,
 | |
|     0, /* glSecondaryColor3iEXT */
 | |
|     xglNoOpSecondaryColor3ivEXT,
 | |
|     0, /* glSecondaryColor3sEXT */
 | |
|     xglNoOpSecondaryColor3svEXT,
 | |
|     0, /* glSecondaryColor3ubEXT */
 | |
|     xglNoOpSecondaryColor3ubvEXT,
 | |
|     0, /* glSecondaryColor3uiEXT */
 | |
|     xglNoOpSecondaryColor3uivEXT,
 | |
|     0, /* glSecondaryColor3usEXT */
 | |
|     xglNoOpSecondaryColor3usvEXT,
 | |
|     xglNoOpSecondaryColorPointerEXT,
 | |
|     0, /* glAreProgramsResidentNV */
 | |
|     0, /* glBindProgramNV */
 | |
|     0, /* glDeleteProgramsNV */
 | |
|     0, /* glExecuteProgramNV */
 | |
|     0, /* glGenProgramsNV */
 | |
|     0, /* glGetProgramParameterdvNV */
 | |
|     0, /* glGetProgramParameterfvNV */
 | |
|     0, /* glGetProgramivNV */
 | |
|     0, /* glGetProgramStringNV */
 | |
|     0, /* glGetTrackMatrixivNV */
 | |
|     0, /* glGetVertexAttribdvARB */
 | |
|     0, /* glGetVertexAttribfvARB */
 | |
|     0, /* glGetVertexAttribivARB */
 | |
|     0, /* glGetVertexAttribPointervNV */
 | |
|     0, /* glIsProgramNV */
 | |
|     0, /* glLoadProgramNV */
 | |
|     0, /* glProgramParameter4dNV */
 | |
|     0, /* glProgramParameter4dvNV */
 | |
|     0, /* glProgramParameter4fNV */
 | |
|     0, /* glProgramParameter4fvNV */
 | |
|     0, /* glProgramParameters4dvNV */
 | |
|     0, /* glProgramParameters4fvNV */
 | |
|     0, /* glRequestResidentProgramsNV */
 | |
|     0, /* glTrackMatrixNV */
 | |
|     0, /* glVertexAttribPointerNV */
 | |
|     0, /* glVertexAttrib1dARB */
 | |
|     0, /* glVertexAttrib1dvARB */
 | |
|     0, /* glVertexAttrib1fARB */
 | |
|     0, /* glVertexAttrib1fvARB */
 | |
|     0, /* glVertexAttrib1sARB */
 | |
|     0, /* glVertexAttrib1svARB */
 | |
|     0, /* glVertexAttrib2dARB */
 | |
|     0, /* glVertexAttrib2dvARB */
 | |
|     0, /* glVertexAttrib2fARB */
 | |
|     0, /* glVertexAttrib2fvARB */
 | |
|     0, /* glVertexAttrib2sARB */
 | |
|     0, /* glVertexAttrib2svARB */
 | |
|     0, /* glVertexAttrib3dARB */
 | |
|     0, /* glVertexAttrib3dvARB */
 | |
|     0, /* glVertexAttrib3fARB */
 | |
|     0, /* glVertexAttrib3fvARB */
 | |
|     0, /* glVertexAttrib3sARB */
 | |
|     0, /* glVertexAttrib3svARB */
 | |
|     0, /* glVertexAttrib4dARB */
 | |
|     0, /* glVertexAttrib4dvARB */
 | |
|     0, /* glVertexAttrib4fARB */
 | |
|     0, /* glVertexAttrib4fvARB */
 | |
|     0, /* glVertexAttrib4sARB */
 | |
|     0, /* glVertexAttrib4svARB */
 | |
|     0, /* glVertexAttrib4NubARB */
 | |
|     0, /* glVertexAttrib4NubvARB */
 | |
|     0, /* glVertexAttribs1dvNV */
 | |
|     0, /* glVertexAttribs1fvNV */
 | |
|     0, /* glVertexAttribs1svNV */
 | |
|     0, /* glVertexAttribs2dvNV */
 | |
|     0, /* glVertexAttribs2fvNV */
 | |
|     0, /* glVertexAttribs2svNV */
 | |
|     0, /* glVertexAttribs3dvNV */
 | |
|     0, /* glVertexAttribs3fvNV */
 | |
|     0, /* glVertexAttribs3svNV */
 | |
|     0, /* glVertexAttribs4dvNV */
 | |
|     0, /* glVertexAttribs4fvNV */
 | |
|     0, /* glVertexAttribs4svNV */
 | |
|     0, /* glVertexAttribs4ubvNV */
 | |
|     xglNoOpPointParameteriNV,
 | |
|     xglNoOpPointParameterivNV,
 | |
|     0, /* glMultiDrawArraysEXT */
 | |
|     0, /* glMultiDrawElementsEXT */
 | |
|     xglNoOpActiveStencilFaceEXT,
 | |
|     0, /* glDeleteFencesNV */
 | |
|     0, /* glGenFencesNV */
 | |
|     0, /* glIsFenceNV */
 | |
|     0, /* glTestFenceNV */
 | |
|     0, /* glGetFenceivNV */
 | |
|     0, /* glFinishFenceNV */
 | |
|     0, /* glSetFenceNV */
 | |
|     0, /* glVertexAttrib4bvARB */
 | |
|     0, /* glVertexAttrib4ivARB */
 | |
|     0, /* glVertexAttrib4ubvARB */
 | |
|     0, /* glVertexAttrib4usvARB */
 | |
|     0, /* glVertexAttrib4uivARB */
 | |
|     0, /* glVertexAttrib4NbvARB */
 | |
|     0, /* glVertexAttrib4NsvARB */
 | |
|     0, /* glVertexAttrib4NivARB */
 | |
|     0, /* glVertexAttrib4NusvARB */
 | |
|     0, /* glVertexAttrib4NuivARB */
 | |
|     0, /* glVertexAttribPointerARB */
 | |
|     0, /* glEnableVertexAttribArrayARB */
 | |
|     0, /* glDisableVertexAttribArrayARB */
 | |
|     0, /* glProgramStringARB */
 | |
|     0, /* glProgramEnvParameter4dARB */
 | |
|     0, /* glProgramEnvParameter4dvARB */
 | |
|     0, /* glProgramEnvParameter4fARB */
 | |
|     0, /* glProgramEnvParameter4fvARB */
 | |
|     0, /* glProgramLocalParameter4dARB */
 | |
|     0, /* glProgramLocalParameter4dvARB */
 | |
|     0, /* glProgramLocalParameter4fARB */
 | |
|     0, /* glProgramLocalParameter4fvARB */
 | |
|     0, /* glGetProgramEnvParameterdvARB */
 | |
|     0, /* glGetProgramEnvParameterfvARB */
 | |
|     0, /* glGetProgramLocalParameterdvARB */
 | |
|     0, /* glGetProgramLocalParameterfvARB */
 | |
|     0, /* glGetProgramivARB */
 | |
|     0, /* glGetProgramStringARB */
 | |
|     0, /* glProgramNamedParameter4fNV */
 | |
|     0, /* glProgramNamedParameter4dNV */
 | |
|     0, /* glProgramNamedParameter4fvNV */
 | |
|     0, /* glProgramNamedParameter4dvNV */
 | |
|     0, /* glGetProgramNamedParameterfvNV */
 | |
|     0, /* glGetProgramNamedParameterdvNV */
 | |
|     0, /* glBindBufferARB */
 | |
|     0, /* glBufferDataARB */
 | |
|     0, /* glBufferSubDataARB */
 | |
|     0, /* glDeleteBuffersARB */
 | |
|     0, /* glGenBuffersARB */
 | |
|     0, /* glGetBufferParameterivARB */
 | |
|     0, /* glGetBufferPointervARB */
 | |
|     0, /* glGetBufferSubDataARB */
 | |
|     0, /* glIsBufferARB */
 | |
|     0, /* glMapBufferARB */
 | |
|     0, /* glUnmapBufferARB */
 | |
|     0, /* glDepthBoundsEXT */
 | |
|     0, /* glGenQueriesARB */
 | |
|     0, /* glDeleteQueriesARB */
 | |
|     0, /* glIsQueryARB */
 | |
|     0, /* glBeginQueryARB */
 | |
|     0, /* glEndQueryARB */
 | |
|     0, /* glGetQueryivARB */
 | |
|     0, /* glGetQueryObjectivARB */
 | |
|     0, /* glGetQueryObjectuivARB */
 | |
|     0, /* glMultiModeDrawArraysIBM */
 | |
|     0, /* glMultiModeDrawElementsIBM */
 | |
|     0, /* glBlendEquationSeparateEXT */
 | |
|     0, /* glDeleteObjectARB */
 | |
|     0, /* glGetHandleARB */
 | |
|     0, /* glDetachObjectARB */
 | |
|     0, /* glCreateShaderObjectARB */
 | |
|     0, /* glShaderSourceARB */
 | |
|     0, /* glCompileShaderARB */
 | |
|     0, /* glCreateProgramObjectARB */
 | |
|     0, /* glAttachObjectARB */
 | |
|     0, /* glLinkProgramARB */
 | |
|     0, /* glUseProgramObjectARB */
 | |
|     0, /* glValidateProgramARB */
 | |
|     0, /* glUniform1fARB */
 | |
|     0, /* glUniform2fARB */
 | |
|     0, /* glUniform3fARB */
 | |
|     0, /* glUniform4fARB */
 | |
|     0, /* glUniform1iARB */
 | |
|     0, /* glUniform2iARB */
 | |
|     0, /* glUniform3iARB */
 | |
|     0, /* glUniform4iARB */
 | |
|     0, /* glUniform1fvARB */
 | |
|     0, /* glUniform2fvARB */
 | |
|     0, /* glUniform3fvARB */
 | |
|     0, /* glUniform4fvARB */
 | |
|     0, /* glUniform1ivARB */
 | |
|     0, /* glUniform2ivARB */
 | |
|     0, /* glUniform3ivARB */
 | |
|     0, /* glUniform4ivARB */
 | |
|     0, /* glUniformMatrix2fvARB */
 | |
|     0, /* glUniformMatrix3fvARB */
 | |
|     0, /* glUniformMatrix4fvARB */
 | |
|     0, /* glGetObjectParameterfvARB */
 | |
|     0, /* glGetObjectParameterivARB */
 | |
|     0, /* glGetInfoLogARB */
 | |
|     0, /* glGetAttachedObjectsARB */
 | |
|     0, /* glGetUniformLocationARB */
 | |
|     0, /* glGetActiveUniformARB */
 | |
|     0, /* glGetUniformfvARB */
 | |
|     0, /* glGetUniformivARB */
 | |
|     0, /* glGetShaderSourceARB */
 | |
|     0, /* glBindAttribLocationARB */
 | |
|     0, /* glGetActiveAttribARB */
 | |
|     0, /* glGetAttribLocationARB */
 | |
|     0, /* glGetVertexAttribdvNV */
 | |
|     0, /* glGetVertexAttribfvNV */
 | |
|     0, /* glGetVertexAttribivNV */
 | |
|     0, /* glVertexAttrib1dNV */
 | |
|     0, /* glVertexAttrib1dvNV */
 | |
|     0, /* glVertexAttrib1fNV */
 | |
|     0, /* glVertexAttrib1fvNV */
 | |
|     0, /* glVertexAttrib1sNV */
 | |
|     0, /* glVertexAttrib1svNV */
 | |
|     0, /* glVertexAttrib2dNV */
 | |
|     0, /* glVertexAttrib2dvNV */
 | |
|     0, /* glVertexAttrib2fNV */
 | |
|     0, /* glVertexAttrib2fvNV */
 | |
|     0, /* glVertexAttrib2sNV */
 | |
|     0, /* glVertexAttrib2svNV */
 | |
|     0, /* glVertexAttrib3dNV */
 | |
|     0, /* glVertexAttrib3dvNV */
 | |
|     0, /* glVertexAttrib3fNV */
 | |
|     0, /* glVertexAttrib3fvNV */
 | |
|     0, /* glVertexAttrib3sNV */
 | |
|     0, /* glVertexAttrib3svNV */
 | |
|     0, /* glVertexAttrib4dNV */
 | |
|     0, /* glVertexAttrib4dvNV */
 | |
|     0, /* glVertexAttrib4fNV */
 | |
|     0, /* glVertexAttrib4fvNV */
 | |
|     0, /* glVertexAttrib4sNV */
 | |
|     0, /* glVertexAttrib4svNV */
 | |
|     0, /* glVertexAttrib4ubNV */
 | |
|     0, /* glVertexAttrib4ubvNV */
 | |
|     0, /* glGenFragmentShadersATI */
 | |
|     0, /* glBindFragmentShaderATI */
 | |
|     0, /* glDeleteFragmentShaderATI */
 | |
|     0, /* glBeginFragmentShaderATI */
 | |
|     0, /* glEndFragmentShaderATI */
 | |
|     0, /* glPassTexCoordATI */
 | |
|     0, /* glSampleMapATI */
 | |
|     0, /* glColorFragmentOp1ATI */
 | |
|     0, /* glColorFragmentOp2ATI */
 | |
|     0, /* glColorFragmentOp3ATI */
 | |
|     0, /* glAlphaFragmentOp1ATI */
 | |
|     0, /* glAlphaFragmentOp2ATI */
 | |
|     0, /* glAlphaFragmentOp3ATI */
 | |
|     0, /* glSetFragmentShaderConstantATI */
 | |
|     xglNoOpIsRenderbufferEXT,
 | |
|     xglNoOpBindRenderbufferEXT,
 | |
|     xglNoOpDeleteRenderbuffersEXT,
 | |
|     xglNoOpGenRenderbuffersEXT,
 | |
|     xglNoOpRenderbufferStorageEXT,
 | |
|     xglNoOpGetRenderbufferParameterivEXT,
 | |
|     xglNoOpIsFramebufferEXT,
 | |
|     xglNoOpBindFramebufferEXT,
 | |
|     xglNoOpDeleteFramebuffersEXT,
 | |
|     xglNoOpGenFramebuffersEXT,
 | |
|     xglNoOpCheckFramebufferStatusEXT,
 | |
|     xglNoOpFramebufferTexture1DEXT,
 | |
|     xglNoOpFramebufferTexture2DEXT,
 | |
|     xglNoOpFramebufferTexture3DEXT,
 | |
|     xglNoOpFramebufferRenderbufferEXT,
 | |
|     xglNoOpGetFramebufferAttachmentParameterivEXT,
 | |
|     xglNoOpGenerateMipmapEXT,
 | |
|     0, /* glStencilFuncSeparate */
 | |
|     0, /* glStencilOpSeparate */
 | |
|     0, /* glStencilMaskSeparate */
 | |
|     0, /* glGetQueryObjecti64vEXT */
 | |
|     0  /* glGetQueryObjectui64vEXT */
 | |
| };
 | |
| 
 | |
| static void
 | |
| xglInitExtensions (xglGLContextPtr pContext)
 | |
| {
 | |
|     const char *extensions;
 | |
| 
 | |
|     extensions = (const char *) glGetString (GL_EXTENSIONS);
 | |
| 
 | |
|     if (strstr (extensions, "GL_ARB_multitexture"))
 | |
|     {
 | |
| 	pContext->ActiveTextureARB =
 | |
| 	    (PFNGLACTIVETEXTUREARBPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glActiveTextureARB");
 | |
| 	pContext->glRenderTable.ClientActiveTextureARB =
 | |
| 	    (PFNGLCLIENTACTIVETEXTUREARBPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glClientActiveTextureARB");
 | |
| 	pContext->glRenderTable.MultiTexCoord1dvARB =
 | |
| 	    (PFNGLMULTITEXCOORD1DVARBPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glMultiTexCoord1dvARB");
 | |
| 	pContext->glRenderTable.MultiTexCoord1fvARB =
 | |
| 	    (PFNGLMULTITEXCOORD1FVARBPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glMultiTexCoord1fvARB");
 | |
| 	pContext->glRenderTable.MultiTexCoord1ivARB =
 | |
| 	    (PFNGLMULTITEXCOORD1IVARBPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glMultiTexCoord1ivARB");
 | |
| 	pContext->glRenderTable.MultiTexCoord1svARB =
 | |
| 	    (PFNGLMULTITEXCOORD1SVARBPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glMultiTexCoord1svARB");
 | |
| 	pContext->glRenderTable.MultiTexCoord2dvARB =
 | |
| 	    (PFNGLMULTITEXCOORD2DVARBPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glMultiTexCoord2dvARB");
 | |
| 	pContext->glRenderTable.MultiTexCoord2fvARB =
 | |
| 	    (PFNGLMULTITEXCOORD2FVARBPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glMultiTexCoord2fvARB");
 | |
| 	pContext->glRenderTable.MultiTexCoord2ivARB =
 | |
| 	    (PFNGLMULTITEXCOORD2IVARBPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glMultiTexCoord2ivARB");
 | |
| 	pContext->glRenderTable.MultiTexCoord2svARB =
 | |
| 	    (PFNGLMULTITEXCOORD2SVARBPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glMultiTexCoord2svARB");
 | |
| 	pContext->glRenderTable.MultiTexCoord3dvARB =
 | |
| 	    (PFNGLMULTITEXCOORD3DVARBPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glMultiTexCoord3dvARB");
 | |
| 	pContext->glRenderTable.MultiTexCoord3fvARB =
 | |
| 	    (PFNGLMULTITEXCOORD3FVARBPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glMultiTexCoord3fvARB");
 | |
| 	pContext->glRenderTable.MultiTexCoord3ivARB =
 | |
| 	    (PFNGLMULTITEXCOORD3IVARBPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glMultiTexCoord3ivARB");
 | |
| 	pContext->glRenderTable.MultiTexCoord3svARB =
 | |
| 	    (PFNGLMULTITEXCOORD3SVARBPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glMultiTexCoord3svARB");
 | |
| 	pContext->glRenderTable.MultiTexCoord4dvARB =
 | |
| 	    (PFNGLMULTITEXCOORD4DVARBPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glMultiTexCoord4dvARB");
 | |
| 	pContext->glRenderTable.MultiTexCoord4fvARB =
 | |
| 	    (PFNGLMULTITEXCOORD4FVARBPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glMultiTexCoord4fvARB");
 | |
| 	pContext->glRenderTable.MultiTexCoord4ivARB =
 | |
| 	    (PFNGLMULTITEXCOORD4IVARBPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glMultiTexCoord4ivARB");
 | |
| 	pContext->glRenderTable.MultiTexCoord4svARB =
 | |
| 	    (PFNGLMULTITEXCOORD4SVARBPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glMultiTexCoord4svARB");
 | |
| 
 | |
| 	glGetIntegerv (GL_MAX_TEXTURE_UNITS_ARB, &pContext->maxTexUnits);
 | |
| 	if (pContext->maxTexUnits > XGL_MAX_TEXTURE_UNITS)
 | |
| 	    pContext->maxTexUnits = XGL_MAX_TEXTURE_UNITS;
 | |
| 
 | |
| 	pContext->glRenderTable.ActiveTextureARB = xglActiveTextureARB;
 | |
|     }
 | |
|     else
 | |
| 	pContext->maxTexUnits = 1;
 | |
| 
 | |
|     if (strstr (extensions, "GL_ARB_multisample"))
 | |
|     {
 | |
| 	pContext->glRenderTable.SampleCoverageARB =
 | |
| 	    (PFNGLSAMPLECOVERAGEARBPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glSampleCoverageARB");
 | |
|     }
 | |
| 
 | |
|     if (strstr (extensions, "GL_EXT_texture_object"))
 | |
|     {
 | |
| 	pContext->glRenderTable.AreTexturesResidentEXT =
 | |
| 	    xglAreTexturesResident;
 | |
| 	pContext->glRenderTable.GenTexturesEXT = xglGenTextures;
 | |
| 	pContext->glRenderTable.IsTextureEXT = xglIsTexture;
 | |
|     }
 | |
| 
 | |
|     if (strstr (extensions, "GL_SGIS_multisample"))
 | |
|     {
 | |
| 	pContext->glRenderTable.SampleMaskSGIS =
 | |
| 	    (PFNGLSAMPLEMASKSGISPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glSampleMaskSGIS");
 | |
| 	pContext->glRenderTable.SamplePatternSGIS =
 | |
| 	    (PFNGLSAMPLEPATTERNSGISPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glSamplePatternSGIS");
 | |
|     }
 | |
| 
 | |
|     if (strstr (extensions, "GL_EXT_point_parameters"))
 | |
|     {
 | |
| 	pContext->glRenderTable.PointParameterfEXT =
 | |
| 	    (PFNGLPOINTPARAMETERFEXTPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glPointParameterfEXT");
 | |
| 	pContext->glRenderTable.PointParameterfvEXT =
 | |
| 	    (PFNGLPOINTPARAMETERFVEXTPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glPointParameterfvEXT");
 | |
|     }
 | |
| 
 | |
|     if (strstr (extensions, "GL_MESA_window_pos"))
 | |
|     {
 | |
| 	pContext->WindowPos3fMESA =
 | |
| 	    (PFNGLWINDOWPOS3FMESAPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glWindowPos3fMESA");
 | |
| 
 | |
| 	pContext->glRenderTable.WindowPos3fMESA = xglWindowPos3fMESA;
 | |
|     }
 | |
| 
 | |
|     if (strstr (extensions, "GL_EXT_blend_func_separate"))
 | |
|     {
 | |
| 	pContext->glRenderTable.BlendFuncSeparateEXT =
 | |
| 	    (PFNGLBLENDFUNCSEPARATEEXTPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glBlendFuncSeparateEXT");
 | |
|     }
 | |
| 
 | |
|     if (strstr (extensions, "GL_EXT_fog_coord"))
 | |
|     {
 | |
| 	pContext->glRenderTable.FogCoordfvEXT =
 | |
| 	    (PFNGLFOGCOORDFVEXTPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glFogCoordfvEXT");
 | |
| 	pContext->glRenderTable.FogCoorddvEXT =
 | |
| 	    (PFNGLFOGCOORDDVEXTPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glFogCoorddvEXT");
 | |
| 	pContext->glRenderTable.FogCoordPointerEXT =
 | |
| 	    (PFNGLFOGCOORDPOINTEREXTPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glFogCoordPointerEXT");
 | |
|     }
 | |
| 
 | |
|     if (strstr (extensions, "GL_EXT_secondary_color"))
 | |
|     {
 | |
| 	pContext->glRenderTable.SecondaryColor3bvEXT =
 | |
| 	    (PFNGLSECONDARYCOLOR3BVEXTPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glSecondaryColor3bvEXT");
 | |
| 	pContext->glRenderTable.SecondaryColor3dvEXT =
 | |
| 	    (PFNGLSECONDARYCOLOR3DVEXTPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glSecondaryColor3dvEXT");
 | |
| 	pContext->glRenderTable.SecondaryColor3fvEXT =
 | |
| 	    (PFNGLSECONDARYCOLOR3FVEXTPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glSecondaryColor3fvEXT");
 | |
| 	pContext->glRenderTable.SecondaryColor3ivEXT =
 | |
| 	    (PFNGLSECONDARYCOLOR3IVEXTPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glSecondaryColor3ivEXT");
 | |
| 	pContext->glRenderTable.SecondaryColor3svEXT =
 | |
| 	    (PFNGLSECONDARYCOLOR3SVEXTPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glSecondaryColor3svEXT");
 | |
| 	pContext->glRenderTable.SecondaryColor3ubvEXT =
 | |
| 	    (PFNGLSECONDARYCOLOR3UBVEXTPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glSecondaryColor3ubvEXT");
 | |
| 	pContext->glRenderTable.SecondaryColor3uivEXT =
 | |
| 	    (PFNGLSECONDARYCOLOR3UIVEXTPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glSecondaryColor3uivEXT");
 | |
| 	pContext->glRenderTable.SecondaryColor3usvEXT =
 | |
| 	    (PFNGLSECONDARYCOLOR3USVEXTPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glSecondaryColor3usvEXT");
 | |
| 	pContext->glRenderTable.SecondaryColorPointerEXT =
 | |
| 	    (PFNGLSECONDARYCOLORPOINTEREXTPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glSecondaryColorPointerEXT");
 | |
|     }
 | |
| 
 | |
|     if (strstr (extensions, "GL_NV_point_sprite"))
 | |
|     {
 | |
| 	pContext->glRenderTable.PointParameteriNV =
 | |
| 	    (PFNGLPOINTPARAMETERINVPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glPointParameteriNV");
 | |
| 	pContext->glRenderTable.PointParameterivNV =
 | |
| 	    (PFNGLPOINTPARAMETERIVNVPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glPointParameterivNV");
 | |
|     }
 | |
| 
 | |
|     if (strstr (extensions, "GL_EXT_stencil_two_side"))
 | |
|     {
 | |
| 	pContext->glRenderTable.ActiveStencilFaceEXT =
 | |
| 	    (PFNGLACTIVESTENCILFACEEXTPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glActiveStencilFaceEXT");
 | |
|     }
 | |
| 
 | |
|     if (strstr (extensions, "GL_EXT_framebuffer_object"))
 | |
|     {
 | |
| 	pContext->glRenderTable.IsRenderbufferEXT =
 | |
| 	    (PFNGLISRENDERBUFFEREXTPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glIsRenderbufferEXT");
 | |
| 	pContext->glRenderTable.BindRenderbufferEXT =
 | |
| 	    (PFNGLBINDRENDERBUFFEREXTPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glBindRenderbufferEXT");
 | |
| 	pContext->glRenderTable.DeleteRenderbuffersEXT =
 | |
| 	    (PFNGLDELETERENDERBUFFERSEXTPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glDeleteRenderbuffersEXT");
 | |
| 	pContext->glRenderTable.GenRenderbuffersEXT =
 | |
| 	    (PFNGLGENRENDERBUFFERSEXTPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glGenRenderbuffersEXT");
 | |
| 	pContext->glRenderTable.RenderbufferStorageEXT =
 | |
| 	    (PFNGLRENDERBUFFERSTORAGEEXTPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glRenderbufferStorageEXT");
 | |
| 	pContext->glRenderTable.GetRenderbufferParameterivEXT =
 | |
| 	    (PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glGetRenderbufferParameterivEXT");
 | |
| 	pContext->glRenderTable.IsFramebufferEXT =
 | |
| 	    (PFNGLISFRAMEBUFFEREXTPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glIsFramebufferEXT");
 | |
| 	pContext->glRenderTable.BindFramebufferEXT =
 | |
| 	    (PFNGLBINDFRAMEBUFFEREXTPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glBindFramebufferEXT");
 | |
| 	pContext->glRenderTable.DeleteFramebuffersEXT =
 | |
| 	    (PFNGLDELETEFRAMEBUFFERSEXTPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glDeleteFramebuffersEXT");
 | |
| 	pContext->glRenderTable.GenFramebuffersEXT =
 | |
| 	    (PFNGLGENFRAMEBUFFERSEXTPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glGenFramebuffersEXT");
 | |
| 	pContext->glRenderTable.CheckFramebufferStatusEXT =
 | |
| 	    (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glCheckFramebufferStatusEXT");
 | |
| 	pContext->glRenderTable.FramebufferTexture1DEXT =
 | |
| 	    (PFNGLFRAMEBUFFERTEXTURE1DEXTPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glFramebufferTexture1DEXT");
 | |
| 	pContext->glRenderTable.FramebufferTexture2DEXT =
 | |
| 	    (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glFramebufferTexture2DEXT");
 | |
| 	pContext->glRenderTable.FramebufferTexture3DEXT =
 | |
| 	    (PFNGLFRAMEBUFFERTEXTURE3DEXTPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glFramebufferTexture3DEXT");
 | |
| 	pContext->glRenderTable.FramebufferRenderbufferEXT =
 | |
| 	    (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glFramebufferRenderbufferEXT");
 | |
| 	pContext->glRenderTable.GetFramebufferAttachmentParameterivEXT =
 | |
| 	    (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glGetFramebufferAttachment"
 | |
| 					    "ParameterivEXT");
 | |
| 	pContext->glRenderTable.GenerateMipmapEXT =
 | |
| 	    (PFNGLGENERATEMIPMAPEXTPROC)
 | |
| 	    glitz_context_get_proc_address (pContext->context,
 | |
| 					    "glGenerateMipmapEXT");
 | |
|     }
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglSetCurrentContext (xglGLContextPtr pContext)
 | |
| {
 | |
|     cctx = pContext;
 | |
| 
 | |
|     glitz_context_make_current (cctx->context, cctx->pDrawBuffer->drawable);
 | |
| 
 | |
|     GlxSetRenderTables (&cctx->glRenderTable);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglFreeContext (xglGLContextPtr pContext)
 | |
| {
 | |
|     int i;
 | |
| 
 | |
|     pContext->refcnt--;
 | |
|     if (pContext->shared == pContext)
 | |
| 	pContext->refcnt--;
 | |
| 
 | |
|     if (pContext->refcnt)
 | |
| 	return;
 | |
| 
 | |
|     if (pContext->shared != pContext)
 | |
| 	xglFreeContext (pContext->shared);
 | |
| 
 | |
|     if (pContext->texObjects)
 | |
|     {
 | |
| 	xglTexObjPtr pTexObj;
 | |
| 	GLuint	     key;
 | |
| 
 | |
| 	do {
 | |
| 	    key = xglHashFirstEntry (pContext->texObjects);
 | |
| 	    if (key)
 | |
| 	    {
 | |
| 		pTexObj = (xglTexObjPtr) xglHashLookup (pContext->texObjects,
 | |
| 							key);
 | |
| 		if (pTexObj)
 | |
| 		    xglUnrefTexObj (pTexObj);
 | |
| 
 | |
| 		xglHashRemove (pContext->texObjects, key);
 | |
| 	    }
 | |
| 	} while (key);
 | |
| 
 | |
| 	xglDeleteHashTable (pContext->texObjects);
 | |
|     }
 | |
| 
 | |
|     if (pContext->displayLists)
 | |
|     {
 | |
| 	xglDisplayListPtr pDisplayList;
 | |
| 	GLuint		  key;
 | |
| 
 | |
| 	do {
 | |
| 	    key = xglHashFirstEntry (pContext->displayLists);
 | |
| 	    if (key)
 | |
| 	    {
 | |
| 		pDisplayList = (xglDisplayListPtr)
 | |
| 		    xglHashLookup (pContext->displayLists, key);
 | |
| 		if (pDisplayList)
 | |
| 		    xglDestroyList (pDisplayList);
 | |
| 
 | |
| 		xglHashRemove (pContext->displayLists, key);
 | |
| 	    }
 | |
| 	} while (key);
 | |
| 
 | |
| 	xglDeleteHashTable (pContext->displayLists);
 | |
|     }
 | |
| 
 | |
|     for (i = 0; i < pContext->maxTexUnits; i++)
 | |
|     {
 | |
| 	xglUnrefTexObj (pContext->attrib.texUnits[i].p1D);
 | |
| 	xglUnrefTexObj (pContext->attrib.texUnits[i].p2D);
 | |
| 	xglUnrefTexObj (pContext->attrib.texUnits[i].p3D);
 | |
| 	xglUnrefTexObj (pContext->attrib.texUnits[i].pRect);
 | |
| 	xglUnrefTexObj (pContext->attrib.texUnits[i].pCubeMap);
 | |
|     }
 | |
| 
 | |
|     if (pContext->groupList)
 | |
| 	glDeleteLists (pContext->groupList, 1);
 | |
| 
 | |
|     if (pContext->context)
 | |
| 	glitz_context_destroy (pContext->context);
 | |
| 
 | |
|     if (pContext->versionString)
 | |
| 	xfree (pContext->versionString);
 | |
| 
 | |
|     xfree (pContext);
 | |
| }
 | |
| 
 | |
| static GLboolean
 | |
| xglDestroyContext (__GLcontext *gc)
 | |
| {
 | |
|     xglGLContextPtr pContext = (xglGLContextPtr) gc;
 | |
|     __GLinterface   *iface = pContext->mIface;
 | |
| 
 | |
|     xglFreeContext (pContext);
 | |
| 
 | |
|     if (!iface)
 | |
| 	return GL_TRUE;
 | |
| 
 | |
|     return (*iface->exports.destroyContext) ((__GLcontext *) iface);
 | |
| }
 | |
| 
 | |
| static GLboolean
 | |
| xglLoseCurrent (__GLcontext *gc)
 | |
| {
 | |
|     xglGLContextPtr pContext = (xglGLContextPtr) gc;
 | |
|     __GLinterface   *iface = pContext->mIface;
 | |
| 
 | |
|     GlxFlushContextCache ();
 | |
|     GlxSetRenderTables (0);
 | |
| 
 | |
|     if (!iface)
 | |
| 	return GL_TRUE;
 | |
| 
 | |
|     return (*iface->exports.loseCurrent) ((__GLcontext *) iface);
 | |
| }
 | |
| 
 | |
| static GLboolean
 | |
| xglMakeCurrent (__GLcontext *gc)
 | |
| {
 | |
|     xglGLContextPtr	pContext = (xglGLContextPtr) gc;
 | |
|     __GLinterface	*iface = &pContext->iface;
 | |
|     __GLinterface	*mIface = pContext->mIface;
 | |
|     __GLdrawablePrivate *drawPriv = iface->imports.getDrawablePrivate (gc);
 | |
|     __GLdrawablePrivate *readPriv = iface->imports.getReadablePrivate (gc);
 | |
|     xglGLBufferPtr	pDrawBufferPriv = drawPriv->private;
 | |
|     xglGLBufferPtr	pReadBufferPriv = readPriv->private;
 | |
|     GLboolean		status = GL_TRUE;
 | |
| 
 | |
|     if (pReadBufferPriv->pDrawable && pDrawBufferPriv->pDrawable)
 | |
|     {
 | |
| 	XID values[2] = { ClipByChildren, 0 };
 | |
| 	int status;
 | |
| 
 | |
| #ifdef COMPOSITE
 | |
| 	/* XXX: temporary hack for root window drawing using
 | |
| 	   IncludeInferiors */
 | |
| 	if (pDrawBufferPriv->pDrawable->type == DRAWABLE_WINDOW &&
 | |
| 	    (!((WindowPtr) (pDrawBufferPriv->pDrawable))->parent))
 | |
| 	    values[0] = IncludeInferiors;
 | |
| #endif
 | |
| 
 | |
| 	/* this happens if client previously used this context with a buffer
 | |
| 	   not supported by the native GL stack */
 | |
| 	if (!pContext->context)
 | |
| 	    return GL_FALSE;
 | |
| 
 | |
| 	/* XXX: GLX_SGI_make_current_read disabled for now */
 | |
| 	if (pDrawBufferPriv != pReadBufferPriv)
 | |
| 	    return GL_FALSE;
 | |
| 
 | |
| 	if (!pReadBufferPriv->pGC)
 | |
| 	    pReadBufferPriv->pGC =
 | |
| 		CreateGC (pReadBufferPriv->pDrawable,
 | |
| 			  GCSubwindowMode | GCGraphicsExposures, values,
 | |
| 			  &status);
 | |
| 
 | |
| 	ValidateGC (pReadBufferPriv->pDrawable, pReadBufferPriv->pGC);
 | |
| 
 | |
| 	if (!pDrawBufferPriv->pGC)
 | |
| 	    pDrawBufferPriv->pGC =
 | |
| 		CreateGC (pDrawBufferPriv->pDrawable,
 | |
| 			  GCSubwindowMode | GCGraphicsExposures, values,
 | |
| 			  &status);
 | |
| 
 | |
| 	ValidateGC (pDrawBufferPriv->pDrawable, pDrawBufferPriv->pGC);
 | |
| 
 | |
| 	pReadBufferPriv->pPixmap = (PixmapPtr) 0;
 | |
| 	pDrawBufferPriv->pPixmap = (PixmapPtr) 0;
 | |
| 
 | |
| 	pContext->pReadBuffer = pReadBufferPriv;
 | |
| 	pContext->pDrawBuffer = pDrawBufferPriv;
 | |
| 
 | |
| 	pContext->readPriv = readPriv;
 | |
| 	pContext->drawPriv = drawPriv;
 | |
| 
 | |
| 	/* from now on this context can only be used with native GL stack */
 | |
| 	if (mIface)
 | |
| 	{
 | |
| 	    (*mIface->exports.destroyContext) ((__GLcontext *) mIface);
 | |
| 	    pContext->mIface = NULL;
 | |
| 	}
 | |
|     }
 | |
|     else
 | |
|     {
 | |
| 	/* this happens if client previously used this context with a buffer
 | |
| 	   supported by the native GL stack */
 | |
| 	if (!mIface)
 | |
| 	    return GL_FALSE;
 | |
| 
 | |
| 	drawPriv->private = pDrawBufferPriv->private;
 | |
| 	readPriv->private = pReadBufferPriv->private;
 | |
| 
 | |
| 	status = (*mIface->exports.makeCurrent) ((__GLcontext *) mIface);
 | |
| 
 | |
| 	drawPriv->private = pDrawBufferPriv;
 | |
| 	readPriv->private = pReadBufferPriv;
 | |
| 
 | |
| 	/* from now on this context can not be used with native GL stack */
 | |
| 	if (status == GL_TRUE && pContext->context)
 | |
| 	{
 | |
| 	    glitz_context_destroy (pContext->context);
 | |
| 	    pContext->context = NULL;
 | |
| 	}
 | |
|     }
 | |
| 
 | |
|     return status;
 | |
| }
 | |
| 
 | |
| static GLboolean
 | |
| xglShareContext (__GLcontext *gc,
 | |
| 		 __GLcontext *gcShare)
 | |
| {
 | |
|     xglGLContextPtr pContext = (xglGLContextPtr) gc;
 | |
|     xglGLContextPtr pContextShare = (xglGLContextPtr) gcShare;
 | |
|     __GLinterface   *iface = pContext->mIface;
 | |
|     __GLinterface   *ifaceShare = pContextShare->mIface;
 | |
| 
 | |
|     if (!iface || !ifaceShare)
 | |
| 	return GL_TRUE;
 | |
| 
 | |
|     return (*iface->exports.shareContext) ((__GLcontext *) iface,
 | |
| 					   (__GLcontext *) ifaceShare);
 | |
| }
 | |
| 
 | |
| static GLboolean
 | |
| xglCopyContext (__GLcontext	  *dst,
 | |
| 		const __GLcontext *src,
 | |
| 		GLuint		  mask)
 | |
| {
 | |
|     xglGLContextPtr   pDst = (xglGLContextPtr) dst;
 | |
|     xglGLContextPtr   pSrc = (xglGLContextPtr) src;
 | |
|     const __GLcontext *srcCtx = (const __GLcontext *) pSrc->mIface;
 | |
|     __GLinterface     *dstIface = (__GLinterface *) pDst->mIface;
 | |
|     GLboolean	      status = GL_TRUE;
 | |
| 
 | |
|     if (pSrc->context && pDst->context)
 | |
| 	glitz_context_copy (pSrc->context, pDst->context, mask);
 | |
|     else
 | |
| 	status = GL_FALSE;
 | |
| 
 | |
|     if (dstIface && srcCtx)
 | |
| 	status = (*dstIface->exports.copyContext) ((__GLcontext *) dstIface,
 | |
| 						   srcCtx,
 | |
| 						   mask);
 | |
| 
 | |
|     return status;
 | |
| }
 | |
| 
 | |
| static Bool
 | |
| xglResizeBuffer (__GLdrawablePrivate *glPriv,
 | |
| 		 int		      x,
 | |
| 		 int		      y,
 | |
| 		 unsigned int	      width,
 | |
| 		 unsigned int	      height)
 | |
| {
 | |
|     xglGLBufferPtr pBufferPriv = glPriv->private;
 | |
|     DrawablePtr    pDrawable = pBufferPriv->pDrawable;
 | |
| 
 | |
|     XGL_SCREEN_PRIV (pDrawable->pScreen);
 | |
|     XGL_DRAWABLE_PIXMAP (pBufferPriv->pDrawable);
 | |
| 
 | |
|     if (pPixmap != pScreenPriv->pScreenPixmap)
 | |
|     {
 | |
| 	if (!xglCreatePixmapSurface (pPixmap))
 | |
| 	    return FALSE;
 | |
| 
 | |
| 	if (pBufferPriv->drawable == pScreenPriv->drawable)
 | |
| 	{
 | |
| 	    if (pBufferPriv->backSurface)
 | |
| 		glitz_surface_destroy (pBufferPriv->backSurface);
 | |
| 
 | |
| 	    glitz_drawable_destroy (pBufferPriv->drawable);
 | |
| 
 | |
| 	    pBufferPriv->drawable    = NULL;
 | |
| 	    pBufferPriv->backSurface = NULL;
 | |
| 	}
 | |
| 
 | |
| 	if (pBufferPriv->drawable)
 | |
| 	{
 | |
| 	    glitz_drawable_update_size (pBufferPriv->drawable,
 | |
| 					pPixmap->drawable.width,
 | |
| 					pPixmap->drawable.height);
 | |
| 	}
 | |
| 	else
 | |
| 	{
 | |
| 	    glitz_drawable_format_t *format;
 | |
| 
 | |
| 	    format = pBufferPriv->pVisual->format.drawable;
 | |
| 	    if (pBufferPriv->pVisual->pbuffer)
 | |
| 	    {
 | |
| 		pBufferPriv->drawable =
 | |
| 		    glitz_create_pbuffer_drawable (pScreenPriv->drawable,
 | |
| 						   format,
 | |
| 						   pPixmap->drawable.width,
 | |
| 						   pPixmap->drawable.height);
 | |
| 	    }
 | |
| 	    else
 | |
| 	    {
 | |
| 		pBufferPriv->drawable =
 | |
| 		    glitz_create_drawable (pScreenPriv->drawable, format,
 | |
| 					   pPixmap->drawable.width,
 | |
| 					   pPixmap->drawable.height);
 | |
| 
 | |
| 		if (!pBufferPriv->drawable)
 | |
| 		    return FALSE;
 | |
| 
 | |
| 		if (format->doublebuffer)
 | |
| 		{
 | |
| 		    glitz_format_t *backFormat;
 | |
| 
 | |
| 		    backFormat = pBufferPriv->pVisual->format.surface;
 | |
| 
 | |
| 		    pBufferPriv->backSurface =
 | |
| 			glitz_surface_create (pScreenPriv->drawable, backFormat,
 | |
| 					      pPixmap->drawable.width,
 | |
| 					      pPixmap->drawable.height,
 | |
| 					      0, NULL);
 | |
| 		    if (pBufferPriv->backSurface)
 | |
| 			glitz_surface_attach (pBufferPriv->backSurface,
 | |
| 					      pBufferPriv->drawable,
 | |
| 					      GLITZ_DRAWABLE_BUFFER_BACK_COLOR);
 | |
| 		}
 | |
| 	    }
 | |
| 	}
 | |
|     }
 | |
|     else
 | |
|     {
 | |
| 	glitz_drawable_reference (pScreenPriv->drawable);
 | |
| 
 | |
| 	if (pBufferPriv->backSurface)
 | |
| 	    glitz_surface_destroy (pBufferPriv->backSurface);
 | |
| 
 | |
| 	if (pBufferPriv->drawable)
 | |
| 	    glitz_drawable_destroy (pBufferPriv->drawable);
 | |
| 
 | |
| 	pBufferPriv->drawable    = pScreenPriv->drawable;
 | |
| 	pBufferPriv->backSurface = NULL;
 | |
|     }
 | |
| 
 | |
|     ValidateGC (pDrawable, pBufferPriv->pGC);
 | |
| 
 | |
|     return TRUE;
 | |
| }
 | |
| 
 | |
| static GLboolean
 | |
| xglForceCurrent (__GLcontext *gc)
 | |
| {
 | |
|     xglGLContextPtr pContext = (xglGLContextPtr) gc;
 | |
|     __GLinterface   *iface = pContext->mIface;
 | |
|     GLboolean	    status = GL_TRUE;
 | |
| 
 | |
|     if (pContext && pContext->context)
 | |
|     {
 | |
| 	__GLdrawablePrivate *readPriv, *drawPriv;
 | |
| 
 | |
| 	readPriv = pContext->readPriv;
 | |
| 	drawPriv = pContext->drawPriv;
 | |
| 
 | |
| 	drawPriv->lockDP (drawPriv, gc);
 | |
| 	if (readPriv != drawPriv)
 | |
| 	    readPriv->lockDP (readPriv, gc);
 | |
| 
 | |
| 	cctx = pContext;
 | |
| 
 | |
| 	if (cctx->pReadBuffer->pDrawable && cctx->pDrawBuffer->pDrawable)
 | |
| 	{
 | |
| 	    DrawablePtr pDrawable = cctx->pReadBuffer->pDrawable;
 | |
| 	    PixmapPtr   pReadPixmap, pDrawPixmap;
 | |
| 
 | |
| 	    XGL_SCREEN_PRIV (pDrawable->pScreen);
 | |
| 
 | |
| 	    if (pDrawable->type != DRAWABLE_PIXMAP)
 | |
| 	    {
 | |
| 		pReadPixmap = XGL_GET_WINDOW_PIXMAP (pDrawable);
 | |
| 		cctx->pReadBuffer->screenX = __XGL_OFF_X_WIN (pReadPixmap);
 | |
| 		cctx->pReadBuffer->screenY = __XGL_OFF_Y_WIN (pReadPixmap);
 | |
| 		cctx->pReadBuffer->xOff = pDrawable->x +
 | |
| 		    __XGL_OFF_X_WIN (pReadPixmap);
 | |
| 		cctx->pReadBuffer->yOff = pReadPixmap->drawable.height -
 | |
| 		    ((pDrawable->y + __XGL_OFF_Y_WIN (pReadPixmap)) +
 | |
| 		     pDrawable->height);
 | |
| 		cctx->pReadBuffer->yFlip = pReadPixmap->drawable.height;
 | |
| 	    }
 | |
| 	    else
 | |
| 	    {
 | |
| 		pReadPixmap = (PixmapPtr) pDrawable;
 | |
| 		cctx->pReadBuffer->screenX = cctx->pReadBuffer->screenY = 0;
 | |
| 		cctx->pReadBuffer->xOff = cctx->pReadBuffer->yOff = 0;
 | |
| 		cctx->pReadBuffer->yFlip = pDrawable->height;
 | |
| 	    }
 | |
| 
 | |
| 	    pDrawable = cctx->pDrawBuffer->pDrawable;
 | |
| 	    if (pDrawable->type != DRAWABLE_PIXMAP)
 | |
| 	    {
 | |
| 		pDrawPixmap = XGL_GET_WINDOW_PIXMAP (pDrawable);
 | |
| 		cctx->pDrawBuffer->screenX = __XGL_OFF_X_WIN (pDrawPixmap);
 | |
| 		cctx->pDrawBuffer->screenY = __XGL_OFF_Y_WIN (pDrawPixmap);
 | |
| 		cctx->pDrawBuffer->xOff = pDrawable->x +
 | |
| 		    __XGL_OFF_X_WIN (pDrawPixmap);
 | |
| 		cctx->pDrawBuffer->yOff = pDrawPixmap->drawable.height -
 | |
| 		    ((pDrawable->y + __XGL_OFF_Y_WIN (pDrawPixmap)) +
 | |
| 		     pDrawable->height);
 | |
| 		cctx->pDrawBuffer->yFlip = pDrawPixmap->drawable.height;
 | |
| 	    }
 | |
| 	    else
 | |
| 	    {
 | |
| 		pDrawPixmap = (PixmapPtr) pDrawable;
 | |
| 		cctx->pDrawBuffer->screenX = cctx->pDrawBuffer->screenY = 0;
 | |
| 		cctx->pDrawBuffer->xOff = cctx->pDrawBuffer->yOff = 0;
 | |
| 		cctx->pDrawBuffer->yFlip = pDrawable->height;
 | |
| 	    }
 | |
| 
 | |
| 	    /* buffer changed */
 | |
| 	    if (cctx->pDrawBuffer->pPixmap != pDrawPixmap ||
 | |
| 		cctx->pReadBuffer->pPixmap != pReadPixmap)
 | |
| 	    {
 | |
| 		if (!xglResizeBuffer (drawPriv,
 | |
| 				      pDrawable->x,
 | |
| 				      pDrawable->y,
 | |
| 				      pDrawable->width,
 | |
| 				      pDrawable->height))
 | |
| 		{
 | |
| 		    drawPriv->unlockDP (drawPriv);
 | |
| 		    if (readPriv != drawPriv)
 | |
| 			readPriv->unlockDP (readPriv);
 | |
| 
 | |
| 		    return FALSE;
 | |
| 		}
 | |
| 
 | |
| 		if (!xglResizeBuffer (readPriv,
 | |
| 				      cctx->pReadBuffer->pDrawable->x,
 | |
| 				      cctx->pReadBuffer->pDrawable->y,
 | |
| 				      cctx->pReadBuffer->pDrawable->width,
 | |
| 				      cctx->pReadBuffer->pDrawable->height))
 | |
| 		{
 | |
| 		    drawPriv->unlockDP (drawPriv);
 | |
| 		    if (readPriv != drawPriv)
 | |
| 			readPriv->unlockDP (readPriv);
 | |
| 
 | |
| 		    return FALSE;
 | |
| 		}
 | |
| 
 | |
| 		cctx->pReadBuffer->pPixmap = pReadPixmap;
 | |
| 		cctx->pDrawBuffer->pPixmap = pDrawPixmap;
 | |
| 	    }
 | |
| 
 | |
| 	    if (!xglSyncSurface (pContext->pDrawBuffer->pDrawable))
 | |
| 	    {
 | |
| 		drawPriv->unlockDP (drawPriv);
 | |
| 		if (readPriv != drawPriv)
 | |
| 		    readPriv->unlockDP (readPriv);
 | |
| 
 | |
| 		return FALSE;
 | |
| 	    }
 | |
| 
 | |
| 	    if (pDrawPixmap != pScreenPriv->pScreenPixmap)
 | |
| 	    {
 | |
| 		XGL_PIXMAP_PRIV (pDrawPixmap);
 | |
| 
 | |
| 		glitz_surface_attach (pPixmapPriv->surface,
 | |
| 				      pContext->pDrawBuffer->drawable,
 | |
| 				      GLITZ_DRAWABLE_BUFFER_FRONT_COLOR);
 | |
| 
 | |
| 		if (pPixmapPriv->target)
 | |
| 		    pPixmapPriv->target = xglPixmapTargetOut;
 | |
| 	    }
 | |
| 
 | |
| 	    xglSetCurrentContext (pContext);
 | |
| 
 | |
| 	    if (cctx->needInit)
 | |
| 	    {
 | |
| 		int i;
 | |
| 
 | |
| 		xglInitExtensions (cctx);
 | |
| 
 | |
| 		glGetIntegerv (GL_MAX_LIST_NESTING, &cctx->maxListNesting);
 | |
| 		glGetIntegerv (GL_MAX_ATTRIB_STACK_DEPTH,
 | |
| 			       &cctx->maxAttribStackDepth);
 | |
| 		if (cctx->maxAttribStackDepth > XGL_MAX_ATTRIB_STACK_DEPTH)
 | |
| 		    cctx->maxAttribStackDepth = XGL_MAX_ATTRIB_STACK_DEPTH;
 | |
| 
 | |
| 		cctx->attrib.scissorTest = GL_FALSE;
 | |
| 		cctx->attrib.scissor.x = cctx->attrib.scissor.y = 0;
 | |
| 		cctx->attrib.scissor.width =
 | |
| 		    cctx->pDrawBuffer->pDrawable->width;
 | |
| 		cctx->attrib.scissor.height =
 | |
| 		    cctx->pDrawBuffer->pDrawable->height;
 | |
| 		cctx->attrib.viewport = cctx->attrib.scissor;
 | |
| 
 | |
| 		cctx->activeTexUnit = 0;
 | |
| 
 | |
| 		for (i = 0; i < cctx->maxTexUnits; i++)
 | |
| 		{
 | |
| 		    cctx->attrib.texUnits[i].enabled = 0;
 | |
| 
 | |
| 		    cctx->attrib.texUnits[i].p1D      = NULL;
 | |
| 		    cctx->attrib.texUnits[i].p2D      = NULL;
 | |
| 		    cctx->attrib.texUnits[i].p3D      = NULL;
 | |
| 		    cctx->attrib.texUnits[i].pRect    = NULL;
 | |
| 		    cctx->attrib.texUnits[i].pCubeMap = NULL;
 | |
| 		}
 | |
| 
 | |
| 		glEnable (GL_SCISSOR_TEST);
 | |
| 
 | |
| 		cctx->needInit = FALSE;
 | |
| 	    }
 | |
| 
 | |
| 	    /* update viewport and raster position */
 | |
| 	    if (cctx->pDrawBuffer->xOff != cctx->drawXoff ||
 | |
| 		cctx->pDrawBuffer->yOff != cctx->drawYoff)
 | |
| 	    {
 | |
| 		glViewport (cctx->attrib.viewport.x + cctx->pDrawBuffer->xOff,
 | |
| 			    cctx->attrib.viewport.y + cctx->pDrawBuffer->yOff,
 | |
| 			    cctx->attrib.viewport.width,
 | |
| 			    cctx->attrib.viewport.height);
 | |
| 
 | |
| 		glBitmap (0, 0, 0, 0,
 | |
| 			  cctx->pDrawBuffer->xOff - cctx->drawXoff,
 | |
| 			  cctx->pDrawBuffer->yOff - cctx->drawYoff,
 | |
| 			  NULL);
 | |
| 
 | |
| 		cctx->drawXoff = cctx->pDrawBuffer->xOff;
 | |
| 		cctx->drawYoff = cctx->pDrawBuffer->yOff;
 | |
| 	    }
 | |
| 
 | |
| 	    xglDrawBuffer (cctx->attrib.drawBuffer);
 | |
| 	    xglReadBuffer (cctx->attrib.readBuffer);
 | |
| 	}
 | |
| 	else
 | |
| 	{
 | |
| 	    xglSetCurrentContext (pContext);
 | |
| 	}
 | |
| 
 | |
| 	drawPriv->unlockDP (drawPriv);
 | |
| 	if (readPriv != drawPriv)
 | |
| 	    readPriv->unlockDP (readPriv);
 | |
|     }
 | |
|     else
 | |
|     {
 | |
| 	cctx = NULL;
 | |
| 	status = (*iface->exports.forceCurrent) ((__GLcontext *) iface);
 | |
|     }
 | |
| 
 | |
|     return status;
 | |
| }
 | |
| 
 | |
| static GLboolean
 | |
| xglNotifyResize (__GLcontext *gc)
 | |
| {
 | |
|     xglGLContextPtr pContext = (xglGLContextPtr) gc;
 | |
|     __GLinterface   *iface = pContext->mIface;
 | |
| 
 | |
|     if (!iface)
 | |
| 	return GL_TRUE;
 | |
| 
 | |
|     return (*iface->exports.notifyResize) ((__GLcontext *) iface);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglNotifyDestroy (__GLcontext *gc)
 | |
| {
 | |
|     xglGLContextPtr pContext = (xglGLContextPtr) gc;
 | |
|     __GLinterface   *iface = pContext->mIface;
 | |
| 
 | |
|     pContext->pReadBuffer->pDrawable = 0;
 | |
|     pContext->pDrawBuffer->pDrawable = 0;
 | |
| 
 | |
|     if (iface)
 | |
| 	(*iface->exports.notifyDestroy) ((__GLcontext *) iface);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglNotifySwapBuffers (__GLcontext *gc)
 | |
| {
 | |
|     xglGLContextPtr pContext = (xglGLContextPtr) gc;
 | |
|     __GLinterface   *iface = pContext->mIface;
 | |
| 
 | |
|     if (iface)
 | |
| 	(*iface->exports.notifySwapBuffers) ((__GLcontext *) iface);
 | |
| }
 | |
| 
 | |
| static struct __GLdispatchStateRec *
 | |
| xglDispatchExec (__GLcontext *gc)
 | |
| {
 | |
|     xglGLContextPtr pContext = (xglGLContextPtr) gc;
 | |
|     __GLinterface   *iface = pContext->mIface;
 | |
| 
 | |
|     if (!iface)
 | |
| 	return NULL;
 | |
| 
 | |
|     return (*iface->exports.dispatchExec) ((__GLcontext *) iface);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglBeginDispatchOverride (__GLcontext *gc)
 | |
| {
 | |
|     xglGLContextPtr pContext = (xglGLContextPtr) gc;
 | |
|     __GLinterface   *iface = pContext->mIface;
 | |
| 
 | |
|     if (iface)
 | |
| 	(*iface->exports.beginDispatchOverride) ((__GLcontext *) iface);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglEndDispatchOverride (__GLcontext *gc)
 | |
| {
 | |
|     xglGLContextPtr pContext = (xglGLContextPtr) gc;
 | |
|     __GLinterface   *iface = pContext->mIface;
 | |
| 
 | |
|     if (iface)
 | |
| 	(*iface->exports.endDispatchOverride) ((__GLcontext *) iface);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglLoseCurrentContext (void *closure)
 | |
| {
 | |
|     if (closure == cctx)
 | |
|     {
 | |
| 	cctx = NULL;
 | |
| 
 | |
| 	GlxFlushContextCache ();
 | |
| 	GlxSetRenderTables (0);
 | |
|     }
 | |
| }
 | |
| 
 | |
| static __GLinterface *
 | |
| xglCreateContext (__GLimports      *imports,
 | |
| 		  __GLcontextModes *modes,
 | |
| 		  __GLinterface    *shareGC)
 | |
| {
 | |
|     glitz_drawable_format_t *format;
 | |
|     xglGLContextPtr	    pShareContext = (xglGLContextPtr) shareGC;
 | |
|     xglGLContextPtr	    pContext;
 | |
|     __GLinterface	    *shareIface = NULL;
 | |
|     __GLinterface	    *iface;
 | |
|     __GLXcontext	    *glxCtx = (__GLXcontext *) imports->other;
 | |
| 
 | |
|     XGL_SCREEN_PRIV (glxCtx->pScreen);
 | |
| 
 | |
|     pContext = xalloc (sizeof (xglGLContextRec));
 | |
|     if (!pContext)
 | |
| 	return NULL;
 | |
| 
 | |
|     format = glitz_drawable_get_format (pScreenPriv->drawable);
 | |
|     pContext->context = glitz_context_create (pScreenPriv->drawable, format);
 | |
|     glitz_context_set_user_data (pContext->context, pContext,
 | |
| 				 xglLoseCurrentContext);
 | |
| 
 | |
|     pContext->glRenderTable = __glNativeRenderTable;
 | |
|     pContext->needInit	    = TRUE;
 | |
|     pContext->versionString = NULL;
 | |
|     pContext->errorValue    = GL_NO_ERROR;
 | |
|     pContext->shared	    = NULL;
 | |
|     pContext->list	    = 0;
 | |
|     pContext->groupList	    = 0;
 | |
|     pContext->beginCnt	    = 0;
 | |
|     pContext->nAttribStack  = 0;
 | |
|     pContext->refcnt	    = 1;
 | |
|     pContext->doubleBuffer  = glxCtx->modes->doubleBufferMode;
 | |
|     pContext->depthBits     = glxCtx->modes->depthBits;
 | |
|     pContext->stencilBits   = glxCtx->modes->stencilBits;
 | |
|     pContext->drawXoff	    = 0;
 | |
|     pContext->drawYoff	    = 0;
 | |
|     pContext->maxTexUnits   = 0;
 | |
| 
 | |
|     if (pContext->doubleBuffer)
 | |
|     {
 | |
| 	pContext->attrib.drawBuffer = GL_BACK;
 | |
| 	pContext->attrib.readBuffer = GL_BACK;
 | |
|     }
 | |
|     else
 | |
|     {
 | |
| 	pContext->attrib.drawBuffer = GL_FRONT;
 | |
| 	pContext->attrib.readBuffer = GL_FRONT;
 | |
|     }
 | |
| 
 | |
|     pContext->attrib.scissorTest = GL_FALSE;
 | |
| 
 | |
|     if (shareGC)
 | |
|     {
 | |
| 	pContext->texObjects   = NULL;
 | |
| 	pContext->displayLists = NULL;
 | |
| 
 | |
| 	pContext->shared = pShareContext->shared;
 | |
| 	shareIface = pShareContext->mIface;
 | |
|     }
 | |
|     else
 | |
|     {
 | |
| 	pContext->texObjects = xglNewHashTable ();
 | |
| 	if (!pContext->texObjects)
 | |
| 	{
 | |
| 	    xglFreeContext (pContext);
 | |
| 	    return NULL;
 | |
| 	}
 | |
| 
 | |
| 	pContext->displayLists = xglNewHashTable ();
 | |
| 	if (!pContext->displayLists)
 | |
| 	{
 | |
| 	    xglFreeContext (pContext);
 | |
| 	    return NULL;
 | |
| 	}
 | |
| 
 | |
| 	pContext->shared = pContext;
 | |
|     }
 | |
| 
 | |
|     pContext->shared->refcnt++;
 | |
| 
 | |
|     iface = (*screenInfoPriv.createContext) (imports, modes, shareIface);
 | |
|     if (!iface)
 | |
|     {
 | |
| 	xglFreeContext (pContext);
 | |
| 	return NULL;
 | |
|     }
 | |
| 
 | |
|     pContext->mIface = iface;
 | |
|     pContext->iface.imports = *imports;
 | |
| 
 | |
|     pContext->iface.exports.destroyContext	  = xglDestroyContext;
 | |
|     pContext->iface.exports.loseCurrent		  = xglLoseCurrent;
 | |
|     pContext->iface.exports.makeCurrent		  = xglMakeCurrent;
 | |
|     pContext->iface.exports.shareContext	  = xglShareContext;
 | |
|     pContext->iface.exports.copyContext		  = xglCopyContext;
 | |
|     pContext->iface.exports.forceCurrent	  = xglForceCurrent;
 | |
|     pContext->iface.exports.notifyResize	  = xglNotifyResize;
 | |
|     pContext->iface.exports.notifyDestroy	  = xglNotifyDestroy;
 | |
|     pContext->iface.exports.notifySwapBuffers     = xglNotifySwapBuffers;
 | |
|     pContext->iface.exports.dispatchExec	  = xglDispatchExec;
 | |
|     pContext->iface.exports.beginDispatchOverride = xglBeginDispatchOverride;
 | |
|     pContext->iface.exports.endDispatchOverride   = xglEndDispatchOverride;
 | |
| 
 | |
|     return (__GLinterface *) pContext;
 | |
| }
 | |
| 
 | |
| static GLboolean
 | |
| xglSwapBuffers (__GLXdrawablePrivate *glxPriv)
 | |
| {
 | |
|     __GLdrawablePrivate	*glPriv = &glxPriv->glPriv;
 | |
|     xglGLBufferPtr	pBufferPriv = glPriv->private;
 | |
|     DrawablePtr		pDrawable = pBufferPriv->pDrawable;
 | |
|     GLboolean		status = GL_TRUE;
 | |
| 
 | |
|     if (pDrawable)
 | |
|     {
 | |
| 	if (glPriv->modes->doubleBufferMode)
 | |
| 	{
 | |
| 	    glitz_surface_t *surface;
 | |
| 	    int		    xOff, yOff;
 | |
| 	    GCPtr	    pGC = pBufferPriv->pGC;
 | |
| 	    BoxPtr	    pBox = REGION_RECTS (pGC->pCompositeClip);
 | |
| 	    int		    nBox = REGION_NUM_RECTS (pGC->pCompositeClip);
 | |
| 
 | |
| 	    XGL_GET_DRAWABLE (pDrawable, surface, xOff, yOff);
 | |
| 
 | |
| 	    glitz_drawable_swap_buffer_region (pBufferPriv->drawable,
 | |
| 					       xOff, yOff,
 | |
| 					       (glitz_box_t *) pBox, nBox);
 | |
| 
 | |
| 	    xglAddBitDamage (pDrawable, pGC->pCompositeClip);
 | |
| 	    DamageDamageRegion (pDrawable, pGC->pCompositeClip);
 | |
| 	    REGION_EMPTY (pGC->pScreen, &pBufferPriv->damage);
 | |
| 	}
 | |
|     }
 | |
|     else if (pBufferPriv->private)
 | |
|     {
 | |
| 	glPriv->private = pBufferPriv->private;
 | |
| 	status = (*pBufferPriv->swapBuffers) (glxPriv);
 | |
| 	glPriv->private = pBufferPriv;
 | |
|     }
 | |
| 
 | |
|     return status;
 | |
| }
 | |
| 
 | |
| static GLboolean
 | |
| xglResizeBuffers (__GLdrawableBuffer  *buffer,
 | |
| 		  GLint		      x,
 | |
| 		  GLint		      y,
 | |
| 		  GLuint	      width,
 | |
| 		  GLuint	      height,
 | |
| 		  __GLdrawablePrivate *glPriv,
 | |
| 		  GLuint	      bufferMask)
 | |
| {
 | |
|     xglGLBufferPtr pBufferPriv = glPriv->private;
 | |
|     DrawablePtr    pDrawable = pBufferPriv->pDrawable;
 | |
|     GLboolean	   status = GL_TRUE;
 | |
| 
 | |
|     if (pDrawable)
 | |
|     {
 | |
| 	if (!xglResizeBuffer (glPriv, x, y, width, height))
 | |
| 	    return GL_FALSE;
 | |
|     }
 | |
|     else if (pBufferPriv->private)
 | |
|     {
 | |
| 	glPriv->private = pBufferPriv->private;
 | |
| 	status = (*pBufferPriv->resizeBuffers) (buffer,
 | |
| 						x, y, width, height,
 | |
| 						glPriv,
 | |
| 						bufferMask);
 | |
| 	glPriv->private = pBufferPriv;
 | |
|     }
 | |
| 
 | |
|     return status;
 | |
| }
 | |
| 
 | |
| static int
 | |
| xglBindBuffers (__GLXdrawablePrivate *glxPriv,
 | |
| 		int		     buffer)
 | |
| {
 | |
|     __GLdrawablePrivate	*glPriv = &glxPriv->glPriv;
 | |
|     xglGLBufferPtr	pBufferPriv = glPriv->private;
 | |
| 
 | |
|     if (cctx)
 | |
|     {
 | |
| 	xglTexUnitPtr pTexUnit = &cctx->attrib.texUnits[cctx->activeTexUnit];
 | |
| 	xglTexObjPtr  pTexObj = NULL;
 | |
| 	DrawablePtr   pDrawable;
 | |
| 
 | |
| 	/* XXX: front left buffer is only supported so far */
 | |
| 	if (buffer != GLX_FRONT_LEFT_EXT)
 | |
| 	    return BadMatch;
 | |
| 
 | |
| 	/* Must be a GLXpixmap */
 | |
| 	if (!glxPriv->pGlxPixmap)
 | |
| 	    return BadDrawable;
 | |
| 
 | |
| 	pDrawable = glxPriv->pGlxPixmap->pDraw;
 | |
| 
 | |
| 	switch (glxPriv->texTarget) {
 | |
| 	case GLX_TEXTURE_RECTANGLE_EXT:
 | |
| 	    pTexObj = pTexUnit->pRect;
 | |
| 	    break;
 | |
| 	case GLX_TEXTURE_2D_EXT:
 | |
| 	    pTexObj = pTexUnit->p2D;
 | |
| 	    break;
 | |
| 	default:
 | |
| 	    break;
 | |
| 	}
 | |
| 
 | |
| 	if (pTexObj)
 | |
| 	{
 | |
| 	    glitz_texture_object_t *object;
 | |
| 
 | |
| 	    XGL_SCREEN_PRIV (pDrawable->pScreen);
 | |
| 	    XGL_DRAWABLE_PIXMAP (pDrawable);
 | |
| 	    XGL_PIXMAP_PRIV (pPixmap);
 | |
| 
 | |
| 	    if (pPixmap == pScreenPriv->pScreenPixmap)
 | |
| 		return BadDrawable;
 | |
| 
 | |
| 	    object = glitz_texture_object_create (pPixmapPriv->surface);
 | |
| 	    if (object)
 | |
| 	    {
 | |
| 		pPixmap->refcnt++;
 | |
| 
 | |
| 		if (pTexObj->pPixmap)
 | |
| 		    (*pDrawable->pScreen->DestroyPixmap) (pTexObj->pPixmap);
 | |
| 
 | |
| 		if (pTexObj->object)
 | |
| 		    glitz_texture_object_destroy (pTexObj->object);
 | |
| 
 | |
| 		pTexObj->pPixmap = pPixmap;
 | |
| 		pTexObj->object  = object;
 | |
| 
 | |
| 		return Success;
 | |
| 	    }
 | |
| 	}
 | |
|     }
 | |
|     else if (pBufferPriv->private)
 | |
|     {
 | |
| 	int status;
 | |
| 
 | |
| 	glPriv->private = pBufferPriv->private;
 | |
| 	status = (*pBufferPriv->bindBuffers) (glxPriv, buffer);
 | |
| 	glPriv->private = pBufferPriv;
 | |
| 
 | |
| 	return status;
 | |
|     }
 | |
| 
 | |
|     return BadDrawable;
 | |
| }
 | |
| 
 | |
| static int
 | |
| xglReleaseBuffers (__GLXdrawablePrivate *glxPriv,
 | |
| 		   int		        buffer)
 | |
| {
 | |
|     __GLdrawablePrivate	*glPriv = &glxPriv->glPriv;
 | |
|     xglGLBufferPtr	pBufferPriv = glPriv->private;
 | |
| 
 | |
|     if (cctx)
 | |
|     {
 | |
| 	xglTexObjPtr pTexObj;
 | |
| 
 | |
| 	/* XXX: front left buffer is only supported so far */
 | |
| 	if (buffer != GLX_FRONT_LEFT_EXT)
 | |
| 	    return BadMatch;
 | |
| 
 | |
| 	/* Must be a GLXpixmap */
 | |
| 	if (glxPriv->pGlxPixmap)
 | |
| 	{
 | |
| 	    DrawablePtr pDrawable = glxPriv->pGlxPixmap->pDraw;
 | |
| 
 | |
| 	    XGL_DRAWABLE_PIXMAP (pDrawable);
 | |
| 
 | |
| 	    pTexObj = cctx->attrib.texUnits[cctx->activeTexUnit].p2D;
 | |
| 	    if (pTexObj && pTexObj->pPixmap == pPixmap)
 | |
| 	    {
 | |
| 		(*pDrawable->pScreen->DestroyPixmap) (pTexObj->pPixmap);
 | |
| 		pTexObj->pPixmap = NULL;
 | |
| 		glitz_texture_object_destroy (pTexObj->object);
 | |
| 		pTexObj->object = NULL;
 | |
| 
 | |
| 		return Success;
 | |
| 	    }
 | |
| 	    else
 | |
| 	    {
 | |
| 		pTexObj = cctx->attrib.texUnits[cctx->activeTexUnit].pRect;
 | |
| 		if (pTexObj && pTexObj->pPixmap == pPixmap)
 | |
| 		{
 | |
| 		    (*pDrawable->pScreen->DestroyPixmap) (pTexObj->pPixmap);
 | |
| 		    pTexObj->pPixmap = NULL;
 | |
| 		    glitz_texture_object_destroy (pTexObj->object);
 | |
| 		    pTexObj->object = NULL;
 | |
| 
 | |
| 		    return Success;
 | |
| 		}
 | |
| 	    }
 | |
| 	}
 | |
|     }
 | |
|     else if (pBufferPriv->private)
 | |
|     {
 | |
| 	int status;
 | |
| 
 | |
| 	glPriv->private = pBufferPriv->private;
 | |
| 	status = (*pBufferPriv->releaseBuffers) (glxPriv, buffer);
 | |
| 	glPriv->private = pBufferPriv;
 | |
| 
 | |
| 	return status;
 | |
|     }
 | |
| 
 | |
|     return BadDrawable;
 | |
| }
 | |
| static void
 | |
| xglFreeBuffers (__GLdrawablePrivate *glPriv)
 | |
| {
 | |
|     xglGLBufferPtr pBufferPriv = glPriv->private;
 | |
| 
 | |
|     glPriv->private = pBufferPriv->private;
 | |
| 
 | |
|     if (pBufferPriv->freeBuffers)
 | |
| 	(*pBufferPriv->freeBuffers) (glPriv);
 | |
| 
 | |
|     if (pBufferPriv->pGC)
 | |
| 	FreeGC (pBufferPriv->pGC, (GContext) 0);
 | |
| 
 | |
|     if (pBufferPriv->backSurface)
 | |
| 	glitz_surface_destroy (pBufferPriv->backSurface);
 | |
| 
 | |
|     if (pBufferPriv->drawable)
 | |
| 	glitz_drawable_destroy (pBufferPriv->drawable);
 | |
| 
 | |
|     xfree (pBufferPriv);
 | |
| }
 | |
| 
 | |
| static void
 | |
| xglCreateBuffer (__GLXdrawablePrivate *glxPriv)
 | |
| {
 | |
|     __GLdrawablePrivate	*glPriv = &glxPriv->glPriv;
 | |
|     DrawablePtr	        pDrawable = glxPriv->pDraw;
 | |
|     ScreenPtr		pScreen = pDrawable->pScreen;
 | |
|     xglGLBufferPtr	pBufferPriv;
 | |
|     xglVisualPtr	v;
 | |
| 
 | |
|     XGL_SCREEN_PRIV (pScreen);
 | |
|     XGL_DRAWABLE_PIXMAP (pDrawable);
 | |
| 
 | |
|     pBufferPriv = xalloc (sizeof (xglGLBufferRec));
 | |
|     if (!pBufferPriv)
 | |
| 	FatalError ("xglCreateBuffer: No memory\n");
 | |
| 
 | |
|     pBufferPriv->pScreen   = pScreen;
 | |
|     pBufferPriv->pDrawable = NULL;
 | |
|     pBufferPriv->pPixmap   = NULL;
 | |
|     pBufferPriv->pGC	   = NULL;
 | |
| 
 | |
|     pBufferPriv->swapBuffers = NULL;
 | |
| 
 | |
|     pBufferPriv->bindBuffers    = NULL;
 | |
|     pBufferPriv->releaseBuffers = NULL;
 | |
| 
 | |
|     pBufferPriv->resizeBuffers = NULL;
 | |
|     pBufferPriv->private       = NULL;
 | |
|     pBufferPriv->freeBuffers   = NULL;
 | |
| 
 | |
|     pBufferPriv->drawable    = NULL;
 | |
|     pBufferPriv->backSurface = NULL;
 | |
| 
 | |
|     REGION_INIT (pScreen, &pBufferPriv->damage, NullBox, 0);
 | |
| 
 | |
|     pBufferPriv->pVisual = 0;
 | |
| 
 | |
|     /* glx acceleration */
 | |
|     if (pScreenPriv->accel.glx.enabled &&
 | |
| 	xglCheckPixmapSize (pPixmap, &pScreenPriv->accel.glx.size))
 | |
|     {
 | |
| 	for (v = pScreenPriv->pGlxVisual; v; v = v->next)
 | |
| 	{
 | |
| 	    glitz_drawable_format_t *format;
 | |
| 
 | |
| 	    if (pScreenPriv->accel.glx.pbuffer != v->pbuffer)
 | |
| 		continue;
 | |
| 
 | |
| 	    format = v->format.drawable;
 | |
| 	    if (!format)
 | |
| 		continue;
 | |
| 
 | |
| 	    if (format->color.red_size   != glxPriv->modes->redBits   ||
 | |
| 		format->color.green_size != glxPriv->modes->greenBits ||
 | |
| 		format->color.blue_size  != glxPriv->modes->blueBits)
 | |
| 		continue;
 | |
| 
 | |
| 	    if (format->color.alpha_size < glxPriv->modes->alphaBits   ||
 | |
| 		format->depth_size	 < glxPriv->modes->depthBits   ||
 | |
| 		format->stencil_size     < glxPriv->modes->stencilBits ||
 | |
| 		format->doublebuffer     < glxPriv->modes->doubleBufferMode)
 | |
| 		continue;
 | |
| 
 | |
| 	    /* this is good enought for pbuffers */
 | |
| 	    if (v->pbuffer)
 | |
| 		break;
 | |
| 
 | |
| 	    /* we want an exact match for non-pbuffer formats */
 | |
| 	    if (format->color.alpha_size == glxPriv->modes->alphaBits   &&
 | |
| 		format->depth_size	 == glxPriv->modes->depthBits   &&
 | |
| 		format->stencil_size     == glxPriv->modes->stencilBits &&
 | |
| 		format->doublebuffer     == glxPriv->modes->doubleBufferMode)
 | |
| 		break;
 | |
| 	}
 | |
| 
 | |
| 	pBufferPriv->pVisual = v;
 | |
|     }
 | |
| 
 | |
|     if ((pDrawable->type == DRAWABLE_WINDOW)
 | |
| 
 | |
| #ifdef COMPOSITE
 | |
| 	&& (pBufferPriv->pVisual
 | |
| 
 | |
| 	    /* this is a root window, can't be redirected */
 | |
| 	    || (!((WindowPtr) pDrawable)->parent))
 | |
| #endif
 | |
| 
 | |
| 	)
 | |
|     {
 | |
| 	pBufferPriv->pDrawable = pDrawable;
 | |
|     }
 | |
|     else
 | |
|     {
 | |
| 	(*screenInfoPriv.createBuffer) (glxPriv);
 | |
| 
 | |
| 	/* Wrap the swap buffers routine */
 | |
| 	pBufferPriv->swapBuffers = glxPriv->swapBuffers;
 | |
| 
 | |
| 	/* Wrap the render texture routines */
 | |
| 	pBufferPriv->bindBuffers    = glxPriv->bindBuffers;
 | |
| 	pBufferPriv->releaseBuffers = glxPriv->releaseBuffers;
 | |
| 
 | |
| 	/* Wrap the front buffer's resize routine */
 | |
| 	pBufferPriv->resizeBuffers = glPriv->frontBuffer.resize;
 | |
| 
 | |
| 	/* Save Xgl's private buffer structure */
 | |
| 	pBufferPriv->freeBuffers = glPriv->freePrivate;
 | |
| 	pBufferPriv->private	 = glPriv->private;
 | |
|     }
 | |
| 
 | |
|     glxPriv->texTarget = GLX_NO_TEXTURE_EXT;
 | |
| 
 | |
|     /* We enable render texture for all GLXPixmaps right now. Eventually, this
 | |
|        should only be enabled when fbconfig attribute GLX_RENDER_TEXTURE_RGB or
 | |
|        GLX_RENDER_TEXTURE_RGBA is set to TRUE. */
 | |
|     if (pDrawable->type != DRAWABLE_WINDOW)
 | |
|     {
 | |
| 	XGL_DRAWABLE_PIXMAP (pDrawable);
 | |
| 
 | |
| 	if (xglCreatePixmapSurface (pPixmap))
 | |
| 	{
 | |
| 	    glitz_texture_object_t *texture;
 | |
| 
 | |
| 	    XGL_PIXMAP_PRIV (pPixmap);
 | |
| 
 | |
| 	    texture = glitz_texture_object_create (pPixmapPriv->surface);
 | |
| 	    if (texture)
 | |
| 	    {
 | |
| 		switch (glitz_texture_object_get_target (texture)) {
 | |
| 		case GLITZ_TEXTURE_TARGET_2D:
 | |
| 		    glxPriv->texTarget = GLX_TEXTURE_2D_EXT;
 | |
| 		    break;
 | |
| 		case GLITZ_TEXTURE_TARGET_RECT:
 | |
| 		    glxPriv->texTarget = GLX_TEXTURE_RECTANGLE_EXT;
 | |
| 		    break;
 | |
| 		}
 | |
| 
 | |
| 		glitz_texture_object_destroy (texture);
 | |
| 	    }
 | |
| 	}
 | |
|     }
 | |
| 
 | |
|     glxPriv->swapBuffers = xglSwapBuffers;
 | |
| 
 | |
|     glxPriv->bindBuffers    = xglBindBuffers;
 | |
|     glxPriv->releaseBuffers = xglReleaseBuffers;
 | |
|     glPriv->frontBuffer.resize = xglResizeBuffers;
 | |
| 
 | |
|     glPriv->private	= (void *) pBufferPriv;
 | |
|     glPriv->freePrivate	= xglFreeBuffers;
 | |
| }
 | |
| 
 | |
| static Bool
 | |
| xglScreenProbe (int screen)
 | |
| {
 | |
|     ScreenPtr    pScreen = screenInfo.screens[screen];
 | |
|     xglVisualPtr pVisual;
 | |
|     Bool         status;
 | |
|     int          i;
 | |
| 
 | |
|     XGL_SCREEN_PRIV (pScreen);
 | |
| 
 | |
|     status = (*screenInfoPriv.screenProbe) (screen);
 | |
| 
 | |
|     /* Create Xgl GLX visuals */
 | |
|     for (i = 0; i < __xglScreenInfoPtr->numVisuals; i++)
 | |
|     {
 | |
| 	pVisual = xglFindVisualWithId (pScreen, pScreen->visuals[i].vid);
 | |
| 	if (pVisual)
 | |
| 	{
 | |
| 	    glitz_drawable_format_t templ, *format, *screenFormat;
 | |
| 	    unsigned long	    mask;
 | |
| 
 | |
| 	    templ.color        = pVisual->format.surface->color;
 | |
| 	    templ.depth_size   = __xglScreenInfoPtr->modes[i].depthBits;
 | |
| 	    templ.stencil_size = __xglScreenInfoPtr->modes[i].stencilBits;
 | |
| 	    templ.doublebuffer = __xglScreenInfoPtr->modes[i].doubleBufferMode;
 | |
| 	    templ.samples      = 1;
 | |
| 
 | |
| 	    mask =
 | |
| 		GLITZ_FORMAT_FOURCC_MASK       |
 | |
| 		GLITZ_FORMAT_RED_SIZE_MASK     |
 | |
| 		GLITZ_FORMAT_GREEN_SIZE_MASK   |
 | |
| 		GLITZ_FORMAT_BLUE_SIZE_MASK    |
 | |
| 		GLITZ_FORMAT_ALPHA_SIZE_MASK   |
 | |
| 		GLITZ_FORMAT_DEPTH_SIZE_MASK   |
 | |
| 		GLITZ_FORMAT_STENCIL_SIZE_MASK |
 | |
| 		GLITZ_FORMAT_DOUBLEBUFFER_MASK |
 | |
| 		GLITZ_FORMAT_SAMPLES_MASK;
 | |
| 
 | |
| 	    format = glitz_find_drawable_format (pScreenPriv->drawable,
 | |
| 						 mask, &templ, 0);
 | |
| 	    if (format)
 | |
| 	    {
 | |
| 		xglVisualPtr v, new, *prev;
 | |
| 
 | |
| 		new = xalloc (sizeof (xglVisualRec));
 | |
| 		if (new)
 | |
| 		{
 | |
| 		    new->next    = 0;
 | |
| 		    new->vid     = pVisual->vid;
 | |
| 		    new->pPixel  = pVisual->pPixel;
 | |
| 		    new->pbuffer = FALSE;
 | |
| 
 | |
| 		    new->format.surface  = pVisual->format.surface;
 | |
| 		    new->format.drawable = format;
 | |
| 
 | |
| 		    prev = &pScreenPriv->pGlxVisual;
 | |
| 		    while ((v = *prev))
 | |
| 			prev = &v->next;
 | |
| 
 | |
| 		    *prev = new;
 | |
| 		}
 | |
| 	    }
 | |
| 
 | |
| 	    /* use same drawable format as screen for pbuffers */
 | |
| 	    screenFormat = glitz_drawable_get_format (pScreenPriv->drawable);
 | |
| 	    templ.id = screenFormat->id;
 | |
| 
 | |
| 	    mask =
 | |
| 		GLITZ_FORMAT_ID_MASK	     |
 | |
| 		GLITZ_FORMAT_FOURCC_MASK     |
 | |
| 		GLITZ_FORMAT_RED_SIZE_MASK   |
 | |
| 		GLITZ_FORMAT_GREEN_SIZE_MASK |
 | |
| 		GLITZ_FORMAT_BLUE_SIZE_MASK  |
 | |
| 		GLITZ_FORMAT_SAMPLES_MASK;
 | |
| 
 | |
| 	    format = glitz_find_pbuffer_format (pScreenPriv->drawable,
 | |
| 						mask, &templ, 0);
 | |
| 	    if (format)
 | |
| 	    {
 | |
| 		xglVisualPtr v, new, *prev;
 | |
| 
 | |
| 		new = xalloc (sizeof (xglVisualRec));
 | |
| 		if (new)
 | |
| 		{
 | |
| 		    new->next    = 0;
 | |
| 		    new->vid     = pVisual->vid;
 | |
| 		    new->pPixel  = pVisual->pPixel;
 | |
| 		    new->pbuffer = TRUE;
 | |
| 
 | |
| 		    new->format.surface  = pVisual->format.surface;
 | |
| 		    new->format.drawable = format;
 | |
| 
 | |
| 		    prev = &pScreenPriv->pGlxVisual;
 | |
| 		    while ((v = *prev))
 | |
| 			prev = &v->next;
 | |
| 
 | |
| 		    *prev = new;
 | |
| 		}
 | |
| 	    }
 | |
| 	}
 | |
|     }
 | |
| 
 | |
|     /* Wrap createBuffer */
 | |
|     if (__xglScreenInfoPtr->createBuffer != xglCreateBuffer)
 | |
|     {
 | |
| 	screenInfoPriv.createBuffer    = __xglScreenInfoPtr->createBuffer;
 | |
| 	__xglScreenInfoPtr->createBuffer = xglCreateBuffer;
 | |
|     }
 | |
| 
 | |
|     /* Wrap createContext */
 | |
|     if (__xglScreenInfoPtr->createContext != xglCreateContext)
 | |
|     {
 | |
| 	screenInfoPriv.createContext    = __xglScreenInfoPtr->createContext;
 | |
| 	__xglScreenInfoPtr->createContext = xglCreateContext;
 | |
|     }
 | |
| 
 | |
|     return status;
 | |
| }
 | |
| 
 | |
| Bool
 | |
| xglInitVisualConfigs (ScreenPtr pScreen)
 | |
| {
 | |
|     miInitVisualsProcPtr    initVisualsProc = NULL;
 | |
|     VisualPtr		    visuals;
 | |
|     int			    nvisuals;
 | |
|     DepthPtr		    depths;
 | |
|     int			    ndepths;
 | |
|     int			    rootDepth;
 | |
|     VisualID		    defaultVis;
 | |
|     glitz_drawable_format_t *format;
 | |
|     xglVisualPtr	    pVisual;
 | |
|     __GLXvisualConfig	    *pConfig;
 | |
|     xglGLXVisualConfigPtr   pConfigPriv, *ppConfigPriv;
 | |
|     XID			    *installedCmaps;
 | |
|     ColormapPtr		    installedCmap;
 | |
|     int			    numInstalledCmaps;
 | |
|     int			    numConfig = 1;
 | |
|     int			    bpp, i;
 | |
| 
 | |
|     XGL_SCREEN_PRIV (pScreen);
 | |
| 
 | |
|     if (xglScreenInfo.depth != 16 && xglScreenInfo.depth != 24)
 | |
| 	return FALSE;
 | |
| 
 | |
|     for (pVisual = xglVisuals; pVisual; pVisual = pVisual->next)
 | |
|     {
 | |
| 	if (pVisual->pPixel->depth == xglScreenInfo.depth)
 | |
| 	    break;
 | |
|     }
 | |
| 
 | |
|     if (!pVisual)
 | |
| 	return FALSE;
 | |
| 
 | |
|     bpp = pVisual->pPixel->masks.bpp;
 | |
| 
 | |
|     format = glitz_drawable_get_format (pScreenPriv->drawable);
 | |
|     if (format->doublebuffer)
 | |
| 	numConfig *= 2;
 | |
| 
 | |
|     pConfig = xcalloc (sizeof (__GLXvisualConfig), numConfig);
 | |
|     if (!pConfig)
 | |
| 	return FALSE;
 | |
| 
 | |
|     pConfigPriv = xcalloc (sizeof (xglGLXVisualConfigRec), numConfig);
 | |
|     if (!pConfigPriv)
 | |
|     {
 | |
| 	xfree (pConfig);
 | |
| 	return FALSE;
 | |
|     }
 | |
| 
 | |
|     ppConfigPriv = xcalloc (sizeof (xglGLXVisualConfigPtr), numConfig);
 | |
|     if (!ppConfigPriv)
 | |
|     {
 | |
| 	xfree (pConfigPriv);
 | |
| 	xfree (pConfig);
 | |
| 	return FALSE;
 | |
|     }
 | |
| 
 | |
|     installedCmaps = xalloc (pScreen->maxInstalledCmaps * sizeof (XID));
 | |
|     if (!installedCmaps)
 | |
|     {
 | |
| 	xfree (ppConfigPriv);
 | |
| 	xfree (pConfigPriv);
 | |
| 	xfree (pConfig);
 | |
| 	return FALSE;
 | |
|     }
 | |
| 
 | |
|     for (i = 0; i < numConfig; i++)
 | |
|     {
 | |
| 	ppConfigPriv[i] = &pConfigPriv[i];
 | |
| 
 | |
| 	pConfig[i].vid   = (VisualID) (-1);
 | |
| 	pConfig[i].class = -1;
 | |
| 	pConfig[i].rgba  = TRUE;
 | |
| 
 | |
| 	pConfig[i].redSize   = format->color.red_size;
 | |
| 	pConfig[i].greenSize = format->color.green_size;
 | |
| 	pConfig[i].blueSize  = format->color.blue_size;
 | |
| 	pConfig[i].alphaSize = format->color.alpha_size;
 | |
| 
 | |
| 	pConfig[i].redMask   = pVisual->pPixel->masks.red_mask;
 | |
| 	pConfig[i].greenMask = pVisual->pPixel->masks.green_mask;
 | |
| 	pConfig[i].blueMask  = pVisual->pPixel->masks.blue_mask;
 | |
| 	pConfig[i].alphaMask = pVisual->pPixel->masks.alpha_mask;
 | |
| 
 | |
| 	if (i == 1)
 | |
| 	{
 | |
| 	    pConfig[i].doubleBuffer = FALSE;
 | |
| 	    pConfig[i].depthSize    = 0;
 | |
| 	    pConfig[i].stencilSize  = 0;
 | |
| 	}
 | |
| 	else
 | |
| 	{
 | |
| 	    pConfig[i].doubleBuffer = TRUE;
 | |
| 	    pConfig[i].depthSize    = format->depth_size;
 | |
| 	    pConfig[i].stencilSize  = format->stencil_size;
 | |
| 	}
 | |
| 
 | |
| 	pConfig[i].stereo = FALSE;
 | |
| 
 | |
| 	if (pScreen->rootDepth == 16)
 | |
| 	    pConfig[i].bufferSize = 16;
 | |
| 	else
 | |
| 	    pConfig[i].bufferSize = 32;
 | |
| 
 | |
| 	pConfig[i].auxBuffers = 0;
 | |
| 	pConfig[i].level      = 0;
 | |
| 
 | |
| 	pConfig[i].visualRating = GLX_NONE;
 | |
| 
 | |
| 	pConfig[i].transparentPixel = GLX_NONE;
 | |
| 	pConfig[i].transparentRed   = 0;
 | |
| 	pConfig[i].transparentGreen = 0;
 | |
| 	pConfig[i].transparentBlue  = 0;
 | |
| 	pConfig[i].transparentAlpha = 0;
 | |
| 	pConfig[i].transparentIndex = 0;
 | |
|     }
 | |
| 
 | |
|     GlxSetVisualConfigs (numConfig, pConfig, (void **) ppConfigPriv);
 | |
| 
 | |
|     /* Wrap screenProbe */
 | |
|     if (__xglScreenInfoPtr->screenProbe != xglScreenProbe)
 | |
|     {
 | |
| 	screenInfoPriv.screenProbe    = __xglScreenInfoPtr->screenProbe;
 | |
| 	__xglScreenInfoPtr->screenProbe = xglScreenProbe;
 | |
|     }
 | |
| 
 | |
|     visuals    = pScreen->visuals;
 | |
|     nvisuals   = pScreen->numVisuals;
 | |
|     depths     = pScreen->allowedDepths;
 | |
|     ndepths    = pScreen->numDepths;
 | |
|     rootDepth  = pScreen->rootDepth;
 | |
|     defaultVis = pScreen->rootVisual;
 | |
| 
 | |
|     /* Find installed colormaps */
 | |
|     numInstalledCmaps = (*pScreen->ListInstalledColormaps) (pScreen,
 | |
| 							    installedCmaps);
 | |
| 
 | |
|     GlxWrapInitVisuals (&initVisualsProc);
 | |
|     GlxInitVisuals (&visuals, &depths, &nvisuals, &ndepths, &rootDepth,
 | |
| 		    &defaultVis, ((unsigned long) 1 << (bpp - 1)), 8, -1);
 | |
| 
 | |
|     /* Fix up any existing installed colormaps. */
 | |
|     for (i = 0; i < numInstalledCmaps; i++)
 | |
|     {
 | |
| 	int j;
 | |
| 
 | |
| 	installedCmap = LookupIDByType (installedCmaps[i], RT_COLORMAP);
 | |
| 	if (!installedCmap)
 | |
| 	    continue;
 | |
| 
 | |
| 	j = installedCmap->pVisual - pScreen->visuals;
 | |
| 	installedCmap->pVisual = &visuals[j];
 | |
|     }
 | |
| 
 | |
|     pScreen->visuals       = visuals;
 | |
|     pScreen->numVisuals    = nvisuals;
 | |
|     pScreen->allowedDepths = depths;
 | |
|     pScreen->numDepths     = ndepths;
 | |
|     pScreen->rootDepth     = rootDepth;
 | |
|     pScreen->rootVisual    = defaultVis;
 | |
| 
 | |
| #ifndef NGLXLOG
 | |
|     xglInitGlxLog ();
 | |
| #endif
 | |
| 
 | |
|     xfree (installedCmaps);
 | |
|     xfree (pConfigPriv);
 | |
|     xfree (pConfig);
 | |
| 
 | |
|     return TRUE;
 | |
| }
 |