Move make install logic for libGL back into src/mesa/Makefile.
[mesa.git] / src / glx / x11 / dri_glx.c
index 2b43a74e66a1eaf4ec705913f083813b229f268f..a6581465bc20c3479c40148e424d45e990bc8d1d 100644 (file)
@@ -59,6 +59,8 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #endif
 
 typedef struct __GLXDRIdisplayPrivateRec __GLXDRIdisplayPrivate;
+typedef struct __GLXDRIcontextPrivateRec __GLXDRIcontextPrivate;
+
 struct __GLXDRIdisplayPrivateRec {
     __GLXDRIdisplay base;
 
@@ -70,6 +72,12 @@ struct __GLXDRIdisplayPrivateRec {
     int driPatch;
 };
 
+struct __GLXDRIcontextPrivateRec {
+    __GLXDRIcontext base;
+    __DRIcontext driContext;
+    XID hwContextID;
+};
+
 #ifndef DEFAULT_DRIVER_DIR
 /* this is normally defined in Mesa/configs/default with DRI_DRIVER_SEARCH_PATH */
 #define DEFAULT_DRIVER_DIR "/usr/X11R6/lib/modules/dri"
@@ -137,13 +145,15 @@ static void *OpenDriver(const char *driverName)
    /* Attempt to make sure libGL symbols will be visible to the driver */
    glhandle = dlopen("libGL.so.1", RTLD_NOW | RTLD_GLOBAL);
 
-   libPaths = DEFAULT_DRIVER_DIR;
+   libPaths = NULL;
    if (geteuid() == getuid()) {
       /* don't allow setuid apps to use LIBGL_DRIVERS_PATH */
       libPaths = getenv("LIBGL_DRIVERS_PATH");
       if (!libPaths)
          libPaths = getenv("LIBGL_DRIVERS_DIR"); /* deprecated */
    }
+   if (libPaths == NULL)
+       libPaths = DEFAULT_DRIVER_DIR;
 
    handle = NULL;
    for (p = libPaths; *p; p = next) {
@@ -413,8 +423,8 @@ __glXDRIGetDrawableInfo(__DRIdrawable *drawable,
                        int *backX, int *backY,
                        int *numBackClipRects, drm_clip_rect_t **pBackClipRects)
 {
-    __GLXdrawable *glxDraw =
-       containerOf(drawable, __GLXdrawable, driDrawable);
+    __GLXDRIdrawable *glxDraw =
+       containerOf(drawable, __GLXDRIdrawable, driDrawable);
     __GLXscreenConfigs *psc = glxDraw->psc;
     Display *dpy = psc->dpy;
 
@@ -601,7 +611,7 @@ CallCreateNewScreen(Display *dpy, int scrn, __GLXscreenConfigs *psc,
                                    err_msg = "InitDriver";
                                    err_extra = NULL;
                                    psp = (*createNewScreen)(scrn,
-                                                            &psc->driScreen,
+                                                            &psc->__driScreen,
                                                             & ddx_version,
                                                             & dri_version,
                                                             & drm_version,
@@ -657,67 +667,153 @@ CallCreateNewScreen(Display *dpy, int scrn, __GLXscreenConfigs *psc,
     return psp;
 }
 
+static void driDestroyContext(__GLXDRIcontext *context,
+                             __GLXscreenConfigs *psc, Display *dpy)
+{
+    __GLXDRIcontextPrivate *pcp = (__GLXDRIcontextPrivate *) context;
+                       
+    (*pcp->driContext.destroyContext)(&pcp->driContext);
+
+    XF86DRIDestroyContext(psc->dpy, psc->scr, pcp->hwContextID);
+}
+
+static Bool driBindContext(__GLXDRIcontext *context,
+                          __GLXDRIdrawable *draw, __GLXDRIdrawable *read)
+{
+    __GLXDRIcontextPrivate *pcp = (__GLXDRIcontextPrivate *) context;
+
+    return (*pcp->driContext.bindContext)(&pcp->driContext,
+                                         &draw->driDrawable,
+                                         &read->driDrawable);
+}
 
-static void driCreateContext(__GLXscreenConfigs *psc,
-                            const __GLcontextModes *mode,
-                            GLXContext gc,
-                            GLXContext shareList, int renderType)
+static void driUnbindContext(__GLXDRIcontext *context)
 {
+    __GLXDRIcontextPrivate *pcp = (__GLXDRIcontextPrivate *) context;
+
+    (*pcp->driContext.unbindContext)(&pcp->driContext);
+}
+
+static __GLXDRIcontext *driCreateContext(__GLXscreenConfigs *psc,
+                                        const __GLcontextModes *mode,
+                                        GLXContext gc,
+                                        GLXContext shareList, int renderType)
+{
+    __GLXDRIcontextPrivate *pcp, *pcp_shared;
     drm_context_t hwContext;
-    __DRIcontext *shared;
+    __DRIcontext *shared = NULL;
 
-    if (psc && psc->driScreen.private) {
-       shared = (shareList != NULL) ? &shareList->driContext : NULL;
+    if (psc && psc->driScreen) {
+       if (shareList) {
+           pcp_shared = (__GLXDRIcontextPrivate *) shareList->driContext;
+           shared = &pcp_shared->driContext;
+       }
+
+       pcp = Xmalloc(sizeof *pcp);
+       if (pcp == NULL)
+           return NULL;
 
        if (!XF86DRICreateContextWithConfig(psc->dpy, psc->scr,
                                            mode->visualID,
-                                           &gc->hwContextID, &hwContext))
-           /* gah, handle this better */
-           return;
-
-       gc->driContext.private = 
-           (*psc->driScreen.createNewContext)( &psc->driScreen,
-                                               mode, renderType,
-                                               shared,
-                                               hwContext,
-                                               &gc->driContext );
-       if (gc->driContext.private) {
-           gc->isDirect = GL_TRUE;
-           gc->screen = mode->screen;
-           gc->psc = psc;
-           gc->mode = mode;
+                                           &pcp->hwContextID, &hwContext)) {
+           Xfree(pcp);
+           return NULL;
        }
-       else {
-           XF86DRIDestroyContext(psc->dpy, psc->scr, gc->hwContextID);
+
+       pcp->driContext.private = 
+           (*psc->__driScreen.createNewContext)(&psc->__driScreen,
+                                                mode, renderType,
+                                                shared,
+                                                hwContext,
+                                                &pcp->driContext);
+       if (pcp->driContext.private == NULL) {
+           XF86DRIDestroyContext(psc->dpy, psc->scr, pcp->hwContextID);
+           Xfree(pcp);
+           return NULL;
        }
+
+       pcp->base.destroyContext = driDestroyContext;
+       pcp->base.bindContext = driBindContext;
+       pcp->base.unbindContext = driUnbindContext;
+
+       return &pcp->base;
+    }
+
+    return NULL;
+}
+
+
+static __GLXDRIdrawable *driCreateDrawable(__GLXscreenConfigs *psc,
+                                          GLXDrawable drawable,
+                                          GLXContext gc)
+{
+    __GLXDRIdrawable *pdraw;
+    drm_drawable_t hwDrawable;
+    void *empty_attribute_list = NULL;
+
+    pdraw = Xmalloc(sizeof(*pdraw));
+    if (!pdraw)
+       return NULL;
+
+    pdraw->drawable = drawable;
+    pdraw->psc = psc;
+
+    if (!XF86DRICreateDrawable(psc->dpy, psc->scr, drawable, &hwDrawable))
+       return NULL;
+
+    /* Create a new drawable */
+    pdraw->driDrawable.private =
+       (*psc->__driScreen.createNewDrawable)(&psc->__driScreen,
+                                             gc->mode,
+                                             &pdraw->driDrawable,
+                                             hwDrawable,
+                                             GLX_WINDOW_BIT,
+                                             0,
+                                             empty_attribute_list);
+
+    if (!pdraw->driDrawable.private) {
+       XF86DRIDestroyDrawable(psc->dpy, psc->scr, drawable);
+       Xfree(pdraw);
+       return NULL;
     }
+
+    if (__glxHashInsert(psc->drawHash, drawable, pdraw)) {
+       (*pdraw->driDrawable.destroyDrawable)(&pdraw->driDrawable);
+       XF86DRIDestroyDrawable(psc->dpy, psc->scr, drawable);
+       Xfree(pdraw);
+       return NULL;
+    }
+
+    return pdraw;
 }
 
 static void driDestroyScreen(__GLXscreenConfigs *psc)
 {
     /* Free the direct rendering per screen data */
-    if (psc->driScreen.private)
-       (*psc->driScreen.destroyScreen)(&psc->driScreen);
-    psc->driScreen.private = NULL;
+    if (psc->__driScreen.private)
+       (*psc->__driScreen.destroyScreen)(&psc->__driScreen);
+    psc->__driScreen.private = NULL;
     if (psc->drawHash)
        __glxHashDestroy(psc->drawHash);
     if (psc->driver)
        dlclose(psc->driver);
 }
 
-static void driCreateScreen(__GLXscreenConfigs *psc, int screen,
-                           __GLXdisplayPrivate *priv)
+static __GLXDRIscreen *driCreateScreen(__GLXscreenConfigs *psc, int screen,
+                                      __GLXdisplayPrivate *priv)
 {
     PFNCREATENEWSCREENFUNC createNewScreen;
     __GLXDRIdisplayPrivate *pdp;
+    __GLXDRIscreen *psp;
 
-    if (priv->driDisplay == NULL)
-       return;
+    psp = Xmalloc(sizeof *psp);
+    if (psp == NULL)
+       return NULL;
 
     /* Create drawable hash */
     psc->drawHash = __glxHashCreate();
     if ( psc->drawHash == NULL )
-       return;
+       return NULL;
 
     /* Initialize per screen dynamic client GLX extensions */
     psc->ext_list_first_time = GL_TRUE;
@@ -725,16 +821,19 @@ static void driCreateScreen(__GLXscreenConfigs *psc, int screen,
     psc->driver = driGetDriver(priv->dpy, screen);
     createNewScreen = dlsym(psc->driver, createNewScreenName);
     if (createNewScreenName == NULL)
-       return;
+       return NULL;
 
     pdp = (__GLXDRIdisplayPrivate *) priv->driDisplay;
-    psc->driScreen.private =
+    psc->__driScreen.private =
        CallCreateNewScreen(psc->dpy, screen, psc, pdp, createNewScreen);
-    if (psc->driScreen.private != NULL)
+    if (psc->__driScreen.private != NULL)
        __glXScrEnableDRIExtension(psc);
 
-    psc->driDestroyScreen = driDestroyScreen;
-    psc->driCreateContext = driCreateContext;
+    psp->destroyScreen = driDestroyScreen;
+    psp->createContext = driCreateContext;
+    psp->createDrawable = driCreateDrawable;
+
+    return psp;
 }
 
 /* Called from __glXFreeDisplayPrivate.
@@ -749,7 +848,7 @@ static void driDestroyDisplay(__GLXDRIdisplay *dpy)
  * This is called from __glXInitialize() when we are given a new
  * display pointer.
  */
-__GLXDRIdisplay *driCreateDisplay(Display *dpy)
+_X_HIDDEN __GLXDRIdisplay *driCreateDisplay(Display *dpy)
 {
     __GLXDRIdisplayPrivate *pdpyp;
     int eventBase, errorBase;
@@ -775,7 +874,7 @@ __GLXDRIdisplay *driCreateDisplay(Display *dpy)
     pdpyp->base.destroyDisplay = driDestroyDisplay;
     pdpyp->base.createScreen = driCreateScreen;
 
-    return (void *)pdpyp;
+    return &pdpyp->base;
 }
 
 #endif /* GLX_DIRECT_RENDERING */