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