reverse some debug that slipped through
[mesa.git] / src / mesa / drivers / x11 / fakeglx.c
index 3a8c79290045a0cb83fb8da9e2bab890064c10a1..1ad62d9e0d95c0123e94014e3b368a0a1391c4e7 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * 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.
@@ -140,11 +136,11 @@ typedef struct _OverlayInfo {
 
 
 
-
 /*
  * 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:
@@ -172,25 +168,22 @@ static GLboolean is_usable_visual( XVisualInfo *vinfo )
 
 
 
-/*
- * 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
@@ -201,25 +194,50 @@ static int level_of_visual( Display *dpy, XVisualInfo *vinfo )
       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;
@@ -282,6 +300,10 @@ save_glx_visual( Display *dpy, XVisualInfo *vinfo,
    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];
@@ -328,13 +350,34 @@ save_glx_visual( Display *dpy, XVisualInfo *vinfo,
       /* 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.
@@ -348,6 +391,7 @@ static XMesaVisual
 create_glx_visual( Display *dpy, XVisualInfo *visinfo )
 {
    int vislevel;
+   GLint zBits = default_depth_bits();
 
    vislevel = level_of_visual( dpy, visinfo );
    if (vislevel) {
@@ -372,7 +416,7 @@ create_glx_visual( Display *dpy, XVisualInfo *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 */
@@ -391,7 +435,7 @@ create_glx_visual( Display *dpy, XVisualInfo *visinfo )
                                  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 */
@@ -438,54 +482,29 @@ find_glx_visual( Display *dpy, XVisualInfo *vinfo )
 
 
 
-/*
+/**
  * 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;
@@ -505,11 +524,11 @@ static int transparent_pixel( XMesaVisual glxvis )
 
 
 
-/*
+/**
  * 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;
@@ -562,7 +581,8 @@ static XVisualInfo *get_visual( Display *dpy, int scr,
  *         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;
@@ -607,9 +627,9 @@ static XVisualInfo *get_env_visual(Display *dpy, int scr, const char *varname)
  *         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;
@@ -777,20 +797,13 @@ static XVisualInfo *choose_x_visual( Display *dpy, int screen,
  *         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;
@@ -807,24 +820,8 @@ static XVisualInfo *choose_x_overlay_visual( Display *dpy, int scr,
       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;
    }
 
@@ -832,12 +829,10 @@ static XVisualInfo *choose_x_overlay_visual( Display *dpy, int scr,
    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 */
@@ -907,8 +902,9 @@ static XVisualInfo *choose_x_overlay_visual( Display *dpy, int scr,
 /**********************************************************************/
 
 
-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;
@@ -1127,7 +1123,7 @@ static XMesaVisual choose_visual( Display *dpy, int screen, const int *list,
          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??? */
       }
@@ -1178,8 +1174,9 @@ static XMesaVisual choose_visual( Display *dpy, int screen, const int *list,
          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)
@@ -1367,7 +1364,6 @@ Fake_glXMakeContextCurrent( Display *dpy, GLXDrawable draw,
 }
 
 
-
 static Bool
 Fake_glXMakeCurrent( Display *dpy, GLXDrawable drawable, GLXContext ctx )
 {
@@ -1375,7 +1371,6 @@ Fake_glXMakeCurrent( Display *dpy, GLXDrawable drawable, GLXContext ctx )
 }
 
 
-
 static GLXPixmap
 Fake_glXCreateGLXPixmap( Display *dpy, XVisualInfo *visinfo, Pixmap pixmap )
 {
@@ -1438,7 +1433,6 @@ Fake_glXDestroyGLXPixmap( Display *dpy, GLXPixmap pixmap )
 }
 
 
-
 static void
 Fake_glXCopyContext( Display *dpy, GLXContext src, GLXContext dst,
                      unsigned long mask )
@@ -1452,7 +1446,6 @@ Fake_glXCopyContext( Display *dpy, GLXContext src, GLXContext dst,
 }
 
 
-
 static Bool
 Fake_glXQueryExtension( Display *dpy, int *errorb, int *event )
 {
@@ -1487,7 +1480,6 @@ Fake_glXDestroyContext( Display *dpy, GLXContext ctx )
 }
 
 
-
 static Bool
 Fake_glXIsDirect( Display *dpy, GLXContext ctx )
 {
@@ -1529,7 +1521,6 @@ Fake_glXCopySubBufferMESA( Display *dpy, GLXDrawable drawable,
 }
 
 
-
 static Bool
 Fake_glXQueryVersion( Display *dpy, int *maj, int *min )
 {
@@ -1542,7 +1533,6 @@ Fake_glXQueryVersion( Display *dpy, int *maj, int *min )
 }
 
 
-
 /*
  * Query the GLX attributes of the given XVisualInfo.
  */
@@ -2089,16 +2079,16 @@ Fake_glXQueryDrawable( Display *dpy, GLXDrawable draw, int attribute,
 
    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;
@@ -2449,13 +2439,13 @@ Fake_glXQueryGLXPbufferSGIX(Display *dpy, GLXPbufferSGIX pbuf, int attribute, un
          *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 */
@@ -2690,32 +2680,19 @@ Fake_glXGetAGPOffsetMESA( const GLvoid *pointer )
 }
 
 
-/*** 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;
 
@@ -2858,10 +2835,5 @@ struct _glxapi_table *_mesa_GetGLXDispatchTable(void)
    /*** 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;
 }