Drop createDrawable and destroyDrawable fron DRIinterfaceMethods.

All the DRI driver did was call the createDrawable callback immediately
upon entry to DRIscreen::createNewDrawable to get the drm_drawable_t.
We can just call that before calling into the DRI driver and pass the
returned drm_drawable_t as an argument to the DRI entry point.

Likewise for destroyDrawable.

Also, DRIdrawablePrivate::draw isn't used anywhere, and since the
driver no longer needs the XID of the drawable we can now drop that.
diff --git a/include/GL/internal/dri_interface.h b/include/GL/internal/dri_interface.h
index 8a6984d..0f90f49 100644
--- a/include/GL/internal/dri_interface.h
+++ b/include/GL/internal/dri_interface.h
@@ -195,21 +195,10 @@
     GLboolean (* destroyContext)( __DRIscreen *screen, __DRIid context );
 
     /**
-     * Create the server-side portion of the drawable.
-     */
-    GLboolean (*createDrawable)( __DRIscreen *screen,
-        __DRIid drawable, drm_drawable_t * hHWDrawable );
-
-    /**
-     * Destroy the server-side portion of the drawable.
-     */
-    GLboolean (*destroyDrawable)( __DRIscreen *screen, __DRIid drawable );
-
-    /**
      * This function is used to get information about the position, size, and
      * clip rects of a drawable.
      */
-    GLboolean (* getDrawableInfo) ( __DRIscreen *screen, __DRIid drawable,
+    GLboolean (* getDrawableInfo) ( __DRIdrawable *drawable,
 	unsigned int * index, unsigned int * stamp,
         int * x, int * y, int * width, int * height,
         int * numClipRects, drm_clip_rect_t ** pClipRects,
@@ -303,7 +292,8 @@
      */
     void *(*createNewDrawable)(__DRIscreen *screen,
 			       const __GLcontextModes *modes,
-			       __DRIid draw, __DRIdrawable *pdraw,
+			       __DRIdrawable *pdraw,
+			       drm_drawable_t hwDrawable,
 			       int renderType, const int *attrs);
 
     /**
diff --git a/src/glx/x11/glxcmds.c b/src/glx/x11/glxcmds.c
index 45ee93c..229da5a 100644
--- a/src/glx/x11/glxcmds.c
+++ b/src/glx/x11/glxcmds.c
@@ -85,7 +85,7 @@
     __GLXdisplayPrivate * const priv = __glXInitialize(dpy);
     __GLXscreenConfigs *sc;
     __DRIid draw;
-    __DRIdrawable *pdraw;
+    __GLXdrawable *pdraw;
     XWindowAttributes xwa;
     int (*oldXErrorHandler)(Display *, XErrorEvent *);
 
@@ -105,7 +105,8 @@
 	    if (!windowExistsFlag) {
 		/* Destroy the local drawable data, if the drawable no
 		   longer exists in the Xserver */
-		(*pdraw->destroyDrawable)(pdraw->private);
+		(*pdraw->driDrawable.destroyDrawable)(pdraw->driDrawable.private);
+		XF86DRIDestroyDrawable(dpy, sc->scr, draw);
 		Xfree(pdraw);
 	    }
 	} while (__glxHashNext(sc->drawHash, &draw, (void *)&pdraw) == 1);
diff --git a/src/glx/x11/glxext.c b/src/glx/x11/glxext.c
index 2ff7368..dce01d5 100644
--- a/src/glx/x11/glxext.c
+++ b/src/glx/x11/glxext.c
@@ -796,39 +796,19 @@
 }
 
 static GLboolean
-__glXDRICreateDrawable( __DRIscreen *screen,
-			__DRIid drawable, drm_drawable_t *hHWDrawable )
-{
-    __GLXscreenConfigs *psc =
-	containerOf(screen, __GLXscreenConfigs, driScreen);
-    Display *dpy = psc->dpy;
-
-    return XF86DRICreateDrawable(dpy, psc->scr, drawable, hHWDrawable);
-}
-
-static GLboolean
-__glXDRIDestroyDrawable(__DRIscreen *screen, __DRIid drawable)
-{
-    __GLXscreenConfigs *psc =
-	containerOf(screen, __GLXscreenConfigs, driScreen);
-    Display *dpy = psc->dpy;
-
-    return XF86DRIDestroyDrawable(dpy, psc->scr, drawable);
-}
-
-static GLboolean
-__glXDRIGetDrawableInfo(__DRIscreen *screen, __DRIid drawable,
+__glXDRIGetDrawableInfo(__DRIdrawable *drawable,
 			unsigned int *index, unsigned int *stamp, 
 			int *X, int *Y, int *W, int *H,
 			int *numClipRects, drm_clip_rect_t ** pClipRects,
 			int *backX, int *backY,
 			int *numBackClipRects, drm_clip_rect_t **pBackClipRects)
 {
-    __GLXscreenConfigs *psc =
-	containerOf(screen, __GLXscreenConfigs, driScreen);
+    __GLXdrawable *glxDraw =
+	containerOf(drawable, __GLXdrawable, driDrawable);
+    __GLXscreenConfigs *psc = glxDraw->psc;
     Display *dpy = psc->dpy;
 
-    return XF86DRIGetDrawableInfo(dpy, psc->scr, drawable,
+    return XF86DRIGetDrawableInfo(dpy, psc->scr, glxDraw->drawable,
 				  index, stamp, X, Y, W, H,
 				  numClipRects, pClipRects,
 				  backX, backY,
@@ -848,8 +828,6 @@
     __glXDRICreateContext,
     __glXDRIDestroyContext,
 
-    __glXDRICreateDrawable,
-    __glXDRIDestroyDrawable,
     __glXDRIGetDrawableInfo,
 
     __glXGetUST,
@@ -1667,6 +1645,7 @@
     __GLXdisplayPrivate * const priv = __glXInitialize(dpy);
     __GLXdrawable *pdraw;
     __GLXscreenConfigs *sc;
+    drm_drawable_t hwDrawable;
     void *empty_attribute_list = NULL;
 
     if (priv == NULL || priv->driDisplay.private == NULL)
@@ -1684,22 +1663,27 @@
     pdraw->drawable = drawable;
     pdraw->psc = sc;
 
+    if (!XF86DRICreateDrawable(dpy, sc->scr, drawable, &hwDrawable))
+	return NULL;
+
     /* Create a new drawable */
     pdraw->driDrawable.private =
 	(*sc->driScreen.createNewDrawable)(&sc->driScreen,
 					   gc->mode,
-					   drawable, &pdraw->driDrawable,
+					   &pdraw->driDrawable,
+					   hwDrawable,
 					   GLX_WINDOW_BIT,
 					   empty_attribute_list);
 
     if (!pdraw->driDrawable.private) {
-	/* ERROR!!! */
+	XF86DRIDestroyDrawable(dpy, sc->scr, drawable);
 	Xfree(pdraw);
 	return NULL;
     }
 
     if (__glxHashInsert(sc->drawHash, drawable, pdraw)) {
 	(*pdraw->driDrawable.destroyDrawable)(pdraw->driDrawable.private);
+	XF86DRIDestroyDrawable(dpy, sc->scr, drawable);
 	Xfree(pdraw);
 	return NULL;
     }
diff --git a/src/mesa/drivers/dri/common/dri_util.c b/src/mesa/drivers/dri/common/dri_util.c
index 2b5d6f0..dd7068a 100644
--- a/src/mesa/drivers/dri/common/dri_util.c
+++ b/src/mesa/drivers/dri/common/dri_util.c
@@ -59,7 +59,8 @@
 
 static void *driCreateNewDrawable(__DRIscreen *screen,
 				  const __GLcontextModes *modes,
-                                  __DRIid draw, __DRIdrawable *pdraw,
+                                  __DRIdrawable *pdraw,
+				  drm_drawable_t hwDrawable,
                                   int renderType, const int *attrs);
 
 static void driDestroyDrawable(void *drawablePrivate);
@@ -286,7 +287,7 @@
 
     DRM_SPINUNLOCK(&psp->pSAREA->drawable_lock, psp->drawLockID);
 
-    if (! (*dri_interface->getDrawableInfo)(pdp->driScreenPriv->psc, pdp->draw,
+    if (! (*dri_interface->getDrawableInfo)(pdp->pdraw,
 			  &pdp->index, &pdp->lastStamp,
 			  &pdp->x, &pdp->y, &pdp->w, &pdp->h,
 			  &pdp->numClipRects, &pdp->pClipRects,
@@ -435,8 +436,8 @@
  */
 static void *driCreateNewDrawable(__DRIscreen *screen,
 				  const __GLcontextModes *modes,
-				  __DRIid draw,
 				  __DRIdrawable *pdraw,
+				  drm_drawable_t hwDrawable,
 				  int renderType,
 				  const int *attrs)
 {
@@ -456,14 +457,7 @@
 	return NULL;
     }
 
-    /* Ensure that modes->screen and screen are the same screen? */
-
-    if (!(*dri_interface->createDrawable)(screen, draw, &pdp->hHWDrawable)) {
-	_mesa_free(pdp);
-	return NULL;
-    }
-
-    pdp->draw = draw;
+    pdp->hHWDrawable = hwDrawable;
     pdp->pdraw = pdraw;
     pdp->refcount = 0;
     pdp->pStamp = NULL;
@@ -484,7 +478,6 @@
 
     if (!(*psp->DriverAPI.CreateBuffer)(psp, pdp, modes,
 					renderType == GLX_PIXMAP_BIT)) {
-       (void)(*dri_interface->destroyDrawable)(screen, pdp->draw);
        _mesa_free(pdp);
        return NULL;
     }
@@ -523,7 +516,6 @@
     if (pdp) {
 	psp = pdp->driScreenPriv;
         (*psp->DriverAPI.DestroyBuffer)(pdp);
-	(void)(*dri_interface->destroyDrawable)(psp->psc, pdp->draw);
 	if (pdp->pClipRects) {
 	    _mesa_free(pdp->pClipRects);
 	    pdp->pClipRects = NULL;
diff --git a/src/mesa/drivers/dri/common/dri_util.h b/src/mesa/drivers/dri/common/dri_util.h
index cae170c..cb9bb26 100644
--- a/src/mesa/drivers/dri/common/dri_util.h
+++ b/src/mesa/drivers/dri/common/dri_util.h
@@ -248,7 +248,6 @@
     /**
      * X's drawable ID associated with this private drawable.
      */
-    __DRIid draw;
     __DRIdrawable *pdraw;
 
     /**
diff --git a/src/mesa/drivers/dri/mga/mgastate.c b/src/mesa/drivers/dri/mga/mgastate.c
index c20a76f..88f2175 100644
--- a/src/mesa/drivers/dri/mga/mgastate.c
+++ b/src/mesa/drivers/dri/mga/mgastate.c
@@ -778,8 +778,6 @@
 {
    __DRIdrawablePrivate *const driDrawable = mmesa->driDrawable;
    __DRIdrawablePrivate *const driReadable = mmesa->driReadable;
-   drm_mga_sarea_t *sarea = mmesa->sarea;
-
 
    mmesa->dirty_cliprects = 0;	
 
@@ -790,9 +788,6 @@
 
    mga_set_cliprects(mmesa);
 
-   sarea->req_drawable = driDrawable->draw;
-   sarea->req_draw_buffer = mmesa->draw_buffer;
-
    mgaUpdateClipping( mmesa->glCtx );
    mgaCalcViewport( mmesa->glCtx );
 }