4912 lines
		
	
	
		
			115 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			4912 lines
		
	
	
		
			115 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"
 | 
						|
 | 
						|
#ifdef GLXEXT
 | 
						|
 | 
						|
#include <GL/gl.h>
 | 
						|
 | 
						|
#include "glxserver.h"
 | 
						|
#include "glxdrawable.h"
 | 
						|
#include "glxscreens.h"
 | 
						|
#include "glxutil.h"
 | 
						|
#include "unpack.h"
 | 
						|
#include "g_disptab.h"
 | 
						|
#include "micmap.h"
 | 
						|
 | 
						|
#define XGL_MAX_TEXTURE_UNITS 8
 | 
						|
 | 
						|
#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)
 | 
						|
	
 | 
						|
extern void
 | 
						|
GlxSetVisualConfigs (int	       nconfigs,
 | 
						|
		     __GLXvisualConfig *configs,
 | 
						|
		     void	       **privates);
 | 
						|
 | 
						|
extern void
 | 
						|
GlxWrapInitVisuals (miInitVisualsProcPtr *);
 | 
						|
 | 
						|
extern int
 | 
						|
GlxInitVisuals (VisualPtr     *visualp,
 | 
						|
		DepthPtr      *depthp,
 | 
						|
		int	      *nvisualp,
 | 
						|
		int	      *ndepthp,
 | 
						|
		int	      *rootDepthp,
 | 
						|
		VisualID      *defaultVisp,
 | 
						|
		unsigned long sizes,
 | 
						|
		int	      bitsPerRGB,
 | 
						|
		int	      preferredVis);
 | 
						|
 | 
						|
extern void
 | 
						|
__glXFlushContextCache (void);
 | 
						|
 | 
						|
extern __GLXscreenInfo __glDDXScreenInfo;
 | 
						|
 | 
						|
extern __glProcTable     __glMesaRenderTable;
 | 
						|
extern __glProcTableEXT  __glMesaRenderTableEXT;
 | 
						|
 | 
						|
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;
 | 
						|
 | 
						|
static xglGLXScreenInfoRec screenInfoPriv;
 | 
						|
 | 
						|
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;
 | 
						|
    glitz_surface_t	  *backSurface;
 | 
						|
    PixmapPtr		  pPixmap;
 | 
						|
    GCPtr		  pGC;
 | 
						|
    RegionRec		  damage;
 | 
						|
    void	          *private;
 | 
						|
    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;
 | 
						|
	    GLint  params[4];
 | 
						|
	} tex_parameter_iv;
 | 
						|
	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;
 | 
						|
    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;
 | 
						|
    __glProcTableEXT	      glRenderTableEXT;
 | 
						|
    PFNGLACTIVETEXTUREARBPROC ActiveTextureARB;
 | 
						|
    PFNGLWINDOWPOS3FMESAPROC  WindowPos3fMESA;
 | 
						|
    Bool		      needInit;
 | 
						|
    xglGLBufferPtr	      pDrawBuffer;
 | 
						|
    xglGLBufferPtr	      pReadBuffer;
 | 
						|
    int			      drawXoff, drawYoff;
 | 
						|
    char		      *versionString;
 | 
						|
    GLenum		      errorValue;
 | 
						|
    GLboolean		      doubleBuffer;
 | 
						|
    GLint		      depthBits;
 | 
						|
    GLint		      stencilBits;
 | 
						|
    xglHashTablePtr	      texObjects;
 | 
						|
    xglHashTablePtr	      displayLists;
 | 
						|
    GLuint		      list;
 | 
						|
    GLenum		      listMode;
 | 
						|
    xglDisplayListPtr	      pList;
 | 
						|
    GLuint		      groupList;
 | 
						|
    xglGLAttributesRec	      attrib;
 | 
						|
    xglGLAttributesPtr	      pAttribStack;
 | 
						|
    int			      nAttribStack;
 | 
						|
    int			      activeTexUnit;
 | 
						|
    GLint		      maxTexUnits;
 | 
						|
    GLint		      maxListNesting;
 | 
						|
} xglGLContextRec, *xglGLContextPtr;
 | 
						|
 | 
						|
static xglGLContextPtr cctx = NULL;
 | 
						|
 | 
						|
static void
 | 
						|
xglSetCurrentContext (xglGLContextPtr pContext);
 | 
						|
 | 
						|
#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_PROLOGUE(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;  \
 | 
						|
    xglSetupTextures ()
 | 
						|
 | 
						|
#define XGL_GLX_DRAW_DAMAGE(pBox, pRegion)				 \
 | 
						|
    if (cctx->attrib.drawBuffer != GL_BACK &&				 \
 | 
						|
	cctx->pDrawBuffer->pDrawable &&					 \
 | 
						|
	cctx->pDrawBuffer->pDrawable->type != DRAWABLE_PIXMAP)		 \
 | 
						|
    {									 \
 | 
						|
	REGION_INIT (cctx->pDrawBuffer->pGC->pScreen, pRegion, pBox, 1); \
 | 
						|
	REGION_UNION (cctx->pDrawBuffer->pGC->pScreen,			 \
 | 
						|
		      &cctx->pDrawBuffer->damage,			 \
 | 
						|
		      &cctx->pDrawBuffer->damage,			 \
 | 
						|
		      pRegion);						 \
 | 
						|
	REGION_UNINIT (cctx->pDrawBuffer->pGC->pScreen, 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)
 | 
						|
{
 | 
						|
    switch (pOp->u.enumeration) {
 | 
						|
    case GL_FRONT:
 | 
						|
    case GL_FRONT_AND_BACK:
 | 
						|
	break;
 | 
						|
    case GL_BACK:
 | 
						|
	if (!cctx->doubleBuffer)
 | 
						|
	{
 | 
						|
	    xglRecordError (GL_INVALID_OPERATION);
 | 
						|
	    return;
 | 
						|
	}
 | 
						|
	break;
 | 
						|
    default:
 | 
						|
	xglRecordError (GL_INVALID_ENUM);
 | 
						|
	return;
 | 
						|
    }
 | 
						|
    
 | 
						|
    cctx->attrib.drawBuffer = pOp->u.enumeration;
 | 
						|
    
 | 
						|
    glDrawBuffer (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:
 | 
						|
	break;
 | 
						|
    case GL_BACK:
 | 
						|
	if (!cctx->doubleBuffer)
 | 
						|
	{
 | 
						|
	    xglRecordError (GL_INVALID_OPERATION);
 | 
						|
	    return;
 | 
						|
	}
 | 
						|
	break;
 | 
						|
    default:
 | 
						|
	xglRecordError (GL_INVALID_ENUM);
 | 
						|
	return;
 | 
						|
    }
 | 
						|
    
 | 
						|
    cctx->attrib.readBuffer = pOp->u.enumeration;
 | 
						|
	
 | 
						|
    glReadBuffer (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);
 | 
						|
    }
 | 
						|
 | 
						|
    if (pTexObj->name)
 | 
						|
    {
 | 
						|
	glDeleteTextures (1, &pTexObj->name);
 | 
						|
    }
 | 
						|
 | 
						|
    pTexObj->key     = 0;
 | 
						|
    pTexObj->name    = 0;
 | 
						|
    pTexObj->pPixmap = 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;
 | 
						|
    GLint	       depth;
 | 
						|
    
 | 
						|
    glGetIntegerv (GL_MAX_ATTRIB_STACK_DEPTH, &depth);
 | 
						|
    
 | 
						|
    if (cctx->nAttribStack == depth)
 | 
						|
    {
 | 
						|
	xglRecordError (GL_STACK_OVERFLOW);
 | 
						|
	return;
 | 
						|
    }
 | 
						|
    
 | 
						|
    cctx->pAttribStack =
 | 
						|
	realloc (cctx->pAttribStack,
 | 
						|
		 sizeof (xglGLAttributesRec) * (cctx->nAttribStack + 1));
 | 
						|
    
 | 
						|
    if (!cctx->pAttribStack)
 | 
						|
    {
 | 
						|
	xglRecordError (GL_OUT_OF_MEMORY);
 | 
						|
	return;
 | 
						|
    }
 | 
						|
 | 
						|
    pAttrib = &cctx->pAttribStack[cctx->nAttribStack];
 | 
						|
    pAttrib->mask = pOp->u.bitfield;
 | 
						|
    
 | 
						|
    *pAttrib = cctx->attrib;
 | 
						|
    
 | 
						|
    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->pAttribStack[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;
 | 
						|
    }
 | 
						|
    
 | 
						|
    cctx->pAttribStack =
 | 
						|
	realloc (cctx->pAttribStack,
 | 
						|
		 sizeof (xglGLAttributesRec) * cctx->nAttribStack);
 | 
						|
    
 | 
						|
    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_RECTANGLE_NV:
 | 
						|
	/* 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_RECTANGLE_NV:
 | 
						|
	params[0] = xglActiveTextureBinding (pname);
 | 
						|
	break;
 | 
						|
    case GL_MAX_TEXTURE_UNITS_ARB:
 | 
						|
	params[0] = cctx->maxTexUnits;
 | 
						|
	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_RECTANGLE_NV:
 | 
						|
	params[0] = xglActiveTextureBinding (pname);
 | 
						|
	break;
 | 
						|
    case GL_MAX_TEXTURE_UNITS_ARB:
 | 
						|
	params[0] = cctx->maxTexUnits;
 | 
						|
	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_RECTANGLE_NV:
 | 
						|
	params[0] = xglActiveTextureBinding (pname);
 | 
						|
	break;
 | 
						|
    case GL_MAX_TEXTURE_UNITS_ARB:
 | 
						|
	params[0] = cctx->maxTexUnits;
 | 
						|
	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->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)
 | 
						|
    {
 | 
						|
	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->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])
 | 
						|
	{
 | 
						|
	    XGL_PIXMAP_PRIV (pTexObj[i]->pPixmap);
 | 
						|
 | 
						|
	    activeTexUnit = GL_TEXTURE0_ARB + i;
 | 
						|
	    cctx->ActiveTextureARB (activeTexUnit);
 | 
						|
	    glitz_context_bind_texture (cctx->context, pPixmapPriv->surface);
 | 
						|
	}
 | 
						|
    }
 | 
						|
 | 
						|
    if (cctx->activeTexUnit != 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] == 0)
 | 
						|
	{
 | 
						|
	    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--)
 | 
						|
    {
 | 
						|
	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] <= 0)
 | 
						|
	    continue;
 | 
						|
	
 | 
						|
	pTexObj = (xglTexObjPtr) xglHashLookup (cctx->shared->texObjects,
 | 
						|
						textures[i]);
 | 
						|
	if (pTexObj && pTexObj->name)
 | 
						|
	    glPrioritizeTextures (1, &pTexObj->name, &priorities[i]);
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
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)
 | 
						|
    {
 | 
						|
	XGL_PIXMAP_PRIV (pTexObj->pPixmap);
 | 
						|
 | 
						|
	/* texture parameters should eventually go into a
 | 
						|
	   glitz_texture_object_t */
 | 
						|
	glitz_context_bind_texture (cctx->context, pPixmapPriv->surface);
 | 
						|
 | 
						|
	glTexParameterfv (pOp->u.tex_parameter_fv.target,
 | 
						|
			  pOp->u.tex_parameter_fv.pname,
 | 
						|
			  pOp->u.tex_parameter_fv.params);
 | 
						|
	
 | 
						|
	glBindTexture (pOp->u.tex_parameter_fv.target, pTexObj->name);
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
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
 | 
						|
xglTexParameterivProc (xglGLOpPtr pOp)
 | 
						|
{
 | 
						|
    xglTexObjPtr pTexObj;
 | 
						|
 | 
						|
    glTexParameteriv (pOp->u.tex_parameter_iv.target,
 | 
						|
		      pOp->u.tex_parameter_iv.pname,
 | 
						|
		      pOp->u.tex_parameter_iv.params);
 | 
						|
 | 
						|
    switch (pOp->u.tex_parameter_iv.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)
 | 
						|
    {
 | 
						|
	XGL_PIXMAP_PRIV (pTexObj->pPixmap);
 | 
						|
 | 
						|
	/* texture parameters should eventually go into a
 | 
						|
	   glitz_texture_object_t */
 | 
						|
	glitz_context_bind_texture (cctx->context, pPixmapPriv->surface);
 | 
						|
 | 
						|
	glTexParameteriv (pOp->u.tex_parameter_iv.target,
 | 
						|
			  pOp->u.tex_parameter_iv.pname,
 | 
						|
			  pOp->u.tex_parameter_iv.params);
 | 
						|
	
 | 
						|
	glBindTexture (pOp->u.tex_parameter_iv.target, pTexObj->name);
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
xglTexParameteriv (GLenum      target,
 | 
						|
		   GLenum      pname,
 | 
						|
		   const GLint *params)
 | 
						|
{
 | 
						|
    xglGLOpRec gl;
 | 
						|
    
 | 
						|
    gl.glProc = xglTexParameterivProc;
 | 
						|
 | 
						|
    gl.u.tex_parameter_iv.target = target;
 | 
						|
    gl.u.tex_parameter_iv.pname  = pname;
 | 
						|
 | 
						|
    switch (pname) {
 | 
						|
    case GL_TEXTURE_BORDER_COLOR:
 | 
						|
	gl.u.tex_parameter_iv.params[3] = params[3];
 | 
						|
	gl.u.tex_parameter_iv.params[2] = params[2];
 | 
						|
	gl.u.tex_parameter_iv.params[1] = params[1];
 | 
						|
	/* fall-through */
 | 
						|
    default:
 | 
						|
	gl.u.tex_parameter_iv.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)
 | 
						|
    {
 | 
						|
	XGL_PIXMAP_PRIV (pTexObj->pPixmap);
 | 
						|
 | 
						|
	glitz_context_bind_texture (cctx->context, pPixmapPriv->surface);
 | 
						|
 | 
						|
	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)
 | 
						|
    {
 | 
						|
	XGL_PIXMAP_PRIV (pTexObj->pPixmap);
 | 
						|
 | 
						|
	glitz_context_bind_texture (cctx->context, pPixmapPriv->surface);
 | 
						|
 | 
						|
	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--)
 | 
						|
    {
 | 
						|
	box = *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 = 0; i < range; i++)
 | 
						|
    {
 | 
						|
	pDisplayList = (xglDisplayListPtr)
 | 
						|
	    xglHashLookup (cctx->shared->displayLists, list + i);
 | 
						|
	if (pDisplayList)
 | 
						|
	{
 | 
						|
	    xglHashRemove (cctx->shared->displayLists, list + 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->pDrawBuffer->pDrawable)
 | 
						|
    {
 | 
						|
	xglGLBufferPtr pBuffer = cctx->pDrawBuffer;
 | 
						|
    
 | 
						|
	if (REGION_NOTEMPTY (pBuffer->pDrawable->pScreen, &pBuffer->damage))
 | 
						|
	{
 | 
						|
	    DamageDamageRegion (pBuffer->pDrawable, &pBuffer->damage);
 | 
						|
	    REGION_EMPTY (pBuffer->pDrawable->pScreen, &pBuffer->damage);
 | 
						|
	}
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
xglFinish (void)
 | 
						|
{
 | 
						|
    glFinish ();
 | 
						|
 | 
						|
    if (cctx->pDrawBuffer->pDrawable)
 | 
						|
    {
 | 
						|
	xglGLBufferPtr pBuffer = cctx->pDrawBuffer;
 | 
						|
    
 | 
						|
	if (REGION_NOTEMPTY (pBuffer->pDrawable->pScreen, &pBuffer->damage))
 | 
						|
	{
 | 
						|
	    DamageDamageRegion (pBuffer->pDrawable, &pBuffer->damage);
 | 
						|
	    REGION_EMPTY (pBuffer->pDrawable->pScreen, &pBuffer->damage);
 | 
						|
	}
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
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 (pBox, nBox, &scissor);
 | 
						|
 | 
						|
	while (nBox--)
 | 
						|
	{
 | 
						|
	    box = *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 (pBox, nBox, &scissor);
 | 
						|
    
 | 
						|
	    while (nBox--)
 | 
						|
	    {
 | 
						|
		box = *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--)
 | 
						|
	{
 | 
						|
	    box = *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--)
 | 
						|
	{
 | 
						|
	    box = *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--)
 | 
						|
	{
 | 
						|
	    box = *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--)
 | 
						|
	{
 | 
						|
	    box = *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--)
 | 
						|
	{
 | 
						|
	    box = *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 (cctx->list)
 | 
						|
    {
 | 
						|
	glEndList ();
 | 
						|
	xglStartList (XGL_LIST_OP_DRAW, GL_COMPILE);
 | 
						|
    }
 | 
						|
    else
 | 
						|
    {
 | 
						|
	BoxRec    scissor;
 | 
						|
	BoxPtr    pBox;
 | 
						|
	int	  nBox;
 | 
						|
    
 | 
						|
	XGL_GLX_DRAW_PROLOGUE (pBox, nBox, &scissor);
 | 
						|
	    
 | 
						|
	if (nBox == 1)
 | 
						|
	{
 | 
						|
	    BoxRec 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)
 | 
						|
{
 | 
						|
    glEnd ();
 | 
						|
    
 | 
						|
    if (!cctx->list || cctx->listMode == GL_COMPILE_AND_EXECUTE)
 | 
						|
    {
 | 
						|
	RegionRec region;
 | 
						|
	BoxRec    scissor, box;
 | 
						|
	BoxPtr    pBox;
 | 
						|
	int	  nBox;
 | 
						|
	GLuint	  list;
 | 
						|
    
 | 
						|
	XGL_GLX_DRAW_PROLOGUE (pBox, nBox, &scissor);
 | 
						|
	
 | 
						|
	if (cctx->list)
 | 
						|
	{
 | 
						|
	    list = cctx->pList->pOp[cctx->pList->nOp - 1].u.list;
 | 
						|
	}
 | 
						|
	else
 | 
						|
	{
 | 
						|
	    if (nBox == 1)
 | 
						|
	    {
 | 
						|
		box = *pBox++;
 | 
						|
	    
 | 
						|
		if (cctx->attrib.scissorTest)
 | 
						|
		    XGL_GLX_INTERSECT_BOX (&box, &scissor);
 | 
						|
		
 | 
						|
		XGL_GLX_DRAW_DAMAGE (&box, ®ion);
 | 
						|
		return;
 | 
						|
	    }
 | 
						|
	
 | 
						|
	    list = cctx->groupList;
 | 
						|
	}
 | 
						|
 | 
						|
	glEndList ();
 | 
						|
 | 
						|
	while (nBox--)
 | 
						|
	{
 | 
						|
	    box = *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);
 | 
						|
	    }
 | 
						|
	}
 | 
						|
    }
 | 
						|
	
 | 
						|
    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--)
 | 
						|
    {
 | 
						|
	box = *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);
 | 
						|
}
 | 
						|
 | 
						|
__glProcTable __glNativeRenderTable = {
 | 
						|
    xglNewList, /* glNewList */
 | 
						|
    xglEndList, /* glEndList */
 | 
						|
    xglCallList, /* glCallList */
 | 
						|
    xglCallLists, /* glCallLists */
 | 
						|
    xglDeleteLists, /* glDeleteLists */
 | 
						|
    xglGenLists, /* glGenLists */
 | 
						|
    glListBase,
 | 
						|
    xglBegin, /* glBegin */
 | 
						|
    xglBitmap, /* glBitmap */
 | 
						|
    glColor3bv,
 | 
						|
    glColor3dv,
 | 
						|
    glColor3fv,
 | 
						|
    glColor3iv,
 | 
						|
    glColor3sv,
 | 
						|
    glColor3ubv,
 | 
						|
    glColor3uiv,
 | 
						|
    glColor3usv,
 | 
						|
    glColor4bv,
 | 
						|
    glColor4dv,
 | 
						|
    glColor4fv,
 | 
						|
    glColor4iv,
 | 
						|
    glColor4sv,
 | 
						|
    glColor4ubv,
 | 
						|
    glColor4uiv,
 | 
						|
    glColor4usv,
 | 
						|
    glEdgeFlagv,
 | 
						|
    xglEnd, /* glEnd */
 | 
						|
    glIndexdv,
 | 
						|
    glIndexfv,
 | 
						|
    glIndexiv,
 | 
						|
    glIndexsv,
 | 
						|
    glNormal3bv,
 | 
						|
    glNormal3dv,
 | 
						|
    glNormal3fv,
 | 
						|
    glNormal3iv,
 | 
						|
    glNormal3sv,
 | 
						|
    glRasterPos2dv,
 | 
						|
    glRasterPos2fv,
 | 
						|
    glRasterPos2iv,
 | 
						|
    glRasterPos2sv,
 | 
						|
    glRasterPos3dv,
 | 
						|
    glRasterPos3fv,
 | 
						|
    glRasterPos3iv,
 | 
						|
    glRasterPos3sv,
 | 
						|
    glRasterPos4dv,
 | 
						|
    glRasterPos4fv,
 | 
						|
    glRasterPos4iv,
 | 
						|
    glRasterPos4sv,
 | 
						|
    xglRectdv, /* glRectdv */
 | 
						|
    xglRectfv, /* glRectfv */
 | 
						|
    xglRectiv, /* glRectiv */
 | 
						|
    xglRectsv, /* glRectsv */
 | 
						|
    glTexCoord1dv,
 | 
						|
    glTexCoord1fv,
 | 
						|
    glTexCoord1iv,
 | 
						|
    glTexCoord1sv,
 | 
						|
    glTexCoord2dv,
 | 
						|
    glTexCoord2fv,
 | 
						|
    glTexCoord2iv,
 | 
						|
    glTexCoord2sv,
 | 
						|
    glTexCoord3dv,
 | 
						|
    glTexCoord3fv,
 | 
						|
    glTexCoord3iv,
 | 
						|
    glTexCoord3sv,
 | 
						|
    glTexCoord4dv,
 | 
						|
    glTexCoord4fv,
 | 
						|
    glTexCoord4iv,
 | 
						|
    glTexCoord4sv,
 | 
						|
    glVertex2dv,
 | 
						|
    glVertex2fv,
 | 
						|
    glVertex2iv,
 | 
						|
    glVertex2sv,
 | 
						|
    glVertex3dv,
 | 
						|
    glVertex3fv,
 | 
						|
    glVertex3iv,
 | 
						|
    glVertex3sv,
 | 
						|
    glVertex4dv,
 | 
						|
    glVertex4fv,
 | 
						|
    glVertex4iv,
 | 
						|
    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, /* glScissor */
 | 
						|
    glShadeModel,
 | 
						|
    xglTexParameterf, /* glTexParameterf */
 | 
						|
    xglTexParameterfv, /* glTexParameterfv */
 | 
						|
    xglTexParameteri, /* glTexParameteri */
 | 
						|
    xglTexParameteriv, /* glTexParameteriv */
 | 
						|
    glTexImage1D,
 | 
						|
    glTexImage2D,
 | 
						|
    glTexEnvf,
 | 
						|
    glTexEnvfv,
 | 
						|
    glTexEnvi,
 | 
						|
    glTexEnviv,
 | 
						|
    glTexGend,
 | 
						|
    glTexGendv,
 | 
						|
    glTexGenf,
 | 
						|
    glTexGenfv,
 | 
						|
    glTexGeni,
 | 
						|
    glTexGeniv,
 | 
						|
    glFeedbackBuffer,
 | 
						|
    glSelectBuffer,
 | 
						|
    glRenderMode,
 | 
						|
    glInitNames,
 | 
						|
    glLoadName,
 | 
						|
    glPassThrough,
 | 
						|
    glPopName,
 | 
						|
    glPushName,
 | 
						|
    xglDrawBuffer, /* glDrawBuffer */
 | 
						|
    xglClear, /* glClear */
 | 
						|
    glClearAccum,
 | 
						|
    glClearIndex,
 | 
						|
    glClearColor,
 | 
						|
    glClearStencil,
 | 
						|
    glClearDepth,
 | 
						|
    glStencilMask,
 | 
						|
    glColorMask,
 | 
						|
    glDepthMask,
 | 
						|
    glIndexMask,
 | 
						|
    xglAccum, /* glAccum */
 | 
						|
    xglDisable, /* glDisable */
 | 
						|
    xglEnable, /* glEnable */
 | 
						|
    xglFinish, /* glFinish */
 | 
						|
    xglFlush, /* glFlush */
 | 
						|
    xglPopAttrib, /* glPopAttrib */
 | 
						|
    xglPushAttrib, /* glPushAttrib */
 | 
						|
    glMap1d,
 | 
						|
    glMap1f,
 | 
						|
    glMap2d,
 | 
						|
    glMap2f,
 | 
						|
    glMapGrid1d,
 | 
						|
    glMapGrid1f,
 | 
						|
    glMapGrid2d,
 | 
						|
    glMapGrid2f,
 | 
						|
    glEvalCoord1dv,
 | 
						|
    glEvalCoord1fv,
 | 
						|
    glEvalCoord2dv,
 | 
						|
    glEvalCoord2fv,
 | 
						|
    glEvalMesh1,
 | 
						|
    glEvalPoint1,
 | 
						|
    glEvalMesh2,
 | 
						|
    glEvalPoint2,
 | 
						|
    glAlphaFunc,
 | 
						|
    glBlendFunc,
 | 
						|
    glLogicOp,
 | 
						|
    glStencilFunc,
 | 
						|
    glStencilOp,
 | 
						|
    glDepthFunc,
 | 
						|
    glPixelZoom,
 | 
						|
    glPixelTransferf,
 | 
						|
    glPixelTransferi,
 | 
						|
    glPixelStoref,
 | 
						|
    glPixelStorei,
 | 
						|
    glPixelMapfv,
 | 
						|
    glPixelMapuiv,
 | 
						|
    glPixelMapusv,
 | 
						|
    xglReadBuffer, /* glReadBuffer */
 | 
						|
    xglCopyPixels, /* glCopyPixels */
 | 
						|
    xglReadPixels, /* glReadPixels */
 | 
						|
    xglDrawPixels, /* glDrawPixels */
 | 
						|
    xglGetBooleanv, /* glGetBooleanv */
 | 
						|
    glGetClipPlane,
 | 
						|
    xglGetDoublev, /* glGetDoublev */
 | 
						|
    xglGetError, /* glGetError */
 | 
						|
    xglGetFloatv, /* glGetFloatv */
 | 
						|
    xglGetIntegerv, /* glGetIntegerv */
 | 
						|
    glGetLightfv,
 | 
						|
    glGetLightiv,
 | 
						|
    glGetMapdv,
 | 
						|
    glGetMapfv,
 | 
						|
    glGetMapiv,
 | 
						|
    glGetMaterialfv,
 | 
						|
    glGetMaterialiv,
 | 
						|
    glGetPixelMapfv,
 | 
						|
    glGetPixelMapuiv,
 | 
						|
    glGetPixelMapusv,
 | 
						|
    glGetPolygonStipple,
 | 
						|
    xglGetString, /* glGetString */
 | 
						|
    glGetTexEnvfv,
 | 
						|
    glGetTexEnviv,
 | 
						|
    glGetTexGendv,
 | 
						|
    glGetTexGenfv,
 | 
						|
    glGetTexGeniv,
 | 
						|
    glGetTexImage,
 | 
						|
    glGetTexParameterfv,
 | 
						|
    glGetTexParameteriv,
 | 
						|
    xglGetTexLevelParameterfv, /* glGetTexLevelParameterfv */
 | 
						|
    xglGetTexLevelParameteriv, /* glGetTexLevelParameteriv */
 | 
						|
    xglIsEnabled, /* glIsEnabled */
 | 
						|
    xglIsList, /* glIsList */
 | 
						|
    glDepthRange,
 | 
						|
    glFrustum,
 | 
						|
    glLoadIdentity,
 | 
						|
    glLoadMatrixf,
 | 
						|
    glLoadMatrixd,
 | 
						|
    glMatrixMode,
 | 
						|
    glMultMatrixf,
 | 
						|
    glMultMatrixd,
 | 
						|
    glOrtho,
 | 
						|
    glPopMatrix,
 | 
						|
    glPushMatrix,
 | 
						|
    glRotated,
 | 
						|
    glRotatef,
 | 
						|
    glScaled,
 | 
						|
    glScalef,
 | 
						|
    glTranslated,
 | 
						|
    glTranslatef,
 | 
						|
    xglViewport, /* glViewport */
 | 
						|
    glArrayElement,
 | 
						|
    xglBindTexture, /* glBindTexture */
 | 
						|
    glColorPointer,
 | 
						|
    glDisableClientState,
 | 
						|
    xglDrawArrays, /* glDrawArrays */
 | 
						|
    xglDrawElements, /* glDrawElements */
 | 
						|
    glEdgeFlagPointer,
 | 
						|
    glEnableClientState,
 | 
						|
    glIndexPointer,
 | 
						|
    glIndexubv,
 | 
						|
    glInterleavedArrays,
 | 
						|
    glNormalPointer,
 | 
						|
    glPolygonOffset,
 | 
						|
    glTexCoordPointer,
 | 
						|
    glVertexPointer,
 | 
						|
    xglAreTexturesResident, /* glAreTexturesResident */
 | 
						|
    xglCopyTexImage1D, /* glCopyTexImage1D */
 | 
						|
    xglCopyTexImage2D, /* glCopyTexImage2D */
 | 
						|
    xglCopyTexSubImage1D, /* glCopyTexSubImage1D */
 | 
						|
    xglCopyTexSubImage2D, /* glCopyTexSubImage2D */
 | 
						|
    xglDeleteTextures, /* glDeleteTextures */
 | 
						|
    xglGenTextures, /* glGenTextures */
 | 
						|
    glGetPointerv,
 | 
						|
    xglIsTexture, /* glIsTexture */
 | 
						|
    xglPrioritizeTextures, /* glPrioritizeTextures */
 | 
						|
    glTexSubImage1D,
 | 
						|
    glTexSubImage2D,
 | 
						|
    glPopClientAttrib,
 | 
						|
    glPushClientAttrib,
 | 
						|
    glBlendColor,
 | 
						|
    glBlendEquation,
 | 
						|
    glColorTable,
 | 
						|
    glColorTableParameterfv,
 | 
						|
    glColorTableParameteriv,
 | 
						|
    xglCopyColorTable, /* glCopyColorTable */
 | 
						|
    glGetColorTable,
 | 
						|
    glGetColorTableParameterfv,
 | 
						|
    glGetColorTableParameteriv,
 | 
						|
    glColorSubTable,
 | 
						|
    xglCopyColorSubTable, /* glCopyColorSubTable */
 | 
						|
    glConvolutionFilter1D,
 | 
						|
    glConvolutionFilter2D,
 | 
						|
    glConvolutionParameterf,
 | 
						|
    glConvolutionParameterfv,
 | 
						|
    glConvolutionParameteri,
 | 
						|
    glConvolutionParameteriv,
 | 
						|
    xglCopyConvolutionFilter1D, /* glCopyConvolutionFilter1D */
 | 
						|
    xglCopyConvolutionFilter2D, /* glCopyConvolutionFilter2D */
 | 
						|
    glGetConvolutionFilter,
 | 
						|
    glGetConvolutionParameterfv,
 | 
						|
    glGetConvolutionParameteriv,
 | 
						|
    glGetSeparableFilter,
 | 
						|
    glSeparableFilter2D,
 | 
						|
    glGetHistogram,
 | 
						|
    glGetHistogramParameterfv,
 | 
						|
    glGetHistogramParameteriv,
 | 
						|
    glGetMinmax,
 | 
						|
    glGetMinmaxParameterfv,
 | 
						|
    glGetMinmaxParameteriv,
 | 
						|
    glHistogram,
 | 
						|
    glMinmax,
 | 
						|
    glResetHistogram,
 | 
						|
    glResetMinmax,
 | 
						|
    glTexImage3D,
 | 
						|
    glTexSubImage3D,
 | 
						|
    xglCopyTexSubImage3D /* glCopyTexSubImage3D */
 | 
						|
};
 | 
						|
 | 
						|
/* 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) {}
 | 
						|
 | 
						|
__glProcTableEXT __glNoOpRenderTableEXT = {
 | 
						|
    xglNoOpActiveTextureARB,
 | 
						|
    xglNoOpClientActiveTextureARB,
 | 
						|
    xglNoOpMultiTexCoord1dvARB,
 | 
						|
    xglNoOpMultiTexCoord1fvARB,
 | 
						|
    xglNoOpMultiTexCoord1ivARB,
 | 
						|
    xglNoOpMultiTexCoord1svARB,
 | 
						|
    xglNoOpMultiTexCoord2dvARB,
 | 
						|
    xglNoOpMultiTexCoord2fvARB,
 | 
						|
    xglNoOpMultiTexCoord2ivARB,
 | 
						|
    xglNoOpMultiTexCoord2svARB,
 | 
						|
    xglNoOpMultiTexCoord3dvARB,
 | 
						|
    xglNoOpMultiTexCoord3fvARB,
 | 
						|
    xglNoOpMultiTexCoord3ivARB,
 | 
						|
    xglNoOpMultiTexCoord3svARB,
 | 
						|
    xglNoOpMultiTexCoord4dvARB,
 | 
						|
    xglNoOpMultiTexCoord4fvARB,
 | 
						|
    xglNoOpMultiTexCoord4ivARB,
 | 
						|
    xglNoOpMultiTexCoord4svARB,
 | 
						|
    xglNoOpSampleCoverageARB,
 | 
						|
    xglNoOpAreTexturesResidentEXT,
 | 
						|
    xglNoOpGenTexturesEXT,
 | 
						|
    xglNoOpIsTextureEXT,
 | 
						|
    xglNoOpSampleMaskSGIS,
 | 
						|
    xglNoOpSamplePatternSGIS,
 | 
						|
    xglNoOpPointParameterfEXT,
 | 
						|
    xglNoOpPointParameterfvEXT,
 | 
						|
    xglNoOpWindowPos3fMESA,
 | 
						|
    xglNoOpBlendFuncSeparateEXT,
 | 
						|
    xglNoOpFogCoordfvEXT,
 | 
						|
    xglNoOpFogCoorddvEXT,
 | 
						|
    xglNoOpFogCoordPointerEXT,
 | 
						|
    xglNoOpSecondaryColor3bvEXT,
 | 
						|
    xglNoOpSecondaryColor3dvEXT,
 | 
						|
    xglNoOpSecondaryColor3fvEXT,
 | 
						|
    xglNoOpSecondaryColor3ivEXT,
 | 
						|
    xglNoOpSecondaryColor3svEXT,
 | 
						|
    xglNoOpSecondaryColor3ubvEXT,
 | 
						|
    xglNoOpSecondaryColor3uivEXT,
 | 
						|
    xglNoOpSecondaryColor3usvEXT,
 | 
						|
    xglNoOpSecondaryColorPointerEXT,
 | 
						|
    xglNoOpPointParameteriNV,
 | 
						|
    xglNoOpPointParameterivNV,
 | 
						|
    xglNoOpActiveStencilFaceEXT
 | 
						|
};
 | 
						|
 | 
						|
static void
 | 
						|
xglInitExtensions (xglGLContextPtr pContext)
 | 
						|
{
 | 
						|
    const char *extensions;
 | 
						|
 | 
						|
    pContext->glRenderTableEXT = __glNoOpRenderTableEXT;
 | 
						|
 | 
						|
    extensions = (const char *) glGetString (GL_EXTENSIONS);
 | 
						|
 | 
						|
    if (strstr (extensions, "GL_ARB_multitexture"))
 | 
						|
    {
 | 
						|
	pContext->ActiveTextureARB =
 | 
						|
	    (PFNGLACTIVETEXTUREARBPROC)
 | 
						|
	    glitz_context_get_proc_address (pContext->context,
 | 
						|
					    "glActiveTextureARB");
 | 
						|
	pContext->glRenderTableEXT.ClientActiveTextureARB =
 | 
						|
	    (PFNGLCLIENTACTIVETEXTUREARBPROC)
 | 
						|
	    glitz_context_get_proc_address (pContext->context,
 | 
						|
					    "glClientActiveTextureARB");
 | 
						|
	pContext->glRenderTableEXT.MultiTexCoord1dvARB =
 | 
						|
	    (PFNGLMULTITEXCOORD1DVARBPROC)
 | 
						|
	    glitz_context_get_proc_address (pContext->context,
 | 
						|
					    "glMultiTexCoord1dvARB");
 | 
						|
	pContext->glRenderTableEXT.MultiTexCoord1fvARB =
 | 
						|
	    (PFNGLMULTITEXCOORD1FVARBPROC)
 | 
						|
	    glitz_context_get_proc_address (pContext->context,
 | 
						|
					    "glMultiTexCoord1fvARB");
 | 
						|
	pContext->glRenderTableEXT.MultiTexCoord1ivARB =
 | 
						|
	    (PFNGLMULTITEXCOORD1IVARBPROC)
 | 
						|
	    glitz_context_get_proc_address (pContext->context,
 | 
						|
					    "glMultiTexCoord1ivARB");
 | 
						|
	pContext->glRenderTableEXT.MultiTexCoord1svARB =
 | 
						|
	    (PFNGLMULTITEXCOORD1SVARBPROC)
 | 
						|
	    glitz_context_get_proc_address (pContext->context,
 | 
						|
					    "glMultiTexCoord1svARB");
 | 
						|
	pContext->glRenderTableEXT.MultiTexCoord2dvARB =
 | 
						|
	    (PFNGLMULTITEXCOORD2DVARBPROC)
 | 
						|
	    glitz_context_get_proc_address (pContext->context,
 | 
						|
					    "glMultiTexCoord2dvARB");
 | 
						|
	pContext->glRenderTableEXT.MultiTexCoord2fvARB =
 | 
						|
	    (PFNGLMULTITEXCOORD2FVARBPROC)
 | 
						|
	    glitz_context_get_proc_address (pContext->context,
 | 
						|
					    "glMultiTexCoord2fvARB");
 | 
						|
	pContext->glRenderTableEXT.MultiTexCoord2ivARB =
 | 
						|
	    (PFNGLMULTITEXCOORD2IVARBPROC)
 | 
						|
	    glitz_context_get_proc_address (pContext->context,
 | 
						|
					    "glMultiTexCoord2ivARB");
 | 
						|
	pContext->glRenderTableEXT.MultiTexCoord2svARB =
 | 
						|
	    (PFNGLMULTITEXCOORD2SVARBPROC)
 | 
						|
	    glitz_context_get_proc_address (pContext->context,
 | 
						|
					    "glMultiTexCoord2svARB");
 | 
						|
	pContext->glRenderTableEXT.MultiTexCoord3dvARB =
 | 
						|
	    (PFNGLMULTITEXCOORD3DVARBPROC)
 | 
						|
	    glitz_context_get_proc_address (pContext->context,
 | 
						|
					    "glMultiTexCoord3dvARB");
 | 
						|
	pContext->glRenderTableEXT.MultiTexCoord3fvARB =
 | 
						|
	    (PFNGLMULTITEXCOORD3FVARBPROC)
 | 
						|
	    glitz_context_get_proc_address (pContext->context,
 | 
						|
					    "glMultiTexCoord3fvARB");
 | 
						|
	pContext->glRenderTableEXT.MultiTexCoord3ivARB =
 | 
						|
	    (PFNGLMULTITEXCOORD3IVARBPROC)
 | 
						|
	    glitz_context_get_proc_address (pContext->context,
 | 
						|
					    "glMultiTexCoord3ivARB");
 | 
						|
	pContext->glRenderTableEXT.MultiTexCoord3svARB =
 | 
						|
	    (PFNGLMULTITEXCOORD3SVARBPROC)
 | 
						|
	    glitz_context_get_proc_address (pContext->context,
 | 
						|
					    "glMultiTexCoord3svARB");
 | 
						|
	pContext->glRenderTableEXT.MultiTexCoord4dvARB =
 | 
						|
	    (PFNGLMULTITEXCOORD4DVARBPROC)
 | 
						|
	    glitz_context_get_proc_address (pContext->context,
 | 
						|
					    "glMultiTexCoord4dvARB");
 | 
						|
	pContext->glRenderTableEXT.MultiTexCoord4fvARB =
 | 
						|
	    (PFNGLMULTITEXCOORD4FVARBPROC)
 | 
						|
	    glitz_context_get_proc_address (pContext->context,
 | 
						|
					    "glMultiTexCoord4fvARB");
 | 
						|
	pContext->glRenderTableEXT.MultiTexCoord4ivARB =
 | 
						|
	    (PFNGLMULTITEXCOORD4IVARBPROC)
 | 
						|
	    glitz_context_get_proc_address (pContext->context,
 | 
						|
					    "glMultiTexCoord4ivARB");
 | 
						|
	pContext->glRenderTableEXT.MultiTexCoord4svARB =
 | 
						|
	    (PFNGLMULTITEXCOORD4SVARBPROC)
 | 
						|
	    glitz_context_get_proc_address (pContext->context,
 | 
						|
					    "glMultiTexCoord4svARB");
 | 
						|
 | 
						|
	glGetIntegerv (GL_MAX_LIST_NESTING, &pContext->maxListNesting);
 | 
						|
	glGetIntegerv (GL_MAX_TEXTURE_UNITS_ARB, &pContext->maxTexUnits);
 | 
						|
	if (pContext->maxTexUnits > XGL_MAX_TEXTURE_UNITS)
 | 
						|
	    pContext->maxTexUnits = XGL_MAX_TEXTURE_UNITS;
 | 
						|
 | 
						|
	pContext->glRenderTableEXT.ActiveTextureARB = xglActiveTextureARB;
 | 
						|
    }
 | 
						|
    else
 | 
						|
	pContext->maxTexUnits = 1;
 | 
						|
 | 
						|
    if (strstr (extensions, "GL_ARB_multisample"))
 | 
						|
    {
 | 
						|
	pContext->glRenderTableEXT.SampleCoverageARB =
 | 
						|
	    (PFNGLSAMPLECOVERAGEARBPROC)
 | 
						|
	    glitz_context_get_proc_address (pContext->context,
 | 
						|
					    "glSampleCoverageARB");
 | 
						|
    }
 | 
						|
 | 
						|
    if (strstr (extensions, "GL_EXT_texture_object"))
 | 
						|
    {
 | 
						|
	pContext->glRenderTableEXT.AreTexturesResidentEXT =
 | 
						|
	    xglAreTexturesResident;
 | 
						|
	pContext->glRenderTableEXT.GenTexturesEXT = xglGenTextures;
 | 
						|
	pContext->glRenderTableEXT.IsTextureEXT = xglIsTexture;
 | 
						|
    }
 | 
						|
 | 
						|
    if (strstr (extensions, "GL_SGIS_multisample"))
 | 
						|
    {
 | 
						|
	pContext->glRenderTableEXT.SampleMaskSGIS =
 | 
						|
	    (PFNGLSAMPLEMASKSGISPROC)
 | 
						|
	    glitz_context_get_proc_address (pContext->context,
 | 
						|
					    "glSampleMaskSGIS");
 | 
						|
	pContext->glRenderTableEXT.SamplePatternSGIS =
 | 
						|
	    (PFNGLSAMPLEPATTERNSGISPROC)
 | 
						|
	    glitz_context_get_proc_address (pContext->context,
 | 
						|
					    "glSamplePatternSGIS");
 | 
						|
    }
 | 
						|
 | 
						|
    if (strstr (extensions, "GL_EXT_point_parameters"))
 | 
						|
    {
 | 
						|
	pContext->glRenderTableEXT.PointParameterfEXT =
 | 
						|
	    (PFNGLPOINTPARAMETERFEXTPROC)
 | 
						|
	    glitz_context_get_proc_address (pContext->context,
 | 
						|
					    "glPointParameterfEXT");
 | 
						|
	pContext->glRenderTableEXT.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->glRenderTableEXT.WindowPos3fMESA = xglWindowPos3fMESA;
 | 
						|
    }
 | 
						|
 | 
						|
    if (strstr (extensions, "GL_EXT_blend_func_separate"))
 | 
						|
    {
 | 
						|
	pContext->glRenderTableEXT.BlendFuncSeparateEXT =
 | 
						|
	    (PFNGLBLENDFUNCSEPARATEEXTPROC)
 | 
						|
	    glitz_context_get_proc_address (pContext->context,
 | 
						|
					    "glBlendFuncSeparateEXT");
 | 
						|
    }
 | 
						|
 | 
						|
    if (strstr (extensions, "GL_EXT_fog_coord"))
 | 
						|
    {
 | 
						|
	pContext->glRenderTableEXT.FogCoordfvEXT =
 | 
						|
	    (PFNGLFOGCOORDFVEXTPROC)
 | 
						|
	    glitz_context_get_proc_address (pContext->context,
 | 
						|
					    "glFogCoordfvEXT");
 | 
						|
	pContext->glRenderTableEXT.FogCoorddvEXT =
 | 
						|
	    (PFNGLFOGCOORDDVEXTPROC)
 | 
						|
	    glitz_context_get_proc_address (pContext->context,
 | 
						|
					    "glFogCoorddvEXT");
 | 
						|
	pContext->glRenderTableEXT.FogCoordPointerEXT =
 | 
						|
	    (PFNGLFOGCOORDPOINTEREXTPROC)
 | 
						|
	    glitz_context_get_proc_address (pContext->context,
 | 
						|
					    "glFogCoordPointerEXT");
 | 
						|
    }
 | 
						|
 | 
						|
    if (strstr (extensions, "GL_EXT_secondary_color"))
 | 
						|
    {
 | 
						|
	pContext->glRenderTableEXT.SecondaryColor3bvEXT =
 | 
						|
	    (PFNGLSECONDARYCOLOR3BVEXTPROC)
 | 
						|
	    glitz_context_get_proc_address (pContext->context,
 | 
						|
					    "glSecondaryColor3bvEXT");
 | 
						|
	pContext->glRenderTableEXT.SecondaryColor3dvEXT =
 | 
						|
	    (PFNGLSECONDARYCOLOR3DVEXTPROC)
 | 
						|
	    glitz_context_get_proc_address (pContext->context,
 | 
						|
					    "glSecondaryColor3dvEXT");
 | 
						|
	pContext->glRenderTableEXT.SecondaryColor3fvEXT =
 | 
						|
	    (PFNGLSECONDARYCOLOR3FVEXTPROC)
 | 
						|
	    glitz_context_get_proc_address (pContext->context,
 | 
						|
					    "glSecondaryColor3fvEXT");
 | 
						|
	pContext->glRenderTableEXT.SecondaryColor3ivEXT =
 | 
						|
	    (PFNGLSECONDARYCOLOR3IVEXTPROC)
 | 
						|
	    glitz_context_get_proc_address (pContext->context,
 | 
						|
					    "glSecondaryColor3ivEXT");
 | 
						|
	pContext->glRenderTableEXT.SecondaryColor3svEXT =
 | 
						|
	    (PFNGLSECONDARYCOLOR3SVEXTPROC)
 | 
						|
	    glitz_context_get_proc_address (pContext->context,
 | 
						|
					    "glSecondaryColor3svEXT");
 | 
						|
	pContext->glRenderTableEXT.SecondaryColor3ubvEXT =
 | 
						|
	    (PFNGLSECONDARYCOLOR3UBVEXTPROC)
 | 
						|
	    glitz_context_get_proc_address (pContext->context,
 | 
						|
					    "glSecondaryColor3ubvEXT");
 | 
						|
	pContext->glRenderTableEXT.SecondaryColor3uivEXT =
 | 
						|
	    (PFNGLSECONDARYCOLOR3UIVEXTPROC)
 | 
						|
	    glitz_context_get_proc_address (pContext->context,
 | 
						|
					    "glSecondaryColor3uivEXT");
 | 
						|
	pContext->glRenderTableEXT.SecondaryColor3usvEXT =
 | 
						|
	    (PFNGLSECONDARYCOLOR3USVEXTPROC)
 | 
						|
	    glitz_context_get_proc_address (pContext->context,
 | 
						|
					    "glSecondaryColor3usvEXT");
 | 
						|
	pContext->glRenderTableEXT.SecondaryColorPointerEXT =
 | 
						|
	    (PFNGLSECONDARYCOLORPOINTEREXTPROC)
 | 
						|
	    glitz_context_get_proc_address (pContext->context,
 | 
						|
					    "glSecondaryColorPointerEXT");
 | 
						|
    }
 | 
						|
 | 
						|
    if (strstr (extensions, "GL_NV_point_sprite"))
 | 
						|
    {
 | 
						|
	pContext->glRenderTableEXT.PointParameteriNV =
 | 
						|
	    (PFNGLPOINTPARAMETERINVPROC)
 | 
						|
	    glitz_context_get_proc_address (pContext->context,
 | 
						|
					    "glPointParameteriNV");
 | 
						|
	pContext->glRenderTableEXT.PointParameterivNV =
 | 
						|
	    (PFNGLPOINTPARAMETERIVNVPROC)
 | 
						|
	    glitz_context_get_proc_address (pContext->context,
 | 
						|
					    "glPointParameterivNV");
 | 
						|
    }
 | 
						|
 | 
						|
    if (strstr (extensions, "GL_EXT_stencil_two_side"))
 | 
						|
    {
 | 
						|
	pContext->glRenderTableEXT.ActiveStencilFaceEXT =
 | 
						|
	    (PFNGLACTIVESTENCILFACEEXTPROC)
 | 
						|
	    glitz_context_get_proc_address (pContext->context,
 | 
						|
					    "glActiveStencilFaceEXT");
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
xglSetCurrentContext (xglGLContextPtr pContext)
 | 
						|
{
 | 
						|
    cctx = pContext;
 | 
						|
 | 
						|
    glitz_context_make_current (cctx->context);
 | 
						|
 | 
						|
    __glRenderTable = &__glNativeRenderTable;
 | 
						|
    __glRenderTableEXT = &cctx->glRenderTableEXT;
 | 
						|
}
 | 
						|
 | 
						|
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->pAttribStack)
 | 
						|
	xfree (pContext->pAttribStack);
 | 
						|
 | 
						|
    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 ();
 | 
						|
 | 
						|
    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;
 | 
						|
 | 
						|
	pContext->pReadBuffer = pReadBufferPriv;
 | 
						|
	pContext->pDrawBuffer = pDrawBufferPriv;
 | 
						|
 | 
						|
	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);
 | 
						|
 | 
						|
	pContext->pReadBuffer = pReadBufferPriv;
 | 
						|
	pContext->pDrawBuffer = pDrawBufferPriv;
 | 
						|
 | 
						|
	pReadBufferPriv->pPixmap = (PixmapPtr) 0;
 | 
						|
	pDrawBufferPriv->pPixmap = (PixmapPtr) 0;
 | 
						|
 | 
						|
	/* 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 GLboolean
 | 
						|
xglForceCurrent (__GLcontext *gc)
 | 
						|
{
 | 
						|
    xglGLContextPtr pContext = (xglGLContextPtr) gc;
 | 
						|
    __GLinterface   *iface = pContext->mIface;
 | 
						|
    GLboolean	    status = GL_TRUE;
 | 
						|
    
 | 
						|
    if (pContext->context)
 | 
						|
    {
 | 
						|
	cctx = pContext;
 | 
						|
 | 
						|
	if (cctx->pReadBuffer->pDrawable && cctx->pDrawBuffer->pDrawable)
 | 
						|
	{
 | 
						|
	    DrawablePtr pDrawable;
 | 
						|
	    PixmapPtr   pReadPixmap, pDrawPixmap;
 | 
						|
	
 | 
						|
	    pDrawable = cctx->pReadBuffer->pDrawable;
 | 
						|
	    if (pDrawable->type != DRAWABLE_PIXMAP)
 | 
						|
	    {
 | 
						|
		pReadPixmap = XGL_GET_WINDOW_PIXMAP (pDrawable);
 | 
						|
		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->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->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->xOff = cctx->pDrawBuffer->yOff = 0;
 | 
						|
		cctx->pDrawBuffer->yFlip = pDrawable->height;
 | 
						|
	    }
 | 
						|
	    
 | 
						|
	    /* check if buffers have changed */
 | 
						|
	    if (cctx->pReadBuffer->pPixmap != pReadPixmap ||
 | 
						|
		cctx->pDrawBuffer->pPixmap != pDrawPixmap)
 | 
						|
	    {
 | 
						|
		XGL_SCREEN_PRIV (pDrawable->pScreen);
 | 
						|
		XGL_PIXMAP_PRIV (pDrawPixmap);
 | 
						|
		
 | 
						|
		if (!xglPrepareTarget (pDrawable))
 | 
						|
		    return FALSE;
 | 
						|
		
 | 
						|
		/* draw buffer is offscreen */
 | 
						|
		if (pPixmapPriv->surface != pScreenPriv->surface)
 | 
						|
		{
 | 
						|
		    /* NYI: framebuffer object setup */
 | 
						|
		    FatalError ("NYI: offscreen GL drawable\n");
 | 
						|
		}
 | 
						|
 | 
						|
		cctx->pReadBuffer->pPixmap = pReadPixmap;
 | 
						|
		cctx->pDrawBuffer->pPixmap = pDrawPixmap;
 | 
						|
	    }
 | 
						|
	}
 | 
						|
 | 
						|
	xglSetCurrentContext (pContext);
 | 
						|
	
 | 
						|
	if (cctx->needInit)
 | 
						|
	{
 | 
						|
	    int i;
 | 
						|
	    
 | 
						|
	    xglInitExtensions (cctx);
 | 
						|
 | 
						|
	    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.scissor.x + cctx->pDrawBuffer->xOff,
 | 
						|
			cctx->attrib.scissor.y + cctx->pDrawBuffer->yOff,
 | 
						|
			cctx->attrib.scissor.width,
 | 
						|
			cctx->attrib.scissor.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;
 | 
						|
	}
 | 
						|
 | 
						|
	glDrawBuffer (cctx->attrib.drawBuffer);
 | 
						|
	glReadBuffer (cctx->attrib.readBuffer);
 | 
						|
    }
 | 
						|
    else
 | 
						|
    {
 | 
						|
	cctx = NULL;
 | 
						|
	__glRenderTable = &__glMesaRenderTable;
 | 
						|
	__glRenderTableEXT = &__glMesaRenderTableEXT;
 | 
						|
	
 | 
						|
	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;
 | 
						|
 | 
						|
    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)
 | 
						|
{
 | 
						|
    cctx = NULL;
 | 
						|
    __glRenderTable = &__glMesaRenderTable;
 | 
						|
    __glRenderTableEXT = &__glMesaRenderTableEXT;
 | 
						|
 | 
						|
    __glXFlushContextCache ();
 | 
						|
}
 | 
						|
 | 
						|
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);
 | 
						|
 | 
						|
    format = glitz_drawable_get_format (pScreenPriv->drawable);
 | 
						|
 | 
						|
    pContext = xalloc (sizeof (xglGLContextRec));
 | 
						|
    if (!pContext)
 | 
						|
	return NULL;
 | 
						|
 | 
						|
    pContext->context = glitz_context_create (pScreenPriv->drawable, format);
 | 
						|
    glitz_context_set_user_data (pContext->context, NULL, 
 | 
						|
				 xglLoseCurrentContext);
 | 
						|
 | 
						|
    pContext->needInit	    = TRUE;
 | 
						|
    pContext->versionString = NULL;
 | 
						|
    pContext->errorValue    = GL_NO_ERROR;
 | 
						|
    pContext->shared	    = NULL;
 | 
						|
    pContext->list	    = 0;
 | 
						|
    pContext->groupList	    = 0;
 | 
						|
    pContext->pAttribStack  = NULL;
 | 
						|
    pContext->nAttribStack  = 0;
 | 
						|
    pContext->refcnt	    = 1;
 | 
						|
    pContext->doubleBuffer  = glxCtx->pGlxVisual->doubleBuffer;
 | 
						|
    pContext->depthBits     = glxCtx->pGlxVisual->depthSize;
 | 
						|
    pContext->stencilBits   = glxCtx->pGlxVisual->stencilSize;
 | 
						|
    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_SCREEN_PRIV (pGC->pScreen);
 | 
						|
 | 
						|
	    if (!xglPrepareTarget (pDrawable))
 | 
						|
		return GL_FALSE;
 | 
						|
	    
 | 
						|
	    XGL_GET_DRAWABLE (pDrawable, surface, xOff, yOff);
 | 
						|
 | 
						|
	    /* native swap buffers for fullscreen windows */
 | 
						|
	    if (surface == pScreenPriv->surface &&
 | 
						|
		nBox == 1 &&
 | 
						|
		pBox->x1 <= 0 &&
 | 
						|
		pBox->y1 <= 0 &&
 | 
						|
		pBox->x2 >= pGC->pScreen->width &&
 | 
						|
		pBox->y2 >= pGC->pScreen->height)
 | 
						|
	    {
 | 
						|
		glitz_drawable_swap_buffers (pScreenPriv->drawable);
 | 
						|
	    }
 | 
						|
	    else
 | 
						|
	    {
 | 
						|
		glitz_surface_set_clip_region (surface, xOff, yOff,
 | 
						|
					       (glitz_box_t *) pBox, nBox);
 | 
						|
 | 
						|
		glitz_copy_area (pBufferPriv->backSurface,
 | 
						|
				 surface,
 | 
						|
				 pDrawable->x + xOff,
 | 
						|
				 pDrawable->y + yOff,
 | 
						|
				 pDrawable->width,
 | 
						|
				 pDrawable->height,
 | 
						|
				 pDrawable->x + xOff,
 | 
						|
				 pDrawable->y + yOff);
 | 
						|
		
 | 
						|
		glitz_surface_set_clip_region (surface, 0, 0, NULL, 0);
 | 
						|
	    }
 | 
						|
 | 
						|
	    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 (glPriv->modes->doubleBufferMode)
 | 
						|
	{
 | 
						|
	    glitz_surface_t *surface = pBufferPriv->backSurface;
 | 
						|
 | 
						|
	    XGL_SCREEN_PRIV (pDrawable->pScreen);
 | 
						|
	
 | 
						|
	    /* FIXME: copy color buffer bits, stencil bits and depth bits */
 | 
						|
	
 | 
						|
	    if (surface != pScreenPriv->backSurface &&
 | 
						|
		(glitz_surface_get_width (surface)  != width ||
 | 
						|
		 glitz_surface_get_height (surface) != height))
 | 
						|
	    {
 | 
						|
		glitz_format_t *format;
 | 
						|
 | 
						|
		format = pScreenPriv->pixmapFormats[pDrawable->depth].format;
 | 
						|
		
 | 
						|
		glitz_surface_destroy (surface);
 | 
						|
		
 | 
						|
		pBufferPriv->backSurface =
 | 
						|
		    glitz_surface_create (pScreenPriv->drawable, format,
 | 
						|
					  width, height, 0, NULL);
 | 
						|
		if (!pBufferPriv->backSurface)
 | 
						|
		    status = GL_FALSE;
 | 
						|
	    }
 | 
						|
	}
 | 
						|
	
 | 
						|
	ValidateGC (pDrawable, pBufferPriv->pGC);
 | 
						|
    }
 | 
						|
    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 __glXBadDrawable;
 | 
						|
 | 
						|
	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)
 | 
						|
	{
 | 
						|
	    XGL_DRAWABLE_PIXMAP (pDrawable);
 | 
						|
	    
 | 
						|
	    pPixmap->refcnt++;
 | 
						|
	
 | 
						|
	    if (pTexObj->pPixmap)
 | 
						|
		(*pDrawable->pScreen->DestroyPixmap) (pTexObj->pPixmap);
 | 
						|
	
 | 
						|
	    pTexObj->pPixmap = pPixmap;
 | 
						|
 | 
						|
	    return Success;
 | 
						|
	}
 | 
						|
    }
 | 
						|
    else if (pBufferPriv->private)
 | 
						|
    {
 | 
						|
	int status;
 | 
						|
	
 | 
						|
	glPriv->private = pBufferPriv->private;
 | 
						|
	status = (*pBufferPriv->bindBuffers) (glxPriv, buffer);
 | 
						|
	glPriv->private = pBufferPriv;
 | 
						|
 | 
						|
	return status;
 | 
						|
    }
 | 
						|
 | 
						|
    return __glXBadContext;
 | 
						|
}
 | 
						|
 | 
						|
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;
 | 
						|
		
 | 
						|
		return Success;
 | 
						|
	    }
 | 
						|
	    else
 | 
						|
	    {
 | 
						|
		pTexObj = cctx->attrib.texUnits[cctx->activeTexUnit].pRect;
 | 
						|
		if (pTexObj && pTexObj->pPixmap == pPixmap)
 | 
						|
		{
 | 
						|
		    (*pDrawable->pScreen->DestroyPixmap) (pTexObj->pPixmap);
 | 
						|
		    pTexObj->pPixmap = NULL;
 | 
						|
		    
 | 
						|
		    return Success;
 | 
						|
		}
 | 
						|
	    }
 | 
						|
	}
 | 
						|
    }
 | 
						|
    else if (pBufferPriv->private)
 | 
						|
    {
 | 
						|
	int status;
 | 
						|
	
 | 
						|
	glPriv->private = pBufferPriv->private;
 | 
						|
	status = (*pBufferPriv->releaseBuffers) (glxPriv, buffer);
 | 
						|
	glPriv->private = pBufferPriv;
 | 
						|
 | 
						|
	return status;
 | 
						|
    }
 | 
						|
    
 | 
						|
    return __glXBadContext;
 | 
						|
}
 | 
						|
 | 
						|
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);
 | 
						|
 | 
						|
    xfree (pBufferPriv);
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
xglCreateBuffer (__GLXdrawablePrivate *glxPriv)
 | 
						|
{
 | 
						|
    __GLdrawablePrivate	*glPriv = &glxPriv->glPriv;
 | 
						|
    DrawablePtr		pDrawable = glxPriv->pDraw;
 | 
						|
    ScreenPtr		pScreen = pDrawable->pScreen;
 | 
						|
    xglGLBufferPtr	pBufferPriv;
 | 
						|
 | 
						|
    XGL_SCREEN_PRIV (pScreen);
 | 
						|
    
 | 
						|
    pBufferPriv = xalloc (sizeof (xglGLBufferRec));
 | 
						|
    if (!pBufferPriv)
 | 
						|
	FatalError ("xglCreateBuffer: No memory\n");
 | 
						|
 | 
						|
    pBufferPriv->pScreen       = pScreen;
 | 
						|
    pBufferPriv->pDrawable     = NULL;
 | 
						|
    pBufferPriv->pPixmap       = NULL;
 | 
						|
    pBufferPriv->pGC	       = NULL;
 | 
						|
    pBufferPriv->backSurface   = NULL;
 | 
						|
 | 
						|
    pBufferPriv->swapBuffers = NULL;
 | 
						|
 | 
						|
    pBufferPriv->bindBuffers    = NULL;
 | 
						|
    pBufferPriv->releaseBuffers = NULL;
 | 
						|
    
 | 
						|
    pBufferPriv->resizeBuffers = NULL;
 | 
						|
    pBufferPriv->private       = NULL;
 | 
						|
    pBufferPriv->freeBuffers   = NULL;
 | 
						|
 | 
						|
    REGION_INIT (pScreen, &pBufferPriv->damage, NullBox, 0);
 | 
						|
 | 
						|
    /* use native back buffer for regular windows */
 | 
						|
    if (pDrawable->type == DRAWABLE_WINDOW
 | 
						|
 | 
						|
#ifdef COMPOSITE
 | 
						|
	/* this is a root window, can't be redirected */
 | 
						|
	&& (!((WindowPtr) pDrawable)->parent)
 | 
						|
#endif
 | 
						|
 | 
						|
	)
 | 
						|
    {
 | 
						|
	pBufferPriv->pDrawable = pDrawable;
 | 
						|
	
 | 
						|
	if (glxPriv->pGlxVisual->doubleBuffer)
 | 
						|
	{
 | 
						|
	    pBufferPriv->backSurface = pScreenPriv->backSurface;
 | 
						|
	    glitz_surface_reference (pScreenPriv->backSurface);
 | 
						|
	}
 | 
						|
    }
 | 
						|
    else if (0) /* pScreenPriv->features &
 | 
						|
		   GLITZ_FEATURE_FRAMEBUFFER_OBJECT_MASK) */
 | 
						|
    {
 | 
						|
	pBufferPriv->pDrawable = pDrawable;
 | 
						|
	
 | 
						|
	if (glxPriv->pGlxVisual->doubleBuffer)
 | 
						|
	{
 | 
						|
	    int depth = pDrawable->depth;
 | 
						|
		
 | 
						|
	    pBufferPriv->backSurface =
 | 
						|
		glitz_surface_create (pScreenPriv->drawable,
 | 
						|
				      pScreenPriv->pixmapFormats[depth].format,
 | 
						|
				      pDrawable->width, pDrawable->height,
 | 
						|
				      0, NULL);
 | 
						|
	    if (!pBufferPriv->backSurface)
 | 
						|
		FatalError ("xglCreateBuffer: glitz_surface_create\n");
 | 
						|
	}
 | 
						|
    }
 | 
						|
    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)
 | 
						|
    {
 | 
						|
	/* GL_ARB_texture_rectangle is required for sane texture coordinates.
 | 
						|
	   GL_ARB_texture_border_clamp is required right now as glitz will
 | 
						|
	   emulate it when missing, which means a 1 pixel translucent black
 | 
						|
	   border inside textures, that cannot be exposed to clients. */
 | 
						|
	if (pScreenPriv->features &
 | 
						|
	    (GLITZ_FEATURE_TEXTURE_BORDER_CLAMP_MASK |
 | 
						|
	     GLITZ_FEATURE_TEXTURE_RECTANGLE_MASK))
 | 
						|
	{
 | 
						|
	    glitz_point_fixed_t point = { 1 << 16 , 1 << 16 };
 | 
						|
	
 | 
						|
	    XGL_DRAWABLE_PIXMAP (pDrawable);
 | 
						|
	    
 | 
						|
	    if (xglCreatePixmapSurface (pPixmap))
 | 
						|
	    {
 | 
						|
		XGL_PIXMAP_PRIV (pPixmap);
 | 
						|
		
 | 
						|
		/* FIXME: doesn't work for 1x1 textures */
 | 
						|
		glitz_surface_translate_point (pPixmapPriv->surface,
 | 
						|
					       &point, &point);
 | 
						|
		if (point.x > (1 << 16) || point.y > (1 << 16))
 | 
						|
		    glxPriv->texTarget = GLX_TEXTURE_RECTANGLE_EXT;
 | 
						|
		else
 | 
						|
		    glxPriv->texTarget = GLX_TEXTURE_2D_EXT;
 | 
						|
	    }
 | 
						|
	}
 | 
						|
    }
 | 
						|
 | 
						|
    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)
 | 
						|
{
 | 
						|
    Bool status;
 | 
						|
 | 
						|
    status = (*screenInfoPriv.screenProbe) (screen);
 | 
						|
 | 
						|
    /* Wrap createBuffer */
 | 
						|
    if (__glDDXScreenInfo.createBuffer != xglCreateBuffer)
 | 
						|
    {
 | 
						|
	screenInfoPriv.createBuffer    = __glDDXScreenInfo.createBuffer;
 | 
						|
	__glDDXScreenInfo.createBuffer = xglCreateBuffer;
 | 
						|
    }
 | 
						|
    
 | 
						|
    /* Wrap createContext */
 | 
						|
    if (__glDDXScreenInfo.createContext != xglCreateContext)
 | 
						|
    {
 | 
						|
	screenInfoPriv.createContext    = __glDDXScreenInfo.createContext;
 | 
						|
	__glDDXScreenInfo.createContext = xglCreateContext;
 | 
						|
    }
 | 
						|
    
 | 
						|
    return status;
 | 
						|
}
 | 
						|
 | 
						|
static int
 | 
						|
xglXWaitX (__GLXclientState *cl, GLbyte *pc)
 | 
						|
{
 | 
						|
    xGLXWaitXReq *req = (xGLXWaitXReq *) pc;
 | 
						|
    __GLXcontext *cx;
 | 
						|
    
 | 
						|
    cx = (__GLXcontext *) __glXLookupContextByTag (cl, req->contextTag);
 | 
						|
    if (cx)
 | 
						|
    {
 | 
						|
	xglGLContextPtr pContext = (xglGLContextPtr) cx->gc;
 | 
						|
	__GLXcontext    *glxCtx = (__GLXcontext *)
 | 
						|
	    pContext->iface.imports.other;
 | 
						|
	
 | 
						|
	XGL_SCREEN_PRIV (glxCtx->pScreen);
 | 
						|
	
 | 
						|
	glitz_drawable_finish (pScreenPriv->drawable);
 | 
						|
 | 
						|
	return Success;
 | 
						|
    }
 | 
						|
    else
 | 
						|
    { 
 | 
						|
	cl->client->errorValue = req->contextTag;
 | 
						|
	return __glXBadContextTag;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
static int
 | 
						|
xglXSwapWaitX (__GLXclientState *cl, GLbyte *pc)
 | 
						|
{
 | 
						|
    xGLXWaitXReq *req = (xGLXWaitXReq *) pc;
 | 
						|
    __GLX_DECLARE_SWAP_VARIABLES;
 | 
						|
 | 
						|
    __GLX_SWAP_SHORT (&req->length);
 | 
						|
    __GLX_SWAP_INT (&req->contextTag);
 | 
						|
 | 
						|
    return xglXWaitX (cl, pc);
 | 
						|
}
 | 
						|
 | 
						|
static Bool
 | 
						|
xglDestroyWindow (WindowPtr pWin)
 | 
						|
{
 | 
						|
    ScreenPtr pScreen = pWin->drawable.pScreen;
 | 
						|
    Bool      ret;
 | 
						|
    
 | 
						|
    XGL_SCREEN_PRIV (pScreen);
 | 
						|
 | 
						|
    if (cctx)
 | 
						|
    {
 | 
						|
	if (cctx->pDrawBuffer->pDrawable == &pWin->drawable)
 | 
						|
	    cctx->pDrawBuffer->pDrawable = NULL;
 | 
						|
 | 
						|
	if (cctx->pReadBuffer->pDrawable == &pWin->drawable)
 | 
						|
	    cctx->pReadBuffer->pDrawable = NULL;
 | 
						|
    }
 | 
						|
    
 | 
						|
    XGL_SCREEN_UNWRAP (DestroyWindow);
 | 
						|
    ret = (*pScreen->DestroyWindow) (pWin);
 | 
						|
    XGL_SCREEN_WRAP (DestroyWindow, xglDestroyWindow);
 | 
						|
 | 
						|
    return ret;
 | 
						|
}
 | 
						|
 | 
						|
Bool
 | 
						|
xglInitVisualConfigs (ScreenPtr pScreen)
 | 
						|
{
 | 
						|
    miInitVisualsProcPtr    initVisualsProc = NULL;
 | 
						|
    VisualPtr		    visuals;
 | 
						|
    int			    nvisuals;
 | 
						|
    DepthPtr		    depths;
 | 
						|
    int			    ndepths;
 | 
						|
    int			    rootDepth;
 | 
						|
    VisualID		    defaultVis;
 | 
						|
    glitz_drawable_format_t *format;
 | 
						|
    xglPixelFormatPtr	    pPixel;
 | 
						|
    __GLXvisualConfig	    *pConfig;
 | 
						|
    xglGLXVisualConfigPtr   pConfigPriv, *ppConfigPriv;
 | 
						|
    XID			    *installedCmaps;
 | 
						|
    ColormapPtr		    installedCmap;
 | 
						|
    int			    numInstalledCmaps;
 | 
						|
    int			    numConfig = 1;
 | 
						|
    int			    depth, bpp, i;
 | 
						|
 | 
						|
    XGL_SCREEN_PRIV (pScreen);
 | 
						|
 | 
						|
    XGL_SCREEN_WRAP (DestroyWindow, xglDestroyWindow);
 | 
						|
    
 | 
						|
    depth  = pScreenPriv->pVisual->pPixel->depth;
 | 
						|
    bpp    = pScreenPriv->pVisual->pPixel->masks.bpp;
 | 
						|
    format = glitz_drawable_get_format (pScreenPriv->drawable);
 | 
						|
    pPixel = pScreenPriv->pixmapFormats[depth].pPixel;
 | 
						|
 | 
						|
    if (format->doublebuffer)
 | 
						|
    {
 | 
						|
	pScreenPriv->backSurface =
 | 
						|
	    glitz_surface_create (pScreenPriv->drawable,
 | 
						|
				  pScreenPriv->pixmapFormats[depth].format,
 | 
						|
				  pScreen->width, pScreen->height,
 | 
						|
				  0, NULL);
 | 
						|
	if (!pScreenPriv->backSurface)
 | 
						|
	    return FALSE;
 | 
						|
 | 
						|
	glitz_surface_attach (pScreenPriv->backSurface,
 | 
						|
			      pScreenPriv->drawable,
 | 
						|
			      GLITZ_DRAWABLE_BUFFER_BACK_COLOR,
 | 
						|
			      0, 0);
 | 
						|
 | 
						|
	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].redMask   = pPixel->masks.red_mask;
 | 
						|
	pConfig[i].greenMask = pPixel->masks.green_mask;
 | 
						|
	pConfig[i].blueMask  = pPixel->masks.blue_mask;
 | 
						|
 | 
						|
	if (format->color.alpha_size)
 | 
						|
	{
 | 
						|
	    pConfig[i].alphaSize = format->color.alpha_size;
 | 
						|
	    pConfig[i].alphaMask = pPixel->masks.alpha_mask;
 | 
						|
	}
 | 
						|
	else
 | 
						|
	{
 | 
						|
	    pConfig[i].alphaSize = 0;
 | 
						|
	    pConfig[i].alphaMask = 0;
 | 
						|
	}
 | 
						|
 | 
						|
	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 (depth == 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 (__glDDXScreenInfo.screenProbe != xglScreenProbe)
 | 
						|
    {
 | 
						|
	screenInfoPriv.screenProbe    = __glDDXScreenInfo.screenProbe;
 | 
						|
	__glDDXScreenInfo.screenProbe = xglScreenProbe;
 | 
						|
 | 
						|
	__glXSingleTable[9]     = xglXWaitX;
 | 
						|
	__glXSwapSingleTable[9] = xglXSwapWaitX;
 | 
						|
    }
 | 
						|
 | 
						|
    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;
 | 
						|
 | 
						|
    xfree (installedCmaps);
 | 
						|
    xfree (pConfigPriv);
 | 
						|
    xfree (pConfig);
 | 
						|
    
 | 
						|
    return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
#endif /* GLXEXT */
 |