/*
* Mesa 3-D graphics library
- * Version: 6.0.1
+ * Version: 6.3
*
* Copyright (C) 1999-2004 Brian Paul All Rights Reserved.
*
"GLX_SGI_video_sync " \
"GLX_SGIX_fbconfig " \
"GLX_SGIX_pbuffer "
-/*
- "GLX_ARB_render_texture"
-*/
-
-/* Silence compiler warnings */
-extern void Fake_glXDummyFunc( void );
-void Fake_glXDummyFunc( void )
-{
- (void) kernel8;
- (void) DitherValues;
- (void) HPCR_DRGB;
- (void) kernel1;
-}
-
/*
* Our fake GLX context will contain a "real" GLX context and an XMesa context.
-
/*
* Test if the given XVisualInfo is usable for Mesa rendering.
*/
-static GLboolean is_usable_visual( XVisualInfo *vinfo )
+static GLboolean
+is_usable_visual( XVisualInfo *vinfo )
{
switch (vinfo->CLASS) {
case StaticGray:
-/*
- * Return the level (overlay, normal, underlay) of a given XVisualInfo.
- * Input: dpy - the X display
- * vinfo - the XVisualInfo to test
- * Return: level of the visual:
- * 0 = normal planes
- * >0 = overlay planes
- * <0 = underlay planes
+/**
+ * Get an array OverlayInfo records for specified screen.
+ * \param dpy the display
+ * \param screen screen number
+ * \param numOverlays returns numver of OverlayInfo records
+ * \return pointer to OverlayInfo array, free with XFree()
*/
-static int level_of_visual( Display *dpy, XVisualInfo *vinfo )
+static OverlayInfo *
+GetOverlayInfo(Display *dpy, int screen, int *numOverlays)
{
Atom overlayVisualsAtom;
- OverlayInfo *overlay_info = NULL;
- int numOverlaysPerScreen;
- Status status;
Atom actualType;
- int actualFormat;
+ Status status;
+ unsigned char *ovInfo;
unsigned long sizeData, bytesLeft;
- int i;
+ int actualFormat;
/*
* The SERVER_OVERLAY_VISUALS property on the root window contains
return 0;
}
- status = XGetWindowProperty(dpy, RootWindow( dpy, vinfo->screen ),
+ status = XGetWindowProperty(dpy, RootWindow(dpy, screen),
overlayVisualsAtom, 0L, (long) 10000, False,
overlayVisualsAtom, &actualType, &actualFormat,
&sizeData, &bytesLeft,
- (unsigned char **) &overlay_info );
+ &ovInfo);
if (status != Success || actualType != overlayVisualsAtom ||
actualFormat != 32 || sizeData < 4) {
/* something went wrong */
- XFree((void *) overlay_info);
+ XFree((void *) ovInfo);
+ *numOverlays = 0;
+ return NULL;
+ }
+
+ *numOverlays = sizeData / 4;
+ return (OverlayInfo *) ovInfo;
+}
+
+
+
+/**
+ * Return the level (overlay, normal, underlay) of a given XVisualInfo.
+ * Input: dpy - the X display
+ * vinfo - the XVisualInfo to test
+ * Return: level of the visual:
+ * 0 = normal planes
+ * >0 = overlay planes
+ * <0 = underlay planes
+ */
+static int
+level_of_visual( Display *dpy, XVisualInfo *vinfo )
+{
+ OverlayInfo *overlay_info;
+ int numOverlaysPerScreen, i;
+
+ overlay_info = GetOverlayInfo(dpy, vinfo->screen, &numOverlaysPerScreen);
+ if (!overlay_info) {
return 0;
}
/* search the overlay visual list for the visual ID of interest */
- numOverlaysPerScreen = (int) (sizeData / 4);
- for (i=0;i<numOverlaysPerScreen;i++) {
- OverlayInfo *ov;
- ov = overlay_info + i;
- if (ov->overlay_visual==vinfo->visualid) {
+ for (i = 0; i < numOverlaysPerScreen; i++) {
+ const OverlayInfo *ov = overlay_info + i;
+ if (ov->overlay_visual == vinfo->visualid) {
/* found the visual */
if (/*ov->transparent_type==1 &&*/ ov->layer!=0) {
int level = ov->layer;
GLint depth_size, GLint stencil_size,
GLint accumRedSize, GLint accumGreenSize,
GLint accumBlueSize, GLint accumAlphaSize,
- GLint level )
+ GLint level, GLint numAuxBuffers )
{
GLboolean ximageFlag = GL_TRUE;
XMesaVisual xmvis;
else
comparePointers = GL_FALSE;
+ /* Force the visual to have an alpha channel */
+ if (rgbFlag && _mesa_getenv("MESA_GLX_FORCE_ALPHA"))
+ alphaFlag = GL_TRUE;
+
/* First check if a matching visual is already in the list */
for (i=0; i<NumVisuals; i++) {
XMesaVisual v = VisualTable[i];
if (v->display == dpy
- && v->level == level
+ && v->mesa_visual.level == level
+ && v->mesa_visual.numAuxBuffers == numAuxBuffers
&& v->ximage_flag == ximageFlag
&& v->mesa_visual.rgbMode == rgbFlag
&& v->mesa_visual.doubleBufferMode == dbFlag
/* add xmvis to the list */
VisualTable[NumVisuals] = xmvis;
NumVisuals++;
+ /* XXX minor hack, because XMesaCreateVisual doesn't support an
+ * aux buffers parameter.
+ */
+ xmvis->mesa_visual.numAuxBuffers = numAuxBuffers;
}
return xmvis;
}
+/**
+ * Return the default number of bits for the Z buffer.
+ * If defined, use the MESA_GLX_DEPTH_BITS env var value.
+ * Otherwise, use the DEFAULT_SOFTWARE_DEPTH_BITS constant.
+ * XXX probably do the same thing for stencil, accum, etc.
+ */
+static GLint
+default_depth_bits(void)
+{
+ int zBits;
+ const char *zEnv = _mesa_getenv("MESA_GLX_DEPTH_BITS");
+ if (zEnv)
+ zBits = _mesa_atoi(zEnv);
+ else
+ zBits = DEFAULT_SOFTWARE_DEPTH_BITS;
+ return zBits;
+}
+
+
/*
* Create a GLX visual from a regular XVisualInfo.
create_glx_visual( Display *dpy, XVisualInfo *visinfo )
{
int vislevel;
+ GLint zBits = default_depth_bits();
vislevel = level_of_visual( dpy, visinfo );
if (vislevel) {
0, /* depth bits */
0, /* stencil bits */
0,0,0,0, /* accum bits */
- vislevel /* level */
+ vislevel, /* level */
+ 0 /* numAux */
);
}
else if (is_usable_visual( visinfo )) {
GL_FALSE, /* alpha */
GL_TRUE, /* double */
GL_FALSE, /* stereo */
- DEFAULT_SOFTWARE_DEPTH_BITS,
+ zBits,
8 * sizeof(GLstencil),
0 * sizeof(GLaccum), /* r */
0 * sizeof(GLaccum), /* g */
0 * sizeof(GLaccum), /* b */
0 * sizeof(GLaccum), /* a */
- 0 /* level */
+ 0, /* level */
+ 0 /* numAux */
);
}
else {
GL_FALSE, /* alpha */
GL_TRUE, /* double */
GL_FALSE, /* stereo */
- DEFAULT_SOFTWARE_DEPTH_BITS,
+ zBits,
8 * sizeof(GLstencil),
8 * sizeof(GLaccum), /* r */
8 * sizeof(GLaccum), /* g */
8 * sizeof(GLaccum), /* b */
8 * sizeof(GLaccum), /* a */
- 0 /* level */
+ 0, /* level */
+ 0 /* numAux */
);
}
}
-/*
+/**
* Return the transparent pixel value for a GLX visual.
* Input: glxvis - the glx_visual
* Return: a pixel value or -1 if no transparent pixel
*/
-static int transparent_pixel( XMesaVisual glxvis )
+static int
+transparent_pixel( XMesaVisual glxvis )
{
Display *dpy = glxvis->display;
XVisualInfo *vinfo = glxvis->visinfo;
- Atom overlayVisualsAtom;
- OverlayInfo *overlay_info = NULL;
- int numOverlaysPerScreen;
- Status status;
- Atom actualType;
- int actualFormat;
- unsigned long sizeData, bytesLeft;
- int i;
-
- /*
- * The SERVER_OVERLAY_VISUALS property on the root window contains
- * a list of overlay visuals. Get that list now.
- */
- overlayVisualsAtom = XInternAtom(dpy,"SERVER_OVERLAY_VISUALS", True);
- if (overlayVisualsAtom == None) {
- return -1;
- }
-
- status = XGetWindowProperty(dpy, RootWindow( dpy, vinfo->screen ),
- overlayVisualsAtom, 0L, (long) 10000, False,
- overlayVisualsAtom, &actualType, &actualFormat,
- &sizeData, &bytesLeft,
- (unsigned char **) &overlay_info );
+ OverlayInfo *overlay_info;
+ int numOverlaysPerScreen, i;
- if (status != Success || actualType != overlayVisualsAtom ||
- actualFormat != 32 || sizeData < 4) {
- /* something went wrong */
- XFree((void *) overlay_info);
+ overlay_info = GetOverlayInfo(dpy, vinfo->screen, &numOverlaysPerScreen);
+ if (!overlay_info) {
return -1;
}
- /* search the overlay visual list for the visual ID of interest */
- numOverlaysPerScreen = (int) (sizeData / 4);
- for (i=0;i<numOverlaysPerScreen;i++) {
- OverlayInfo *ov;
- ov = overlay_info + i;
- if (ov->overlay_visual==vinfo->visualid) {
+ for (i = 0; i < numOverlaysPerScreen; i++) {
+ const OverlayInfo *ov = overlay_info + i;
+ if (ov->overlay_visual == vinfo->visualid) {
/* found it! */
- if (ov->transparent_type==0) {
+ if (ov->transparent_type == 0) {
/* type 0 indicates no transparency */
XFree((void *) overlay_info);
return -1;
-/*
+/**
* Try to get an X visual which matches the given arguments.
*/
-static XVisualInfo *get_visual( Display *dpy, int scr,
- unsigned int depth, int xclass )
+static XVisualInfo *
+get_visual( Display *dpy, int scr, unsigned int depth, int xclass )
{
XVisualInfo temp, *vis;
long mask;
* varname - the name of the environment variable
* Return: an XVisualInfo pointer to NULL if error.
*/
-static XVisualInfo *get_env_visual(Display *dpy, int scr, const char *varname)
+static XVisualInfo *
+get_env_visual(Display *dpy, int scr, const char *varname)
{
char value[100], type[100];
int depth, xclass = -1;
* preferred_class - preferred GLX visual class or DONT_CARE
* Return: pointer to an XVisualInfo or NULL.
*/
-static XVisualInfo *choose_x_visual( Display *dpy, int screen,
- GLboolean rgba, int min_depth,
- int preferred_class )
+static XVisualInfo *
+choose_x_visual( Display *dpy, int screen, GLboolean rgba, int min_depth,
+ int preferred_class )
{
XVisualInfo *vis;
int xclass, visclass = 0;
* preferred_class - preferred GLX visual class or DONT_CARE
* Return: pointer to an XVisualInfo or NULL.
*/
-static XVisualInfo *choose_x_overlay_visual( Display *dpy, int scr,
- GLboolean rgbFlag,
- int level, int trans_type,
- int trans_value,
- int min_depth,
- int preferred_class )
+static XVisualInfo *
+choose_x_overlay_visual( Display *dpy, int scr, GLboolean rgbFlag,
+ int level, int trans_type, int trans_value,
+ int min_depth, int preferred_class )
{
- Atom overlayVisualsAtom;
OverlayInfo *overlay_info;
int numOverlaysPerScreen;
- Status status;
- Atom actualType;
- int actualFormat;
- unsigned long sizeData, bytesLeft;
int i;
XVisualInfo *deepvis;
int deepest;
default: preferred_class = DONT_CARE;
}
- /*
- * The SERVER_OVERLAY_VISUALS property on the root window contains
- * a list of overlay visuals. Get that list now.
- */
- overlayVisualsAtom = XInternAtom(dpy,"SERVER_OVERLAY_VISUALS", True);
- if (overlayVisualsAtom == (Atom) None) {
- return NULL;
- }
-
- status = XGetWindowProperty(dpy, RootWindow( dpy, scr ),
- overlayVisualsAtom, 0L, (long) 10000, False,
- overlayVisualsAtom, &actualType, &actualFormat,
- &sizeData, &bytesLeft,
- (unsigned char **) &overlay_info );
-
- if (status != Success || actualType != overlayVisualsAtom ||
- actualFormat != 32 || sizeData < 4) {
- /* something went wrong */
+ overlay_info = GetOverlayInfo(dpy, scr, &numOverlaysPerScreen);
+ if (!overlay_info) {
return NULL;
}
deepest = min_depth;
deepvis = NULL;
- numOverlaysPerScreen = (int) (sizeData / 4);
- for (i=0;i<numOverlaysPerScreen;i++) {
+ for (i = 0; i < numOverlaysPerScreen; i++) {
+ const OverlayInfo *ov = overlay_info + i;
XVisualInfo *vislist, vistemplate;
int count;
- OverlayInfo *ov;
- ov = overlay_info + i;
if (ov->layer!=level) {
/* failed overlay level criteria */
/**********************************************************************/
-static XMesaVisual choose_visual( Display *dpy, int screen, const int *list,
- GLboolean rgbModeDefault )
+static XMesaVisual
+choose_visual( Display *dpy, int screen, const int *list,
+ GLboolean rgbModeDefault )
{
const int *parselist;
XVisualInfo *vis;
GLint caveat = DONT_CARE;
XMesaVisual xmvis = NULL;
int desiredVisualID = -1;
+ int numAux = 0;
parselist = list;
case GLX_AUX_BUFFERS:
/* ignore */
parselist++;
- parselist++;
+ numAux = *parselist++;
+ if (numAux > MAX_AUX_BUFFERS)
+ return NULL;
break;
case GLX_RED_SIZE:
parselist++;
double_flag = GL_TRUE;
if (vis->depth > 8)
rgb_flag = GL_TRUE;
- depth_size = DEFAULT_SOFTWARE_DEPTH_BITS;
+ depth_size = default_depth_bits();
stencil_size = STENCIL_BITS;
/* XXX accum??? */
}
depth_size = 31; /* 32 causes int overflow problems */
else if (depth_size > 16)
depth_size = 24;
- else if (depth_size > 0)
- depth_size = DEFAULT_SOFTWARE_DEPTH_BITS; /*16*/
+ else if (depth_size > 0) {
+ depth_size = default_depth_bits();
+ }
/* we only support one size of stencil and accum buffers. */
if (stencil_size > 0)
xmvis = save_glx_visual( dpy, vis, rgb_flag, alpha_flag, double_flag,
stereo_flag, depth_size, stencil_size,
accumRedSize, accumGreenSize,
- accumBlueSize, accumAlphaSize, level );
+ accumBlueSize, accumAlphaSize, level, numAux );
}
return xmvis;
}
-
static Bool
Fake_glXMakeCurrent( Display *dpy, GLXDrawable drawable, GLXContext ctx )
{
}
-
static GLXPixmap
Fake_glXCreateGLXPixmap( Display *dpy, XVisualInfo *visinfo, Pixmap pixmap )
{
}
-
static void
Fake_glXCopyContext( Display *dpy, GLXContext src, GLXContext dst,
unsigned long mask )
}
-
static Bool
Fake_glXQueryExtension( Display *dpy, int *errorb, int *event )
{
}
-
static Bool
Fake_glXIsDirect( Display *dpy, GLXContext ctx )
{
}
-
static Bool
Fake_glXQueryVersion( Display *dpy, int *maj, int *min )
{
}
-
/*
* Query the GLX attributes of the given XVisualInfo.
*/
*value = xmvis->visinfo->depth;
return 0;
case GLX_LEVEL:
- *value = xmvis->level;
+ *value = xmvis->mesa_visual.level;
return 0;
case GLX_RGBA:
if (xmvis->mesa_visual.rgbMode) {
*value = (int) xmvis->mesa_visual.stereoMode;
return 0;
case GLX_AUX_BUFFERS:
- *value = (int) False;
+ *value = xmvis->mesa_visual.numAuxBuffers;
return 0;
case GLX_RED_SIZE:
*value = xmvis->mesa_visual.redBits;
}
return 0;
case GLX_TRANSPARENT_TYPE_EXT:
- if (xmvis->level==0) {
+ if (xmvis->mesa_visual.level==0) {
/* normal planes */
*value = GLX_NONE_EXT;
}
- else if (xmvis->level>0) {
+ else if (xmvis->mesa_visual.level>0) {
/* overlay */
if (xmvis->mesa_visual.rgbMode) {
*value = GLX_TRANSPARENT_RGB_EXT;
*value = GLX_TRANSPARENT_INDEX_EXT;
}
}
- else if (xmvis->level<0) {
+ else if (xmvis->mesa_visual.level<0) {
/* underlay */
*value = GLX_NONE_EXT;
}
*/
case GLX_VISUAL_CAVEAT_EXT:
/* test for zero, just in case */
- if (xmvis->VisualCaveat > 0)
- *value = xmvis->VisualCaveat;
+ if (xmvis->mesa_visual.visualRating > 0)
+ *value = xmvis->mesa_visual.visualRating;
else
*value = GLX_NONE_EXT;
return 0;
switch (attribute) {
case GLX_WIDTH:
- *value = xmbuf->width;
+ *value = xmbuf->mesa_buffer.Width;
break;
case GLX_HEIGHT:
- *value = xmbuf->height;
+ *value = xmbuf->mesa_buffer.Height;
break;
case GLX_PRESERVED_CONTENTS:
*value = True;
break;
case GLX_LARGEST_PBUFFER:
- *value = xmbuf->width * xmbuf->height;
+ *value = xmbuf->mesa_buffer.Width * xmbuf->mesa_buffer.Height;
break;
case GLX_FBCONFIG_ID:
*value = xmbuf->xm_visual->visinfo->visualid;
(void) dpy;
- for (attrib = attribList; *attrib; attrib++) {
+ for (attrib = attribList; attrib && *attrib; attrib++) {
switch (*attrib) {
case GLX_PRESERVED_CONTENTS_SGIX:
attrib++;
*value = True;
break;
case GLX_LARGEST_PBUFFER_SGIX:
- *value = xmbuf->width * xmbuf->height;
+ *value = xmbuf->mesa_buffer.Width * xmbuf->mesa_buffer.Height;
break;
case GLX_WIDTH_SGIX:
- *value = xmbuf->width;
+ *value = xmbuf->mesa_buffer.Width;
break;
case GLX_HEIGHT_SGIX:
- *value = xmbuf->height;
+ *value = xmbuf->mesa_buffer.Height;
break;
case GLX_EVENT_MASK_SGIX:
*value = 0; /* XXX might be wrong */
}
-/*** GLX_ARB_render_texture ***/
-
-static Bool
-Fake_glXBindTexImageARB( Display *dpy, GLXPbuffer pbuffer, int buffer )
-{
- return False;
-}
-
-
-static Bool
-Fake_glXReleaseTexImageARB(Display *dpy, GLXPbuffer pbuffer, int buffer )
-{
- return False;
-}
-
-
-static Bool
-Fake_glXDrawableAttribARB( Display *dpy, GLXDrawable draw, const int *attribList )
-{
- return False;
-}
-
+/* silence warning */
+extern struct _glxapi_table *_mesa_GetGLXDispatchTable(void);
-extern struct _glxapi_table *_mesa_GetGLXDispatchTable(void);
-struct _glxapi_table *_mesa_GetGLXDispatchTable(void)
+/**
+ * Create a new GLX API dispatch table with its function pointers
+ * initialized to point to Mesa's "fake" GLX API functions.
+ * Note: there's a similar function (_real_GetGLXDispatchTable) that
+ * returns a new dispatch table with all pointers initalized to point
+ * to "real" GLX functions (which understand GLX wire protocol, etc).
+ */
+struct _glxapi_table *
+_mesa_GetGLXDispatchTable(void)
{
static struct _glxapi_table glx;
/*** GLX_MESA_agp_offset ***/
glx.GetAGPOffsetMESA = Fake_glXGetAGPOffsetMESA;
- /*** GLX_ARB_render_texture ***/
- glx.BindTexImageARB = Fake_glXBindTexImageARB;
- glx.ReleaseTexImageARB = Fake_glXReleaseTexImageARB;
- glx.DrawableAttribARB = Fake_glXDrawableAttribARB;
-
return &glx;
}