fix some 0->NULLs
[mesa.git] / src / mesa / drivers / dri / common / dri_util.c
index f60c772c7844ecacb1166844607e37b91e0b9d22..302994e0c23a9417fe0d48dace5177c0ecfc47b5 100644 (file)
  */
 
 
-#ifdef GLX_DIRECT_RENDERING
-
-#include <inttypes.h>
 #include <assert.h>
 #include <stdarg.h>
 #include <unistd.h>
 #include <sys/mman.h>
-#include <X11/Xlibint.h>
-#include <Xext.h>
-#include <extutil.h>
 #include <stdio.h>
-#include "dri_util.h"
+
+#ifndef MAP_FAILED
+#define MAP_FAILED ((void *)-1)
+#endif
+
 #ifndef DRI_NEW_INTERFACE_ONLY
+# include <X11/Xlibint.h>
+# include <Xext.h>
+# include <extutil.h>
 # include "xf86dri.h"
+# define _mesa_malloc(b) Xmalloc(b)
+# define _mesa_free(m) Xfree(m)
+#else
+# include "imports.h"
+# define None 0
 #endif /* DRI_NEW_INTERFACE_ONLY */
+
+#include "dri_util.h"
 #include "drm_sarea.h"
 #include "glcontextmodes.h"
 
-#ifndef GLX_OML_sync_control
-typedef Bool ( * PFNGLXGETMSCRATEOMLPROC) (__DRInativeDisplay *dpy, __DRIid drawable, int32_t *numerator, int32_t *denominator);
+#ifndef PFNGLXGETMSCRATEOMLPROC
+typedef GLboolean ( * PFNGLXGETMSCRATEOMLPROC) (__DRInativeDisplay *dpy, __DRIid drawable, int32_t *numerator, int32_t *denominator);
 #endif
 
+/**
+ * Weak thread-safety dispatch pointer.  Older versions of libGL will not have
+ * this symbol, so a "weak" version is included here so that the driver will
+ * dynamically link properly.  The value is set to \c NULL.  This forces the
+ * driver to fall back to the old dispatch interface.
+ */
+struct _glapi_table *_glapi_DispatchTSD __attribute__((weak)) = NULL;
+
 /**
  * This is used in a couple of places that call \c driCreateNewDrawable.
  */
@@ -61,7 +77,7 @@ static const int empty_attribute_list[1] = { None };
  */
 static PFNGLXWINDOWEXISTSPROC window_exists;
 
-typedef Bool (*PFNGLXCREATECONTEXTWITHCONFIGPROC)( __DRInativeDisplay*, int, int, void *,
+typedef GLboolean (*PFNGLXCREATECONTEXTWITHCONFIGPROC)( __DRInativeDisplay*, int, int, void *,
     drm_context_t * );
 
 static PFNGLXCREATECONTEXTWITHCONFIGPROC create_context_with_config;
@@ -86,7 +102,7 @@ static void driDestroyDrawable(__DRInativeDisplay *dpy, void *drawablePrivate);
 
 
 #ifdef not_defined
-static Bool driFeatureOn(const char *name)
+static GLboolean driFeatureOn(const char *name)
 {
     char *env = getenv(name);
 
@@ -126,6 +142,26 @@ __driUtilMessage(const char *f, ...)
     }
 }
 
+/*
+ * fd.o bug #1713: Some rare libGL's have __glXFindDRIScreen defined but do not
+ * export it via glXGetProcAddress.  These are not supported anymore, so print
+ * an error message to that effect.  - ajax 2004-10-26
+ */
+typedef __DRIscreen *(*PFNGLXFINDDRISCREEN)(__DRInativeDisplay *, int);
+
+static __DRIscreen *glx_find_dri_screen(__DRInativeDisplay *d, int i)
+{
+    PFNGLXFINDDRISCREEN findscreen = 
+        (PFNGLXFINDDRISCREEN)glXGetProcAddress("__glXFindDRIScreen");
+
+    if (!findscreen)
+    {
+        __driUtilMessage("glXGetProcAddress(\"__glXFindDRIScreen\") failed!");
+        __driUtilMessage("Your libGL is too old, please upgrade.");
+        return NULL;
+    }
+    else return findscreen(d, i);
+}
 
 /*****************************************************************/
 /** \name Visual utility functions                               */
@@ -165,7 +201,7 @@ findConfigMode(__DRInativeDisplay *dpy, int scrn, VisualID vid,
  * drivers that are built to work without XFree86) shouldn't have to know
  * about X structures like a \c Visual.
  */
-static Bool
+static GLboolean
 fake_XF86DRICreateContextWithConfig( __DRInativeDisplay* dpy, int screen, int configID,
                                     XID* context, drm_context_t * hHWContext )
 {
@@ -184,7 +220,7 @@ fake_XF86DRICreateContextWithConfig( __DRInativeDisplay* dpy, int screen, int co
 /*****************************************************************/
 /*@{*/
 
-static Bool __driAddDrawable(void *drawHash, __DRIdrawable *pdraw)
+static GLboolean __driAddDrawable(void *drawHash, __DRIdrawable *pdraw)
 {
     __DRIdrawablePrivate *pdp = (__DRIdrawablePrivate *)pdraw->private;
 
@@ -199,26 +235,15 @@ static __DRIdrawable *__driFindDrawable(void *drawHash, __DRIid draw)
     int retcode;
     __DRIdrawable *pdraw;
 
-    retcode = drmHashLookup(drawHash, draw, (void **)&pdraw);
+    retcode = drmHashLookup(drawHash, draw, (void *)&pdraw);
     if (retcode)
        return NULL;
 
     return pdraw;
 }
 
-static void __driRemoveDrawable(void *drawHash, __DRIdrawable *pdraw)
-{
-    int retcode;
-    __DRIdrawablePrivate *pdp = (__DRIdrawablePrivate *)pdraw->private;
-
-    retcode = drmHashLookup(drawHash, pdp->draw, (void **)&pdraw);
-    if (!retcode) { /* Found */
-       drmHashDelete(drawHash, pdp->draw);
-    }
-}
-
 #ifndef DRI_NEW_INTERFACE_ONLY
-static Bool __driWindowExistsFlag;
+static GLboolean __driWindowExistsFlag;
 
 static int __driWindowExistsErrorHandler(Display *dpy, XErrorEvent *xerr)
 {
@@ -248,7 +273,7 @@ static int __driWindowExistsErrorHandler(Display *dpy, XErrorEvent *xerr)
  * 
  * \sa __glXWindowExists glXGetProcAddress window_exists
  */
-static Bool __driWindowExists(Display *dpy, GLXDrawable draw)
+static GLboolean __driWindowExists(Display *dpy, GLXDrawable draw)
 {
     XWindowAttributes xwa;
     int (*oldXErrorHandler)(Display *, XErrorEvent *);
@@ -271,21 +296,21 @@ static Bool __driWindowExists(Display *dpy, GLXDrawable draw)
 static void __driGarbageCollectDrawables(void *drawHash)
 {
     __DRIid draw;
-    __DRIdrawable *pdraw;
     __DRInativeDisplay *dpy;
+    __DRIdrawable *pdraw;
 
-    if (drmHashFirst(drawHash, &draw, (void **)&pdraw)) {
+    if (drmHashFirst(drawHash, &draw, (void *)&pdraw) == 1) {
        do {
            __DRIdrawablePrivate *pdp = (__DRIdrawablePrivate *)pdraw->private;
            dpy = pdp->driScreenPriv->display;
            if (! (*window_exists)(dpy, draw)) {
                /* Destroy the local drawable data in the hash table, if the
                   drawable no longer exists in the Xserver */
-               __driRemoveDrawable(drawHash, pdraw);
+               drmHashDelete(drawHash, draw);
                (*pdraw->destroyDrawable)(dpy, pdraw->private);
-               Xfree(pdraw);
+               _mesa_free(pdraw);
            }
-       } while (drmHashNext(drawHash, &draw, (void **)&pdraw));
+       } while (drmHashNext(drawHash, &draw, (void *)&pdraw) == 1);
     }
 }
 
@@ -338,7 +363,7 @@ static GLboolean driUnbindContext3(__DRInativeDisplay *dpy, int scrn,
        return GL_FALSE;
     }
 
-    pDRIScreen = __glXFindDRIScreen(dpy, scrn);
+    pDRIScreen = glx_find_dri_screen(dpy, scrn);
     if ( (pDRIScreen == NULL) || (pDRIScreen->private == NULL) ) {
        /* ERROR!!! */
        return GL_FALSE;
@@ -407,7 +432,7 @@ static GLboolean driUnbindContext3(__DRInativeDisplay *dpy, int scrn,
  *      be needed in those places when support for pbuffers and / or pixmaps
  *      is added.  Is it safe to assume that the drawable is a window?
  */
-static Bool DoBindContext(__DRInativeDisplay *dpy,
+static GLboolean DoBindContext(__DRInativeDisplay *dpy,
                          __DRIid draw, __DRIid read,
                          __DRIcontext *ctx, const __GLcontextModes * modes,
                          __DRIscreenPrivate *psp)
@@ -423,7 +448,7 @@ static Bool DoBindContext(__DRInativeDisplay *dpy,
     pdraw = __driFindDrawable(psp->drawHash, draw);
     if (!pdraw) {
        /* Allocate a new drawable */
-       pdraw = (__DRIdrawable *)Xmalloc(sizeof(__DRIdrawable));
+       pdraw = (__DRIdrawable *)_mesa_malloc(sizeof(__DRIdrawable));
        if (!pdraw) {
            /* ERROR!!! */
            return GL_FALSE;
@@ -434,7 +459,7 @@ static Bool DoBindContext(__DRInativeDisplay *dpy,
                             empty_attribute_list);
        if (!pdraw->private) {
            /* ERROR!!! */
-           Xfree(pdraw);
+           _mesa_free(pdraw);
            return GL_FALSE;
        }
 
@@ -450,7 +475,7 @@ static Bool DoBindContext(__DRInativeDisplay *dpy,
         pread = __driFindDrawable(psp->drawHash, read);
         if (!pread) {
             /* Allocate a new drawable */
-            pread = (__DRIdrawable *)Xmalloc(sizeof(__DRIdrawable));
+            pread = (__DRIdrawable *)_mesa_malloc(sizeof(__DRIdrawable));
             if (!pread) {
                 /* ERROR!!! */
                 return GL_FALSE;
@@ -461,7 +486,7 @@ static Bool DoBindContext(__DRInativeDisplay *dpy,
                                 empty_attribute_list);
             if (!pread->private) {
                 /* ERROR!!! */
-                Xfree(pread);
+                _mesa_free(pread);
                 return GL_FALSE;
             }
         }
@@ -514,7 +539,7 @@ static GLboolean driBindContext3(__DRInativeDisplay *dpy, int scrn,
        return GL_FALSE;
     }
 
-    pDRIScreen = __glXFindDRIScreen(dpy, scrn);
+    pDRIScreen = glx_find_dri_screen(dpy, scrn);
     if ( (pDRIScreen == NULL) || (pDRIScreen->private == NULL) ) {
        /* ERROR!!! */
        return GL_FALSE;
@@ -531,7 +556,7 @@ static GLboolean driBindContext3(__DRInativeDisplay *dpy, int scrn,
  * for \c glXMakeCurrentReadSGI or GLX 1.3's \c glXMakeContextCurrent
  * function.
  */
-static Bool driBindContext2(Display *dpy, int scrn,
+static GLboolean driBindContext2(Display *dpy, int scrn,
                             GLXDrawable draw, GLXDrawable read,
                             GLXContext gc)
 {
@@ -548,7 +573,7 @@ static Bool driBindContext2(Display *dpy, int scrn,
        return GL_FALSE;
     }
 
-    pDRIScreen = __glXFindDRIScreen(dpy, scrn);
+    pDRIScreen = glx_find_dri_screen(dpy, scrn);
     modes = (driCompareGLXAPIVersion( 20040317 ) >= 0)
        ? gc->driContext.mode
        : findConfigMode( dpy, scrn, gc->vid, pDRIScreen );
@@ -567,7 +592,7 @@ static Bool driBindContext2(Display *dpy, int scrn,
                          (__DRIscreenPrivate *)pDRIScreen->private );
 }
 
-static Bool driUnbindContext2(Display *dpy, int scrn,
+static GLboolean driUnbindContext2(Display *dpy, int scrn,
                              GLXDrawable draw, GLXDrawable read,
                              GLXContext gc)
 {
@@ -577,7 +602,7 @@ static Bool driUnbindContext2(Display *dpy, int scrn,
 /*
  * Simply call bind with the same GLXDrawable for the read and draw buffers.
  */
-static Bool driBindContext(Display *dpy, int scrn,
+static GLboolean driBindContext(Display *dpy, int scrn,
                            GLXDrawable draw, GLXContext gc)
 {
     return driBindContext2(dpy, scrn, draw, draw, gc);
@@ -587,7 +612,7 @@ static Bool driBindContext(Display *dpy, int scrn,
 /*
  * Simply call bind with the same GLXDrawable for the read and draw buffers.
  */
-static Bool driUnbindContext(Display *dpy, int scrn,
+static GLboolean driUnbindContext(Display *dpy, int scrn,
                              GLXDrawable draw, GLXContext gc,
                              int will_rebind)
 {
@@ -634,11 +659,11 @@ __driUtilUpdateDrawableInfo(__DRIdrawablePrivate *pdp)
     }
 
     if (pdp->pClipRects) {
-       Xfree(pdp->pClipRects); 
+       _mesa_free(pdp->pClipRects); 
     }
 
     if (pdp->pBackClipRects) {
-       Xfree(pdp->pBackClipRects); 
+       _mesa_free(pdp->pBackClipRects); 
     }
 
     DRM_SPINUNLOCK(&psp->pSAREA->drawable_lock, psp->drawLockID);
@@ -778,7 +803,7 @@ static void *driCreateNewDrawable(__DRInativeDisplay *dpy,
                                  int renderType,
                                  const int *attrs)
 {
-    __DRIscreen * const pDRIScreen = __glXFindDRIScreen(dpy, modes->screen);
+    __DRIscreen * const pDRIScreen = glx_find_dri_screen(dpy, modes->screen);
     __DRIscreenPrivate *psp;
     __DRIdrawablePrivate *pdp;
 
@@ -794,13 +819,13 @@ static void *driCreateNewDrawable(__DRInativeDisplay *dpy,
        return NULL;
     }
 
-    pdp = (__DRIdrawablePrivate *)Xmalloc(sizeof(__DRIdrawablePrivate));
+    pdp = (__DRIdrawablePrivate *)_mesa_malloc(sizeof(__DRIdrawablePrivate));
     if (!pdp) {
        return NULL;
     }
 
     if (!XF86DRICreateDrawable(dpy, modes->screen, draw, &pdp->hHWDrawable)) {
-       Xfree(pdp);
+       _mesa_free(pdp);
        return NULL;
     }
 
@@ -830,17 +855,17 @@ static void *driCreateNewDrawable(__DRInativeDisplay *dpy,
     if ( pdp->getInfo == NULL ) {
 #ifdef DRI_NEW_INTERFACE_ONLY
         (void)XF86DRIDestroyDrawable(dpy, modes->screen, pdp->draw);
-       Xfree(pdp);
+       _mesa_free(pdp);
        return NULL;
 #else
-       pdp->getInfo = XF86DRIGetDrawableInfo;
+       pdp->getInfo = (PFNGLXGETDRAWABLEINFOPROC) XF86DRIGetDrawableInfo;
 #endif /* DRI_NEW_INTERFACE_ONLY */
     }
 
     if (!(*psp->DriverAPI.CreateBuffer)(psp, pdp, modes,
                                        renderType == GLX_PIXMAP_BIT)) {
        (void)XF86DRIDestroyDrawable(dpy, modes->screen, pdp->draw);
-       Xfree(pdp);
+       _mesa_free(pdp);
        return NULL;
     }
 
@@ -868,7 +893,7 @@ static void *driCreateNewDrawable(__DRInativeDisplay *dpy,
     if (!__driAddDrawable(psp->drawHash, pdraw)) {
        /* ERROR!!! */
        (*pdraw->destroyDrawable)(dpy, pdp);
-       Xfree(pdp);
+       _mesa_free(pdp);
        pdp = NULL;
        pdraw->private = NULL;
     }
@@ -899,14 +924,14 @@ static void driDestroyDrawable(__DRInativeDisplay *dpy, void *drawablePrivate)
        if ((*window_exists)(dpy, pdp->draw))
            (void)XF86DRIDestroyDrawable(dpy, scrn, pdp->draw);
        if (pdp->pClipRects) {
-           Xfree(pdp->pClipRects);
+           _mesa_free(pdp->pClipRects);
            pdp->pClipRects = NULL;
        }
        if (pdp->pBackClipRects) {
-           Xfree(pdp->pBackClipRects);
+           _mesa_free(pdp->pBackClipRects);
            pdp->pBackClipRects = NULL;
        }
-       Xfree(pdp);
+       _mesa_free(pdp);
     }
 }
 
@@ -937,7 +962,7 @@ static void driDestroyContext(__DRInativeDisplay *dpy, int scrn, void *contextPr
        (*pcp->driScreenPriv->DriverAPI.DestroyContext)(pcp);
        __driGarbageCollectDrawables(pcp->driScreenPriv->drawHash);
        (void)XF86DRIDestroyContext(dpy, scrn, pcp->contextID);
-       Xfree(pcp);
+       _mesa_free(pcp);
     }
 }
 
@@ -973,7 +998,7 @@ driCreateNewContext(__DRInativeDisplay *dpy, const __GLcontextModes *modes,
     __DRIscreenPrivate *psp;
     void * const shareCtx = (pshare != NULL) ? pshare->driverPrivate : NULL;
 
-    pDRIScreen = __glXFindDRIScreen(dpy, modes->screen);
+    pDRIScreen = glx_find_dri_screen(dpy, modes->screen);
     if ( (pDRIScreen == NULL) || (pDRIScreen->private == NULL) ) {
        /* ERROR!!! */
        return NULL;
@@ -981,14 +1006,14 @@ driCreateNewContext(__DRInativeDisplay *dpy, const __GLcontextModes *modes,
 
     psp = (__DRIscreenPrivate *)pDRIScreen->private;
 
-    pcp = (__DRIcontextPrivate *)Xmalloc(sizeof(__DRIcontextPrivate));
+    pcp = (__DRIcontextPrivate *)_mesa_malloc(sizeof(__DRIcontextPrivate));
     if (!pcp) {
        return NULL;
     }
 
     if (! (*create_context_with_config)(dpy, modes->screen, modes->fbconfigID,
                                        &pcp->contextID, &pcp->hHWContext)) {
-       Xfree(pcp);
+       _mesa_free(pcp);
        return NULL;
     }
 
@@ -1018,22 +1043,22 @@ driCreateNewContext(__DRInativeDisplay *dpy, const __GLcontextModes *modes,
     pctx->bindContext3   = driBindContext3;
     pctx->unbindContext3 = driUnbindContext3;
 #else
-    pctx->bindContext    = driBindContext;
-    pctx->unbindContext  = driUnbindContext;
+    pctx->bindContext    = (void *)driBindContext;
+    pctx->unbindContext  = (void *)driUnbindContext;
     if ( driCompareGLXAPIVersion( 20030606 ) >= 0 ) {
-        pctx->bindContext2   = driBindContext2;
-        pctx->unbindContext2 = driUnbindContext2;
+        pctx->bindContext2   = (void *)driBindContext2;
+        pctx->unbindContext2 = (void *)driUnbindContext2;
     }
 
     if ( driCompareGLXAPIVersion( 20040415 ) >= 0 ) {
-        pctx->bindContext3   = driBindContext3;
-        pctx->unbindContext3 = driUnbindContext3;
+        pctx->bindContext3   = (void *)driBindContext3;
+        pctx->unbindContext3 = (void *)driUnbindContext3;
     }
 #endif
 
     if ( !(*psp->DriverAPI.CreateContext)(modes, pcp, shareCtx) ) {
         (void)XF86DRIDestroyContext(dpy, modes->screen, pcp->contextID);
-        Xfree(pcp);
+        _mesa_free(pcp);
         return NULL;
     }
 
@@ -1073,7 +1098,7 @@ static void *driCreateContext(Display *dpy, XVisualInfo *vis,
     __DRIscreen *pDRIScreen;
     const __GLcontextModes *modes;
 
-    pDRIScreen = __glXFindDRIScreen(dpy, vis->screen);
+    pDRIScreen = glx_find_dri_screen(dpy, vis->screen);
     if ( (pDRIScreen == NULL) || (pDRIScreen->private == NULL) ) {
        /* ERROR!!! */
        return NULL;
@@ -1126,12 +1151,12 @@ static void driDestroyScreen(__DRInativeDisplay *dpy, int scrn, void *screenPriv
 
        (void)drmUnmap((drmAddress)psp->pSAREA, SAREA_MAX);
        (void)drmUnmap((drmAddress)psp->pFB, psp->fbSize);
-       Xfree(psp->pDevPriv);
+       _mesa_free(psp->pDevPriv);
        (void)drmClose(psp->fd);
        if ( psp->modes != NULL ) {
            _gl_context_modes_destroy( psp->modes );
        }
-       Xfree(psp);
+       _mesa_free(psp);
     }
 }
 
@@ -1219,7 +1244,7 @@ __driUtilCreateNewScreen(__DRInativeDisplay *dpy, int scrn, __DRIscreen *psc,
        
     api_ver = internal_api_version;
 
-    psp = (__DRIscreenPrivate *)Xmalloc(sizeof(__DRIscreenPrivate));
+    psp = (__DRIscreenPrivate *)_mesa_malloc(sizeof(__DRIscreenPrivate));
     if (!psp) {
        return NULL;
     }
@@ -1227,7 +1252,7 @@ __driUtilCreateNewScreen(__DRInativeDisplay *dpy, int scrn, __DRIscreen *psc,
     /* Create the hash table */
     psp->drawHash = drmHashCreate();
     if ( psp->drawHash == NULL ) {
-       Xfree( psp );
+       _mesa_free( psp );
        return NULL;
     }
 
@@ -1298,7 +1323,7 @@ __driUtilCreateNewScreen(__DRInativeDisplay *dpy, int scrn, __DRIscreen *psc,
 
     if ( (psp->DriverAPI.InitDriver != NULL)
         && !(*psp->DriverAPI.InitDriver)(psp) ) {
-       Xfree( psp );
+       _mesa_free( psp );
        return NULL;
     }
 
@@ -1376,7 +1401,7 @@ __driUtilCreateScreen(Display *dpy, int scrn, __DRIscreen *psc,
 
     if (XF86DRIOpenConnection(dpy, scrn, &hSAREA, &BusID)) {
        fd = drmOpen(NULL,BusID);
-       Xfree(BusID); /* No longer needed */
+       _mesa_free(BusID); /* No longer needed */
 
        err_msg = "open DRM";
        err_extra = strerror( -fd );
@@ -1418,7 +1443,7 @@ __driUtilCreateScreen(Display *dpy, int scrn, __DRIscreen *psc,
                                                   &driverName)) {
 
                        /* No longer needed. */
-                       Xfree( driverName );
+                       _mesa_free( driverName );
 
                        /*
                         * Get the DRI X extension version.
@@ -1505,7 +1530,7 @@ __driUtilCreateScreen(Display *dpy, int scrn, __DRIscreen *psc,
        }
 
        if ( framebuffer.dev_priv != NULL ) {
-           Xfree(framebuffer.dev_priv);
+           _mesa_free(framebuffer.dev_priv);
        }
 
        if ( fd >= 0 ) {
@@ -1548,7 +1573,7 @@ __driUtilCreateScreen(Display *dpy, int scrn, __DRIscreen *psc,
  *
  * \sa __glXGetInternalVersion().
  */
-int driCompareGLXAPIVersion( GLuint required_version )
+int driCompareGLXAPIVersion( GLint required_version )
 {
    if ( api_ver > required_version ) {
       return 1;
@@ -1662,5 +1687,3 @@ driCalculateSwapUsage( __DRIdrawablePrivate *dPriv, int64_t last_swap_ust,
 }
 
 /*@}*/
-
-#endif /* GLX_DIRECT_RENDERING */