/*
* Mesa 3-D graphics library
- * Version: 6.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"
-*/
-
/*
* 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;
/* add xmvis to the list */
VisualTable[NumVisuals] = xmvis;
NumVisuals++;
- /* XXX minor hack */
+ /* 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) {
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 */
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 */
-/*
+/**
* 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;
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)
}
-
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.
*/
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;
*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;
}