Initial support for PowerPC specific code in Mesa and DRI drivers. DRI
[mesa.git] / src / mesa / drivers / dri / common / dri_util.c
index 6b251c1cd6b25bc0b566af6560f6df65c0fe366d..dd83080cca0447250c7be37fe98655dc82aee767 100644 (file)
 #include <stdarg.h>
 #include <unistd.h>
 #include <sys/mman.h>
-#include <X11/Xlibint.h>
-#include <Xext.h>
-#include <extutil.h>
 #include <stdio.h>
+
+#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 "xf86dri.h"
-#include "sarea.h"
+#include "drm_sarea.h"
 #include "glcontextmodes.h"
 
-/*#define DRI_NEW_INTERFACE_ONLY*/
-
-#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 +76,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 +101,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);
 
@@ -165,7 +180,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 +199,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;
 
@@ -218,7 +233,7 @@ static void __driRemoveDrawable(void *drawHash, __DRIdrawable *pdraw)
 }
 
 #ifndef DRI_NEW_INTERFACE_ONLY
-static Bool __driWindowExistsFlag;
+static GLboolean __driWindowExistsFlag;
 
 static int __driWindowExistsErrorHandler(Display *dpy, XErrorEvent *xerr)
 {
@@ -248,7 +263,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 *);
@@ -283,7 +298,7 @@ static void __driGarbageCollectDrawables(void *drawHash)
                   drawable no longer exists in the Xserver */
                __driRemoveDrawable(drawHash, pdraw);
                (*pdraw->destroyDrawable)(dpy, pdraw->private);
-               Xfree(pdraw);
+               _mesa_free(pdraw);
            }
        } while (drmHashNext(drawHash, &draw, (void **)&pdraw));
     }
@@ -316,7 +331,7 @@ static void __driGarbageCollectDrawables(void *drawHash)
  * While casting the opaque private pointers associated with the parameters
  * into their respective real types it also assures they are not \c NULL. 
  */
-static Bool driUnbindContext3(__DRInativeDisplay *dpy, int scrn,
+static GLboolean driUnbindContext3(__DRInativeDisplay *dpy, int scrn,
                              __DRIid draw, __DRIid read,
                              __DRIcontext *ctx)
 {
@@ -407,7 +422,7 @@ static Bool 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 +438,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 +449,7 @@ static Bool DoBindContext(__DRInativeDisplay *dpy,
                             empty_attribute_list);
        if (!pdraw->private) {
            /* ERROR!!! */
-           Xfree(pdraw);
+           _mesa_free(pdraw);
            return GL_FALSE;
        }
 
@@ -450,7 +465,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 +476,7 @@ static Bool DoBindContext(__DRInativeDisplay *dpy,
                                 empty_attribute_list);
             if (!pread->private) {
                 /* ERROR!!! */
-                Xfree(pread);
+                _mesa_free(pread);
                 return GL_FALSE;
             }
         }
@@ -498,7 +513,7 @@ static Bool DoBindContext(__DRInativeDisplay *dpy,
  * for \c glXMakeCurrentReadSGI or GLX 1.3's \c glXMakeContextCurrent
  * function.
  */
-static Bool driBindContext3(__DRInativeDisplay *dpy, int scrn,
+static GLboolean driBindContext3(__DRInativeDisplay *dpy, int scrn,
                             __DRIid draw, __DRIid read,
                             __DRIcontext * ctx)
 {
@@ -531,7 +546,7 @@ static Bool 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)
 {
@@ -567,7 +582,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 +592,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 +602,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 +649,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);
@@ -783,6 +798,8 @@ static void *driCreateNewDrawable(__DRInativeDisplay *dpy,
     __DRIdrawablePrivate *pdp;
 
 
+    pdraw->private = NULL;
+
     /* Since pbuffers are not yet supported, no drawable attributes are
      * supported either.
      */
@@ -792,13 +809,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;
     }
 
@@ -828,7 +845,7 @@ 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;
@@ -838,7 +855,7 @@ static void *driCreateNewDrawable(__DRInativeDisplay *dpy,
     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;
     }
 
@@ -866,7 +883,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;
     }
@@ -897,14 +914,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);
     }
 }
 
@@ -935,7 +952,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);
     }
 }
 
@@ -979,14 +996,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;
     }
 
@@ -1031,7 +1048,7 @@ driCreateNewContext(__DRInativeDisplay *dpy, const __GLcontextModes *modes,
 
     if ( !(*psp->DriverAPI.CreateContext)(modes, pcp, shareCtx) ) {
         (void)XF86DRIDestroyContext(dpy, modes->screen, pcp->contextID);
-        Xfree(pcp);
+        _mesa_free(pcp);
         return NULL;
     }
 
@@ -1124,12 +1141,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);
     }
 }
 
@@ -1165,7 +1182,7 @@ __driUtilCreateNewScreen(__DRInativeDisplay *dpy, int scrn, __DRIscreen *psc,
                         const __DRIversion * dri_version,
                         const __DRIversion * drm_version,
                         const __DRIframebuffer * frame_buffer,
-                        drmAddress pSAREA,
+                        drm_sarea_t *pSAREA,
                         int fd,
                         int internal_api_version,
                         const struct __DriverAPIRec *driverAPI)
@@ -1174,9 +1191,9 @@ __driUtilCreateNewScreen(__DRInativeDisplay *dpy, int scrn, __DRIscreen *psc,
 
 
 #ifdef DRI_NEW_INTERFACE_ONLY
-    if ( internal_api_version < 20040415 ) {
+    if ( internal_api_version < 20040602 ) {
        fprintf( stderr, "libGL error: libGL.so version (%08u) is too old.  "
-                "20040415 or later is required.\n", internal_api_version );
+                "20040602 or later is required.\n", internal_api_version );
        return NULL;
     }
 #else
@@ -1217,7 +1234,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;
     }
@@ -1225,7 +1242,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;
     }
 
@@ -1296,7 +1313,7 @@ __driUtilCreateNewScreen(__DRInativeDisplay *dpy, int scrn, __DRIscreen *psc,
 
     if ( (psp->DriverAPI.InitDriver != NULL)
         && !(*psp->DriverAPI.InitDriver)(psp) ) {
-       Xfree( psp );
+       _mesa_free( psp );
        return NULL;
     }
 
@@ -1374,7 +1391,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 );
@@ -1416,7 +1433,7 @@ __driUtilCreateScreen(Display *dpy, int scrn, __DRIscreen *psc,
                                                   &driverName)) {
 
                        /* No longer needed. */
-                       Xfree( driverName );
+                       _mesa_free( driverName );
 
                        /*
                         * Get the DRI X extension version.
@@ -1503,7 +1520,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 ) {