-/* $Id: fakeglx.c,v 1.43 2001/01/08 04:06:20 keithw Exp $ */
+/* $Id: fakeglx.c,v 1.60 2002/03/15 18:24:53 brianp Exp $ */
/*
* Mesa 3-D graphics library
- * Version: 3.5
+ * Version: 4.1
*
- * Copyright (C) 1999-2000 Brian Paul All Rights Reserved.
+ * Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
#include "context.h"
#include "config.h"
#include "macros.h"
+#include "mem.h"
#include "mmath.h"
#include "mtypes.h"
#include "xfonts.h"
/* This indicates the client-side GLX API and GLX encoder version. */
#define CLIENT_MAJOR_VERSION 1
-#define CLIENT_MINOR_VERSION 2
+#define CLIENT_MINOR_VERSION 4 /* but don't have 1.3's pbuffers, etc yet */
/* This indicates the server-side GLX decoder version.
- * GLX 1.3 indicates OpenGL 1.2 support
+ * GLX 1.4 indicates OpenGL 1.3 support
*/
#define SERVER_MAJOR_VERSION 1
-#define SERVER_MINOR_VERSION 3
+#define SERVER_MINOR_VERSION 4
/* This is appended onto the glXGetClient/ServerString version strings. */
-#define MESA_GLX_VERSION "Mesa 3.5"
+#define MESA_GLX_VERSION "Mesa 4.1"
/* Who implemented this GLX? */
#define VENDOR "Brian Paul"
}
+/*
+ * Our fake GLX context will contain a "real" GLX context and an XMesa context.
+ *
+ * Note that a pointer to a __GLXcontext is a pointer to a fake_glx_context,
+ * and vice versa.
+ *
+ * We really just need this structure in order to make the libGL functions
+ * glXGetCurrentContext(), glXGetCurrentDrawable() and glXGetCurrentDisplay()
+ * work correctly.
+ */
+struct fake_glx_context {
+ __GLXcontext glxContext; /* this MUST be first! */
+ XMesaContext xmesaContext;
+};
+
-#define DONT_CARE -1
+/**********************************************************************/
+/*** GLX Visual Code ***/
+/**********************************************************************/
+
+#define DONT_CARE -1
#define MAX_VISUALS 100
static int NumVisuals = 0;
-
/*
* This struct and some code fragments borrowed
* from Mark Kilgard's GLUT library.
if (v->display == dpy
&& v->level == level
&& v->ximage_flag == ximageFlag
- && v->gl_visual->RGBAflag == rgbFlag
- && v->gl_visual->DBflag == dbFlag
- && v->gl_visual->StereoFlag == stereoFlag
- && (v->gl_visual->AlphaBits > 0) == alphaFlag
- && (v->gl_visual->DepthBits >= depth_size || depth_size == 0)
- && (v->gl_visual->StencilBits >= stencil_size || stencil_size == 0)
- && (v->gl_visual->AccumRedBits >= accumRedSize || accumRedSize == 0)
- && (v->gl_visual->AccumGreenBits >= accumGreenSize || accumGreenSize == 0)
- && (v->gl_visual->AccumBlueBits >= accumBlueSize || accumBlueSize == 0)
- && (v->gl_visual->AccumAlphaBits >= accumAlphaSize || accumAlphaSize == 0)) {
+ && v->mesa_visual.rgbMode == rgbFlag
+ && v->mesa_visual.doubleBufferMode == dbFlag
+ && v->mesa_visual.stereoMode == stereoFlag
+ && (v->mesa_visual.alphaBits > 0) == alphaFlag
+ && (v->mesa_visual.depthBits >= depth_size || depth_size == 0)
+ && (v->mesa_visual.stencilBits >= stencil_size || stencil_size == 0)
+ && (v->mesa_visual.accumRedBits >= accumRedSize || accumRedSize == 0)
+ && (v->mesa_visual.accumGreenBits >= accumGreenSize || accumGreenSize == 0)
+ && (v->mesa_visual.accumBlueBits >= accumBlueSize || accumBlueSize == 0)
+ && (v->mesa_visual.accumAlphaBits >= accumAlphaSize || accumAlphaSize == 0)) {
/* now either compare XVisualInfo pointers or visual IDs */
if ((!comparePointers && v->visinfo->visualid == vinfo->visualid)
|| (comparePointers && v->vishandle == vinfo)) {
);
}
else if (is_usable_visual( visinfo )) {
- /* Configure this visual as RGB, double-buffered, depth-buffered. */
- /* This is surely wrong for some people's needs but what else */
- /* can be done? They should use glXChooseVisual(). */
- return save_glx_visual( dpy, visinfo,
- GL_TRUE, /* rgb */
- GL_FALSE, /* alpha */
- GL_TRUE, /* double */
- GL_FALSE, /* stereo */
- DEFAULT_SOFTWARE_DEPTH_BITS,
- 8 * sizeof(GLstencil),
- 8 * sizeof(GLaccum), /* r */
- 8 * sizeof(GLaccum), /* g */
- 8 * sizeof(GLaccum), /* b */
- 8 * sizeof(GLaccum), /* a */
- 0 /* level */
- );
+ if (getenv("MESA_GLX_FORCE_CI")) {
+ /* Configure this visual as a COLOR INDEX visual. */
+ return save_glx_visual( dpy, visinfo,
+ GL_FALSE, /* rgb */
+ GL_FALSE, /* alpha */
+ GL_TRUE, /* double */
+ GL_FALSE, /* stereo */
+ DEFAULT_SOFTWARE_DEPTH_BITS,
+ 8 * sizeof(GLstencil),
+ 0 * sizeof(GLaccum), /* r */
+ 0 * sizeof(GLaccum), /* g */
+ 0 * sizeof(GLaccum), /* b */
+ 0 * sizeof(GLaccum), /* a */
+ 0 /* level */
+ );
+ }
+ else {
+ /* Configure this visual as RGB, double-buffered, depth-buffered. */
+ /* This is surely wrong for some people's needs but what else */
+ /* can be done? They should use glXChooseVisual(). */
+ return save_glx_visual( dpy, visinfo,
+ GL_TRUE, /* rgb */
+ GL_FALSE, /* alpha */
+ GL_TRUE, /* double */
+ GL_FALSE, /* stereo */
+ DEFAULT_SOFTWARE_DEPTH_BITS,
+ 8 * sizeof(GLstencil),
+ 8 * sizeof(GLaccum), /* r */
+ 8 * sizeof(GLaccum), /* g */
+ 8 * sizeof(GLaccum), /* b */
+ 8 * sizeof(GLaccum), /* a */
+ 0 /* level */
+ );
+ }
}
else {
fprintf(stderr,"Mesa: error in glXCreateContext: bad visual\n");
}
+/**********************************************************************/
+/*** Begin Fake GLX API Functions ***/
+/**********************************************************************/
+
static XVisualInfo *
Fake_glXChooseVisual( Display *dpy, int screen, int *list )
/* we only support one size of stencil and accum buffers. */
if (stencil_size > 0)
stencil_size = STENCIL_BITS;
- if (accumRedSize > 0)
+ if (accumRedSize > 0 || accumGreenSize > 0 || accumBlueSize > 0 ||
+ accumAlphaSize > 0) {
accumRedSize = ACCUM_BITS;
- if (accumGreenSize > 0)
accumGreenSize = ACCUM_BITS;
- if (accumBlueSize > 0)
accumBlueSize = ACCUM_BITS;
- if (accumAlphaSize > 0)
- accumAlphaSize = ACCUM_BITS;
+ accumAlphaSize = alpha_flag ? ACCUM_BITS : 0;
+ }
+
if (!save_glx_visual( dpy, vis, rgb_flag, alpha_flag, double_flag,
stereo_flag, depth_size, stencil_size,
accumRedSize, accumGreenSize,
GLXContext share_list, Bool direct )
{
XMesaVisual glxvis;
- struct __GLcontextRec *ctx;
+ struct fake_glx_context *glxCtx;
+ struct fake_glx_context *shareCtx = (struct fake_glx_context *) share_list;
+ glxCtx = CALLOC_STRUCT(fake_glx_context);
+ if (!glxCtx)
+ return 0;
/* deallocate unused windows/buffers */
XMesaGarbageCollect();
glxvis = create_glx_visual( dpy, visinfo );
if (!glxvis) {
/* unusable visual */
+ FREE(glxCtx);
return NULL;
}
}
- ctx = XMesaCreateContext( glxvis, (struct __GLcontextRec *) share_list );
- if (ctx) {
- XMesaContext xmctx = (XMesaContext)(ctx->DriverCtx);
- /* set the direct/indirect flag */
- xmctx->direct = direct;
+ glxCtx->xmesaContext = XMesaCreateContext(glxvis,
+ shareCtx ? shareCtx->xmesaContext : NULL);
+ if (!glxCtx->xmesaContext) {
+ FREE(glxCtx);
+ return NULL;
}
- return (GLXContext) ctx;
+
+ glxCtx->xmesaContext->direct = GL_FALSE;
+ glxCtx->glxContext.isDirect = GL_FALSE;
+ glxCtx->glxContext.currentDpy = dpy;
+ glxCtx->glxContext.xid = (XID) glxCtx; /* self pointer */
+
+ assert((void *) glxCtx == (void *) &(glxCtx->glxContext));
+
+ return (GLXContext) glxCtx;
}
+/* XXX these may have to be removed due to thread-safety issues. */
static GLXContext MakeCurrent_PrevContext = 0;
static GLXDrawable MakeCurrent_PrevDrawable = 0;
static GLXDrawable MakeCurrent_PrevReadable = 0;
static XMesaBuffer MakeCurrent_PrevDrawBuffer = 0;
static XMesaBuffer MakeCurrent_PrevReadBuffer = 0;
+
/* GLX 1.3 and later */
static Bool
Fake_glXMakeContextCurrent( Display *dpy, GLXDrawable draw,
- GLXDrawable read, GLXContext glxctx )
+ GLXDrawable read, GLXContext ctx )
{
- if (glxctx && draw && read) {
+ struct fake_glx_context *glxCtx = (struct fake_glx_context *) ctx;
+
+ if (ctx && draw && read) {
XMesaBuffer drawBuffer, readBuffer;
- GLcontext *ctx = (GLcontext *) glxctx;
- XMesaContext xmctx = (XMesaContext)(ctx->DriverCtx);
+ XMesaContext xmctx = glxCtx->xmesaContext;
/* Find the XMesaBuffer which corresponds to the GLXDrawable 'draw' */
- if (glxctx == MakeCurrent_PrevContext &&
- draw == MakeCurrent_PrevDrawable) {
+ if (ctx == MakeCurrent_PrevContext
+ && draw == MakeCurrent_PrevDrawable) {
drawBuffer = MakeCurrent_PrevDrawBuffer;
}
else {
}
if (!drawBuffer) {
/* drawable must be a new window! */
- drawBuffer = XMesaCreateWindowBuffer2( xmctx->xm_visual, draw, xmctx );
+ drawBuffer = XMesaCreateWindowBuffer2( xmctx->xm_visual, draw, xmctx);
if (!drawBuffer) {
/* Out of memory, or context/drawable depth mismatch */
return False;
}
/* Find the XMesaBuffer which corresponds to the GLXDrawable 'read' */
- if (glxctx == MakeCurrent_PrevContext
+ if (ctx == MakeCurrent_PrevContext
&& read == MakeCurrent_PrevReadable) {
readBuffer = MakeCurrent_PrevReadBuffer;
}
}
if (!readBuffer) {
/* drawable must be a new window! */
- readBuffer = XMesaCreateWindowBuffer2( xmctx->xm_visual, read, xmctx );
+ readBuffer = XMesaCreateWindowBuffer2(glxCtx->xmesaContext->xm_visual,
+ read, xmctx);
if (!readBuffer) {
/* Out of memory, or context/drawable depth mismatch */
return False;
}
}
- MakeCurrent_PrevContext = glxctx;
+ MakeCurrent_PrevContext = ctx;
MakeCurrent_PrevDrawable = draw;
MakeCurrent_PrevReadable = read;
MakeCurrent_PrevDrawBuffer = drawBuffer;
MakeCurrent_PrevReadBuffer = readBuffer;
/* Now make current! */
- return (Bool) XMesaMakeCurrent2(xmctx, drawBuffer, readBuffer);
+ if (XMesaMakeCurrent2(xmctx, drawBuffer, readBuffer)) {
+ ((__GLXcontext *) ctx)->currentDpy = dpy;
+ ((__GLXcontext *) ctx)->currentDrawable = draw;
+ ((__GLXcontext *) ctx)->currentReadable = read;
+#ifdef GLX_BUILT_IN_XMESA
+ __glXSetCurrentContext(ctx);
+#endif
+ return True;
+ }
+ else {
+ return False;
+ }
}
- else if (!glxctx && !draw && !read) {
+ else if (!ctx && !draw && !read) {
/* release current context w/out assigning new one. */
XMesaMakeCurrent( NULL, NULL );
MakeCurrent_PrevContext = 0;
MakeCurrent_PrevReadable = 0;
MakeCurrent_PrevDrawBuffer = 0;
MakeCurrent_PrevReadBuffer = 0;
+#ifdef GLX_BUILT_IN_XMESA
+ /* XXX bind dummy context with __glXSetCurrentContext(ctx); */
+#endif
return True;
}
else {
}
-#ifdef GLX_MESA_pixmap_colormap
+/*** GLX_MESA_pixmap_colormap ***/
+
static GLXPixmap
Fake_glXCreateGLXPixmapMESA( Display *dpy, XVisualInfo *visinfo,
Pixmap pixmap, Colormap cmap )
}
return b->frontbuffer;
}
-#endif
static void
Fake_glXCopyContext( Display *dpy, GLXContext src, GLXContext dst,
unsigned long mask )
{
- struct __GLcontextRec *csrc = (struct __GLcontextRec *) src;
- struct __GLcontextRec *cdst = (struct __GLcontextRec *) dst;
+ XMesaContext xm_src = (XMesaContext) src;
+ XMesaContext xm_dst = (XMesaContext) dst;
(void) dpy;
- _mesa_copy_context( csrc, cdst, (GLuint) mask );
+ _mesa_copy_context( xm_src->gl_ctx, xm_dst->gl_ctx, (GLuint) mask );
}
static void
Fake_glXDestroyContext( Display *dpy, GLXContext ctx )
{
- XMesaContext xmctx = (XMesaContext)(((GLcontext *)ctx)->DriverCtx);
+ struct fake_glx_context *glxCtx = (struct fake_glx_context *) ctx;
(void) dpy;
MakeCurrent_PrevContext = 0;
MakeCurrent_PrevDrawable = 0;
MakeCurrent_PrevReadable = 0;
MakeCurrent_PrevDrawBuffer = 0;
MakeCurrent_PrevReadBuffer = 0;
- XMesaDestroyContext( xmctx );
+ XMesaDestroyContext( glxCtx->xmesaContext );
XMesaGarbageCollect();
}
static Bool
Fake_glXIsDirect( Display *dpy, GLXContext ctx )
{
- XMesaContext xmctx = (XMesaContext)(((GLcontext *)ctx)->DriverCtx);
+ struct fake_glx_context *glxCtx = (struct fake_glx_context *) ctx;
(void) dpy;
- return xmctx->direct;
+ return glxCtx->xmesaContext->direct;
}
-#ifdef GLX_MESA_copy_sub_buffer
+/*** GLX_MESA_copy_sub_buffer ***/
+
static void
Fake_glXCopySubBufferMESA( Display *dpy, GLXDrawable drawable,
int x, int y, int width, int height )
fprintf(stderr, "Mesa Warning: glXCopySubBufferMESA: invalid drawable\n");
}
}
-#endif
*value = glxvis->level;
return 0;
case GLX_RGBA:
- if (glxvis->gl_visual->RGBAflag) {
+ if (glxvis->mesa_visual.rgbMode) {
*value = True;
}
else {
}
return 0;
case GLX_DOUBLEBUFFER:
- *value = (int) glxvis->gl_visual->DBflag;
+ *value = (int) glxvis->mesa_visual.doubleBufferMode;
return 0;
case GLX_STEREO:
- *value = (int) glxvis->gl_visual->StereoFlag;
+ *value = (int) glxvis->mesa_visual.stereoMode;
return 0;
case GLX_AUX_BUFFERS:
*value = (int) False;
return 0;
case GLX_RED_SIZE:
- *value = glxvis->gl_visual->RedBits;
+ *value = glxvis->mesa_visual.redBits;
return 0;
case GLX_GREEN_SIZE:
- *value = glxvis->gl_visual->GreenBits;
+ *value = glxvis->mesa_visual.greenBits;
return 0;
case GLX_BLUE_SIZE:
- *value = glxvis->gl_visual->BlueBits;
+ *value = glxvis->mesa_visual.blueBits;
return 0;
case GLX_ALPHA_SIZE:
- *value = glxvis->gl_visual->AlphaBits;
+ *value = glxvis->mesa_visual.alphaBits;
return 0;
case GLX_DEPTH_SIZE:
- *value = glxvis->gl_visual->DepthBits;
+ *value = glxvis->mesa_visual.depthBits;
return 0;
case GLX_STENCIL_SIZE:
- *value = glxvis->gl_visual->StencilBits;
+ *value = glxvis->mesa_visual.stencilBits;
return 0;
case GLX_ACCUM_RED_SIZE:
- *value = glxvis->gl_visual->AccumRedBits;
+ *value = glxvis->mesa_visual.accumRedBits;
return 0;
case GLX_ACCUM_GREEN_SIZE:
- *value = glxvis->gl_visual->AccumGreenBits;
+ *value = glxvis->mesa_visual.accumGreenBits;
return 0;
case GLX_ACCUM_BLUE_SIZE:
- *value = glxvis->gl_visual->AccumBlueBits;
+ *value = glxvis->mesa_visual.accumBlueBits;
return 0;
case GLX_ACCUM_ALPHA_SIZE:
- *value = glxvis->gl_visual->AccumAlphaBits;
+ *value = glxvis->mesa_visual.accumAlphaBits;
return 0;
/*
}
else if (glxvis->level>0) {
/* overlay */
- if (glxvis->gl_visual->RGBAflag) {
+ if (glxvis->mesa_visual.rgbMode) {
*value = GLX_TRANSPARENT_RGB_EXT;
}
else {
* GLX 1.3 and later
*/
+/* XXX Move this when done.
+ * Create an XMesaBuffer as a Pbuffer.
+ * New in Mesa 4.0 but untested.
+ */
+extern XMesaBuffer XMesaCreatePBuffer( XMesaVisual v, XMesaColormap cmap,
+ unsigned int width, unsigned int height );
+
+
+
static GLXFBConfig *
Fake_glXChooseFBConfig( Display *dpy, int screen,
const int *attribList, int *nitems )
Fake_glXGetFBConfigAttrib( Display *dpy, GLXFBConfig config,
int attribute, int *value )
{
+ XMesaVisual v = NULL; /* XXX Fix this */
(void) dpy;
(void) config;
(void) attribute;
(void) value;
- return 0;
+
+ if (!dpy || !config || !value)
+ return -1;
+
+ switch (attribute) {
+ case GLX_FBCONFIG_ID:
+ case GLX_BUFFER_SIZE:
+ if (v->mesa_visual.rgbMode)
+ *value = v->mesa_visual.redBits + v->mesa_visual.greenBits +
+ v->mesa_visual.blueBits + v->mesa_visual.alphaBits;
+ else
+ *value = v->mesa_visual.indexBits;
+ break;
+ case GLX_LEVEL:
+ *value = v->level;
+ break;
+ case GLX_DOUBLEBUFFER:
+ *value = v->mesa_visual.doubleBufferMode;
+ break;
+ case GLX_STEREO:
+ *value = v->mesa_visual.stereoMode;
+ break;
+ case GLX_AUX_BUFFERS:
+ *value = v->mesa_visual.numAuxBuffers;
+ break;
+ case GLX_RED_SIZE:
+ *value = v->mesa_visual.redBits;
+ break;
+ case GLX_GREEN_SIZE:
+ *value = v->mesa_visual.greenBits;
+ break;
+ case GLX_BLUE_SIZE:
+ *value = v->mesa_visual.blueBits;
+ break;
+ case GLX_ALPHA_SIZE:
+ *value = v->mesa_visual.alphaBits;
+ break;
+ case GLX_DEPTH_SIZE:
+ *value = v->mesa_visual.depthBits;
+ break;
+ case GLX_STENCIL_SIZE:
+ *value = v->mesa_visual.stencilBits;
+ break;
+ case GLX_ACCUM_RED_SIZE:
+ *value = v->mesa_visual.accumRedBits;
+ break;
+ case GLX_ACCUM_GREEN_SIZE:
+ *value = v->mesa_visual.accumGreenBits;
+ break;
+ case GLX_ACCUM_BLUE_SIZE:
+ *value = v->mesa_visual.accumBlueBits;
+ break;
+ case GLX_ACCUM_ALPHA_SIZE:
+ *value = v->mesa_visual.accumAlphaBits;
+ break;
+ case GLX_RENDER_TYPE:
+ *value = 0; /* XXX ??? */
+ break;
+ case GLX_DRAWABLE_TYPE:
+ *value = GLX_PBUFFER_BIT; /* XXX fix? */
+ break;
+ case GLX_X_RENDERABLE:
+ *value = False; /* XXX ??? */
+ break;
+ case GLX_X_VISUAL_TYPE:
+ switch (v->vishandle->class) {
+ case GrayScale:
+ *value = GLX_GRAY_SCALE;
+ break;
+ case StaticGray:
+ *value = GLX_STATIC_GRAY;
+ break;
+ case StaticColor:
+ *value = GLX_STATIC_COLOR;
+ break;
+ case PseudoColor:
+ *value = GLX_PSEUDO_COLOR;
+ break;
+ case TrueColor:
+ *value = GLX_TRUE_COLOR;
+ break;
+ case DirectColor:
+ *value = GLX_DIRECT_COLOR;
+ break;
+ default:
+ *value = 0;
+ }
+ break;
+ case GLX_CONFIG_CAVEAT:
+ *value = 0; /* XXX ??? */
+ break;
+ case GLX_TRANSPARENT_TYPE:
+ if (v->level == 0) {
+ /* normal planes */
+ *value = GLX_NONE_EXT;
+ }
+ else if (v->level > 0) {
+ /* overlay */
+ if (v->mesa_visual.rgbMode) {
+ *value = GLX_TRANSPARENT_RGB_EXT;
+ }
+ else {
+ *value = GLX_TRANSPARENT_INDEX_EXT;
+ }
+ }
+ else if (v->level < 0) {
+ /* underlay */
+ *value = GLX_NONE_EXT;
+ }
+ break;
+ case GLX_TRANSPARENT_INDEX_VALUE:
+ *value = transparent_pixel( v );
+ break;
+ case GLX_TRANSPARENT_RED_VALUE:
+ *value = 0; /* not implemented */
+ break;
+ case GLX_TRANSPARENT_GREEN_VALUE:
+ *value = 0; /* not implemented */
+ break;
+ case GLX_TRANSPARENT_BLUE_VALUE:
+ *value = 0; /* not implemented */
+ break;
+ case GLX_TRANSPARENT_ALPHA_VALUE:
+ *value = 0; /* not implemented */
+ break;
+ case GLX_MAX_PBUFFER_WIDTH:
+ *value = DisplayWidth(dpy, v->vishandle->screen);
+ break;
+ case GLX_MAX_PBUFFER_HEIGHT:
+ *value = DisplayHeight(dpy, v->vishandle->screen);
+ break;
+ case GLX_MAX_PBUFFER_PIXELS:
+ *value = DisplayWidth(dpy, v->vishandle->screen) *
+ DisplayHeight(dpy, v->vishandle->screen);
+ break;
+ case GLX_VISUAL_ID:
+ *value = v->vishandle->visualid;
+ break;
+ default:
+ return GLX_BAD_ATTRIBUTE;
+ }
+
+ return Success;
}
static XVisualInfo *
Fake_glXGetVisualFromFBConfig( Display *dpy, GLXFBConfig config )
{
- (void) dpy;
- (void) config;
- return 0;
+ if (dpy && config) {
+ XMesaVisual v = (XMesaVisual) config;
+ return v->vishandle;
+ }
+ else {
+ return NULL;
+ }
}
(void) dpy;
(void) config;
(void) win;
- (void) attribList;
- return 0;
+ (void) attribList; /* Ignored in GLX 1.3 */
+
+ return win; /* A hack for now */
}
static void
Fake_glXDestroyWindow( Display *dpy, GLXWindow window )
{
- (void) dpy;
- (void) window;
- return;
+ XMesaBuffer b = XMesaFindBuffer(dpy, (XMesaDrawable) window);
+ if (b)
+ XMesaDestroyBuffer(b);
+ /* don't destroy X window */
}
+/* XXX untested */
static GLXPixmap
Fake_glXCreatePixmap( Display *dpy, GLXFBConfig config, Pixmap pixmap,
const int *attribList )
{
+ XMesaVisual v = (XMesaVisual) config;
+ XVisualInfo *visinfo;
+ XMesaBuffer b;
+
(void) dpy;
(void) config;
(void) pixmap;
- (void) attribList;
- return 0;
+ (void) attribList; /* Ignored in GLX 1.3 */
+
+ if (!dpy || !config || !pixmap)
+ return 0;
+
+ visinfo = v->vishandle;
+
+ v = find_glx_visual( dpy, visinfo );
+ if (!v) {
+ v = create_glx_visual( dpy, visinfo );
+ if (!v) {
+ /* unusable visual */
+ return 0;
+ }
+ }
+
+ b = XMesaCreatePixmapBuffer( v, pixmap, 0 );
+ if (!b) {
+ return 0;
+ }
+
+ return pixmap;
}
static void
Fake_glXDestroyPixmap( Display *dpy, GLXPixmap pixmap )
{
- (void) dpy;
- (void) pixmap;
- return;
+ XMesaBuffer b = XMesaFindBuffer(dpy, (XMesaDrawable)pixmap);
+ if (b)
+ XMesaDestroyBuffer(b);
+ /* don't destroy X pixmap */
}
Fake_glXCreatePbuffer( Display *dpy, GLXFBConfig config,
const int *attribList )
{
+ const int *attrib;
+ int width = 0, height = 0;
+ GLboolean useLargest = GL_FALSE, preserveContents = GL_FALSE;
+
(void) dpy;
(void) config;
- (void) attribList;
+
+ for (attrib = attribList; attrib; attrib++) {
+ switch (*attrib) {
+ case GLX_PBUFFER_WIDTH:
+ width = *(++attrib);
+ break;
+ case GLX_PBUFFER_HEIGHT:
+ height = *(++attrib);
+ break;
+ case GLX_PRESERVED_CONTENTS:
+ preserveContents = GL_TRUE; /* ignored */
+ break;
+ case GLX_LARGEST_PBUFFER:
+ useLargest = GL_TRUE; /* ignored */
+ break;
+ default:
+ return 0;
+ }
+ }
+
+ if (width == 0 || height == 0)
+ return 0;
+
+
return 0;
}
{
(void) dpy;
(void) draw;
- (void) attribute;
- (void) value;
+
+ switch (attribute) {
+ case GLX_WIDTH:
+ case GLX_HEIGHT:
+ case GLX_PRESERVED_CONTENTS:
+ case GLX_LARGEST_PBUFFER:
+ case GLX_FBCONFIG_ID:
+ *value = 0;
+ return;
+ default:
+ return; /* GLX_BAD_ATTRIBUTE? */
+ }
}
Fake_glXCreateNewContext( Display *dpy, GLXFBConfig config,
int renderType, GLXContext shareList, Bool direct )
{
- (void) dpy;
- (void) config;
- (void) renderType;
- (void) shareList;
- (void) direct;
- return 0;
+ XMesaVisual v = (XMesaVisual) config;
+
+ if (!dpy || !config ||
+ (renderType != GLX_RGBA_TYPE && renderType != GLX_COLOR_INDEX_TYPE))
+ return 0;
+
+ return Fake_glXCreateContext(dpy, v->vishandle, shareList, direct);
}
{
(void) dpy;
(void) ctx;
- (void) attribute;
- (void) value;
- return 0;
+
+ switch (attribute) {
+ case GLX_FBCONFIG_ID:
+ case GLX_RENDER_TYPE:
+ case GLX_SCREEN:
+ *value = 0;
+ return Success;
+ default:
+ return GLX_BAD_ATTRIBUTE;
+ }
}
-#ifdef GLX_SGI_swap_control
+/*** GLX_SGI_swap_control ***/
static int
Fake_glXSwapIntervalSGI(int interval)
return 0;
}
-#endif
-#ifdef GLX_SGI_video_sync
+/*** GLX_SGI_video_sync ***/
static int
Fake_glXGetVideoSyncSGI(unsigned int *count)
return 0;
}
-#endif
-#ifdef GLX_SGI_make_current_read
+/*** GLX_SGI_make_current_read ***/
static Bool
Fake_glXMakeCurrentReadSGI(Display *dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx)
return False;
}
+/* not used
static GLXDrawable
Fake_glXGetCurrentReadDrawableSGI(void)
{
return 0;
}
-
-#endif
+*/
-#if defined(_VL_H) && defined(GLX_SGIX_video_source)
+/*** GLX_SGIX_video_source ***/
+#if defined(_VL_H)
static GLXVideoSourceSGIX
Fake_glXCreateGLXVideoSourceSGIX(Display *dpy, int screen, VLServer server, VLPath path, int nodeClass, VLNode drainNode)
#endif
-#ifdef GLX_EXT_import_context
+/*** GLX_EXT_import_context ***/
static void
Fake_glXFreeContextEXT(Display *dpy, GLXContext context)
return 0;
}
-static Display *
-Fake_glXGetCurrentDisplayEXT(void)
-{
- return glXGetCurrentDisplay();
-}
-
static GLXContext
Fake_glXImportContextEXT(Display *dpy, GLXContextID contextID)
{
return 0;
}
-#endif
-#ifdef GLX_SGIX_fbconfig
+/*** GLX_SGIX_fbconfig ***/
static int
Fake_glXGetFBConfigAttribSGIX(Display *dpy, GLXFBConfigSGIX config, int attribute, int *value)
return 0;
}
-#endif
-#ifdef GLX_SGIX_pbuffer
+/*** GLX_SGIX_pbuffer ***/
static GLXPbufferSGIX
Fake_glXCreateGLXPbufferSGIX(Display *dpy, GLXFBConfigSGIX config, unsigned int width, unsigned int height, int *attrib_list)
(void) mask;
}
-#endif
-#ifdef GLX_SGI_cushion
+/*** GLX_SGI_cushion ***/
static void
Fake_glXCushionSGI(Display *dpy, Window win, float cushion)
(void) cushion;
}
-#endif
-#ifdef GLX_SGIX_video_resize
+/*** GLX_SGIX_video_resize ***/
static int
Fake_glXBindChannelToWindowSGIX(Display *dpy, int screen, int channel , Window window)
return 0;
}
-#endif
-#if defined(_DM_BUFFER_H_) && defined(GLX_SGIX_dmbuffer)
+/*** GLX_SGIX_dmbuffer **/
+#if defined(_DM_BUFFER_H_)
static Bool
Fake_glXAssociateDMPbufferSGIX(Display *dpy, GLXPbufferSGIX pbuffer, DMparams *params, DMbuffer dmbuffer)
{
(void) dmbuffer;
return False;
}
-
#endif
-#ifdef GLX_SGIX_swap_group
+/*** GLX_SGIX_swap_group ***/
static void
Fake_glXJoinSwapGroupSGIX(Display *dpy, GLXDrawable drawable, GLXDrawable member)
(void) member;
}
-#endif
-#ifdef GLX_SGIX_swap_barrier
+/*** GLX_SGIX_swap_barrier ***/
static void
Fake_glXBindSwapBarrierSGIX(Display *dpy, GLXDrawable drawable, int barrier)
return False;
}
-#endif
-#ifdef GLX_SUN_get_transparent_index
+/*** GLX_SUN_get_transparent_index ***/
static Status
Fake_glXGetTransparentIndexSUN(Display *dpy, Window overlay, Window underlay, long *pTransparent)
return 0;
}
-#endif
-#ifdef GLX_MESA_release_buffers
+/*** GLX_MESA_release_buffers ***/
+
/*
* Release the depth, stencil, accum buffers attached to a GLXDrawable
* (a window or pixmap) prior to destroying the GLXDrawable.
}
return False;
}
-#endif
-#ifdef GLX_MESA_set_3dfx_mode
+/*** GLX_MESA_set_3dfx_mode ***/
+
static Bool
Fake_glXSet3DfxModeMESA( int mode )
{
return XMesaSetFXmode( mode );
}
-#endif
/* be sure our dispatch table size <= libGL's table */
{
- int size = sizeof(struct _glxapi_table) / sizeof(void *);
+ GLuint size = sizeof(struct _glxapi_table) / sizeof(void *);
(void) size;
assert(_glxapi_get_dispatch_table_size() >= size);
}
glx.WaitGL = Fake_glXWaitGL;
glx.WaitX = Fake_glXWaitX;
-#ifdef GLX_VERSION_1_1
+ /*** GLX_VERSION_1_1 ***/
glx.GetClientString = Fake_glXGetClientString;
glx.QueryExtensionsString = Fake_glXQueryExtensionsString;
glx.QueryServerString = Fake_glXQueryServerString;
-#endif
-#ifdef GLX_VERSION_1_2
+ /*** GLX_VERSION_1_2 ***/
/*glx.GetCurrentDisplay = Fake_glXGetCurrentDisplay;*/
-#endif
-#ifdef GLX_VERSION_1_3
+ /*** GLX_VERSION_1_3 ***/
glx.ChooseFBConfig = Fake_glXChooseFBConfig;
glx.CreateNewContext = Fake_glXCreateNewContext;
glx.CreatePbuffer = Fake_glXCreatePbuffer;
glx.QueryContext = Fake_glXQueryContext;
glx.QueryDrawable = Fake_glXQueryDrawable;
glx.SelectEvent = Fake_glXSelectEvent;
-#endif
-#ifdef GLX_SGI_swap_control
+ /*** GLX_SGI_swap_control ***/
glx.SwapIntervalSGI = Fake_glXSwapIntervalSGI;
-#endif
-#ifdef GLX_SGI_video_sync
+ /*** GLX_SGI_video_sync ***/
glx.GetVideoSyncSGI = Fake_glXGetVideoSyncSGI;
glx.WaitVideoSyncSGI = Fake_glXWaitVideoSyncSGI;
-#endif
-#ifdef GLX_SGI_make_current_read
+ /*** GLX_SGI_make_current_read ***/
glx.MakeCurrentReadSGI = Fake_glXMakeCurrentReadSGI;
- glx.GetCurrentReadDrawableSGI = Fake_glXGetCurrentReadDrawableSGI;
-#endif
+ /*glx.GetCurrentReadDrawableSGI = Fake_glXGetCurrentReadDrawableSGI;*/
-#if defined(_VL_H) && defined(GLX_SGIX_video_source)
+/*** GLX_SGIX_video_source ***/
+#if defined(_VL_H)
glx.CreateGLXVideoSourceSGIX = Fake_glXCreateGLXVideoSourceSGIX;
glx.DestroyGLXVideoSourceSGIX = Fake_glXDestroyGLXVideoSourceSGIX;
#endif
-#ifdef GLX_EXT_import_context
+ /*** GLX_EXT_import_context ***/
glx.FreeContextEXT = Fake_glXFreeContextEXT;
glx.GetContextIDEXT = Fake_glXGetContextIDEXT;
- glx.GetCurrentDisplayEXT = Fake_glXGetCurrentDisplayEXT;
+ /*glx.GetCurrentDisplayEXT = Fake_glXGetCurrentDisplayEXT;*/
glx.ImportContextEXT = Fake_glXImportContextEXT;
glx.QueryContextInfoEXT = Fake_glXQueryContextInfoEXT;
-#endif
-#ifdef GLX_SGIX_fbconfig
+ /*** GLX_SGIX_fbconfig ***/
glx.GetFBConfigAttribSGIX = Fake_glXGetFBConfigAttribSGIX;
glx.ChooseFBConfigSGIX = Fake_glXChooseFBConfigSGIX;
glx.CreateGLXPixmapWithConfigSGIX = Fake_glXCreateGLXPixmapWithConfigSGIX;
glx.CreateContextWithConfigSGIX = Fake_glXCreateContextWithConfigSGIX;
glx.GetVisualFromFBConfigSGIX = Fake_glXGetVisualFromFBConfigSGIX;
glx.GetFBConfigFromVisualSGIX = Fake_glXGetFBConfigFromVisualSGIX;
-#endif
-#ifdef GLX_SGIX_pbuffer
+ /*** GLX_SGIX_pbuffer ***/
glx.CreateGLXPbufferSGIX = Fake_glXCreateGLXPbufferSGIX;
glx.DestroyGLXPbufferSGIX = Fake_glXDestroyGLXPbufferSGIX;
glx.QueryGLXPbufferSGIX = Fake_glXQueryGLXPbufferSGIX;
glx.SelectEventSGIX = Fake_glXSelectEventSGIX;
glx.GetSelectedEventSGIX = Fake_glXGetSelectedEventSGIX;
-#endif
-#ifdef GLX_SGI_cushion
+ /*** GLX_SGI_cushion ***/
glx.CushionSGI = Fake_glXCushionSGI;
-#endif
-#ifdef GLX_SGIX_video_resize
+ /*** GLX_SGIX_video_resize ***/
glx.BindChannelToWindowSGIX = Fake_glXBindChannelToWindowSGIX;
glx.ChannelRectSGIX = Fake_glXChannelRectSGIX;
glx.QueryChannelRectSGIX = Fake_glXQueryChannelRectSGIX;
glx.QueryChannelDeltasSGIX = Fake_glXQueryChannelDeltasSGIX;
glx.ChannelRectSyncSGIX = Fake_glXChannelRectSyncSGIX;
-#endif
-#if defined(_DM_BUFFER_H_) && defined(GLX_SGIX_dmbuffer)
+ /*** GLX_SGIX_dmbuffer **/
+#if defined(_DM_BUFFER_H_)
glx.AssociateDMPbufferSGIX = NULL;
#endif
-#ifdef GLX_SGIX_swap_group
+ /*** GLX_SGIX_swap_group ***/
glx.JoinSwapGroupSGIX = Fake_glXJoinSwapGroupSGIX;
-#endif
-#ifdef GLX_SGIX_swap_barrier
+ /*** GLX_SGIX_swap_barrier ***/
glx.BindSwapBarrierSGIX = Fake_glXBindSwapBarrierSGIX;
glx.QueryMaxSwapBarriersSGIX = Fake_glXQueryMaxSwapBarriersSGIX;
-#endif
-#ifdef GLX_SUN_get_transparent_index
+ /*** GLX_SUN_get_transparent_index ***/
glx.GetTransparentIndexSUN = Fake_glXGetTransparentIndexSUN;
-#endif
-#ifdef GLX_MESA_copy_sub_buffer
+ /*** GLX_MESA_copy_sub_buffer ***/
glx.CopySubBufferMESA = Fake_glXCopySubBufferMESA;
-#endif
-#ifdef GLX_MESA_release_buffers
+ /*** GLX_MESA_release_buffers ***/
glx.ReleaseBuffersMESA = Fake_glXReleaseBuffersMESA;
-#endif
-#ifdef GLX_MESA_pixmap_colormap
+ /*** GLX_MESA_pixmap_colormap ***/
glx.CreateGLXPixmapMESA = Fake_glXCreateGLXPixmapMESA;
-#endif
-#ifdef GLX_MESA_set_3dfx_mode
+ /*** GLX_MESA_set_3dfx_mode ***/
glx.Set3DfxModeMESA = Fake_glXSet3DfxModeMESA;
-#endif
return &glx;
}