From 6083a94d68878c9ad5f59b28bd07e4738e9fb7b4 Mon Sep 17 00:00:00 2001
From: marha <marha@users.sourceforge.net>
Date: Tue, 11 May 2010 19:15:00 +0000
Subject: xserver git update 11/5/2010

---
 xorg-server/damageext/damageext.c          | 1049 +++---
 xorg-server/damageext/damageextint.h       |  141 +-
 xorg-server/dix/resource.c                 | 1848 +++++------
 xorg-server/glx/glxcmds.c                  | 4875 ++++++++++++++--------------
 xorg-server/glx/glxdri.c                   | 2392 +++++++-------
 xorg-server/glx/glxdri2.c                  | 1612 ++++-----
 xorg-server/glx/glxdriswrast.c             | 1080 +++---
 xorg-server/glx/glxscreens.h               |  366 +--
 xorg-server/hw/xfree86/dri2/dri2.c         | 1984 +++++------
 xorg-server/hw/xfree86/dri2/dri2.h         |  549 ++--
 xorg-server/hw/xfree86/dri2/dri2ext.c      | 1292 ++++----
 xorg-server/hw/xfree86/modes/xf86Cursors.c | 1344 ++++----
 xorg-server/hw/xquartz/GL/indirect.c       | 3280 +++++++++----------
 xorg-server/include/list.h                 |  200 +-
 14 files changed, 11075 insertions(+), 10937 deletions(-)

diff --git a/xorg-server/damageext/damageext.c b/xorg-server/damageext/damageext.c
index 462796e91..2608e60b3 100644
--- a/xorg-server/damageext/damageext.c
+++ b/xorg-server/damageext/damageext.c
@@ -1,524 +1,525 @@
-/*
- * Copyright © 2002 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Keith Packard not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Keith Packard makes no
- * representations about the suitability of this software for any purpose.  It
- * is provided "as is" without express or implied warranty.
- *
- * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include "damageextint.h"
-#include "protocol-versions.h"
-
-static unsigned char	DamageReqCode;
-static int		DamageEventBase;
-static int		DamageErrorBase;
-static RESTYPE		DamageExtType;
-static RESTYPE		DamageExtWinType;
-
-static int DamageClientPrivateKeyIndex;
-static DevPrivateKey DamageClientPrivateKey = &DamageClientPrivateKeyIndex;
-
-#define prScreen	screenInfo.screens[0]
-
-static void
-DamageExtNotify (DamageExtPtr pDamageExt, BoxPtr pBoxes, int nBoxes)
-{
-    ClientPtr		pClient = pDamageExt->pClient;
-    DamageClientPtr	pDamageClient = GetDamageClient (pClient);
-    DrawablePtr		pDrawable = pDamageExt->pDrawable;
-    xDamageNotifyEvent	ev;
-    int			i;
-
-    UpdateCurrentTimeIf ();
-    ev.type = DamageEventBase + XDamageNotify;
-    ev.level = pDamageExt->level;
-    ev.sequenceNumber = pClient->sequence;
-    ev.drawable = pDrawable->id;
-    ev.damage = pDamageExt->id;
-    ev.timestamp = currentTime.milliseconds;
-    ev.geometry.x = pDrawable->x;
-    ev.geometry.y = pDrawable->y;
-    ev.geometry.width = pDrawable->width;
-    ev.geometry.height = pDrawable->height;
-    if (pBoxes)
-    {
-	for (i = 0; i < nBoxes; i++)
-	{
-	    ev.level = pDamageExt->level;
-	    if (i < nBoxes - 1)
-		ev.level |= DamageNotifyMore;
-	    ev.area.x = pBoxes[i].x1;
-	    ev.area.y = pBoxes[i].y1;
-	    ev.area.width = pBoxes[i].x2 - pBoxes[i].x1;
-	    ev.area.height = pBoxes[i].y2 - pBoxes[i].y1;
-	    if (!pClient->clientGone)
-		WriteEventsToClient (pClient, 1, (xEvent *) &ev);
-	}
-    }
-    else
-    {
-	ev.area.x = 0;
-	ev.area.y = 0;
-	ev.area.width = pDrawable->width;
-	ev.area.height = pDrawable->height;
-	if (!pClient->clientGone)
-	    WriteEventsToClient (pClient, 1, (xEvent *) &ev);
-    }
-    /* Composite extension marks clients with manual Subwindows as critical */
-    if (pDamageClient->critical > 0)
-    {
-	SetCriticalOutputPending ();
-	pClient->smart_priority = SMART_MAX_PRIORITY;
-    }
-}
-
-static void
-DamageExtReport (DamagePtr pDamage, RegionPtr pRegion, void *closure)
-{
-    DamageExtPtr    pDamageExt = closure;
-
-    switch (pDamageExt->level) {
-    case DamageReportRawRegion:
-    case DamageReportDeltaRegion:
-	DamageExtNotify (pDamageExt, REGION_RECTS(pRegion), REGION_NUM_RECTS(pRegion));
-	break;
-    case DamageReportBoundingBox:
-	DamageExtNotify (pDamageExt, REGION_EXTENTS(prScreen, pRegion), 1);
-	break;
-    case DamageReportNonEmpty:
-	DamageExtNotify (pDamageExt, NullBox, 0);
-	break;
-    case DamageReportNone:
-	break;
-    }
-}
-
-static void
-DamageExtDestroy (DamagePtr pDamage, void *closure)
-{
-    DamageExtPtr    pDamageExt = closure;
-    
-    pDamageExt->pDamage = 0;
-    if (pDamageExt->id)
-	FreeResource (pDamageExt->id, RT_NONE);
-}
-
-void
-DamageExtSetCritical (ClientPtr pClient, Bool critical)
-{
-    DamageClientPtr pDamageClient = GetDamageClient (pClient);
-
-    if (pDamageClient)
-	pDamageClient->critical += critical ? 1 : -1;
-}
-
-static int
-ProcDamageQueryVersion(ClientPtr client)
-{
-    DamageClientPtr pDamageClient = GetDamageClient (client);
-    xDamageQueryVersionReply rep;
-    register int n;
-    REQUEST(xDamageQueryVersionReq);
-
-    REQUEST_SIZE_MATCH(xDamageQueryVersionReq);
-    rep.type = X_Reply;
-    rep.length = 0;
-    rep.sequenceNumber = client->sequence;
-    if (stuff->majorVersion < SERVER_DAMAGE_MAJOR_VERSION) {
-	rep.majorVersion = stuff->majorVersion;
-	rep.minorVersion = stuff->minorVersion;
-    } else {
-	rep.majorVersion = SERVER_DAMAGE_MAJOR_VERSION;
-	if (stuff->majorVersion == SERVER_DAMAGE_MAJOR_VERSION &&
-	    stuff->minorVersion < SERVER_DAMAGE_MINOR_VERSION)
-	    rep.minorVersion = stuff->minorVersion;
-	else
-	    rep.minorVersion = SERVER_DAMAGE_MINOR_VERSION;
-    }
-    pDamageClient->major_version = rep.majorVersion;
-    pDamageClient->minor_version = rep.minorVersion;
-    if (client->swapped) {
-    	swaps(&rep.sequenceNumber, n);
-    	swapl(&rep.length, n);
-	swapl(&rep.majorVersion, n);
-	swapl(&rep.minorVersion, n);
-    }
-    WriteToClient(client, sizeof(xDamageQueryVersionReply), (char *)&rep);
-    return(client->noClientException);
-}
-
-static int
-ProcDamageCreate (ClientPtr client)
-{
-    DrawablePtr		pDrawable;
-    DamageExtPtr	pDamageExt;
-    DamageReportLevel	level;
-    RegionPtr		pRegion;
-    int			rc;
-    
-    REQUEST(xDamageCreateReq);
-
-    REQUEST_SIZE_MATCH(xDamageCreateReq);
-    LEGAL_NEW_RESOURCE(stuff->damage, client);
-    rc = dixLookupDrawable(&pDrawable, stuff->drawable, client, 0,
-			   DixGetAttrAccess|DixReadAccess);
-    if (rc != Success)
-	return rc;
-
-    switch (stuff->level) {
-    case XDamageReportRawRectangles:
-	level = DamageReportRawRegion;
-	break;
-    case XDamageReportDeltaRectangles:
-	level = DamageReportDeltaRegion;
-	break;
-    case XDamageReportBoundingBox:
-	level = DamageReportBoundingBox;
-	break;
-    case XDamageReportNonEmpty:
-	level = DamageReportNonEmpty;
-	break;
-    default:
-	client->errorValue = stuff->level;
-	return BadValue;
-    }
-    
-    pDamageExt = xalloc (sizeof (DamageExtRec));
-    if (!pDamageExt)
-	return BadAlloc;
-    pDamageExt->id = stuff->damage;
-    pDamageExt->pDrawable = pDrawable;
-    pDamageExt->level = level;
-    pDamageExt->pClient = client;
-    pDamageExt->pDamage = DamageCreate (DamageExtReport,
-					DamageExtDestroy,
-					level,
-					FALSE,
-					pDrawable->pScreen,
-					pDamageExt);
-    if (!pDamageExt->pDamage)
-    {
-	xfree (pDamageExt);
-	return BadAlloc;
-    }
-    if (!AddResource (stuff->damage, DamageExtType, (pointer) pDamageExt))
-	return BadAlloc;
-
-    DamageRegister (pDamageExt->pDrawable, pDamageExt->pDamage);
-
-    if (pDrawable->type == DRAWABLE_WINDOW)
-    {
-	pRegion = &((WindowPtr) pDrawable)->borderClip;
-	DamageRegionAppend(pDrawable, pRegion);
-    }
-
-    return (client->noClientException);
-}
-
-static int
-ProcDamageDestroy (ClientPtr client)
-{
-    REQUEST(xDamageDestroyReq);
-    DamageExtPtr    pDamageExt;
-
-    REQUEST_SIZE_MATCH(xDamageDestroyReq);
-    VERIFY_DAMAGEEXT(pDamageExt, stuff->damage, client, DixWriteAccess);
-    FreeResource (stuff->damage, RT_NONE);
-    return (client->noClientException);
-}
-
-static int
-ProcDamageSubtract (ClientPtr client)
-{
-    REQUEST(xDamageSubtractReq);
-    DamageExtPtr    pDamageExt;
-    RegionPtr	    pRepair;
-    RegionPtr	    pParts;
-
-    REQUEST_SIZE_MATCH(xDamageSubtractReq);
-    VERIFY_DAMAGEEXT(pDamageExt, stuff->damage, client, DixWriteAccess);
-    VERIFY_REGION_OR_NONE(pRepair, stuff->repair, client, DixWriteAccess);
-    VERIFY_REGION_OR_NONE(pParts, stuff->parts, client, DixWriteAccess);
-
-    if (pDamageExt->level != DamageReportRawRegion)
-    {
-	DamagePtr   pDamage = pDamageExt->pDamage;
-	if (pRepair)
-	{
-	    if (pParts)
-		REGION_INTERSECT (prScreen, pParts, DamageRegion (pDamage), pRepair);
-	    if (DamageSubtract (pDamage, pRepair))
-		DamageExtReport (pDamage, DamageRegion (pDamage), (void *) pDamageExt);
-	}
-	else
-	{
-	    if (pParts)
-		REGION_COPY (prScreen, pParts, DamageRegion (pDamage));
-	    DamageEmpty (pDamage);
-	}
-    }
-    return (client->noClientException);
-}
-
-static int
-ProcDamageAdd (ClientPtr client)
-{
-    REQUEST(xDamageAddReq);
-    DrawablePtr	    pDrawable;
-    RegionPtr	    pRegion;
-    int		    rc;
-
-    REQUEST_SIZE_MATCH(xDamageAddReq);
-    VERIFY_REGION(pRegion, stuff->region, client, DixWriteAccess);
-    rc = dixLookupDrawable(&pDrawable, stuff->drawable, client, 0,
-			   DixWriteAccess);
-    if (rc != Success)
-	return rc;
-
-    /* The region is relative to the drawable origin, so translate it out to
-     * screen coordinates like damage expects.
-     */
-    REGION_TRANSLATE(pScreen, pRegion, pDrawable->x, pDrawable->y);
-    DamageRegionAppend(pDrawable, pRegion);
-    REGION_TRANSLATE(pScreen, pRegion, -pDrawable->x, -pDrawable->y);
-
-    return (client->noClientException);
-}
-
-/* Major version controls available requests */
-static const int version_requests[] = {
-    X_DamageQueryVersion,	/* before client sends QueryVersion */
-    X_DamageAdd,		/* Version 1 */
-};
-
-#define NUM_VERSION_REQUESTS	(sizeof (version_requests) / sizeof (version_requests[0]))
-    
-static int (*ProcDamageVector[XDamageNumberRequests])(ClientPtr) = {
-/*************** Version 1 ******************/
-    ProcDamageQueryVersion,
-    ProcDamageCreate,
-    ProcDamageDestroy,
-    ProcDamageSubtract,
-/*************** Version 1.1 ****************/
-    ProcDamageAdd,
-};
-
-
-static int
-ProcDamageDispatch (ClientPtr client)
-{
-    REQUEST(xDamageReq);
-    DamageClientPtr pDamageClient = GetDamageClient (client);
-
-    if (pDamageClient->major_version >= NUM_VERSION_REQUESTS)
-	return BadRequest;
-    if (stuff->damageReqType > version_requests[pDamageClient->major_version])
-	return BadRequest;
-    return (*ProcDamageVector[stuff->damageReqType]) (client);
-}
-
-static int
-SProcDamageQueryVersion(ClientPtr client)
-{
-    register int n;
-    REQUEST(xDamageQueryVersionReq);
-
-    swaps(&stuff->length, n);
-    REQUEST_SIZE_MATCH(xDamageQueryVersionReq);
-    swapl(&stuff->majorVersion, n);
-    swapl(&stuff->minorVersion, n);
-    return (*ProcDamageVector[stuff->damageReqType]) (client);
-}
-
-static int
-SProcDamageCreate (ClientPtr client)
-{
-    register int n;
-    REQUEST(xDamageCreateReq);
-    
-    swaps (&stuff->length, n);
-    REQUEST_SIZE_MATCH(xDamageCreateReq);
-    swapl (&stuff->damage, n);
-    swapl (&stuff->drawable, n);
-    return (*ProcDamageVector[stuff->damageReqType]) (client);
-}
-
-static int
-SProcDamageDestroy (ClientPtr client)
-{
-    register int n;
-    REQUEST(xDamageDestroyReq);
-    
-    swaps (&stuff->length, n);
-    REQUEST_SIZE_MATCH(xDamageDestroyReq);
-    swapl (&stuff->damage, n);
-    return (*ProcDamageVector[stuff->damageReqType]) (client);
-}
-
-static int
-SProcDamageSubtract (ClientPtr client)
-{
-    register int n;
-    REQUEST(xDamageSubtractReq);
-    
-    swaps (&stuff->length, n);
-    REQUEST_SIZE_MATCH(xDamageSubtractReq);
-    swapl (&stuff->damage, n);
-    swapl (&stuff->repair, n);
-    swapl (&stuff->parts, n);
-    return (*ProcDamageVector[stuff->damageReqType]) (client);
-}
-
-static int
-SProcDamageAdd (ClientPtr client)
-{
-    register int n;
-    REQUEST(xDamageAddReq);
-
-    swaps (&stuff->length, n);
-    REQUEST_SIZE_MATCH(xDamageSubtractReq);
-    swapl (&stuff->drawable, n);
-    swapl (&stuff->region, n);
-    return (*ProcDamageVector[stuff->damageReqType]) (client);
-}
-
-static int (*SProcDamageVector[XDamageNumberRequests])(ClientPtr) = {
-/*************** Version 1 ******************/
-    SProcDamageQueryVersion,
-    SProcDamageCreate,
-    SProcDamageDestroy,
-    SProcDamageSubtract,
-/*************** Version 1.1 ****************/
-    SProcDamageAdd,
-};
-
-static int
-SProcDamageDispatch (ClientPtr client)
-{
-    REQUEST(xDamageReq);
-    if (stuff->damageReqType >= XDamageNumberRequests)
-	return BadRequest;
-    return (*SProcDamageVector[stuff->damageReqType]) (client);
-}
-
-static void
-DamageClientCallback (CallbackListPtr	*list,
-		      pointer		closure,
-		      pointer		data)
-{
-    NewClientInfoRec	*clientinfo = (NewClientInfoRec *) data;
-    ClientPtr		pClient = clientinfo->client;
-    DamageClientPtr	pDamageClient = GetDamageClient (pClient);
-
-    pDamageClient->critical = 0;
-    pDamageClient->major_version = 0;
-    pDamageClient->minor_version = 0;
-}
-
-/*ARGSUSED*/
-static void
-DamageResetProc (ExtensionEntry *extEntry)
-{
-    DeleteCallback (&ClientStateCallback, DamageClientCallback, 0);
-}
-
-static int
-FreeDamageExt (pointer value, XID did)
-{
-    DamageExtPtr    pDamageExt = (DamageExtPtr) value;
-
-    /*
-     * Get rid of the resource table entry hanging from the window id
-     */
-    pDamageExt->id = 0;
-    if (WindowDrawable(pDamageExt->pDrawable->type))
-	FreeResourceByType (pDamageExt->pDrawable->id, DamageExtWinType, TRUE);
-    if (pDamageExt->pDamage)
-    {
-	DamageUnregister (pDamageExt->pDrawable, pDamageExt->pDamage);
-	DamageDestroy (pDamageExt->pDamage);
-    }
-    xfree (pDamageExt);
-    return Success;
-}
-
-static int
-FreeDamageExtWin (pointer value, XID wid)
-{
-    DamageExtPtr    pDamageExt = (DamageExtPtr) value;
-
-    if (pDamageExt->id)
-	FreeResource (pDamageExt->id, RT_NONE);
-    return Success;
-}
-
-static void
-SDamageNotifyEvent (xDamageNotifyEvent *from,
-		    xDamageNotifyEvent *to)
-{
-    to->type = from->type;
-    cpswaps (from->sequenceNumber, to->sequenceNumber);
-    cpswapl (from->drawable, to->drawable);
-    cpswapl (from->damage, to->damage);
-    cpswaps (from->area.x, to->area.x);
-    cpswaps (from->area.y, to->area.y);
-    cpswaps (from->area.width, to->area.width);
-    cpswaps (from->area.height, to->area.height);
-    cpswaps (from->geometry.x, to->geometry.x);
-    cpswaps (from->geometry.y, to->geometry.y);
-    cpswaps (from->geometry.width, to->geometry.width);
-    cpswaps (from->geometry.height, to->geometry.height);
-}
-
-void
-DamageExtensionInit(void)
-{
-    ExtensionEntry *extEntry;
-    int		    s;
-
-    for (s = 0; s < screenInfo.numScreens; s++)
-	DamageSetup (screenInfo.screens[s]);
-
-    DamageExtType = CreateNewResourceType (FreeDamageExt, "DamageExt");
-    if (!DamageExtType)
-	return;
-
-    DamageExtWinType = CreateNewResourceType (FreeDamageExtWin, "DamageExtWin");
-    if (!DamageExtWinType)
-	return;
-
-    if (!dixRequestPrivate(DamageClientPrivateKey, sizeof (DamageClientRec)))
-	return;
-    if (!AddCallback (&ClientStateCallback, DamageClientCallback, 0))
-	return;
-
-    if ((extEntry = AddExtension(DAMAGE_NAME, XDamageNumberEvents, 
-				 XDamageNumberErrors,
-				 ProcDamageDispatch, SProcDamageDispatch,
-				 DamageResetProc, StandardMinorOpcode)) != 0)
-    {
-	DamageReqCode = (unsigned char)extEntry->base;
-	DamageEventBase = extEntry->eventBase;
-	DamageErrorBase = extEntry->errorBase;
-	EventSwapVector[DamageEventBase + XDamageNotify] =
-			(EventSwapPtr) SDamageNotifyEvent;
-    }
-}
+/*
+ * Copyright © 2002 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Keith Packard not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission.  Keith Packard makes no
+ * representations about the suitability of this software for any purpose.  It
+ * is provided "as is" without express or implied warranty.
+ *
+ * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "damageextint.h"
+#include "protocol-versions.h"
+
+static unsigned char	DamageReqCode;
+static int		DamageEventBase;
+static int		DamageErrorBase;
+static RESTYPE		DamageExtType;
+static RESTYPE		DamageExtWinType;
+
+static int DamageClientPrivateKeyIndex;
+static DevPrivateKey DamageClientPrivateKey = &DamageClientPrivateKeyIndex;
+
+#define prScreen	screenInfo.screens[0]
+
+static void
+DamageExtNotify (DamageExtPtr pDamageExt, BoxPtr pBoxes, int nBoxes)
+{
+    ClientPtr		pClient = pDamageExt->pClient;
+    DamageClientPtr	pDamageClient = GetDamageClient (pClient);
+    DrawablePtr		pDrawable = pDamageExt->pDrawable;
+    xDamageNotifyEvent	ev;
+    int			i;
+
+    UpdateCurrentTimeIf ();
+    ev.type = DamageEventBase + XDamageNotify;
+    ev.level = pDamageExt->level;
+    ev.sequenceNumber = pClient->sequence;
+    ev.drawable = pDamageExt->drawable;
+    ev.damage = pDamageExt->id;
+    ev.timestamp = currentTime.milliseconds;
+    ev.geometry.x = pDrawable->x;
+    ev.geometry.y = pDrawable->y;
+    ev.geometry.width = pDrawable->width;
+    ev.geometry.height = pDrawable->height;
+    if (pBoxes)
+    {
+	for (i = 0; i < nBoxes; i++)
+	{
+	    ev.level = pDamageExt->level;
+	    if (i < nBoxes - 1)
+		ev.level |= DamageNotifyMore;
+	    ev.area.x = pBoxes[i].x1;
+	    ev.area.y = pBoxes[i].y1;
+	    ev.area.width = pBoxes[i].x2 - pBoxes[i].x1;
+	    ev.area.height = pBoxes[i].y2 - pBoxes[i].y1;
+	    if (!pClient->clientGone)
+		WriteEventsToClient (pClient, 1, (xEvent *) &ev);
+	}
+    }
+    else
+    {
+	ev.area.x = 0;
+	ev.area.y = 0;
+	ev.area.width = pDrawable->width;
+	ev.area.height = pDrawable->height;
+	if (!pClient->clientGone)
+	    WriteEventsToClient (pClient, 1, (xEvent *) &ev);
+    }
+    /* Composite extension marks clients with manual Subwindows as critical */
+    if (pDamageClient->critical > 0)
+    {
+	SetCriticalOutputPending ();
+	pClient->smart_priority = SMART_MAX_PRIORITY;
+    }
+}
+
+static void
+DamageExtReport (DamagePtr pDamage, RegionPtr pRegion, void *closure)
+{
+    DamageExtPtr    pDamageExt = closure;
+
+    switch (pDamageExt->level) {
+    case DamageReportRawRegion:
+    case DamageReportDeltaRegion:
+	DamageExtNotify (pDamageExt, REGION_RECTS(pRegion), REGION_NUM_RECTS(pRegion));
+	break;
+    case DamageReportBoundingBox:
+	DamageExtNotify (pDamageExt, REGION_EXTENTS(prScreen, pRegion), 1);
+	break;
+    case DamageReportNonEmpty:
+	DamageExtNotify (pDamageExt, NullBox, 0);
+	break;
+    case DamageReportNone:
+	break;
+    }
+}
+
+static void
+DamageExtDestroy (DamagePtr pDamage, void *closure)
+{
+    DamageExtPtr    pDamageExt = closure;
+    
+    pDamageExt->pDamage = 0;
+    if (pDamageExt->id)
+	FreeResource (pDamageExt->id, RT_NONE);
+}
+
+void
+DamageExtSetCritical (ClientPtr pClient, Bool critical)
+{
+    DamageClientPtr pDamageClient = GetDamageClient (pClient);
+
+    if (pDamageClient)
+	pDamageClient->critical += critical ? 1 : -1;
+}
+
+static int
+ProcDamageQueryVersion(ClientPtr client)
+{
+    DamageClientPtr pDamageClient = GetDamageClient (client);
+    xDamageQueryVersionReply rep;
+    register int n;
+    REQUEST(xDamageQueryVersionReq);
+
+    REQUEST_SIZE_MATCH(xDamageQueryVersionReq);
+    rep.type = X_Reply;
+    rep.length = 0;
+    rep.sequenceNumber = client->sequence;
+    if (stuff->majorVersion < SERVER_DAMAGE_MAJOR_VERSION) {
+	rep.majorVersion = stuff->majorVersion;
+	rep.minorVersion = stuff->minorVersion;
+    } else {
+	rep.majorVersion = SERVER_DAMAGE_MAJOR_VERSION;
+	if (stuff->majorVersion == SERVER_DAMAGE_MAJOR_VERSION &&
+	    stuff->minorVersion < SERVER_DAMAGE_MINOR_VERSION)
+	    rep.minorVersion = stuff->minorVersion;
+	else
+	    rep.minorVersion = SERVER_DAMAGE_MINOR_VERSION;
+    }
+    pDamageClient->major_version = rep.majorVersion;
+    pDamageClient->minor_version = rep.minorVersion;
+    if (client->swapped) {
+    	swaps(&rep.sequenceNumber, n);
+    	swapl(&rep.length, n);
+	swapl(&rep.majorVersion, n);
+	swapl(&rep.minorVersion, n);
+    }
+    WriteToClient(client, sizeof(xDamageQueryVersionReply), (char *)&rep);
+    return(client->noClientException);
+}
+
+static int
+ProcDamageCreate (ClientPtr client)
+{
+    DrawablePtr		pDrawable;
+    DamageExtPtr	pDamageExt;
+    DamageReportLevel	level;
+    RegionPtr		pRegion;
+    int			rc;
+    
+    REQUEST(xDamageCreateReq);
+
+    REQUEST_SIZE_MATCH(xDamageCreateReq);
+    LEGAL_NEW_RESOURCE(stuff->damage, client);
+    rc = dixLookupDrawable(&pDrawable, stuff->drawable, client, 0,
+			   DixGetAttrAccess|DixReadAccess);
+    if (rc != Success)
+	return rc;
+
+    switch (stuff->level) {
+    case XDamageReportRawRectangles:
+	level = DamageReportRawRegion;
+	break;
+    case XDamageReportDeltaRectangles:
+	level = DamageReportDeltaRegion;
+	break;
+    case XDamageReportBoundingBox:
+	level = DamageReportBoundingBox;
+	break;
+    case XDamageReportNonEmpty:
+	level = DamageReportNonEmpty;
+	break;
+    default:
+	client->errorValue = stuff->level;
+	return BadValue;
+    }
+    
+    pDamageExt = xalloc (sizeof (DamageExtRec));
+    if (!pDamageExt)
+	return BadAlloc;
+    pDamageExt->id = stuff->damage;
+    pDamageExt->drawable = stuff->drawable;
+    pDamageExt->pDrawable = pDrawable;
+    pDamageExt->level = level;
+    pDamageExt->pClient = client;
+    pDamageExt->pDamage = DamageCreate (DamageExtReport,
+					DamageExtDestroy,
+					level,
+					FALSE,
+					pDrawable->pScreen,
+					pDamageExt);
+    if (!pDamageExt->pDamage)
+    {
+	xfree (pDamageExt);
+	return BadAlloc;
+    }
+    if (!AddResource (stuff->damage, DamageExtType, (pointer) pDamageExt))
+	return BadAlloc;
+
+    DamageRegister (pDamageExt->pDrawable, pDamageExt->pDamage);
+
+    if (pDrawable->type == DRAWABLE_WINDOW)
+    {
+	pRegion = &((WindowPtr) pDrawable)->borderClip;
+	DamageRegionAppend(pDrawable, pRegion);
+    }
+
+    return (client->noClientException);
+}
+
+static int
+ProcDamageDestroy (ClientPtr client)
+{
+    REQUEST(xDamageDestroyReq);
+    DamageExtPtr    pDamageExt;
+
+    REQUEST_SIZE_MATCH(xDamageDestroyReq);
+    VERIFY_DAMAGEEXT(pDamageExt, stuff->damage, client, DixWriteAccess);
+    FreeResource (stuff->damage, RT_NONE);
+    return (client->noClientException);
+}
+
+static int
+ProcDamageSubtract (ClientPtr client)
+{
+    REQUEST(xDamageSubtractReq);
+    DamageExtPtr    pDamageExt;
+    RegionPtr	    pRepair;
+    RegionPtr	    pParts;
+
+    REQUEST_SIZE_MATCH(xDamageSubtractReq);
+    VERIFY_DAMAGEEXT(pDamageExt, stuff->damage, client, DixWriteAccess);
+    VERIFY_REGION_OR_NONE(pRepair, stuff->repair, client, DixWriteAccess);
+    VERIFY_REGION_OR_NONE(pParts, stuff->parts, client, DixWriteAccess);
+
+    if (pDamageExt->level != DamageReportRawRegion)
+    {
+	DamagePtr   pDamage = pDamageExt->pDamage;
+	if (pRepair)
+	{
+	    if (pParts)
+		REGION_INTERSECT (prScreen, pParts, DamageRegion (pDamage), pRepair);
+	    if (DamageSubtract (pDamage, pRepair))
+		DamageExtReport (pDamage, DamageRegion (pDamage), (void *) pDamageExt);
+	}
+	else
+	{
+	    if (pParts)
+		REGION_COPY (prScreen, pParts, DamageRegion (pDamage));
+	    DamageEmpty (pDamage);
+	}
+    }
+    return (client->noClientException);
+}
+
+static int
+ProcDamageAdd (ClientPtr client)
+{
+    REQUEST(xDamageAddReq);
+    DrawablePtr	    pDrawable;
+    RegionPtr	    pRegion;
+    int		    rc;
+
+    REQUEST_SIZE_MATCH(xDamageAddReq);
+    VERIFY_REGION(pRegion, stuff->region, client, DixWriteAccess);
+    rc = dixLookupDrawable(&pDrawable, stuff->drawable, client, 0,
+			   DixWriteAccess);
+    if (rc != Success)
+	return rc;
+
+    /* The region is relative to the drawable origin, so translate it out to
+     * screen coordinates like damage expects.
+     */
+    REGION_TRANSLATE(pScreen, pRegion, pDrawable->x, pDrawable->y);
+    DamageRegionAppend(pDrawable, pRegion);
+    REGION_TRANSLATE(pScreen, pRegion, -pDrawable->x, -pDrawable->y);
+
+    return (client->noClientException);
+}
+
+/* Major version controls available requests */
+static const int version_requests[] = {
+    X_DamageQueryVersion,	/* before client sends QueryVersion */
+    X_DamageAdd,		/* Version 1 */
+};
+
+#define NUM_VERSION_REQUESTS	(sizeof (version_requests) / sizeof (version_requests[0]))
+    
+static int (*ProcDamageVector[XDamageNumberRequests])(ClientPtr) = {
+/*************** Version 1 ******************/
+    ProcDamageQueryVersion,
+    ProcDamageCreate,
+    ProcDamageDestroy,
+    ProcDamageSubtract,
+/*************** Version 1.1 ****************/
+    ProcDamageAdd,
+};
+
+
+static int
+ProcDamageDispatch (ClientPtr client)
+{
+    REQUEST(xDamageReq);
+    DamageClientPtr pDamageClient = GetDamageClient (client);
+
+    if (pDamageClient->major_version >= NUM_VERSION_REQUESTS)
+	return BadRequest;
+    if (stuff->damageReqType > version_requests[pDamageClient->major_version])
+	return BadRequest;
+    return (*ProcDamageVector[stuff->damageReqType]) (client);
+}
+
+static int
+SProcDamageQueryVersion(ClientPtr client)
+{
+    register int n;
+    REQUEST(xDamageQueryVersionReq);
+
+    swaps(&stuff->length, n);
+    REQUEST_SIZE_MATCH(xDamageQueryVersionReq);
+    swapl(&stuff->majorVersion, n);
+    swapl(&stuff->minorVersion, n);
+    return (*ProcDamageVector[stuff->damageReqType]) (client);
+}
+
+static int
+SProcDamageCreate (ClientPtr client)
+{
+    register int n;
+    REQUEST(xDamageCreateReq);
+    
+    swaps (&stuff->length, n);
+    REQUEST_SIZE_MATCH(xDamageCreateReq);
+    swapl (&stuff->damage, n);
+    swapl (&stuff->drawable, n);
+    return (*ProcDamageVector[stuff->damageReqType]) (client);
+}
+
+static int
+SProcDamageDestroy (ClientPtr client)
+{
+    register int n;
+    REQUEST(xDamageDestroyReq);
+    
+    swaps (&stuff->length, n);
+    REQUEST_SIZE_MATCH(xDamageDestroyReq);
+    swapl (&stuff->damage, n);
+    return (*ProcDamageVector[stuff->damageReqType]) (client);
+}
+
+static int
+SProcDamageSubtract (ClientPtr client)
+{
+    register int n;
+    REQUEST(xDamageSubtractReq);
+    
+    swaps (&stuff->length, n);
+    REQUEST_SIZE_MATCH(xDamageSubtractReq);
+    swapl (&stuff->damage, n);
+    swapl (&stuff->repair, n);
+    swapl (&stuff->parts, n);
+    return (*ProcDamageVector[stuff->damageReqType]) (client);
+}
+
+static int
+SProcDamageAdd (ClientPtr client)
+{
+    register int n;
+    REQUEST(xDamageAddReq);
+
+    swaps (&stuff->length, n);
+    REQUEST_SIZE_MATCH(xDamageSubtractReq);
+    swapl (&stuff->drawable, n);
+    swapl (&stuff->region, n);
+    return (*ProcDamageVector[stuff->damageReqType]) (client);
+}
+
+static int (*SProcDamageVector[XDamageNumberRequests])(ClientPtr) = {
+/*************** Version 1 ******************/
+    SProcDamageQueryVersion,
+    SProcDamageCreate,
+    SProcDamageDestroy,
+    SProcDamageSubtract,
+/*************** Version 1.1 ****************/
+    SProcDamageAdd,
+};
+
+static int
+SProcDamageDispatch (ClientPtr client)
+{
+    REQUEST(xDamageReq);
+    if (stuff->damageReqType >= XDamageNumberRequests)
+	return BadRequest;
+    return (*SProcDamageVector[stuff->damageReqType]) (client);
+}
+
+static void
+DamageClientCallback (CallbackListPtr	*list,
+		      pointer		closure,
+		      pointer		data)
+{
+    NewClientInfoRec	*clientinfo = (NewClientInfoRec *) data;
+    ClientPtr		pClient = clientinfo->client;
+    DamageClientPtr	pDamageClient = GetDamageClient (pClient);
+
+    pDamageClient->critical = 0;
+    pDamageClient->major_version = 0;
+    pDamageClient->minor_version = 0;
+}
+
+/*ARGSUSED*/
+static void
+DamageResetProc (ExtensionEntry *extEntry)
+{
+    DeleteCallback (&ClientStateCallback, DamageClientCallback, 0);
+}
+
+static int
+FreeDamageExt (pointer value, XID did)
+{
+    DamageExtPtr    pDamageExt = (DamageExtPtr) value;
+
+    /*
+     * Get rid of the resource table entry hanging from the window id
+     */
+    pDamageExt->id = 0;
+    if (WindowDrawable(pDamageExt->pDrawable->type))
+	FreeResourceByType (pDamageExt->pDrawable->id, DamageExtWinType, TRUE);
+    if (pDamageExt->pDamage)
+    {
+	DamageUnregister (pDamageExt->pDrawable, pDamageExt->pDamage);
+	DamageDestroy (pDamageExt->pDamage);
+    }
+    xfree (pDamageExt);
+    return Success;
+}
+
+static int
+FreeDamageExtWin (pointer value, XID wid)
+{
+    DamageExtPtr    pDamageExt = (DamageExtPtr) value;
+
+    if (pDamageExt->id)
+	FreeResource (pDamageExt->id, RT_NONE);
+    return Success;
+}
+
+static void
+SDamageNotifyEvent (xDamageNotifyEvent *from,
+		    xDamageNotifyEvent *to)
+{
+    to->type = from->type;
+    cpswaps (from->sequenceNumber, to->sequenceNumber);
+    cpswapl (from->drawable, to->drawable);
+    cpswapl (from->damage, to->damage);
+    cpswaps (from->area.x, to->area.x);
+    cpswaps (from->area.y, to->area.y);
+    cpswaps (from->area.width, to->area.width);
+    cpswaps (from->area.height, to->area.height);
+    cpswaps (from->geometry.x, to->geometry.x);
+    cpswaps (from->geometry.y, to->geometry.y);
+    cpswaps (from->geometry.width, to->geometry.width);
+    cpswaps (from->geometry.height, to->geometry.height);
+}
+
+void
+DamageExtensionInit(void)
+{
+    ExtensionEntry *extEntry;
+    int		    s;
+
+    for (s = 0; s < screenInfo.numScreens; s++)
+	DamageSetup (screenInfo.screens[s]);
+
+    DamageExtType = CreateNewResourceType (FreeDamageExt, "DamageExt");
+    if (!DamageExtType)
+	return;
+
+    DamageExtWinType = CreateNewResourceType (FreeDamageExtWin, "DamageExtWin");
+    if (!DamageExtWinType)
+	return;
+
+    if (!dixRequestPrivate(DamageClientPrivateKey, sizeof (DamageClientRec)))
+	return;
+    if (!AddCallback (&ClientStateCallback, DamageClientCallback, 0))
+	return;
+
+    if ((extEntry = AddExtension(DAMAGE_NAME, XDamageNumberEvents, 
+				 XDamageNumberErrors,
+				 ProcDamageDispatch, SProcDamageDispatch,
+				 DamageResetProc, StandardMinorOpcode)) != 0)
+    {
+	DamageReqCode = (unsigned char)extEntry->base;
+	DamageEventBase = extEntry->eventBase;
+	DamageErrorBase = extEntry->errorBase;
+	EventSwapVector[DamageEventBase + XDamageNotify] =
+			(EventSwapPtr) SDamageNotifyEvent;
+    }
+}
diff --git a/xorg-server/damageext/damageextint.h b/xorg-server/damageext/damageextint.h
index 45c5ff96c..99bc57499 100644
--- a/xorg-server/damageext/damageextint.h
+++ b/xorg-server/damageext/damageextint.h
@@ -1,70 +1,71 @@
-/*
- * Copyright © 2002 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Keith Packard not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Keith Packard makes no
- * representations about the suitability of this software for any purpose.  It
- * is provided "as is" without express or implied warranty.
- *
- * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#ifndef _DAMAGEEXTINT_H_
-#define _DAMAGEEXTINT_H_
-
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include "misc.h"
-#include "os.h"
-#include "dixstruct.h"
-#include "extnsionst.h"
-#include <X11/extensions/damageproto.h>
-#include "windowstr.h"
-#include "selection.h"
-#include "scrnintstr.h"
-#include "damageext.h"
-#include "damage.h" 
-#include "xfixes.h"
-
-typedef struct _DamageClient {
-    CARD32	major_version;
-    CARD32	minor_version;
-    int		critical;
-} DamageClientRec, *DamageClientPtr;
-
-#define GetDamageClient(pClient) ((DamageClientPtr)dixLookupPrivate(&(pClient)->devPrivates, DamageClientPrivateKey))
-
-typedef struct _DamageExt {
-    DamagePtr		pDamage;
-    DrawablePtr		pDrawable;
-    DamageReportLevel	level;
-    ClientPtr		pClient;
-    XID			id;
-} DamageExtRec, *DamageExtPtr;
-
-#define VERIFY_DAMAGEEXT(pDamageExt, rid, client, mode) { \
-    int rc = dixLookupResourceByType((pointer *)&(pDamageExt), rid, \
-                                     DamageExtType, client, mode); \
-    if (rc != Success) \
-        return (rc == BadValue) ? DamageErrorBase + BadDamage : rc; \
-}
-
-void
-DamageExtSetCritical (ClientPtr pClient, Bool critical);
-
-#endif /* _DAMAGEEXTINT_H_ */
+/*
+ * Copyright © 2002 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Keith Packard not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission.  Keith Packard makes no
+ * representations about the suitability of this software for any purpose.  It
+ * is provided "as is" without express or implied warranty.
+ *
+ * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#ifndef _DAMAGEEXTINT_H_
+#define _DAMAGEEXTINT_H_
+
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include "misc.h"
+#include "os.h"
+#include "dixstruct.h"
+#include "extnsionst.h"
+#include <X11/extensions/damageproto.h>
+#include "windowstr.h"
+#include "selection.h"
+#include "scrnintstr.h"
+#include "damageext.h"
+#include "damage.h" 
+#include "xfixes.h"
+
+typedef struct _DamageClient {
+    CARD32	major_version;
+    CARD32	minor_version;
+    int		critical;
+} DamageClientRec, *DamageClientPtr;
+
+#define GetDamageClient(pClient) ((DamageClientPtr)dixLookupPrivate(&(pClient)->devPrivates, DamageClientPrivateKey))
+
+typedef struct _DamageExt {
+    DamagePtr		pDamage;
+    DrawablePtr		pDrawable;
+    DamageReportLevel	level;
+    ClientPtr		pClient;
+    XID			id;
+    XID			drawable;
+} DamageExtRec, *DamageExtPtr;
+
+#define VERIFY_DAMAGEEXT(pDamageExt, rid, client, mode) { \
+    int rc = dixLookupResourceByType((pointer *)&(pDamageExt), rid, \
+                                     DamageExtType, client, mode); \
+    if (rc != Success) \
+        return (rc == BadValue) ? DamageErrorBase + BadDamage : rc; \
+}
+
+void
+DamageExtSetCritical (ClientPtr pClient, Bool critical);
+
+#endif /* _DAMAGEEXTINT_H_ */
diff --git a/xorg-server/dix/resource.c b/xorg-server/dix/resource.c
index 91d0cfb1c..2eb1b3697 100644
--- a/xorg-server/dix/resource.c
+++ b/xorg-server/dix/resource.c
@@ -1,920 +1,928 @@
-/************************************************************
-
-Copyright 1987, 1998  The Open Group
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of The Open Group shall not be
-used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from The Open Group.
-
-
-Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
-
-                        All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its 
-documentation for any purpose and without fee is hereby granted, 
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in 
-supporting documentation, and that the name of Digital not be
-used in advertising or publicity pertaining to distribution of the
-software without specific, written prior permission.  
-
-DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
-DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
-SOFTWARE.
-
-********************************************************/
-/* The panoramix components contained the following notice */
-/*****************************************************************
-
-Copyright (c) 1991, 1997 Digital Equipment Corporation, Maynard, Massachusetts.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software.
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
-DIGITAL EQUIPMENT CORPORATION BE LIABLE FOR ANY CLAIM, DAMAGES, INCLUDING,
-BUT NOT LIMITED TO CONSEQUENTIAL OR INCIDENTAL DAMAGES, OR OTHER LIABILITY,
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
-IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of Digital Equipment Corporation
-shall not be used in advertising or otherwise to promote the sale, use or other
-dealings in this Software without prior written authorization from Digital
-Equipment Corporation.
-
-******************************************************************/
-/* XSERVER_DTRACE additions:
- * Copyright 2005-2006 Sun Microsystems, Inc.  All rights reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-/*	Routines to manage various kinds of resources:
- *
- *	CreateNewResourceType, CreateNewResourceClass, InitClientResources,
- *	FakeClientID, AddResource, FreeResource, FreeClientResources,
- *	FreeAllResources, LookupIDByType, LookupIDByClass, GetXIDRange
- */
-
-/* 
- *      A resource ID is a 32 bit quantity, the upper 2 bits of which are
- *	off-limits for client-visible resources.  The next 8 bits are
- *      used as client ID, and the low 22 bits come from the client.
- *	A resource ID is "hashed" by extracting and xoring subfields
- *      (varying with the size of the hash table).
- *
- *      It is sometimes necessary for the server to create an ID that looks
- *      like it belongs to a client.  This ID, however,  must not be one
- *      the client actually can create, or we have the potential for conflict.
- *      The 31st bit of the ID is reserved for the server's use for this
- *      purpose.  By setting CLIENT_ID(id) to the client, the SERVER_BIT to
- *      1, and an otherwise arbitrary ID in the low 22 bits, we can create a
- *      resource "owned" by the client.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <X11/X.h>
-#include "misc.h"
-#include "os.h"
-#include "resource.h"
-#include "dixstruct.h" 
-#include "opaque.h"
-#include "windowstr.h"
-#include "dixfont.h"
-#include "colormap.h"
-#include "inputstr.h"
-#include "dixevents.h"
-#include "dixgrabs.h"
-#include "cursor.h"
-#ifdef PANORAMIX
-#include "panoramiX.h"
-#include "panoramiXsrv.h"
-#endif
-#include "xace.h"
-#include <assert.h>
-#include "registry.h"
-
-#ifdef XSERVER_DTRACE
-#include <sys/types.h>
-typedef const char *string;
-#include "Xserver-dtrace.h"
-
-#define TypeNameString(t) LookupResourceName(t)
-#endif
-
-static void RebuildTable(
-    int /*client*/
-);
-
-#define SERVER_MINID 32
-
-#define INITBUCKETS 64
-#define INITHASHSIZE 6
-#define MAXHASHSIZE 11
-
-typedef struct _Resource {
-    struct _Resource	*next;
-    XID			id;
-    RESTYPE		type;
-    pointer		value;
-} ResourceRec, *ResourcePtr;
-#define NullResource ((ResourcePtr)NULL)
-
-typedef struct _ClientResource {
-    ResourcePtr *resources;
-    int		elements;
-    int		buckets;
-    int		hashsize;	/* log(2)(buckets) */
-    XID		fakeID;
-    XID		endFakeID;
-    XID		expectID;
-} ClientResourceRec;
-
-RESTYPE lastResourceType;
-static RESTYPE lastResourceClass;
-RESTYPE TypeMask;
-
-static DeleteType *DeleteFuncs = (DeleteType *)NULL;
-
-CallbackListPtr ResourceStateCallback;
-
-static _X_INLINE void
-CallResourceStateCallback(ResourceState state, ResourceRec *res)
-{
-    if (ResourceStateCallback) {
-	ResourceStateInfoRec rsi = { state, res->id, res->type, res->value };
-	CallCallbacks(&ResourceStateCallback, &rsi);
-    }
-}
-
-RESTYPE
-CreateNewResourceType(DeleteType deleteFunc, char *name)
-{
-    RESTYPE next = lastResourceType + 1;
-    DeleteType *funcs;
-
-    if (next & lastResourceClass)
-	return 0;
-    funcs = (DeleteType *)xrealloc(DeleteFuncs,
-				   (next + 1) * sizeof(DeleteType));
-    if (!funcs)
-	return 0;
-    if (!dixRegisterPrivateOffset(next, -1))
-	return 0;
-
-    lastResourceType = next;
-    DeleteFuncs = funcs;
-    DeleteFuncs[next] = deleteFunc;
-
-    /* Called even if name is NULL, to remove any previous entry */
-    RegisterResourceName(next, name);
-
-    return next;
-}
-
-RESTYPE
-CreateNewResourceClass(void)
-{
-    RESTYPE next = lastResourceClass >> 1;
-
-    if (next & lastResourceType)
-	return 0;
-    lastResourceClass = next;
-    TypeMask = next - 1;
-    return next;
-}
-
-static ClientResourceRec clientTable[MAXCLIENTS];
-
-/*****************
- * InitClientResources
- *    When a new client is created, call this to allocate space
- *    in resource table
- *****************/
-
-Bool
-InitClientResources(ClientPtr client)
-{
-    int i, j;
- 
-    if (client == serverClient)
-    {
-	lastResourceType = RT_LASTPREDEF;
-	lastResourceClass = RC_LASTPREDEF;
-	TypeMask = RC_LASTPREDEF - 1;
-	if (DeleteFuncs)
-	    xfree(DeleteFuncs);
-	DeleteFuncs = xalloc((lastResourceType + 1) * sizeof(DeleteType));
-	if (!DeleteFuncs)
-	    return FALSE;
-	DeleteFuncs[RT_NONE & TypeMask] = (DeleteType)NoopDDA;
-	DeleteFuncs[RT_WINDOW & TypeMask] = DeleteWindow;
-	DeleteFuncs[RT_PIXMAP & TypeMask] = dixDestroyPixmap;
-	DeleteFuncs[RT_GC & TypeMask] = FreeGC;
-	DeleteFuncs[RT_FONT & TypeMask] = CloseFont;
-	DeleteFuncs[RT_CURSOR & TypeMask] = FreeCursor;
-	DeleteFuncs[RT_COLORMAP & TypeMask] = FreeColormap;
-	DeleteFuncs[RT_CMAPENTRY & TypeMask] = FreeClientPixels;
-	DeleteFuncs[RT_OTHERCLIENT & TypeMask] = OtherClientGone;
-	DeleteFuncs[RT_PASSIVEGRAB & TypeMask] = DeletePassiveGrab;
-    }
-    clientTable[i = client->index].resources =
-	xalloc(INITBUCKETS*sizeof(ResourcePtr));
-    if (!clientTable[i].resources)
-	return FALSE;
-    clientTable[i].buckets = INITBUCKETS;
-    clientTable[i].elements = 0;
-    clientTable[i].hashsize = INITHASHSIZE;
-    /* Many IDs allocated from the server client are visible to clients,
-     * so we don't use the SERVER_BIT for them, but we have to start
-     * past the magic value constants used in the protocol.  For normal
-     * clients, we can start from zero, with SERVER_BIT set.
-     */
-    clientTable[i].fakeID = client->clientAsMask |
-			    (client->index ? SERVER_BIT : SERVER_MINID);
-    clientTable[i].endFakeID = (clientTable[i].fakeID | RESOURCE_ID_MASK) + 1;
-    clientTable[i].expectID = client->clientAsMask;
-    for (j=0; j<INITBUCKETS; j++) 
-    {
-        clientTable[i].resources[j] = NullResource;
-    }
-    return TRUE;
-}
-
-
-static int
-Hash(int client, XID id)
-{
-    id &= RESOURCE_ID_MASK;
-    switch (clientTable[client].hashsize)
-    {
-	case 6:
-	    return ((int)(0x03F & (id ^ (id>>6) ^ (id>>12))));
-	case 7:
-	    return ((int)(0x07F & (id ^ (id>>7) ^ (id>>13))));
-	case 8:
-	    return ((int)(0x0FF & (id ^ (id>>8) ^ (id>>16))));
-	case 9:
-	    return ((int)(0x1FF & (id ^ (id>>9))));
-	case 10:
-	    return ((int)(0x3FF & (id ^ (id>>10))));
-	case 11:
-	    return ((int)(0x7FF & (id ^ (id>>11))));
-    }
-    return -1;
-}
-
-static XID
-AvailableID(
-    int client,
-    XID id,
-    XID maxid,
-    XID goodid)
-{
-    ResourcePtr res;
-
-    if ((goodid >= id) && (goodid <= maxid))
-	return goodid;
-    for (; id <= maxid; id++)
-    {
-	res = clientTable[client].resources[Hash(client, id)];
-	while (res && (res->id != id))
-	    res = res->next;
-	if (!res)
-	    return id;
-    }
-    return 0;
-}
-
-void
-GetXIDRange(int client, Bool server, XID *minp, XID *maxp)
-{
-    XID id, maxid;
-    ResourcePtr *resp;
-    ResourcePtr res;
-    int i;
-    XID goodid;
-
-    id = (Mask)client << CLIENTOFFSET;
-    if (server)
-	id |= client ? SERVER_BIT : SERVER_MINID;
-    maxid = id | RESOURCE_ID_MASK;
-    goodid = 0;
-    for (resp = clientTable[client].resources, i = clientTable[client].buckets;
-	 --i >= 0;)
-    {
-	for (res = *resp++; res; res = res->next)
-	{
-	    if ((res->id < id) || (res->id > maxid))
-		continue;
-	    if (((res->id - id) >= (maxid - res->id)) ?
-		(goodid = AvailableID(client, id, res->id - 1, goodid)) :
-		!(goodid = AvailableID(client, res->id + 1, maxid, goodid)))
-		maxid = res->id - 1;
-	    else
-		id = res->id + 1;
-	}
-    }
-    if (id > maxid)
-	id = maxid = 0;
-    *minp = id;
-    *maxp = maxid;
-}
-
-/**
- *  GetXIDList is called by the XC-MISC extension's MiscGetXIDList function.
- *  This function tries to find count unused XIDs for the given client.  It 
- *  puts the IDs in the array pids and returns the number found, which should
- *  almost always be the number requested.
- *
- *  The circumstances that lead to a call to this function are very rare.
- *  Xlib must run out of IDs while trying to generate a request that wants
- *  multiple ID's, like the Multi-buffering CreateImageBuffers request.
- *
- *  No rocket science in the implementation; just iterate over all
- *  possible IDs for the given client and pick the first count IDs
- *  that aren't in use.  A more efficient algorithm could probably be
- *  invented, but this will be used so rarely that this should suffice.
- */
-
-unsigned int
-GetXIDList(ClientPtr pClient, unsigned count, XID *pids)
-{
-    unsigned int found = 0;
-    XID rc, id = pClient->clientAsMask;
-    XID maxid;
-    pointer val;
-
-    maxid = id | RESOURCE_ID_MASK;
-    while ( (found < count) && (id <= maxid) )
-    {
-	rc = dixLookupResourceByClass(&val, id, RC_ANY, serverClient,
-				      DixGetAttrAccess);
-	if (rc == BadValue)
-	{
-	    pids[found++] = id;
-	}
-	id++;
-    }
-    return found;
-}
-
-/*
- * Return the next usable fake client ID.
- *
- * Normally this is just the next one in line, but if we've used the last
- * in the range, we need to find a new range of safe IDs to avoid
- * over-running another client.
- */
-
-XID
-FakeClientID(int client)
-{
-    XID id, maxid;
-
-    id = clientTable[client].fakeID++;
-    if (id != clientTable[client].endFakeID)
-	return id;
-    GetXIDRange(client, TRUE, &id, &maxid);
-    if (!id) {
-	if (!client)
-	    FatalError("FakeClientID: server internal ids exhausted\n");
-	MarkClientException(clients[client]);
-	id = ((Mask)client << CLIENTOFFSET) | (SERVER_BIT * 3);
-	maxid = id | RESOURCE_ID_MASK;
-    }
-    clientTable[client].fakeID = id + 1;
-    clientTable[client].endFakeID = maxid + 1;
-    return id;
-}
-
-Bool
-AddResource(XID id, RESTYPE type, pointer value)
-{
-    int client;
-    ClientResourceRec *rrec;
-    ResourcePtr res, *head;
-    	
-#ifdef XSERVER_DTRACE
-    XSERVER_RESOURCE_ALLOC(id, type, value, TypeNameString(type));
-#endif
-    client = CLIENT_ID(id);
-    rrec = &clientTable[client];
-    if (!rrec->buckets)
-    {
-	ErrorF("[dix] AddResource(%lx, %lx, %lx), client=%d \n",
-		(unsigned long)id, type, (unsigned long)value, client);
-        FatalError("client not in use\n");
-    }
-    if ((rrec->elements >= 4*rrec->buckets) &&
-	(rrec->hashsize < MAXHASHSIZE))
-	RebuildTable(client);
-    head = &rrec->resources[Hash(client, id)];
-    res = xalloc(sizeof(ResourceRec));
-    if (!res)
-    {
-	(*DeleteFuncs[type & TypeMask])(value, id);
-	return FALSE;
-    }
-    res->next = *head;
-    res->id = id;
-    res->type = type;
-    res->value = value;
-    *head = res;
-    rrec->elements++;
-    if (!(id & SERVER_BIT) && (id >= rrec->expectID))
-	rrec->expectID = id + 1;
-    CallResourceStateCallback(ResourceStateAdding, res);
-    return TRUE;
-}
-
-static void
-RebuildTable(int client)
-{
-    int j;
-    ResourcePtr res, next;
-    ResourcePtr **tails, *resources;
-    ResourcePtr **tptr, *rptr;
-
-    /*
-     * For now, preserve insertion order, since some ddx layers depend
-     * on resources being free in the opposite order they are added.
-     */
-
-    j = 2 * clientTable[client].buckets;
-    tails = xalloc(j * sizeof(ResourcePtr *));
-    if (!tails)
-	return;
-    resources = xalloc(j * sizeof(ResourcePtr));
-    if (!resources)
-    {
-	xfree(tails);
-	return;
-    }
-    for (rptr = resources, tptr = tails; --j >= 0; rptr++, tptr++)
-    {
-	*rptr = NullResource;
-	*tptr = rptr;
-    }
-    clientTable[client].hashsize++;
-    for (j = clientTable[client].buckets,
-	 rptr = clientTable[client].resources;
-	 --j >= 0;
-	 rptr++)
-    {
-	for (res = *rptr; res; res = next)
-	{
-	    next = res->next;
-	    res->next = NullResource;
-	    tptr = &tails[Hash(client, res->id)];
-	    **tptr = res;
-	    *tptr = &res->next;
-	}
-    }
-    xfree(tails);
-    clientTable[client].buckets *= 2;
-    xfree(clientTable[client].resources);
-    clientTable[client].resources = resources;
-}
-
-void
-FreeResource(XID id, RESTYPE skipDeleteFuncType)
-{
-    int		cid;
-    ResourcePtr res;
-    ResourcePtr *prev, *head;
-    int *eltptr;
-    int		elements;
-
-    if (((cid = CLIENT_ID(id)) < MAXCLIENTS) && clientTable[cid].buckets)
-    {
-	head = &clientTable[cid].resources[Hash(cid, id)];
-	eltptr = &clientTable[cid].elements;
-
-	prev = head;
-	while ( (res = *prev) )
-	{
-	    if (res->id == id)
-	    {
-		RESTYPE rtype = res->type;
-
-#ifdef XSERVER_DTRACE
-		XSERVER_RESOURCE_FREE(res->id, res->type,
-			      res->value, TypeNameString(res->type));
-#endif		    
-		*prev = res->next;
-		elements = --*eltptr;
-
-		CallResourceStateCallback(ResourceStateFreeing, res);
-
-		if (rtype != skipDeleteFuncType)
-		    (*DeleteFuncs[rtype & TypeMask])(res->value, res->id);
-		xfree(res);
-		if (*eltptr != elements)
-		    prev = head; /* prev may no longer be valid */
-	    }
-	    else
-		prev = &res->next;
-        }
-    }
-}
-
-
-void
-FreeResourceByType(XID id, RESTYPE type, Bool skipFree)
-{
-    int		cid;
-    ResourcePtr res;
-    ResourcePtr *prev, *head;
-    if (((cid = CLIENT_ID(id)) < MAXCLIENTS) && clientTable[cid].buckets)
-    {
-	head = &clientTable[cid].resources[Hash(cid, id)];
-
-	prev = head;
-	while ( (res = *prev) )
-	{
-	    if (res->id == id && res->type == type)
-	    {
-#ifdef XSERVER_DTRACE
-		XSERVER_RESOURCE_FREE(res->id, res->type,
-			      res->value, TypeNameString(res->type));
-#endif		    		    
-		*prev = res->next;
-
-		CallResourceStateCallback(ResourceStateFreeing, res);
-
-		if (!skipFree)
-		    (*DeleteFuncs[type & TypeMask])(res->value, res->id);
-		xfree(res);
-		break;
-	    }
-	    else
-		prev = &res->next;
-        }
-    }
-}
-
-/*
- * Change the value associated with a resource id.  Caller
- * is responsible for "doing the right thing" with the old
- * data
- */
-
-Bool
-ChangeResourceValue (XID id, RESTYPE rtype, pointer value)
-{
-    int    cid;
-    ResourcePtr res;
-
-    if (((cid = CLIENT_ID(id)) < MAXCLIENTS) && clientTable[cid].buckets)
-    {
-	res = clientTable[cid].resources[Hash(cid, id)];
-
-	for (; res; res = res->next)
-	    if ((res->id == id) && (res->type == rtype))
-	    {
-		res->value = value;
-		return TRUE;
-	    }
-    }
-    return FALSE;
-}
-
-/* Note: if func adds or deletes resources, then func can get called
- * more than once for some resources.  If func adds new resources,
- * func might or might not get called for them.  func cannot both
- * add and delete an equal number of resources!
- */
-
-void
-FindClientResourcesByType(
-    ClientPtr client,
-    RESTYPE type,
-    FindResType func,
-    pointer cdata
-){
-    ResourcePtr *resources;
-    ResourcePtr this, next;
-    int i, elements;
-    int *eltptr;
-
-    if (!client)
-	client = serverClient;
-
-    resources = clientTable[client->index].resources;
-    eltptr = &clientTable[client->index].elements;
-    for (i = 0; i < clientTable[client->index].buckets; i++) 
-    {
-        for (this = resources[i]; this; this = next)
-	{
-	    next = this->next;
-	    if (!type || this->type == type) {
-		elements = *eltptr;
-		(*func)(this->value, this->id, cdata);
-		if (*eltptr != elements)
-		    next = resources[i]; /* start over */
-	    }
-	}
-    }
-}
-
-void
-FindAllClientResources(
-    ClientPtr client,
-    FindAllRes func,
-    pointer cdata
-){
-    ResourcePtr *resources;
-    ResourcePtr this, next;
-    int i, elements;
-    int *eltptr;
-
-    if (!client)
-        client = serverClient;
-
-    resources = clientTable[client->index].resources;
-    eltptr = &clientTable[client->index].elements;
-    for (i = 0; i < clientTable[client->index].buckets; i++)
-    {
-        for (this = resources[i]; this; this = next)
-        {
-            next = this->next;
-            elements = *eltptr;
-            (*func)(this->value, this->id, this->type, cdata);
-            if (*eltptr != elements)
-                next = resources[i]; /* start over */
-        }
-    }
-}
-
-
-pointer
-LookupClientResourceComplex(
-    ClientPtr client,
-    RESTYPE type,
-    FindComplexResType func,
-    pointer cdata
-){
-    ResourcePtr *resources;
-    ResourcePtr this, next;
-    pointer value;
-    int i;
-
-    if (!client)
-	client = serverClient;
-
-    resources = clientTable[client->index].resources;
-    for (i = 0; i < clientTable[client->index].buckets; i++) {
-        for (this = resources[i]; this; this = next) {
-	    next = this->next;
-	    if (!type || this->type == type) {
-		/* workaround func freeing the type as DRI1 does */
-		value = this->value;
-		if((*func)(value, this->id, cdata))
-		    return value;
-	    }
-	}
-    }
-    return NULL;
-}
-
-
-void
-FreeClientNeverRetainResources(ClientPtr client)
-{
-    ResourcePtr *resources;
-    ResourcePtr this;
-    ResourcePtr *prev;
-    int j;
-
-    if (!client)
-	return;
-
-    resources = clientTable[client->index].resources;
-    for (j=0; j < clientTable[client->index].buckets; j++) 
-    {
-	prev = &resources[j];
-        while ( (this = *prev) )
-	{
-	    RESTYPE rtype = this->type;
-	    if (rtype & RC_NEVERRETAIN)
-	    {
-#ifdef XSERVER_DTRACE
-		XSERVER_RESOURCE_FREE(this->id, this->type,
-			      this->value, TypeNameString(this->type));
-#endif		    
-		*prev = this->next;
-
-		CallResourceStateCallback(ResourceStateFreeing, this);
-
-		(*DeleteFuncs[rtype & TypeMask])(this->value, this->id);
-		xfree(this);
-	    }
-	    else
-		prev = &this->next;
-	}
-    }
-}
-
-void
-FreeClientResources(ClientPtr client)
-{
-    ResourcePtr *resources;
-    ResourcePtr this;
-    int j;
-
-    /* This routine shouldn't be called with a null client, but just in
-	case ... */
-
-    if (!client)
-	return;
-
-    HandleSaveSet(client);
-
-    resources = clientTable[client->index].resources;
-    for (j=0; j < clientTable[client->index].buckets; j++) 
-    {
-        /* It may seem silly to update the head of this resource list as
-	we delete the members, since the entire list will be deleted any way, 
-	but there are some resource deletion functions "FreeClientPixels" for 
-	one which do a LookupID on another resource id (a Colormap id in this
-	case), so the resource list must be kept valid up to the point that
-	it is deleted, so every time we delete a resource, we must update the
-	head, just like in FreeResource. I hope that this doesn't slow down
-	mass deletion appreciably. PRH */
-
-	ResourcePtr *head;
-
-	head = &resources[j];
-
-        for (this = *head; this; this = *head)
-	{
-	    RESTYPE rtype = this->type;
-#ifdef XSERVER_DTRACE
-	    XSERVER_RESOURCE_FREE(this->id, this->type,
-			  this->value, TypeNameString(this->type));
-#endif		    
-	    *head = this->next;
-
-	    CallResourceStateCallback(ResourceStateFreeing, this);
-
-	    (*DeleteFuncs[rtype & TypeMask])(this->value, this->id);
-	    xfree(this);
-	}
-    }
-    xfree(clientTable[client->index].resources);
-    clientTable[client->index].resources = NULL;
-    clientTable[client->index].buckets = 0;
-}
-
-void
-FreeAllResources(void)
-{
-    int	i;
-
-    for (i = currentMaxClients; --i >= 0; ) 
-    {
-        if (clientTable[i].buckets) 
-	    FreeClientResources(clients[i]);
-    }
-}
-
-Bool
-LegalNewID(XID id, ClientPtr client)
-{
-    pointer val;
-    int rc;
-
-#ifdef PANORAMIX
-    XID 	minid, maxid;
-
-	if (!noPanoramiXExtension) { 
-	    minid = client->clientAsMask | (client->index ? 
-			                    SERVER_BIT : SERVER_MINID);
-	    maxid = (clientTable[client->index].fakeID | RESOURCE_ID_MASK) + 1;
-            if ((id >= minid) && (id <= maxid))
-	        return TRUE;
-	}
-#endif /* PANORAMIX */
-	if (client->clientAsMask == (id & ~RESOURCE_ID_MASK))
-	{
-	    if (clientTable[client->index].expectID <= id)
-		return TRUE;
-
-	    rc = dixLookupResourceByClass(&val, id, RC_ANY, serverClient,
-					  DixGetAttrAccess);
-	    return (rc == BadValue);
-	}
-	return FALSE;
-}
-
-int
-dixLookupResourceByType(pointer *result, XID id, RESTYPE rtype,
-			ClientPtr client, Mask mode)
-{
-    int cid = CLIENT_ID(id);
-    ResourcePtr res = NULL;
-
-    *result = NULL;
-
-    if ((cid < MAXCLIENTS) && clientTable[cid].buckets) {
-	res = clientTable[cid].resources[Hash(cid, id)];
-
-	for (; res; res = res->next)
-	    if (res->id == id && res->type == rtype)
-		break;
-    }
-    if (!res)
-	return BadValue;
-
-    if (client) {
-	client->errorValue = id;
-	cid = XaceHook(XACE_RESOURCE_ACCESS, client, id, res->type,
-		       res->value, RT_NONE, NULL, mode);
-	if (cid != Success)
-	    return cid;
-    }
-
-    *result = res->value;
-    return Success;
-}
-
-int
-dixLookupResourceByClass(pointer *result, XID id, RESTYPE rclass,
-			 ClientPtr client, Mask mode)
-{
-    int cid = CLIENT_ID(id);
-    ResourcePtr res = NULL;
-
-    *result = NULL;
-
-    if ((cid < MAXCLIENTS) && clientTable[cid].buckets) {
-	res = clientTable[cid].resources[Hash(cid, id)];
-
-	for (; res; res = res->next)
-	    if (res->id == id && (res->type & rclass))
-		break;
-    }
-    if (!res)
-	return BadValue;
-
-    if (client) {
-	client->errorValue = id;
-	cid = XaceHook(XACE_RESOURCE_ACCESS, client, id, res->type,
-		       res->value, RT_NONE, NULL, mode);
-	if (cid != Success)
-	    return cid;
-    }
-
-    *result = res->value;
-    return Success;
-}
+/************************************************************
+
+Copyright 1987, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+
+Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its 
+documentation for any purpose and without fee is hereby granted, 
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in 
+supporting documentation, and that the name of Digital not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.  
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+********************************************************/
+/* The panoramix components contained the following notice */
+/*****************************************************************
+
+Copyright (c) 1991, 1997 Digital Equipment Corporation, Maynard, Massachusetts.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+DIGITAL EQUIPMENT CORPORATION BE LIABLE FOR ANY CLAIM, DAMAGES, INCLUDING,
+BUT NOT LIMITED TO CONSEQUENTIAL OR INCIDENTAL DAMAGES, OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of Digital Equipment Corporation
+shall not be used in advertising or otherwise to promote the sale, use or other
+dealings in this Software without prior written authorization from Digital
+Equipment Corporation.
+
+******************************************************************/
+/* XSERVER_DTRACE additions:
+ * Copyright 2005-2006 Sun Microsystems, Inc.  All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+/*	Routines to manage various kinds of resources:
+ *
+ *	CreateNewResourceType, CreateNewResourceClass, InitClientResources,
+ *	FakeClientID, AddResource, FreeResource, FreeClientResources,
+ *	FreeAllResources, LookupIDByType, LookupIDByClass, GetXIDRange
+ */
+
+/* 
+ *      A resource ID is a 32 bit quantity, the upper 2 bits of which are
+ *	off-limits for client-visible resources.  The next 8 bits are
+ *      used as client ID, and the low 22 bits come from the client.
+ *	A resource ID is "hashed" by extracting and xoring subfields
+ *      (varying with the size of the hash table).
+ *
+ *      It is sometimes necessary for the server to create an ID that looks
+ *      like it belongs to a client.  This ID, however,  must not be one
+ *      the client actually can create, or we have the potential for conflict.
+ *      The 31st bit of the ID is reserved for the server's use for this
+ *      purpose.  By setting CLIENT_ID(id) to the client, the SERVER_BIT to
+ *      1, and an otherwise arbitrary ID in the low 22 bits, we can create a
+ *      resource "owned" by the client.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <X11/X.h>
+#include "misc.h"
+#include "os.h"
+#include "resource.h"
+#include "dixstruct.h" 
+#include "opaque.h"
+#include "windowstr.h"
+#include "dixfont.h"
+#include "colormap.h"
+#include "inputstr.h"
+#include "dixevents.h"
+#include "dixgrabs.h"
+#include "cursor.h"
+#ifdef PANORAMIX
+#include "panoramiX.h"
+#include "panoramiXsrv.h"
+#endif
+#include "xace.h"
+#include <assert.h>
+#include "registry.h"
+
+#ifdef XSERVER_DTRACE
+#include <sys/types.h>
+typedef const char *string;
+#include "Xserver-dtrace.h"
+
+#define TypeNameString(t) LookupResourceName(t)
+#endif
+
+static void RebuildTable(
+    int /*client*/
+);
+
+#define SERVER_MINID 32
+
+#define INITBUCKETS 64
+#define INITHASHSIZE 6
+#define MAXHASHSIZE 11
+
+typedef struct _Resource {
+    struct _Resource	*next;
+    XID			id;
+    RESTYPE		type;
+    pointer		value;
+} ResourceRec, *ResourcePtr;
+#define NullResource ((ResourcePtr)NULL)
+
+typedef struct _ClientResource {
+    ResourcePtr *resources;
+    int		elements;
+    int		buckets;
+    int		hashsize;	/* log(2)(buckets) */
+    XID		fakeID;
+    XID		endFakeID;
+    XID		expectID;
+} ClientResourceRec;
+
+RESTYPE lastResourceType;
+static RESTYPE lastResourceClass;
+RESTYPE TypeMask;
+
+static DeleteType *DeleteFuncs = (DeleteType *)NULL;
+
+CallbackListPtr ResourceStateCallback;
+
+static _X_INLINE void
+CallResourceStateCallback(ResourceState state, ResourceRec *res)
+{
+    if (ResourceStateCallback) {
+	ResourceStateInfoRec rsi = { state, res->id, res->type, res->value };
+	CallCallbacks(&ResourceStateCallback, &rsi);
+    }
+}
+
+RESTYPE
+CreateNewResourceType(DeleteType deleteFunc, char *name)
+{
+    RESTYPE next = lastResourceType + 1;
+    DeleteType *funcs;
+
+    if (next & lastResourceClass)
+	return 0;
+    funcs = (DeleteType *)xrealloc(DeleteFuncs,
+				   (next + 1) * sizeof(DeleteType));
+    if (!funcs)
+	return 0;
+    if (!dixRegisterPrivateOffset(next, -1))
+	return 0;
+
+    lastResourceType = next;
+    DeleteFuncs = funcs;
+    DeleteFuncs[next] = deleteFunc;
+
+    /* Called even if name is NULL, to remove any previous entry */
+    RegisterResourceName(next, name);
+
+    return next;
+}
+
+RESTYPE
+CreateNewResourceClass(void)
+{
+    RESTYPE next = lastResourceClass >> 1;
+
+    if (next & lastResourceType)
+	return 0;
+    lastResourceClass = next;
+    TypeMask = next - 1;
+    return next;
+}
+
+static ClientResourceRec clientTable[MAXCLIENTS];
+
+/*****************
+ * InitClientResources
+ *    When a new client is created, call this to allocate space
+ *    in resource table
+ *****************/
+
+Bool
+InitClientResources(ClientPtr client)
+{
+    int i, j;
+ 
+    if (client == serverClient)
+    {
+	lastResourceType = RT_LASTPREDEF;
+	lastResourceClass = RC_LASTPREDEF;
+	TypeMask = RC_LASTPREDEF - 1;
+	if (DeleteFuncs)
+	    xfree(DeleteFuncs);
+	DeleteFuncs = xalloc((lastResourceType + 1) * sizeof(DeleteType));
+	if (!DeleteFuncs)
+	    return FALSE;
+	DeleteFuncs[RT_NONE & TypeMask] = (DeleteType)NoopDDA;
+	DeleteFuncs[RT_WINDOW & TypeMask] = DeleteWindow;
+	DeleteFuncs[RT_PIXMAP & TypeMask] = dixDestroyPixmap;
+	DeleteFuncs[RT_GC & TypeMask] = FreeGC;
+	DeleteFuncs[RT_FONT & TypeMask] = CloseFont;
+	DeleteFuncs[RT_CURSOR & TypeMask] = FreeCursor;
+	DeleteFuncs[RT_COLORMAP & TypeMask] = FreeColormap;
+	DeleteFuncs[RT_CMAPENTRY & TypeMask] = FreeClientPixels;
+	DeleteFuncs[RT_OTHERCLIENT & TypeMask] = OtherClientGone;
+	DeleteFuncs[RT_PASSIVEGRAB & TypeMask] = DeletePassiveGrab;
+    }
+    clientTable[i = client->index].resources =
+	xalloc(INITBUCKETS*sizeof(ResourcePtr));
+    if (!clientTable[i].resources)
+	return FALSE;
+    clientTable[i].buckets = INITBUCKETS;
+    clientTable[i].elements = 0;
+    clientTable[i].hashsize = INITHASHSIZE;
+    /* Many IDs allocated from the server client are visible to clients,
+     * so we don't use the SERVER_BIT for them, but we have to start
+     * past the magic value constants used in the protocol.  For normal
+     * clients, we can start from zero, with SERVER_BIT set.
+     */
+    clientTable[i].fakeID = client->clientAsMask |
+			    (client->index ? SERVER_BIT : SERVER_MINID);
+    clientTable[i].endFakeID = (clientTable[i].fakeID | RESOURCE_ID_MASK) + 1;
+    clientTable[i].expectID = client->clientAsMask;
+    for (j=0; j<INITBUCKETS; j++) 
+    {
+        clientTable[i].resources[j] = NullResource;
+    }
+    return TRUE;
+}
+
+
+static int
+Hash(int client, XID id)
+{
+    id &= RESOURCE_ID_MASK;
+    switch (clientTable[client].hashsize)
+    {
+	case 6:
+	    return ((int)(0x03F & (id ^ (id>>6) ^ (id>>12))));
+	case 7:
+	    return ((int)(0x07F & (id ^ (id>>7) ^ (id>>13))));
+	case 8:
+	    return ((int)(0x0FF & (id ^ (id>>8) ^ (id>>16))));
+	case 9:
+	    return ((int)(0x1FF & (id ^ (id>>9))));
+	case 10:
+	    return ((int)(0x3FF & (id ^ (id>>10))));
+	case 11:
+	    return ((int)(0x7FF & (id ^ (id>>11))));
+    }
+    return -1;
+}
+
+static XID
+AvailableID(
+    int client,
+    XID id,
+    XID maxid,
+    XID goodid)
+{
+    ResourcePtr res;
+
+    if ((goodid >= id) && (goodid <= maxid))
+	return goodid;
+    for (; id <= maxid; id++)
+    {
+	res = clientTable[client].resources[Hash(client, id)];
+	while (res && (res->id != id))
+	    res = res->next;
+	if (!res)
+	    return id;
+    }
+    return 0;
+}
+
+void
+GetXIDRange(int client, Bool server, XID *minp, XID *maxp)
+{
+    XID id, maxid;
+    ResourcePtr *resp;
+    ResourcePtr res;
+    int i;
+    XID goodid;
+
+    id = (Mask)client << CLIENTOFFSET;
+    if (server)
+	id |= client ? SERVER_BIT : SERVER_MINID;
+    maxid = id | RESOURCE_ID_MASK;
+    goodid = 0;
+    for (resp = clientTable[client].resources, i = clientTable[client].buckets;
+	 --i >= 0;)
+    {
+	for (res = *resp++; res; res = res->next)
+	{
+	    if ((res->id < id) || (res->id > maxid))
+		continue;
+	    if (((res->id - id) >= (maxid - res->id)) ?
+		(goodid = AvailableID(client, id, res->id - 1, goodid)) :
+		!(goodid = AvailableID(client, res->id + 1, maxid, goodid)))
+		maxid = res->id - 1;
+	    else
+		id = res->id + 1;
+	}
+    }
+    if (id > maxid)
+	id = maxid = 0;
+    *minp = id;
+    *maxp = maxid;
+}
+
+/**
+ *  GetXIDList is called by the XC-MISC extension's MiscGetXIDList function.
+ *  This function tries to find count unused XIDs for the given client.  It 
+ *  puts the IDs in the array pids and returns the number found, which should
+ *  almost always be the number requested.
+ *
+ *  The circumstances that lead to a call to this function are very rare.
+ *  Xlib must run out of IDs while trying to generate a request that wants
+ *  multiple ID's, like the Multi-buffering CreateImageBuffers request.
+ *
+ *  No rocket science in the implementation; just iterate over all
+ *  possible IDs for the given client and pick the first count IDs
+ *  that aren't in use.  A more efficient algorithm could probably be
+ *  invented, but this will be used so rarely that this should suffice.
+ */
+
+unsigned int
+GetXIDList(ClientPtr pClient, unsigned count, XID *pids)
+{
+    unsigned int found = 0;
+    XID rc, id = pClient->clientAsMask;
+    XID maxid;
+    pointer val;
+
+    maxid = id | RESOURCE_ID_MASK;
+    while ( (found < count) && (id <= maxid) )
+    {
+	rc = dixLookupResourceByClass(&val, id, RC_ANY, serverClient,
+				      DixGetAttrAccess);
+	if (rc == BadValue)
+	{
+	    pids[found++] = id;
+	}
+	id++;
+    }
+    return found;
+}
+
+/*
+ * Return the next usable fake client ID.
+ *
+ * Normally this is just the next one in line, but if we've used the last
+ * in the range, we need to find a new range of safe IDs to avoid
+ * over-running another client.
+ */
+
+XID
+FakeClientID(int client)
+{
+    XID id, maxid;
+
+    id = clientTable[client].fakeID++;
+    if (id != clientTable[client].endFakeID)
+	return id;
+    GetXIDRange(client, TRUE, &id, &maxid);
+    if (!id) {
+	if (!client)
+	    FatalError("FakeClientID: server internal ids exhausted\n");
+	MarkClientException(clients[client]);
+	id = ((Mask)client << CLIENTOFFSET) | (SERVER_BIT * 3);
+	maxid = id | RESOURCE_ID_MASK;
+    }
+    clientTable[client].fakeID = id + 1;
+    clientTable[client].endFakeID = maxid + 1;
+    return id;
+}
+
+Bool
+AddResource(XID id, RESTYPE type, pointer value)
+{
+    int client;
+    ClientResourceRec *rrec;
+    ResourcePtr res, *head;
+    	
+#ifdef XSERVER_DTRACE
+    XSERVER_RESOURCE_ALLOC(id, type, value, TypeNameString(type));
+#endif
+    client = CLIENT_ID(id);
+    rrec = &clientTable[client];
+    if (!rrec->buckets)
+    {
+	ErrorF("[dix] AddResource(%lx, %lx, %lx), client=%d \n",
+		(unsigned long)id, type, (unsigned long)value, client);
+        FatalError("client not in use\n");
+    }
+    if ((rrec->elements >= 4*rrec->buckets) &&
+	(rrec->hashsize < MAXHASHSIZE))
+	RebuildTable(client);
+    head = &rrec->resources[Hash(client, id)];
+    res = xalloc(sizeof(ResourceRec));
+    if (!res)
+    {
+	(*DeleteFuncs[type & TypeMask])(value, id);
+	return FALSE;
+    }
+    res->next = *head;
+    res->id = id;
+    res->type = type;
+    res->value = value;
+    *head = res;
+    rrec->elements++;
+    if (!(id & SERVER_BIT) && (id >= rrec->expectID))
+	rrec->expectID = id + 1;
+    CallResourceStateCallback(ResourceStateAdding, res);
+    return TRUE;
+}
+
+static void
+RebuildTable(int client)
+{
+    int j;
+    ResourcePtr res, next;
+    ResourcePtr **tails, *resources;
+    ResourcePtr **tptr, *rptr;
+
+    /*
+     * For now, preserve insertion order, since some ddx layers depend
+     * on resources being free in the opposite order they are added.
+     */
+
+    j = 2 * clientTable[client].buckets;
+    tails = xalloc(j * sizeof(ResourcePtr *));
+    if (!tails)
+	return;
+    resources = xalloc(j * sizeof(ResourcePtr));
+    if (!resources)
+    {
+	xfree(tails);
+	return;
+    }
+    for (rptr = resources, tptr = tails; --j >= 0; rptr++, tptr++)
+    {
+	*rptr = NullResource;
+	*tptr = rptr;
+    }
+    clientTable[client].hashsize++;
+    for (j = clientTable[client].buckets,
+	 rptr = clientTable[client].resources;
+	 --j >= 0;
+	 rptr++)
+    {
+	for (res = *rptr; res; res = next)
+	{
+	    next = res->next;
+	    res->next = NullResource;
+	    tptr = &tails[Hash(client, res->id)];
+	    **tptr = res;
+	    *tptr = &res->next;
+	}
+    }
+    xfree(tails);
+    clientTable[client].buckets *= 2;
+    xfree(clientTable[client].resources);
+    clientTable[client].resources = resources;
+}
+
+void
+FreeResource(XID id, RESTYPE skipDeleteFuncType)
+{
+    int		cid;
+    ResourcePtr res;
+    ResourcePtr *prev, *head;
+    int *eltptr;
+    int		elements;
+
+    if (((cid = CLIENT_ID(id)) < MAXCLIENTS) && clientTable[cid].buckets)
+    {
+	head = &clientTable[cid].resources[Hash(cid, id)];
+	eltptr = &clientTable[cid].elements;
+
+	prev = head;
+	while ( (res = *prev) )
+	{
+	    if (res->id == id)
+	    {
+		RESTYPE rtype = res->type;
+
+#ifdef XSERVER_DTRACE
+		XSERVER_RESOURCE_FREE(res->id, res->type,
+			      res->value, TypeNameString(res->type));
+#endif		    
+		*prev = res->next;
+		elements = --*eltptr;
+
+		CallResourceStateCallback(ResourceStateFreeing, res);
+
+		if (rtype != skipDeleteFuncType)
+		    (*DeleteFuncs[rtype & TypeMask])(res->value, res->id);
+		xfree(res);
+		if (*eltptr != elements)
+		    prev = head; /* prev may no longer be valid */
+	    }
+	    else
+		prev = &res->next;
+        }
+    }
+}
+
+
+void
+FreeResourceByType(XID id, RESTYPE type, Bool skipFree)
+{
+    int		cid;
+    ResourcePtr res;
+    ResourcePtr *prev, *head;
+    if (((cid = CLIENT_ID(id)) < MAXCLIENTS) && clientTable[cid].buckets)
+    {
+	head = &clientTable[cid].resources[Hash(cid, id)];
+
+	prev = head;
+	while ( (res = *prev) )
+	{
+	    if (res->id == id && res->type == type)
+	    {
+#ifdef XSERVER_DTRACE
+		XSERVER_RESOURCE_FREE(res->id, res->type,
+			      res->value, TypeNameString(res->type));
+#endif		    		    
+		*prev = res->next;
+		clientTable[cid].elements--;
+
+		CallResourceStateCallback(ResourceStateFreeing, res);
+
+		if (!skipFree)
+		    (*DeleteFuncs[type & TypeMask])(res->value, res->id);
+		xfree(res);
+		break;
+	    }
+	    else
+		prev = &res->next;
+        }
+    }
+}
+
+/*
+ * Change the value associated with a resource id.  Caller
+ * is responsible for "doing the right thing" with the old
+ * data
+ */
+
+Bool
+ChangeResourceValue (XID id, RESTYPE rtype, pointer value)
+{
+    int    cid;
+    ResourcePtr res;
+
+    if (((cid = CLIENT_ID(id)) < MAXCLIENTS) && clientTable[cid].buckets)
+    {
+	res = clientTable[cid].resources[Hash(cid, id)];
+
+	for (; res; res = res->next)
+	    if ((res->id == id) && (res->type == rtype))
+	    {
+		res->value = value;
+		return TRUE;
+	    }
+    }
+    return FALSE;
+}
+
+/* Note: if func adds or deletes resources, then func can get called
+ * more than once for some resources.  If func adds new resources,
+ * func might or might not get called for them.  func cannot both
+ * add and delete an equal number of resources!
+ */
+
+void
+FindClientResourcesByType(
+    ClientPtr client,
+    RESTYPE type,
+    FindResType func,
+    pointer cdata
+){
+    ResourcePtr *resources;
+    ResourcePtr this, next;
+    int i, elements;
+    int *eltptr;
+
+    if (!client)
+	client = serverClient;
+
+    resources = clientTable[client->index].resources;
+    eltptr = &clientTable[client->index].elements;
+    for (i = 0; i < clientTable[client->index].buckets; i++) 
+    {
+        for (this = resources[i]; this; this = next)
+	{
+	    next = this->next;
+	    if (!type || this->type == type) {
+		elements = *eltptr;
+		(*func)(this->value, this->id, cdata);
+		if (*eltptr != elements)
+		    next = resources[i]; /* start over */
+	    }
+	}
+    }
+}
+
+void
+FindAllClientResources(
+    ClientPtr client,
+    FindAllRes func,
+    pointer cdata
+){
+    ResourcePtr *resources;
+    ResourcePtr this, next;
+    int i, elements;
+    int *eltptr;
+
+    if (!client)
+        client = serverClient;
+
+    resources = clientTable[client->index].resources;
+    eltptr = &clientTable[client->index].elements;
+    for (i = 0; i < clientTable[client->index].buckets; i++)
+    {
+        for (this = resources[i]; this; this = next)
+        {
+            next = this->next;
+            elements = *eltptr;
+            (*func)(this->value, this->id, this->type, cdata);
+            if (*eltptr != elements)
+                next = resources[i]; /* start over */
+        }
+    }
+}
+
+
+pointer
+LookupClientResourceComplex(
+    ClientPtr client,
+    RESTYPE type,
+    FindComplexResType func,
+    pointer cdata
+){
+    ResourcePtr *resources;
+    ResourcePtr this, next;
+    pointer value;
+    int i;
+
+    if (!client)
+	client = serverClient;
+
+    resources = clientTable[client->index].resources;
+    for (i = 0; i < clientTable[client->index].buckets; i++) {
+        for (this = resources[i]; this; this = next) {
+	    next = this->next;
+	    if (!type || this->type == type) {
+		/* workaround func freeing the type as DRI1 does */
+		value = this->value;
+		if((*func)(value, this->id, cdata))
+		    return value;
+	    }
+	}
+    }
+    return NULL;
+}
+
+
+void
+FreeClientNeverRetainResources(ClientPtr client)
+{
+    ResourcePtr *resources;
+    ResourcePtr this;
+    ResourcePtr *prev;
+    int j, elements;
+    int *eltptr;
+
+    if (!client)
+	return;
+
+    resources = clientTable[client->index].resources;
+    eltptr = &clientTable[client->index].elements;
+    for (j=0; j < clientTable[client->index].buckets; j++) 
+    {
+	prev = &resources[j];
+        while ( (this = *prev) )
+	{
+	    RESTYPE rtype = this->type;
+	    if (rtype & RC_NEVERRETAIN)
+	    {
+#ifdef XSERVER_DTRACE
+		XSERVER_RESOURCE_FREE(this->id, this->type,
+			      this->value, TypeNameString(this->type));
+#endif		    
+		*prev = this->next;
+		clientTable[client->index].elements--;
+
+		CallResourceStateCallback(ResourceStateFreeing, this);
+
+		elements = *eltptr;
+		(*DeleteFuncs[rtype & TypeMask])(this->value, this->id);
+		xfree(this);
+		if (*eltptr != elements)
+		    prev = &resources[j]; /* prev may no longer be valid */
+	    }
+	    else
+		prev = &this->next;
+	}
+    }
+}
+
+void
+FreeClientResources(ClientPtr client)
+{
+    ResourcePtr *resources;
+    ResourcePtr this;
+    int j;
+
+    /* This routine shouldn't be called with a null client, but just in
+	case ... */
+
+    if (!client)
+	return;
+
+    HandleSaveSet(client);
+
+    resources = clientTable[client->index].resources;
+    for (j=0; j < clientTable[client->index].buckets; j++) 
+    {
+        /* It may seem silly to update the head of this resource list as
+	we delete the members, since the entire list will be deleted any way, 
+	but there are some resource deletion functions "FreeClientPixels" for 
+	one which do a LookupID on another resource id (a Colormap id in this
+	case), so the resource list must be kept valid up to the point that
+	it is deleted, so every time we delete a resource, we must update the
+	head, just like in FreeResource. I hope that this doesn't slow down
+	mass deletion appreciably. PRH */
+
+	ResourcePtr *head;
+
+	head = &resources[j];
+
+        for (this = *head; this; this = *head)
+	{
+	    RESTYPE rtype = this->type;
+#ifdef XSERVER_DTRACE
+	    XSERVER_RESOURCE_FREE(this->id, this->type,
+			  this->value, TypeNameString(this->type));
+#endif		    
+	    *head = this->next;
+	    clientTable[client->index].elements--;
+
+	    CallResourceStateCallback(ResourceStateFreeing, this);
+
+	    (*DeleteFuncs[rtype & TypeMask])(this->value, this->id);
+	    xfree(this);
+	}
+    }
+    xfree(clientTable[client->index].resources);
+    clientTable[client->index].resources = NULL;
+    clientTable[client->index].buckets = 0;
+}
+
+void
+FreeAllResources(void)
+{
+    int	i;
+
+    for (i = currentMaxClients; --i >= 0; ) 
+    {
+        if (clientTable[i].buckets) 
+	    FreeClientResources(clients[i]);
+    }
+}
+
+Bool
+LegalNewID(XID id, ClientPtr client)
+{
+    pointer val;
+    int rc;
+
+#ifdef PANORAMIX
+    XID 	minid, maxid;
+
+	if (!noPanoramiXExtension) { 
+	    minid = client->clientAsMask | (client->index ? 
+			                    SERVER_BIT : SERVER_MINID);
+	    maxid = (clientTable[client->index].fakeID | RESOURCE_ID_MASK) + 1;
+            if ((id >= minid) && (id <= maxid))
+	        return TRUE;
+	}
+#endif /* PANORAMIX */
+	if (client->clientAsMask == (id & ~RESOURCE_ID_MASK))
+	{
+	    if (clientTable[client->index].expectID <= id)
+		return TRUE;
+
+	    rc = dixLookupResourceByClass(&val, id, RC_ANY, serverClient,
+					  DixGetAttrAccess);
+	    return (rc == BadValue);
+	}
+	return FALSE;
+}
+
+int
+dixLookupResourceByType(pointer *result, XID id, RESTYPE rtype,
+			ClientPtr client, Mask mode)
+{
+    int cid = CLIENT_ID(id);
+    ResourcePtr res = NULL;
+
+    *result = NULL;
+
+    if ((cid < MAXCLIENTS) && clientTable[cid].buckets) {
+	res = clientTable[cid].resources[Hash(cid, id)];
+
+	for (; res; res = res->next)
+	    if (res->id == id && res->type == rtype)
+		break;
+    }
+    if (!res)
+	return BadValue;
+
+    if (client) {
+	client->errorValue = id;
+	cid = XaceHook(XACE_RESOURCE_ACCESS, client, id, res->type,
+		       res->value, RT_NONE, NULL, mode);
+	if (cid != Success)
+	    return cid;
+    }
+
+    *result = res->value;
+    return Success;
+}
+
+int
+dixLookupResourceByClass(pointer *result, XID id, RESTYPE rclass,
+			 ClientPtr client, Mask mode)
+{
+    int cid = CLIENT_ID(id);
+    ResourcePtr res = NULL;
+
+    *result = NULL;
+
+    if ((cid < MAXCLIENTS) && clientTable[cid].buckets) {
+	res = clientTable[cid].resources[Hash(cid, id)];
+
+	for (; res; res = res->next)
+	    if (res->id == id && (res->type & rclass))
+		break;
+    }
+    if (!res)
+	return BadValue;
+
+    if (client) {
+	client->errorValue = id;
+	cid = XaceHook(XACE_RESOURCE_ACCESS, client, id, res->type,
+		       res->value, RT_NONE, NULL, mode);
+	if (cid != Success)
+	    return cid;
+    }
+
+    *result = res->value;
+    return Success;
+}
diff --git a/xorg-server/glx/glxcmds.c b/xorg-server/glx/glxcmds.c
index 087d52ec2..1000f2179 100644
--- a/xorg-server/glx/glxcmds.c
+++ b/xorg-server/glx/glxcmds.c
@@ -1,2435 +1,2440 @@
-/*
- * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008)
- * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice including the dates of first publication and
- * either this permission notice or a reference to
- * http://oss.sgi.com/projects/FreeB/
- * shall be included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
- * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- * Except as contained in this notice, the name of Silicon Graphics, Inc.
- * shall not be used in advertising or otherwise to promote the sale, use or
- * other dealings in this Software without prior written authorization from
- * Silicon Graphics, Inc.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <string.h>
-#include <assert.h>
-
-#include "glxserver.h"
-#include <GL/glxtokens.h>
-#include <unpack.h>
-#include "g_disptab.h"
-#include <pixmapstr.h>
-#include <windowstr.h>
-#include "glxutil.h"
-#include "glxext.h"
-#include "glapitable.h"
-#include "glapi.h"
-#include "glthread.h"
-#include "dispatch.h"
-#include "indirect_dispatch.h"
-#include "indirect_table.h"
-#include "indirect_util.h"
-
-static int
-validGlxScreen(ClientPtr client, int screen, __GLXscreen **pGlxScreen, int *err)
-{
-    /*
-    ** Check if screen exists.
-    */
-    if (screen >= screenInfo.numScreens) {
-	client->errorValue = screen;
-	*err = BadValue;
-	return FALSE;
-    }
-    *pGlxScreen = glxGetScreen(screenInfo.screens[screen]);
-
-    return TRUE;
-}
-
-static int
-validGlxFBConfig(ClientPtr client, __GLXscreen *pGlxScreen, XID id,
-		 __GLXconfig **config, int *err)
-{
-    __GLXconfig *m;
-
-    for (m = pGlxScreen->fbconfigs; m != NULL; m = m->next)
-	if (m->fbconfigID == id) {
-	    *config = m;
-	    return TRUE;
-	}
-
-    client->errorValue = id;
-    *err = __glXError(GLXBadFBConfig);
-
-    return FALSE;
-}
-
-static int
-validGlxVisual(ClientPtr client, __GLXscreen *pGlxScreen, XID id,
-	       __GLXconfig **config, int *err)
-{
-    int i;
-
-    for (i = 0; i < pGlxScreen->numVisuals; i++)
- 	if (pGlxScreen->visuals[i]->visualID == id) {
-	    *config = pGlxScreen->visuals[i];
-	    return TRUE;
-	}
-
-    client->errorValue = id;
-    *err = BadValue;
-
-    return FALSE;
-}
-
-static int
-validGlxFBConfigForWindow(ClientPtr client, __GLXconfig *config,
-			  DrawablePtr pDraw, int *err)
-{
-    ScreenPtr pScreen = pDraw->pScreen;
-    VisualPtr pVisual = NULL;
-    XID vid;
-    int i;
-
-    vid = wVisual((WindowPtr)pDraw);
-    for (i = 0; i < pScreen->numVisuals; i++) {
-	if (pScreen->visuals[i].vid == vid) {
-	    pVisual = &pScreen->visuals[i];
-	    break;
-	}
-    }
-
-    /* FIXME: What exactly should we check here... */
-    if (pVisual->class != glxConvertToXVisualType(config->visualType) ||
-	!(config->drawableType & GLX_WINDOW_BIT)) {
-	client->errorValue = pDraw->id;
-	*err = BadMatch;
-	return FALSE;
-    }
-
-    return TRUE;
-}
-
-static int
-validGlxContext(ClientPtr client, XID id, int access_mode,
-		__GLXcontext **context, int *err)
-{
-    *err = dixLookupResourceByType((pointer *) context, id,
-				   __glXContextRes, client, access_mode);
-    if (*err != Success) {
-	client->errorValue = id;
-	if (*err == BadValue)
-	    *err = __glXError(GLXBadContext);
-	return FALSE;
-    }
-
-    return TRUE;
-}
-
-static int
-validGlxDrawable(ClientPtr client, XID id, int type, int access_mode,
-		 __GLXdrawable **drawable, int *err)
-{
-    int rc;
-
-    rc = dixLookupResourceByType((pointer *) drawable, id,
-				 __glXDrawableRes, client, access_mode);
-    if (rc != Success && rc != BadValue) {
-	*err = rc;
-	client->errorValue = id;
-	return FALSE;
-    }
-
-    /* If the ID of the glx drawable we looked up doesn't match the id
-     * we looked for, it's because we looked it up under the X
-     * drawable ID (see DoCreateGLXDrawable). */
-    if (rc == BadValue ||
-	(*drawable)->drawId != id ||
-	(type != GLX_DRAWABLE_ANY && type != (*drawable)->type)) {
-	client->errorValue = id;
-	switch (type) {
-	case GLX_DRAWABLE_WINDOW:
-	    *err = __glXError(GLXBadWindow);
-	    return FALSE;
-	case GLX_DRAWABLE_PIXMAP:
-	    *err = __glXError(GLXBadPixmap);
-	    return FALSE;
-	case GLX_DRAWABLE_PBUFFER:
-	    *err = __glXError(GLXBadPbuffer);
-	    return FALSE;
-	case GLX_DRAWABLE_ANY:
-	    *err = __glXError(GLXBadDrawable);
-	    return FALSE;
-	}
-    }
-
-    return TRUE;
-}
-
-void
-__glXContextDestroy(__GLXcontext *context)
-{
-    __glXFlushContextCache();
-}
-
-static void __glXdirectContextDestroy(__GLXcontext *context)
-{
-    __glXContextDestroy(context);
-    xfree(context);
-}
-
-static __GLXcontext *__glXdirectContextCreate(__GLXscreen *screen,
-					      __GLXconfig *modes,
-					      __GLXcontext *shareContext)
-{
-    __GLXcontext *context;
-
-    context = xcalloc (1, sizeof (__GLXcontext));
-    if (context == NULL)
-	return NULL;
-
-    context->destroy = __glXdirectContextDestroy;
-
-    return context;
-}
-
-/**
- * Create a GL context with the given properties.  This routine is used
- * to implement \c glXCreateContext, \c glXCreateNewContext, and
- * \c glXCreateContextWithConfigSGIX.  This works becuase of the hack way
- * that GLXFBConfigs are implemented.  Basically, the FBConfigID is the
- * same as the VisualID.
- */
-
-static int
-DoCreateContext(__GLXclientState *cl, GLXContextID gcId,
-		GLXContextID shareList, __GLXconfig *config,
-		__GLXscreen *pGlxScreen, GLboolean isDirect)
-{
-    ClientPtr client = cl->client;
-    __GLXcontext *glxc, *shareglxc;
-    int err;
-    
-    LEGAL_NEW_RESOURCE(gcId, client);
-
-    /*
-    ** Find the display list space that we want to share.  
-    **
-    ** NOTE: In a multithreaded X server, we would need to keep a reference
-    ** count for each display list so that if one client detroyed a list that 
-    ** another client was using, the list would not really be freed until it 
-    ** was no longer in use.  Since this sample implementation has no support 
-    ** for multithreaded servers, we don't do this.  
-    */
-    if (shareList == None) {
-	shareglxc = 0;
-    } else {
-	if (!validGlxContext(client, shareList, DixReadAccess,
-			     &shareglxc, &err))
-	    return err;
-
-	if (shareglxc->isDirect) {
-	    /*
-	    ** NOTE: no support for sharing display lists between direct
-	    ** contexts, even if they are in the same address space.
-	    */
-#if 0
-            /* Disabling this code seems to allow shared display lists
-             * and texture objects to work.  We'll leave it disabled for now.
-             */
-	    client->errorValue = shareList;
-	    return BadMatch;
-#endif
-	} else {
-	    /*
-	    ** Create an indirect context regardless of what the client asked
-	    ** for; this way we can share display list space with shareList.
-	    */
-	    isDirect = GL_FALSE;
-	}
-    }
-
-    /*
-    ** Allocate memory for the new context
-    */
-    if (!isDirect)
-	glxc = pGlxScreen->createContext(pGlxScreen, config, shareglxc);
-    else
-	glxc = __glXdirectContextCreate(pGlxScreen, config, shareglxc);
-    if (!glxc) {
-	return BadAlloc;
-    }
-
-    /*
-    ** Initially, setup the part of the context that could be used by
-    ** a GL core that needs windowing information (e.g., Mesa).
-    */
-    glxc->pGlxScreen = pGlxScreen;
-    glxc->config = config;
-
-    /*
-    ** Register this context as a resource.
-    */
-    if (!AddResource(gcId, __glXContextRes, (pointer)glxc)) {
-	(*glxc->destroy)(glxc);
-	client->errorValue = gcId;
-	return BadAlloc;
-    }
-    
-    /*
-    ** Finally, now that everything is working, setup the rest of the
-    ** context.
-    */
-    glxc->id = gcId;
-    glxc->share_id = shareList;
-    glxc->idExists = GL_TRUE;
-    glxc->isCurrent = GL_FALSE;
-    glxc->isDirect = isDirect;
-    glxc->renderMode = GL_RENDER;
-
-    __glXAddToContextList(glxc);
-
-    return Success;
-}
-
-int __glXDisp_CreateContext(__GLXclientState *cl, GLbyte *pc)
-{
-    xGLXCreateContextReq *req = (xGLXCreateContextReq *) pc;
-    __GLXconfig *config;
-    __GLXscreen *pGlxScreen;
-    int err;
-
-    if (!validGlxScreen(cl->client, req->screen, &pGlxScreen, &err))
-	return err;
-    if (!validGlxVisual(cl->client, pGlxScreen, req->visual, &config, &err))
-	return err;
-
-    return DoCreateContext(cl, req->context, req->shareList,
-			   config, pGlxScreen, req->isDirect);
-}
-
-int __glXDisp_CreateNewContext(__GLXclientState *cl, GLbyte *pc)
-{
-    xGLXCreateNewContextReq *req = (xGLXCreateNewContextReq *) pc;
-    __GLXconfig *config;
-    __GLXscreen *pGlxScreen;
-    int err;
-
-    if (!validGlxScreen(cl->client, req->screen, &pGlxScreen, &err))
-	return err;
-    if (!validGlxFBConfig(cl->client, pGlxScreen, req->fbconfig, &config, &err))
-	return err;
-
-    return DoCreateContext(cl, req->context, req->shareList,
-			   config, pGlxScreen, req->isDirect);
-}
-
-int __glXDisp_CreateContextWithConfigSGIX(__GLXclientState *cl, GLbyte *pc)
-{
-    xGLXCreateContextWithConfigSGIXReq *req = 
-	(xGLXCreateContextWithConfigSGIXReq *) pc;
-    __GLXconfig *config;
-    __GLXscreen *pGlxScreen;
-    int err;
-
-    if (!validGlxScreen(cl->client, req->screen, &pGlxScreen, &err))
-	return err;
-    if (!validGlxFBConfig(cl->client, pGlxScreen, req->fbconfig, &config, &err))
-	return err;
-
-    return DoCreateContext(cl, req->context, req->shareList,
-			   config, pGlxScreen, req->isDirect);
-}
-int __glXDisp_DestroyContext(__GLXclientState *cl, GLbyte *pc)
-{
-    xGLXDestroyContextReq *req = (xGLXDestroyContextReq *) pc;
-    __GLXcontext *glxc;
-    int err;
-
-    if (!validGlxContext(cl->client, req->context, DixDestroyAccess,
-			 &glxc, &err))
-	    return err;
-
-    FreeResourceByType(req->context, __glXContextRes, FALSE);
-    return Success;
-}
-
-/*****************************************************************************/
-
-/*
-** For each client, the server keeps a table of all the contexts that are
-** current for that client (each thread of a client may have its own current
-** context).  These routines add, change, and lookup contexts in the table.
-*/
-
-/*
-** Add a current context, and return the tag that will be used to refer to it.
-*/
-static int AddCurrentContext(__GLXclientState *cl, __GLXcontext *glxc)
-{
-    int i;
-    int num = cl->numCurrentContexts;
-    __GLXcontext **table = cl->currentContexts;
-
-    if (!glxc) return -1;
-    
-    /*
-    ** Try to find an empty slot and use it.
-    */
-    for (i=0; i < num; i++) {
-	if (!table[i]) {
-	    table[i] = glxc;
-	    return i+1;
-	}
-    }
-    /*
-    ** Didn't find a free slot, so we'll have to grow the table.
-    */
-    if (!num) {
-	table = (__GLXcontext **) xalloc(sizeof(__GLXcontext *));
-    } else {
-	table = (__GLXcontext **) xrealloc(table,
-					   (num+1)*sizeof(__GLXcontext *));
-    }
-    table[num] = glxc;
-    cl->currentContexts = table;
-    cl->numCurrentContexts++;
-    return num+1;
-}
-
-/*
-** Given a tag, change the current context for the corresponding entry.
-*/
-static void ChangeCurrentContext(__GLXclientState *cl, __GLXcontext *glxc,
-				GLXContextTag tag)
-{
-    __GLXcontext **table = cl->currentContexts;
-    table[tag-1] = glxc;
-}
-
-/*
-** For this implementation we have chosen to simply use the index of the
-** context's entry in the table as the context tag.  A tag must be greater
-** than 0.
-*/
-__GLXcontext *__glXLookupContextByTag(__GLXclientState *cl, GLXContextTag tag)
-{
-    int num = cl->numCurrentContexts;
-
-    if (tag < 1 || tag > num) {
-	return 0;
-    } else {
-	return cl->currentContexts[tag-1];
-    }
-}
-
-/*****************************************************************************/
-
-static void StopUsingContext(__GLXcontext *glxc)
-{
-    if (glxc) {
-	if (glxc == __glXLastContext) {
-	    /* Tell server GL library */
-	    __glXLastContext = 0;
-	}
-	glxc->isCurrent = GL_FALSE;
-	if (!glxc->idExists) {
-	    __glXFreeContext(glxc);
-	}
-    }
-}
-
-static void StartUsingContext(__GLXclientState *cl, __GLXcontext *glxc)
-{
-    glxc->isCurrent = GL_TRUE;
-    __glXLastContext = glxc;	
-}
-
-/**
- * This is a helper function to handle the legacy (pre GLX 1.3) cases
- * where passing an X window to glXMakeCurrent is valid.  Given a
- * resource ID, look up the GLX drawable if available, otherwise, make
- * sure it's an X window and create a GLX drawable one the fly.
- */
-static __GLXdrawable *
-__glXGetDrawable(__GLXcontext *glxc, GLXDrawable drawId, ClientPtr client,
-		 int *error)
-{
-    DrawablePtr pDraw;
-    __GLXdrawable *pGlxDraw;
-    int rc;
-
-    if (validGlxDrawable(client, drawId, GLX_DRAWABLE_ANY,
-			 DixWriteAccess, &pGlxDraw, &rc)) {
-	if (glxc != NULL && pGlxDraw->config != glxc->config) {
-	    client->errorValue = drawId;
-	    *error = BadMatch;
-	    return NULL;
-	}
-
-	return pGlxDraw;
-    }
-
-    /* The drawId wasn't a GLX drawable.  Make sure it's a window and
-     * create a GLXWindow for it.  Check that the drawable screen
-     * matches the context screen and that the context fbconfig is
-     * compatible with the window visual. */
-
-    rc = dixLookupDrawable(&pDraw, drawId, client, 0, DixGetAttrAccess);
-    if (rc != Success || pDraw->type != DRAWABLE_WINDOW) {
-	client->errorValue = drawId;
-	*error = __glXError(GLXBadDrawable);
-	return NULL;
-    }
-
-    if (pDraw->pScreen != glxc->pGlxScreen->pScreen) {
-	client->errorValue = pDraw->pScreen->myNum;
-	*error = BadMatch;
-	return NULL;
-    }
-
-    if (!validGlxFBConfigForWindow(client, glxc->config, pDraw, error))
-	return NULL;
-
-    pGlxDraw = glxc->pGlxScreen->createDrawable(glxc->pGlxScreen,
-						pDraw, GLX_DRAWABLE_WINDOW,
-						drawId, glxc->config);
-
-    /* since we are creating the drawablePrivate, drawId should be new */
-    if (!AddResource(drawId, __glXDrawableRes, pGlxDraw)) {
-	pGlxDraw->destroy (pGlxDraw);
-	*error = BadAlloc;
-	return NULL;
-    }
-
-    return pGlxDraw;
-}
-
-/*****************************************************************************/
-/*
-** Make an OpenGL context and drawable current.
-*/
-
-static int
-DoMakeCurrent(__GLXclientState *cl,
-	      GLXDrawable drawId, GLXDrawable readId,
-	      GLXContextID contextId, GLXContextTag tag)
-{
-    ClientPtr client = cl->client;
-    xGLXMakeCurrentReply reply;
-    __GLXcontext *glxc, *prevglxc;
-    __GLXdrawable *drawPriv = NULL;
-    __GLXdrawable *readPriv = NULL;
-    int error;
-    GLuint  mask;
-
-    /*
-    ** If one is None and the other isn't, it's a bad match.
-    */
-
-    mask  = (drawId == None)    ? (1 << 0) : 0;
-    mask |= (readId == None)    ? (1 << 1) : 0;
-    mask |= (contextId == None) ? (1 << 2) : 0;
-
-    if ( (mask != 0x00) && (mask != 0x07) ) {
-	return BadMatch;
-    }
-    
-    /*
-    ** Lookup old context.  If we have one, it must be in a usable state.
-    */
-    if (tag != 0) {
-	prevglxc = __glXLookupContextByTag(cl, tag);
-	if (!prevglxc) {
-	    /*
-	    ** Tag for previous context is invalid.
-	    */
-	    return __glXError(GLXBadContextTag);
-	}
-	if (prevglxc->renderMode != GL_RENDER) {
-	    /* Oops.  Not in render mode render. */
-	    client->errorValue = prevglxc->id;
-	    return __glXError(GLXBadContextState);
-	}
-    } else {
-	prevglxc = 0;
-    }
-
-    /*
-    ** Lookup new context.  It must not be current for someone else.
-    */
-    if (contextId != None) {
-	int  status;
-
-	if (!validGlxContext(client, contextId, DixUseAccess, &glxc, &error))
-	    return error;
-	if ((glxc != prevglxc) && glxc->isCurrent) {
-	    /* Context is current to somebody else */
-	    return BadAccess;
-	}
-
-	assert( drawId != None );
-	assert( readId != None );
-
-	drawPriv = __glXGetDrawable(glxc, drawId, client, &status);
-	if (drawPriv == NULL)
-	    return status;
-
-	readPriv = __glXGetDrawable(glxc, readId, client, &status);
-	if (readPriv == NULL)
-	    return status;
-
-    } else {
-	/* Switching to no context.  Ignore new drawable. */
-	glxc = 0;
-	drawPriv = 0;
-	readPriv = 0;
-    }
-
-
-    if (prevglxc) {
-	/*
-	** Flush the previous context if needed.
-	*/
-	if (__GLX_HAS_UNFLUSHED_CMDS(prevglxc)) {
-	    if (__glXForceCurrent(cl, tag, (int *)&error)) {
-		CALL_Flush( GET_DISPATCH(), () );
-		__GLX_NOTE_FLUSHED_CMDS(prevglxc);
-	    } else {
-		return error;
-	    }
-	}
-
-	/*
-	** Make the previous context not current.
-	*/
-	if (!(*prevglxc->loseCurrent)(prevglxc)) {
-	    return __glXError(GLXBadContext);
-	}
-	__glXFlushContextCache();
-	if (!prevglxc->isDirect) {
-	    prevglxc->drawPriv = NULL;
-	    prevglxc->readPriv = NULL;
-	}
-    }
-	
-
-    if ((glxc != 0) && !glxc->isDirect) {
-
-	glxc->drawPriv = drawPriv;
-	glxc->readPriv = readPriv;
-
-	/* make the context current */
-	if (!(*glxc->makeCurrent)(glxc)) {
-	    glxc->drawPriv = NULL;
-	    glxc->readPriv = NULL;
-	    return __glXError(GLXBadContext);
-	}
-
-	glxc->isCurrent = GL_TRUE;
-    }
-
-    if (prevglxc) {
-	ChangeCurrentContext(cl, glxc, tag);
-	StopUsingContext(prevglxc);
-    } else {
-	tag = AddCurrentContext(cl, glxc);
-    }
-
-    if (glxc) {
-	StartUsingContext(cl, glxc);
-	reply.contextTag = tag;
-    } else {
-	reply.contextTag = 0;
-    }
-
-    reply.length = 0;
-    reply.type = X_Reply;
-    reply.sequenceNumber = client->sequence;
-
-    if (client->swapped) {
-	__glXSwapMakeCurrentReply(client, &reply);
-    } else {
-	WriteToClient(client, sz_xGLXMakeCurrentReply, (char *)&reply);
-    }
-    return Success;
-}
-
-int __glXDisp_MakeCurrent(__GLXclientState *cl, GLbyte *pc)
-{
-    xGLXMakeCurrentReq *req = (xGLXMakeCurrentReq *) pc;
-
-    return DoMakeCurrent( cl, req->drawable, req->drawable,
-			  req->context, req->oldContextTag );
-}
-
-int __glXDisp_MakeContextCurrent(__GLXclientState *cl, GLbyte *pc)
-{
-    xGLXMakeContextCurrentReq *req = (xGLXMakeContextCurrentReq *) pc;
-
-    return DoMakeCurrent( cl, req->drawable, req->readdrawable,
-			  req->context, req->oldContextTag );
-}
-
-int __glXDisp_MakeCurrentReadSGI(__GLXclientState *cl, GLbyte *pc)
-{
-    xGLXMakeCurrentReadSGIReq *req = (xGLXMakeCurrentReadSGIReq *) pc;
-
-    return DoMakeCurrent( cl, req->drawable, req->readable,
-			  req->context, req->oldContextTag );
-}
-
-int __glXDisp_IsDirect(__GLXclientState *cl, GLbyte *pc)
-{
-    ClientPtr client = cl->client;
-    xGLXIsDirectReq *req = (xGLXIsDirectReq *) pc;
-    xGLXIsDirectReply reply;
-    __GLXcontext *glxc;
-    int err;
-
-    if (!validGlxContext(cl->client, req->context, DixReadAccess, &glxc, &err))
-	return err;
-
-    reply.isDirect = glxc->isDirect;
-    reply.length = 0;
-    reply.type = X_Reply;
-    reply.sequenceNumber = client->sequence;
-
-    if (client->swapped) {
-	__glXSwapIsDirectReply(client, &reply);
-    } else {
-	WriteToClient(client, sz_xGLXIsDirectReply, (char *)&reply);
-    }
-
-    return Success;
-}
-
-int __glXDisp_QueryVersion(__GLXclientState *cl, GLbyte *pc)
-{
-    ClientPtr client = cl->client;
-    xGLXQueryVersionReq *req = (xGLXQueryVersionReq *) pc;
-    xGLXQueryVersionReply reply;
-    GLuint major, minor;
-
-    major = req->majorVersion;
-    minor = req->minorVersion;
-    (void)major;
-    (void)minor;
-
-    /*
-    ** Server should take into consideration the version numbers sent by the
-    ** client if it wants to work with older clients; however, in this
-    ** implementation the server just returns its version number.
-    */
-    reply.majorVersion = glxMajorVersion;
-    reply.minorVersion = glxMinorVersion;
-    reply.length = 0;
-    reply.type = X_Reply;
-    reply.sequenceNumber = client->sequence;
-
-    if (client->swapped) {
-	__glXSwapQueryVersionReply(client, &reply);
-    } else {
-	WriteToClient(client, sz_xGLXQueryVersionReply, (char *)&reply);
-    }
-    return Success;
-}
-
-int __glXDisp_WaitGL(__GLXclientState *cl, GLbyte *pc)
-{
-    xGLXWaitGLReq *req = (xGLXWaitGLReq *)pc;
-    GLXContextTag tag = req->contextTag;
-    __GLXcontext *glxc = NULL;
-    int error;
-
-    if (tag) {
-	glxc = __glXLookupContextByTag(cl, tag);
-	if (!glxc)
-	    return __glXError(GLXBadContextTag);
-    
-	if (!__glXForceCurrent(cl, req->contextTag, &error))
-	    return error;
-
-	CALL_Finish( GET_DISPATCH(), () );
-    }
-
-    if (glxc && glxc->drawPriv->waitGL)
-	(*glxc->drawPriv->waitGL)(glxc->drawPriv);
-
-    return Success;
-}
-
-int __glXDisp_WaitX(__GLXclientState *cl, GLbyte *pc)
-{
-    xGLXWaitXReq *req = (xGLXWaitXReq *)pc;
-    GLXContextTag tag = req->contextTag;
-    __GLXcontext *glxc = NULL;
-    int error;
-
-    if (tag) {
-	glxc = __glXLookupContextByTag(cl, tag);
-	if (!glxc)
-	    return __glXError(GLXBadContextTag);
-    
-	if (!__glXForceCurrent(cl, req->contextTag, &error))
-	    return error;
-    }
-
-    if (glxc && glxc->drawPriv->waitX)
-	(*glxc->drawPriv->waitX)(glxc->drawPriv);
-
-    return Success;
-}
-
-int __glXDisp_CopyContext(__GLXclientState *cl, GLbyte *pc)
-{
-    ClientPtr client = cl->client;
-    xGLXCopyContextReq *req = (xGLXCopyContextReq *) pc;
-    GLXContextID source = req->source;
-    GLXContextID dest = req->dest;
-    GLXContextTag tag = req->contextTag;
-    unsigned long mask = req->mask;
-    __GLXcontext *src, *dst;
-    int error;
-
-    if (!validGlxContext(cl->client, source, DixReadAccess, &src, &error))
-	return error;
-    if (!validGlxContext(cl->client, dest, DixWriteAccess, &dst, &error))
-	return error;
-
-    /*
-    ** They must be in the same address space, and same screen.
-    ** NOTE: no support for direct rendering contexts here.
-    */
-    if (src->isDirect || dst->isDirect ||
-	(src->pGlxScreen != dst->pGlxScreen)) {
-	client->errorValue = source;
-	return BadMatch;
-    }
-
-    /*
-    ** The destination context must not be current for any client.
-    */
-    if (dst->isCurrent) {
-	client->errorValue = dest;
-	return BadAccess;
-    }
-
-    if (tag) {
-	__GLXcontext *tagcx = __glXLookupContextByTag(cl, tag);
-	
-	if (!tagcx) {
-	    return __glXError(GLXBadContextTag);
-	}
-	if (tagcx != src) {
-	    /*
-	    ** This would be caused by a faulty implementation of the client
-	    ** library.
-	    */
-	    return BadMatch;
-	}
-	/*
-	** In this case, glXCopyContext is in both GL and X streams, in terms
-	** of sequentiality.
-	*/
-	if (__glXForceCurrent(cl, tag, &error)) {
-	    /*
-	    ** Do whatever is needed to make sure that all preceding requests
-	    ** in both streams are completed before the copy is executed.
-	    */
-	    CALL_Finish( GET_DISPATCH(), () );
-	    __GLX_NOTE_FLUSHED_CMDS(tagcx);
-	} else {
-	    return error;
-	}
-    }
-    /*
-    ** Issue copy.  The only reason for failure is a bad mask.
-    */
-    if (!(*dst->copy)(dst, src, mask)) {
-	client->errorValue = mask;
-	return BadValue;
-    }
-    return Success;
-}
-
-enum {
-    GLX_VIS_CONFIG_UNPAIRED = 18,
-    GLX_VIS_CONFIG_PAIRED = 20
-};
-
-enum {
-    GLX_VIS_CONFIG_TOTAL = GLX_VIS_CONFIG_UNPAIRED + GLX_VIS_CONFIG_PAIRED
-};
-
-int __glXDisp_GetVisualConfigs(__GLXclientState *cl, GLbyte *pc)
-{
-    xGLXGetVisualConfigsReq *req = (xGLXGetVisualConfigsReq *) pc;
-    ClientPtr client = cl->client;
-    xGLXGetVisualConfigsReply reply;
-    __GLXscreen *pGlxScreen;
-    __GLXconfig *modes;
-    CARD32 buf[GLX_VIS_CONFIG_TOTAL];
-    int p, i, err;
-    __GLX_DECLARE_SWAP_VARIABLES;
-    __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
-
-    if (!validGlxScreen(cl->client, req->screen, &pGlxScreen, &err))
-	return err;
-
-    reply.numVisuals = pGlxScreen->numVisuals;
-    reply.numProps = GLX_VIS_CONFIG_TOTAL;
-    reply.length = (reply.numVisuals * __GLX_SIZE_CARD32 * GLX_VIS_CONFIG_TOTAL) >> 2;
-    reply.type = X_Reply;
-    reply.sequenceNumber = client->sequence;
-
-    if (client->swapped) {
-	__GLX_SWAP_SHORT(&reply.sequenceNumber);
-	__GLX_SWAP_INT(&reply.length);
-	__GLX_SWAP_INT(&reply.numVisuals);
-	__GLX_SWAP_INT(&reply.numProps);
-    }
-
-    WriteToClient(client, sz_xGLXGetVisualConfigsReply, (char *)&reply);
-
-    for (i = 0; i < pGlxScreen->numVisuals; i++) {
-	modes = pGlxScreen->visuals[i];
-
-	p = 0;
-	buf[p++] = modes->visualID;
-	buf[p++] = glxConvertToXVisualType( modes->visualType );
-	buf[p++] = (modes->renderType & GLX_RGBA_BIT) ? GL_TRUE : GL_FALSE;
-
-	buf[p++] = modes->redBits;
-	buf[p++] = modes->greenBits;
-	buf[p++] = modes->blueBits;
-	buf[p++] = modes->alphaBits;
-	buf[p++] = modes->accumRedBits;
-	buf[p++] = modes->accumGreenBits;
-	buf[p++] = modes->accumBlueBits;
-	buf[p++] = modes->accumAlphaBits;
-
-	buf[p++] = modes->doubleBufferMode;
-	buf[p++] = modes->stereoMode;
-
-	buf[p++] = modes->rgbBits;
-	buf[p++] = modes->depthBits;
-	buf[p++] = modes->stencilBits;
-	buf[p++] = modes->numAuxBuffers;
-	buf[p++] = modes->level;
-
-	assert(p == GLX_VIS_CONFIG_UNPAIRED);
-	/* 
-	** Add token/value pairs for extensions.
-	*/
-	buf[p++] = GLX_VISUAL_CAVEAT_EXT;
-	buf[p++] = modes->visualRating;
-	buf[p++] = GLX_TRANSPARENT_TYPE;
-	buf[p++] = modes->transparentPixel;
-	buf[p++] = GLX_TRANSPARENT_RED_VALUE;
-	buf[p++] = modes->transparentRed;
-	buf[p++] = GLX_TRANSPARENT_GREEN_VALUE;
-	buf[p++] = modes->transparentGreen;
-	buf[p++] = GLX_TRANSPARENT_BLUE_VALUE;
-	buf[p++] = modes->transparentBlue;
-	buf[p++] = GLX_TRANSPARENT_ALPHA_VALUE;
-	buf[p++] = modes->transparentAlpha;
-	buf[p++] = GLX_TRANSPARENT_INDEX_VALUE;
-	buf[p++] = modes->transparentIndex;
-	buf[p++] = GLX_SAMPLES_SGIS;
-	buf[p++] = modes->samples;
-	buf[p++] = GLX_SAMPLE_BUFFERS_SGIS;
-	buf[p++] = modes->sampleBuffers;
-	buf[p++] = 0; /* copy over visualSelectGroup (GLX_VISUAL_SELECT_GROUP_SGIX)? */
-	buf[p++] = 0;
-
-	assert(p == GLX_VIS_CONFIG_TOTAL);
-	if (client->swapped) {
-	    __GLX_SWAP_INT_ARRAY(buf, p);
-	}
-	WriteToClient(client, __GLX_SIZE_CARD32 * p, (char *)buf);
-    }
-    return Success;
-}
-
-#define __GLX_TOTAL_FBCONFIG_ATTRIBS (36)
-#define __GLX_FBCONFIG_ATTRIBS_LENGTH (__GLX_TOTAL_FBCONFIG_ATTRIBS * 2)
-/**
- * Send the set of GLXFBConfigs to the client.  There is not currently
- * and interface into the driver on the server-side to get GLXFBConfigs,
- * so we "invent" some based on the \c __GLXvisualConfig structures that
- * the driver does supply.
- * 
- * The reply format for both \c glXGetFBConfigs and \c glXGetFBConfigsSGIX
- * is the same, so this routine pulls double duty.
- */
-
-static int
-DoGetFBConfigs(__GLXclientState *cl, unsigned screen)
-{
-    ClientPtr client = cl->client;
-    xGLXGetFBConfigsReply reply;
-    __GLXscreen *pGlxScreen;
-    CARD32 buf[__GLX_FBCONFIG_ATTRIBS_LENGTH];
-    int p, err;
-    __GLXconfig *modes;
-    __GLX_DECLARE_SWAP_VARIABLES;
-    __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
-
-    if (!validGlxScreen(cl->client, screen, &pGlxScreen, &err))
-	return err;
-
-    reply.numFBConfigs = pGlxScreen->numFBConfigs;
-    reply.numAttribs = __GLX_TOTAL_FBCONFIG_ATTRIBS;
-    reply.length = (__GLX_FBCONFIG_ATTRIBS_LENGTH * reply.numFBConfigs);
-    reply.type = X_Reply;
-    reply.sequenceNumber = client->sequence;
-
-    if (client->swapped) {
-	__GLX_SWAP_SHORT(&reply.sequenceNumber);
-	__GLX_SWAP_INT(&reply.length);
-	__GLX_SWAP_INT(&reply.numFBConfigs);
-	__GLX_SWAP_INT(&reply.numAttribs);
-    }
-
-    WriteToClient(client, sz_xGLXGetFBConfigsReply, (char *)&reply);
-
-    for (modes = pGlxScreen->fbconfigs; modes != NULL; modes = modes->next) {
-	p = 0;
-
-#define WRITE_PAIR(tag,value) \
-    do { buf[p++] = tag ; buf[p++] = value ; } while( 0 )
-
-	WRITE_PAIR( GLX_VISUAL_ID,        modes->visualID );
-	WRITE_PAIR( GLX_FBCONFIG_ID,      modes->fbconfigID );
-	WRITE_PAIR( GLX_X_RENDERABLE,     GL_TRUE );
-
-	WRITE_PAIR( GLX_RGBA,
-		    (modes->renderType & GLX_RGBA_BIT) ? GL_TRUE : GL_FALSE );
-	WRITE_PAIR( GLX_RENDER_TYPE,      modes->renderType );
-	WRITE_PAIR( GLX_DOUBLEBUFFER,     modes->doubleBufferMode );
-	WRITE_PAIR( GLX_STEREO,           modes->stereoMode );
-
-	WRITE_PAIR( GLX_BUFFER_SIZE,      modes->rgbBits );
-	WRITE_PAIR( GLX_LEVEL,            modes->level );
-	WRITE_PAIR( GLX_AUX_BUFFERS,      modes->numAuxBuffers );
-	WRITE_PAIR( GLX_RED_SIZE,         modes->redBits );
-	WRITE_PAIR( GLX_GREEN_SIZE,       modes->greenBits );
-	WRITE_PAIR( GLX_BLUE_SIZE,        modes->blueBits );
-	WRITE_PAIR( GLX_ALPHA_SIZE,       modes->alphaBits );
-	WRITE_PAIR( GLX_ACCUM_RED_SIZE,   modes->accumRedBits );
-	WRITE_PAIR( GLX_ACCUM_GREEN_SIZE, modes->accumGreenBits );
-	WRITE_PAIR( GLX_ACCUM_BLUE_SIZE,  modes->accumBlueBits );
-	WRITE_PAIR( GLX_ACCUM_ALPHA_SIZE, modes->accumAlphaBits );
-	WRITE_PAIR( GLX_DEPTH_SIZE,       modes->depthBits );
-	WRITE_PAIR( GLX_STENCIL_SIZE,     modes->stencilBits );
-	WRITE_PAIR( GLX_X_VISUAL_TYPE,    modes->visualType );
-	WRITE_PAIR( GLX_CONFIG_CAVEAT, modes->visualRating );
-	WRITE_PAIR( GLX_TRANSPARENT_TYPE, modes->transparentPixel );
-	WRITE_PAIR( GLX_TRANSPARENT_RED_VALUE, modes->transparentRed );
-	WRITE_PAIR( GLX_TRANSPARENT_GREEN_VALUE, modes->transparentGreen );
-	WRITE_PAIR( GLX_TRANSPARENT_BLUE_VALUE, modes->transparentBlue );
-	WRITE_PAIR( GLX_TRANSPARENT_ALPHA_VALUE, modes->transparentAlpha );
-	WRITE_PAIR( GLX_TRANSPARENT_INDEX_VALUE, modes->transparentIndex );
-	WRITE_PAIR( GLX_SWAP_METHOD_OML, modes->swapMethod );
-	WRITE_PAIR( GLX_SAMPLES_SGIS, modes->samples );
-	WRITE_PAIR( GLX_SAMPLE_BUFFERS_SGIS, modes->sampleBuffers );
-	/* GLX_VISUAL_SELECT_GROUP_SGIX ? */
-	WRITE_PAIR( GLX_DRAWABLE_TYPE, modes->drawableType );
-	WRITE_PAIR( GLX_BIND_TO_TEXTURE_RGB_EXT, modes->bindToTextureRgb );
-	WRITE_PAIR( GLX_BIND_TO_TEXTURE_RGBA_EXT, modes->bindToTextureRgba );
-	WRITE_PAIR( GLX_BIND_TO_MIPMAP_TEXTURE_EXT, modes->bindToMipmapTexture );
-	WRITE_PAIR( GLX_BIND_TO_TEXTURE_TARGETS_EXT, modes->bindToTextureTargets );
-
-	if (client->swapped) {
-	    __GLX_SWAP_INT_ARRAY(buf, __GLX_FBCONFIG_ATTRIBS_LENGTH);
-	}
-	WriteToClient(client, __GLX_SIZE_CARD32 * __GLX_FBCONFIG_ATTRIBS_LENGTH,
-		      (char *)buf);
-    }
-    return Success;
-}
-
-
-int __glXDisp_GetFBConfigs(__GLXclientState *cl, GLbyte *pc)
-{
-    xGLXGetFBConfigsReq *req = (xGLXGetFBConfigsReq *) pc;
-    return DoGetFBConfigs(cl, req->screen);
-}
-
-int __glXDisp_GetFBConfigsSGIX(__GLXclientState *cl, GLbyte *pc)
-{
-    xGLXGetFBConfigsSGIXReq *req = (xGLXGetFBConfigsSGIXReq *) pc;
-    return DoGetFBConfigs(cl, req->screen);
-}
-
-GLboolean
-__glXDrawableInit(__GLXdrawable *drawable,
-		  __GLXscreen *screen, DrawablePtr pDraw, int type,
-		  XID drawId, __GLXconfig *config)
-{
-    drawable->pDraw = pDraw;
-    drawable->type = type;
-    drawable->drawId = drawId;
-    drawable->config = config;
-    drawable->eventMask = 0;
-
-    return GL_TRUE;
-}
-
-void
-__glXDrawableRelease(__GLXdrawable *drawable)
-{
-}
-
-static int 
-DoCreateGLXDrawable(ClientPtr client, __GLXscreen *pGlxScreen, __GLXconfig *config,
-		    DrawablePtr pDraw, XID glxDrawableId, int type)
-{
-    __GLXdrawable *pGlxDraw;
-
-    if (pGlxScreen->pScreen != pDraw->pScreen)
-	return BadMatch;
-
-    pGlxDraw = pGlxScreen->createDrawable(pGlxScreen, pDraw, type,
-					  glxDrawableId, config);
-    if (pGlxDraw == NULL)
-	return BadAlloc;
-
-    if (!AddResource(glxDrawableId, __glXDrawableRes, pGlxDraw)) {
-	pGlxDraw->destroy (pGlxDraw);
-	return BadAlloc;
-    }
-
-    /* Add the glx drawable under the XID of the underlying X drawable
-     * too.  That way we'll get a callback in DrawableGone and can
-     * clean up properly when the drawable is destroyed. */
-    if (pDraw->id != glxDrawableId &&
-	!AddResource(pDraw->id, __glXDrawableRes, pGlxDraw)) {
-	pGlxDraw->destroy (pGlxDraw);
-	return BadAlloc;
-    }
-
-    return Success;
-}
-
-static int
-DoCreateGLXPixmap(ClientPtr client, __GLXscreen *pGlxScreen, __GLXconfig *config,
-		  XID drawableId, XID glxDrawableId)
-{
-    DrawablePtr pDraw;
-    int err;
-
-    LEGAL_NEW_RESOURCE(glxDrawableId, client);
-
-    err = dixLookupDrawable(&pDraw, drawableId, client, 0, DixAddAccess);
-    if (err != Success) {
-	client->errorValue = drawableId;
-	return err;
-    }
-    if (pDraw->type != DRAWABLE_PIXMAP) {
-	client->errorValue = drawableId;
-	return BadPixmap;
-    }
-
-    err = DoCreateGLXDrawable(client, pGlxScreen, config, pDraw,
-			      glxDrawableId, GLX_DRAWABLE_PIXMAP);
-
-    return err;
-}
-
-static void
-determineTextureTarget(ClientPtr client, XID glxDrawableID,
-		       CARD32 *attribs, CARD32 numAttribs)
-{
-    GLenum target = 0;
-    GLenum format = 0;
-    int i, err;
-    __GLXdrawable *pGlxDraw;
-
-    if (!validGlxDrawable(client, glxDrawableID, GLX_DRAWABLE_PIXMAP,
-			  DixWriteAccess, &pGlxDraw, &err))
-	/* We just added it in CreatePixmap, so we should never get here. */
-	return;
-
-    for (i = 0; i < numAttribs; i++) {
-	if (attribs[2 * i] == GLX_TEXTURE_TARGET_EXT) {
-	    switch (attribs[2 * i + 1]) {
-	    case GLX_TEXTURE_2D_EXT:
-		target = GL_TEXTURE_2D;
-		break;
-	    case GLX_TEXTURE_RECTANGLE_EXT:
-		target = GL_TEXTURE_RECTANGLE_ARB;
-		break;
-	    }
-	}
-
-	if (attribs[2 * i] == GLX_TEXTURE_FORMAT_EXT)
-		format = attribs[2 * i + 1];
-    }
- 
-    if (!target) {
-	int w = pGlxDraw->pDraw->width, h = pGlxDraw->pDraw->height;
-	
-	if (h & (h - 1) || w & (w - 1))
-	    target = GL_TEXTURE_RECTANGLE_ARB;
-	else
-	    target = GL_TEXTURE_2D;
-    }
-
-    pGlxDraw->target = target;
-    pGlxDraw->format = format;
-}
-
-int __glXDisp_CreateGLXPixmap(__GLXclientState *cl, GLbyte *pc)
-{
-    xGLXCreateGLXPixmapReq *req = (xGLXCreateGLXPixmapReq *) pc;
-    __GLXconfig *config;
-    __GLXscreen *pGlxScreen;
-    int err;
-
-    if (!validGlxScreen(cl->client, req->screen, &pGlxScreen, &err))
-	return err;
-    if (!validGlxVisual(cl->client, pGlxScreen, req->visual, &config, &err))
-	return err;
-
-    return DoCreateGLXPixmap(cl->client, pGlxScreen, config,
-			     req->pixmap, req->glxpixmap);
-}
-
-int __glXDisp_CreatePixmap(__GLXclientState *cl, GLbyte *pc)
-{
-    xGLXCreatePixmapReq *req = (xGLXCreatePixmapReq *) pc;
-    __GLXconfig *config;
-    __GLXscreen *pGlxScreen;
-    int err;
-
-    if (!validGlxScreen(cl->client, req->screen, &pGlxScreen, &err))
-	return err;
-    if (!validGlxFBConfig(cl->client, pGlxScreen, req->fbconfig, &config, &err))
-	return err;
-
-    err = DoCreateGLXPixmap(cl->client, pGlxScreen, config,
-			    req->pixmap, req->glxpixmap);
-    if (err != Success)
-	return err;
-
-    determineTextureTarget(cl->client, req->glxpixmap,
-			   (CARD32*) (req + 1), req->numAttribs);
-
-    return Success;
-}
-
-int __glXDisp_CreateGLXPixmapWithConfigSGIX(__GLXclientState *cl, GLbyte *pc)
-{
-    xGLXCreateGLXPixmapWithConfigSGIXReq *req = 
-	(xGLXCreateGLXPixmapWithConfigSGIXReq *) pc;
-    __GLXconfig *config;
-    __GLXscreen *pGlxScreen;
-    int err;
-
-    if (!validGlxScreen(cl->client, req->screen, &pGlxScreen, &err))
-	return err;
-    if (!validGlxFBConfig(cl->client, pGlxScreen, req->fbconfig, &config, &err))
-	return err;
-
-    return DoCreateGLXPixmap(cl->client, pGlxScreen,
-			     config, req->pixmap, req->glxpixmap);
-}
-
-
-static int DoDestroyDrawable(__GLXclientState *cl, XID glxdrawable, int type)
-{
-    __GLXdrawable *pGlxDraw;
-    int err;
-
-    if (!validGlxDrawable(cl->client, glxdrawable, type,
-			  DixDestroyAccess, &pGlxDraw, &err))
-	return err;
-
-    FreeResource(glxdrawable, FALSE);
-
-    return Success;
-}
-
-int __glXDisp_DestroyGLXPixmap(__GLXclientState *cl, GLbyte *pc)
-{
-    xGLXDestroyGLXPixmapReq *req = (xGLXDestroyGLXPixmapReq *) pc;
-
-    return DoDestroyDrawable(cl, req->glxpixmap, GLX_DRAWABLE_PIXMAP);
-}
-
-int __glXDisp_DestroyPixmap(__GLXclientState *cl, GLbyte *pc)
-{
-    xGLXDestroyPixmapReq *req = (xGLXDestroyPixmapReq *) pc;
-
-    return DoDestroyDrawable(cl, req->glxpixmap, GLX_DRAWABLE_PIXMAP);
-}
-
-static int
-DoCreatePbuffer(ClientPtr client, int screenNum, XID fbconfigId,
-		int width, int height, XID glxDrawableId)
-{
-    __GLXconfig	*config;
-    __GLXscreen		*pGlxScreen;
-    PixmapPtr		 pPixmap;
-    int			 err;
-
-    LEGAL_NEW_RESOURCE(glxDrawableId, client);
-
-    if (!validGlxScreen(client, screenNum, &pGlxScreen, &err))
-	return err;
-    if (!validGlxFBConfig(client, pGlxScreen, fbconfigId, &config, &err))
-	return err;
-
-    __glXenterServer(GL_FALSE);
-    pPixmap = (*pGlxScreen->pScreen->CreatePixmap) (pGlxScreen->pScreen,
-						    width, height, config->rgbBits, 0);
-    __glXleaveServer(GL_FALSE);
-
-    /* Assign the pixmap the same id as the pbuffer and add it as a
-     * resource so it and the DRI2 drawable will be reclaimed when the
-     * pbuffer is destroyed. */
-    pPixmap->drawable.id = glxDrawableId;
-    if (!AddResource(pPixmap->drawable.id, RT_PIXMAP, pPixmap))
-	return BadAlloc;
-
-    return DoCreateGLXDrawable(client, pGlxScreen, config, &pPixmap->drawable,
-			       glxDrawableId, GLX_DRAWABLE_PBUFFER);
-}
-
-int __glXDisp_CreatePbuffer(__GLXclientState *cl, GLbyte *pc)
-{
-    xGLXCreatePbufferReq	*req = (xGLXCreatePbufferReq *) pc;
-    CARD32			*attrs;
-    int				 width, height, i;
-
-    attrs = (CARD32 *) (req + 1);
-    width = 0;
-    height = 0;
-
-    for (i = 0; i < req->numAttribs; i++) {
-	switch (attrs[i * 2]) {
-	case GLX_PBUFFER_WIDTH:
-	    width = attrs[i * 2 + 1];
-	    break;
-	case GLX_PBUFFER_HEIGHT:
-	    height = attrs[i * 2 + 1];
-	    break;
-	case GLX_LARGEST_PBUFFER:
-	case GLX_PRESERVED_CONTENTS:
-	    /* FIXME: huh... */
-	    break;
-	}
-    }
-
-    return DoCreatePbuffer(cl->client, req->screen, req->fbconfig,
-			   width, height, req->pbuffer);
-}
-
-int __glXDisp_CreateGLXPbufferSGIX(__GLXclientState *cl, GLbyte *pc)
-{
-    xGLXCreateGLXPbufferSGIXReq *req = (xGLXCreateGLXPbufferSGIXReq *) pc;
-
-    return DoCreatePbuffer(cl->client, req->screen, req->fbconfig,
-			   req->width, req->height, req->pbuffer);
-}
-
-int __glXDisp_DestroyPbuffer(__GLXclientState *cl, GLbyte *pc)
-{
-    xGLXDestroyPbufferReq *req = (xGLXDestroyPbufferReq *) pc;
-
-    return DoDestroyDrawable(cl, req->pbuffer, GLX_DRAWABLE_PBUFFER);
-}
-
-int __glXDisp_DestroyGLXPbufferSGIX(__GLXclientState *cl, GLbyte *pc)
-{
-    xGLXDestroyGLXPbufferSGIXReq *req = (xGLXDestroyGLXPbufferSGIXReq *) pc;
-
-    return DoDestroyDrawable(cl, req->pbuffer, GLX_DRAWABLE_PBUFFER);
-}
-
-static int
-DoChangeDrawableAttributes(ClientPtr client, XID glxdrawable,
-			   int numAttribs, CARD32 *attribs)
-{
-    __GLXdrawable *pGlxDraw;
-    int i, err;
-
-    if (!validGlxDrawable(client, glxdrawable, GLX_DRAWABLE_ANY,
-			  DixSetAttrAccess, &pGlxDraw, &err))
-	return err;
-
-    for (i = 0; i < numAttribs; i++) {
-	switch(attribs[i * 2]) {
-	case GLX_EVENT_MASK:
-	    /* All we do is to record the event mask so we can send it
-	     * back when queried.  We never actually clobber the
-	     * pbuffers, so we never need to send out the event. */
-	    pGlxDraw->eventMask = attribs[i * 2 + 1];
-	    break;
-	}
-    }
-
-    return Success;
-}
-
-int __glXDisp_ChangeDrawableAttributes(__GLXclientState *cl, GLbyte *pc)
-{
-    xGLXChangeDrawableAttributesReq *req =
-	(xGLXChangeDrawableAttributesReq *) pc;
-
-    return DoChangeDrawableAttributes(cl->client, req->drawable,
-				      req->numAttribs, (CARD32 *) (req + 1));
-}
-
-int __glXDisp_ChangeDrawableAttributesSGIX(__GLXclientState *cl, GLbyte *pc)
-{
-    xGLXChangeDrawableAttributesSGIXReq *req =
-	(xGLXChangeDrawableAttributesSGIXReq *)pc;
-
-    return DoChangeDrawableAttributes(cl->client, req->drawable,
-				      req->numAttribs, (CARD32 *) (req + 1));
-}
-
-int __glXDisp_CreateWindow(__GLXclientState *cl, GLbyte *pc)
-{
-    xGLXCreateWindowReq	*req = (xGLXCreateWindowReq *) pc;
-    __GLXconfig	*config;
-    __GLXscreen		*pGlxScreen;
-    ClientPtr		 client = cl->client;
-    DrawablePtr		 pDraw;
-    int			 err;
-
-    LEGAL_NEW_RESOURCE(req->glxwindow, client);
-
-    if (!validGlxScreen(client, req->screen, &pGlxScreen, &err))
-	return err;
-    if (!validGlxFBConfig(client, pGlxScreen, req->fbconfig, &config, &err))
-	return err;
-
-    err = dixLookupDrawable(&pDraw, req->window, client, 0, DixAddAccess);
-    if (err != Success || pDraw->type != DRAWABLE_WINDOW) {
-	client->errorValue = req->window;
-	return BadWindow;
-    }
-
-    if (!validGlxFBConfigForWindow(client, config, pDraw, &err))
-	return err;
-
-    return DoCreateGLXDrawable(client, pGlxScreen, config,
-			       pDraw, req->glxwindow, GLX_DRAWABLE_WINDOW);
-}
-
-int __glXDisp_DestroyWindow(__GLXclientState *cl, GLbyte *pc)
-{
-    xGLXDestroyWindowReq *req = (xGLXDestroyWindowReq *) pc;
-
-    return DoDestroyDrawable(cl, req->glxwindow, GLX_DRAWABLE_WINDOW);
-}
-
-
-/*****************************************************************************/
-
-/*
-** NOTE: There is no portable implementation for swap buffers as of
-** this time that is of value.  Consequently, this code must be
-** implemented by somebody other than SGI.
-*/
-int __glXDisp_SwapBuffers(__GLXclientState *cl, GLbyte *pc)
-{
-    ClientPtr client = cl->client;
-    xGLXSwapBuffersReq *req = (xGLXSwapBuffersReq *) pc;
-    GLXContextTag tag = req->contextTag;
-    XID drawId = req->drawable;
-    __GLXcontext *glxc = NULL;
-    __GLXdrawable *pGlxDraw;
-    int error;
-
-    if (tag) {
-	glxc = __glXLookupContextByTag(cl, tag);
-	if (!glxc) {
-	    return __glXError(GLXBadContextTag);
-	}
-	/*
-	** The calling thread is swapping its current drawable.  In this case,
-	** glxSwapBuffers is in both GL and X streams, in terms of
-	** sequentiality.
-	*/
-	if (__glXForceCurrent(cl, tag, &error)) {
-	    /*
-	    ** Do whatever is needed to make sure that all preceding requests
-	    ** in both streams are completed before the swap is executed.
-	    */
-	    CALL_Finish( GET_DISPATCH(), () );
-	    __GLX_NOTE_FLUSHED_CMDS(glxc);
-	} else {
-	    return error;
-	}
-    }
-
-    pGlxDraw = __glXGetDrawable(glxc, drawId, client, &error);
-    if (pGlxDraw == NULL)
-	return error;
-
-    if (pGlxDraw->type == DRAWABLE_WINDOW &&
-	(*pGlxDraw->swapBuffers)(cl->client, pGlxDraw) == GL_FALSE)
-	return __glXError(GLXBadDrawable);
-
-    return Success;
-}
-
-
-static int
-DoQueryContext(__GLXclientState *cl, GLXContextID gcId)
-{
-    ClientPtr client = cl->client;
-    __GLXcontext *ctx;
-    xGLXQueryContextInfoEXTReply reply;
-    int nProps;
-    int *sendBuf, *pSendBuf;
-    int nReplyBytes;
-    int err;
-
-    if (!validGlxContext(cl->client, gcId, DixReadAccess, &ctx, &err))
-	return err;
-
-    nProps = 3;
-    reply.length = nProps << 1;
-    reply.type = X_Reply;
-    reply.sequenceNumber = client->sequence;
-    reply.n = nProps;
-
-    nReplyBytes = reply.length << 2;
-    sendBuf = (int *)xalloc((size_t)nReplyBytes);
-    if (sendBuf == NULL) {
-	return __glXError(GLXBadContext);	/* XXX: Is this correct? */
-    }
-    pSendBuf = sendBuf;
-    *pSendBuf++ = GLX_SHARE_CONTEXT_EXT;
-    *pSendBuf++ = (int)(ctx->share_id);
-    *pSendBuf++ = GLX_VISUAL_ID_EXT;
-    *pSendBuf++ = (int)(ctx->config->visualID);
-    *pSendBuf++ = GLX_SCREEN_EXT;
-    *pSendBuf++ = (int)(ctx->pGlxScreen->pScreen->myNum);
-
-    if (client->swapped) {
-	__glXSwapQueryContextInfoEXTReply(client, &reply, sendBuf);
-    } else {
-	WriteToClient(client, sz_xGLXQueryContextInfoEXTReply, (char *)&reply);
-	WriteToClient(client, nReplyBytes, (char *)sendBuf);
-    }
-    xfree((char *)sendBuf);
-
-    return Success;
-}
-
-int __glXDisp_QueryContextInfoEXT(__GLXclientState *cl, GLbyte *pc)
-{
-    xGLXQueryContextInfoEXTReq *req = (xGLXQueryContextInfoEXTReq *) pc;
-
-    return DoQueryContext(cl, req->context);
-}
-
-int __glXDisp_QueryContext(__GLXclientState *cl, GLbyte *pc)
-{
-    xGLXQueryContextReq *req = (xGLXQueryContextReq *) pc;
-
-    return DoQueryContext(cl, req->context);
-}
-
-int __glXDisp_BindTexImageEXT(__GLXclientState *cl, GLbyte *pc)
-{
-    xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *) pc;
-    ClientPtr		 client = cl->client;
-    __GLXcontext	*context;
-    __GLXdrawable	*pGlxDraw;
-    GLXDrawable		 drawId;
-    int			 buffer;
-    int			 error;
-
-    pc += __GLX_VENDPRIV_HDR_SIZE;
-
-    drawId = *((CARD32 *) (pc));
-    buffer = *((INT32 *)  (pc + 4));
-
-    if (buffer != GLX_FRONT_LEFT_EXT)
-	return __glXError(GLXBadPixmap);
-
-    context = __glXForceCurrent (cl, req->contextTag, &error);
-    if (!context)
-	return error;
-
-    if (!validGlxDrawable(client, drawId, GLX_DRAWABLE_PIXMAP,
-			  DixReadAccess, &pGlxDraw, &error))
-	return error;
-
-    if (!context->textureFromPixmap)
-	return __glXError(GLXUnsupportedPrivateRequest);
-
-    return context->textureFromPixmap->bindTexImage(context,
-						    buffer,
-						    pGlxDraw);
-}
-
-int __glXDisp_ReleaseTexImageEXT(__GLXclientState *cl, GLbyte *pc)
-{
-    xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *) pc;
-    ClientPtr		 client = cl->client;
-    __GLXdrawable	*pGlxDraw;
-    __GLXcontext	*context;
-    GLXDrawable		 drawId;
-    int			 buffer;
-    int			 error;
-
-    pc += __GLX_VENDPRIV_HDR_SIZE;
-
-    drawId = *((CARD32 *) (pc));
-    buffer = *((INT32 *)  (pc + 4));
-    
-    context = __glXForceCurrent (cl, req->contextTag, &error);
-    if (!context)
-	return error;
-
-    if (!validGlxDrawable(client, drawId, GLX_DRAWABLE_PIXMAP,
-			  DixReadAccess, &pGlxDraw, &error))
-	return error;
-
-    if (!context->textureFromPixmap)
-	return __glXError(GLXUnsupportedPrivateRequest);
-
-    return context->textureFromPixmap->releaseTexImage(context,
-						       buffer,
-						       pGlxDraw);
-}
-
-int __glXDisp_CopySubBufferMESA(__GLXclientState *cl, GLbyte *pc)
-{
-    xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *) pc;
-    GLXContextTag         tag = req->contextTag;
-    __GLXcontext         *glxc = NULL;
-    __GLXdrawable        *pGlxDraw;
-    ClientPtr		  client = cl->client;
-    GLXDrawable		  drawId;
-    int                   error;
-    int                   x, y, width, height;
-
-    (void) client;
-    (void) req;
-
-    pc += __GLX_VENDPRIV_HDR_SIZE;
-
-    drawId = *((CARD32 *) (pc));
-    x      = *((INT32 *)  (pc + 4));
-    y      = *((INT32 *)  (pc + 8));
-    width  = *((INT32 *)  (pc + 12));
-    height = *((INT32 *)  (pc + 16));
-
-    if (tag) {
-	glxc = __glXLookupContextByTag(cl, tag);
-	if (!glxc) {
-	    return __glXError(GLXBadContextTag);
-	}
-	/*
-	** The calling thread is swapping its current drawable.  In this case,
-	** glxSwapBuffers is in both GL and X streams, in terms of
-	** sequentiality.
-	*/
-	if (__glXForceCurrent(cl, tag, &error)) {
-	    /*
-	    ** Do whatever is needed to make sure that all preceding requests
-	    ** in both streams are completed before the swap is executed.
-	    */
-	    CALL_Finish( GET_DISPATCH(), () );
-	    __GLX_NOTE_FLUSHED_CMDS(glxc);
-	} else {
-	    return error;
-	}
-    }
-
-    pGlxDraw = __glXGetDrawable(glxc, drawId, client, &error);
-    if (!pGlxDraw)
-	return error;
-
-    if (pGlxDraw == NULL ||
-	pGlxDraw->type != GLX_DRAWABLE_WINDOW ||
-	pGlxDraw->copySubBuffer == NULL)
-	return __glXError(GLXBadDrawable);
-
-    (*pGlxDraw->copySubBuffer)(pGlxDraw, x, y, width, height);
-
-    return Success;
-}
-
-/*
-** Get drawable attributes
-*/
-static int
-DoGetDrawableAttributes(__GLXclientState *cl, XID drawId)
-{
-    ClientPtr client = cl->client;
-    xGLXGetDrawableAttributesReply reply;
-    __GLXdrawable *pGlxDraw;
-    CARD32 attributes[6];
-    int numAttribs, error;
-
-    if (!validGlxDrawable(client, drawId, GLX_DRAWABLE_ANY,
-			  DixGetAttrAccess, &pGlxDraw, &error))
-	return error;
-
-    numAttribs = 3;
-    reply.length = numAttribs << 1;
-    reply.type = X_Reply;
-    reply.sequenceNumber = client->sequence;
-    reply.numAttribs = numAttribs;
-
-    attributes[0] = GLX_TEXTURE_TARGET_EXT;
-    attributes[1] = pGlxDraw->target == GL_TEXTURE_2D ? GLX_TEXTURE_2D_EXT :
-	GLX_TEXTURE_RECTANGLE_EXT;
-    attributes[2] = GLX_Y_INVERTED_EXT;
-    attributes[3] = GL_FALSE;
-    attributes[4] = GLX_EVENT_MASK;
-    attributes[5] = pGlxDraw->eventMask;
-
-    if (client->swapped) {
-	__glXSwapGetDrawableAttributesReply(client, &reply, attributes);
-    } else {
-	WriteToClient(client, sz_xGLXGetDrawableAttributesReply,
-		      (char *)&reply);
-	WriteToClient(client, reply.length * sizeof (CARD32),
-		      (char *)attributes);
-    }
-
-    return Success;
-}
-
-int __glXDisp_GetDrawableAttributes(__GLXclientState *cl, GLbyte *pc)
-{
-    xGLXGetDrawableAttributesReq *req = (xGLXGetDrawableAttributesReq *)pc;
-
-    return DoGetDrawableAttributes(cl, req->drawable);
-}
-
-int __glXDisp_GetDrawableAttributesSGIX(__GLXclientState *cl, GLbyte *pc)
-{
-    xGLXGetDrawableAttributesSGIXReq *req =
-	(xGLXGetDrawableAttributesSGIXReq *)pc;
-    
-    return DoGetDrawableAttributes(cl, req->drawable);
-}
-
-/************************************************************************/
-
-/*
-** Render and Renderlarge are not in the GLX API.  They are used by the GLX
-** client library to send batches of GL rendering commands.
-*/
-
-/*
-** Execute all the drawing commands in a request.
-*/
-int __glXDisp_Render(__GLXclientState *cl, GLbyte *pc)
-{
-    xGLXRenderReq *req;
-    ClientPtr client= cl->client;
-    int left, cmdlen, error;
-    int commandsDone;
-    CARD16 opcode;
-    __GLXrenderHeader *hdr;
-    __GLXcontext *glxc;
-    __GLX_DECLARE_SWAP_VARIABLES;
-
-    req = (xGLXRenderReq *) pc;
-    if (client->swapped) {
-	__GLX_SWAP_SHORT(&req->length);
-	__GLX_SWAP_INT(&req->contextTag);
-    }
-
-    glxc = __glXForceCurrent(cl, req->contextTag, &error);
-    if (!glxc) {
-	return error;
-    }
-
-    commandsDone = 0;
-    pc += sz_xGLXRenderReq;
-    left = (req->length << 2) - sz_xGLXRenderReq;
-    while (left > 0) {
-        __GLXrenderSizeData entry;
-        int extra;
-	__GLXdispatchRenderProcPtr proc;
-	int err;
-
-	/*
-	** Verify that the header length and the overall length agree.
-	** Also, each command must be word aligned.
-	*/
-	hdr = (__GLXrenderHeader *) pc;
-	if (client->swapped) {
-	    __GLX_SWAP_SHORT(&hdr->length);
-	    __GLX_SWAP_SHORT(&hdr->opcode);
-	}
-	cmdlen = hdr->length;
-	opcode = hdr->opcode;
-
-	/*
-	** Check for core opcodes and grab entry data.
-	*/
-	err = __glXGetProtocolSizeData(& Render_dispatch_info, opcode, & entry);
-	proc = (__GLXdispatchRenderProcPtr)
-	    __glXGetProtocolDecodeFunction(& Render_dispatch_info,
-					   opcode, client->swapped);
-
-	if ((err < 0) || (proc == NULL)) {
-	    client->errorValue = commandsDone;
-	    return __glXError(GLXBadRenderRequest);
-	}
-
-        if (entry.varsize) {
-            /* variable size command */
-            extra = (*entry.varsize)(pc + __GLX_RENDER_HDR_SIZE,
-				     client->swapped);
-            if (extra < 0) {
-                extra = 0;
-            }
-            if (cmdlen != __GLX_PAD(entry.bytes + extra)) {
-                return BadLength;
-            }
-        } else {
-            /* constant size command */
-            if (cmdlen != __GLX_PAD(entry.bytes)) {
-                return BadLength;
-            }
-        }
-	if (left < cmdlen) {
-	    return BadLength;
-	}
-
-	/*
-	** Skip over the header and execute the command.  We allow the
-	** caller to trash the command memory.  This is useful especially
-	** for things that require double alignment - they can just shift
-	** the data towards lower memory (trashing the header) by 4 bytes
-	** and achieve the required alignment.
-	*/
-	(*proc)(pc + __GLX_RENDER_HDR_SIZE);
-	pc += cmdlen;
-	left -= cmdlen;
-	commandsDone++;
-    }
-    __GLX_NOTE_UNFLUSHED_CMDS(glxc);
-    return Success;
-}
-
-
-/*
-** Execute a large rendering request (one that spans multiple X requests).
-*/
-int __glXDisp_RenderLarge(__GLXclientState *cl, GLbyte *pc)
-{
-    xGLXRenderLargeReq *req;
-    ClientPtr client= cl->client;
-    size_t dataBytes;
-    __GLXrenderLargeHeader *hdr;
-    __GLXcontext *glxc;
-    int error;
-    CARD16 opcode;
-    __GLX_DECLARE_SWAP_VARIABLES;
-    
-    req = (xGLXRenderLargeReq *) pc;
-    if (client->swapped) {
-	__GLX_SWAP_SHORT(&req->length);
-	__GLX_SWAP_INT(&req->contextTag);
-	__GLX_SWAP_INT(&req->dataBytes);
-	__GLX_SWAP_SHORT(&req->requestNumber);
-	__GLX_SWAP_SHORT(&req->requestTotal);
-    }
-
-    glxc = __glXForceCurrent(cl, req->contextTag, &error);
-    if (!glxc) {
-	/* Reset in case this isn't 1st request. */
-	__glXResetLargeCommandStatus(cl);
-	return error;
-    }
-    dataBytes = req->dataBytes;
-
-    /*
-    ** Check the request length.
-    */
-    if ((req->length << 2) != __GLX_PAD(dataBytes) + sz_xGLXRenderLargeReq) {
-	client->errorValue = req->length;
-	/* Reset in case this isn't 1st request. */
-	__glXResetLargeCommandStatus(cl);
-	return BadLength;
-    }
-    pc += sz_xGLXRenderLargeReq;
-    
-    if (cl->largeCmdRequestsSoFar == 0) {
-	__GLXrenderSizeData entry;
-	int extra;
-	size_t cmdlen;
-	int err;
-
-	/*
-	** This is the first request of a multi request command.
-	** Make enough space in the buffer, then copy the entire request.
-	*/
-	if (req->requestNumber != 1) {
-	    client->errorValue = req->requestNumber;
-	    return __glXError(GLXBadLargeRequest);
-	}
-
-	hdr = (__GLXrenderLargeHeader *) pc;
-	if (client->swapped) {
-	    __GLX_SWAP_INT(&hdr->length);
-	    __GLX_SWAP_INT(&hdr->opcode);
-	}
-	cmdlen = hdr->length;
-	opcode = hdr->opcode;
-
-	/*
-	** Check for core opcodes and grab entry data.
-	*/
-	err = __glXGetProtocolSizeData(& Render_dispatch_info, opcode, & entry);
-	if (err < 0) {
-	    client->errorValue = opcode;
-	    return __glXError(GLXBadLargeRequest);
-	}
-
-	if (entry.varsize) {
-	    /*
-	    ** If it's a variable-size command (a command whose length must
-	    ** be computed from its parameters), all the parameters needed
-	    ** will be in the 1st request, so it's okay to do this.
-	    */
-	    extra = (*entry.varsize)(pc + __GLX_RENDER_LARGE_HDR_SIZE,
-				     client->swapped);
-	    if (extra < 0) {
-		extra = 0;
-	    }
-	    /* large command's header is 4 bytes longer, so add 4 */
-	    if (cmdlen != __GLX_PAD(entry.bytes + 4 + extra)) {
-		return BadLength;
-	    }
-	} else {
-	    /* constant size command */
-	    if (cmdlen != __GLX_PAD(entry.bytes + 4)) {
-		return BadLength;
-	    }
-	}
-	/*
-	** Make enough space in the buffer, then copy the entire request.
-	*/
-	if (cl->largeCmdBufSize < cmdlen) {
-	    if (!cl->largeCmdBuf) {
-		cl->largeCmdBuf = (GLbyte *) xalloc(cmdlen);
-	    } else {
-		cl->largeCmdBuf = (GLbyte *) xrealloc(cl->largeCmdBuf, cmdlen);
-	    }
-	    if (!cl->largeCmdBuf) {
-		return BadAlloc;
-	    }
-	    cl->largeCmdBufSize = cmdlen;
-	}
-	memcpy(cl->largeCmdBuf, pc, dataBytes);
-
-	cl->largeCmdBytesSoFar = dataBytes;
-	cl->largeCmdBytesTotal = cmdlen;
-	cl->largeCmdRequestsSoFar = 1;
-	cl->largeCmdRequestsTotal = req->requestTotal;
-	return Success;
-	
-    } else {
-	/*
-	** We are receiving subsequent (i.e. not the first) requests of a
-	** multi request command.
-	*/
-
-	/*
-	** Check the request number and the total request count.
-	*/
-	if (req->requestNumber != cl->largeCmdRequestsSoFar + 1) {
-	    client->errorValue = req->requestNumber;
-	    __glXResetLargeCommandStatus(cl);
-	    return __glXError(GLXBadLargeRequest);
-	}
-	if (req->requestTotal != cl->largeCmdRequestsTotal) {
-	    client->errorValue = req->requestTotal;
-	    __glXResetLargeCommandStatus(cl);
-	    return __glXError(GLXBadLargeRequest);
-	}
-
-	/*
-	** Check that we didn't get too much data.
-	*/
-	if ((cl->largeCmdBytesSoFar + dataBytes) > cl->largeCmdBytesTotal) {
-	    client->errorValue = dataBytes;
-	    __glXResetLargeCommandStatus(cl);
-	    return __glXError(GLXBadLargeRequest);
-	}
-	memcpy(cl->largeCmdBuf + cl->largeCmdBytesSoFar, pc, dataBytes);
-	cl->largeCmdBytesSoFar += dataBytes;
-	cl->largeCmdRequestsSoFar++;
-
-	if (req->requestNumber == cl->largeCmdRequestsTotal) {
-	    __GLXdispatchRenderProcPtr proc;
-
-	    /*
-	    ** This is the last request; it must have enough bytes to complete
-	    ** the command.
-	    */
-	    /* NOTE: the two pad macros have been added below; they are needed
-	    ** because the client library pads the total byte count, but not
-	    ** the per-request byte counts.  The Protocol Encoding says the
-	    ** total byte count should not be padded, so a proposal will be 
-	    ** made to the ARB to relax the padding constraint on the total 
-	    ** byte count, thus preserving backward compatibility.  Meanwhile, 
-	    ** the padding done below fixes a bug that did not allow
-	    ** large commands of odd sizes to be accepted by the server.
-	    */
-	    if (__GLX_PAD(cl->largeCmdBytesSoFar) !=
-		__GLX_PAD(cl->largeCmdBytesTotal)) {
-		client->errorValue = dataBytes;
-		__glXResetLargeCommandStatus(cl);
-		return __glXError(GLXBadLargeRequest);
-	    }
-	    hdr = (__GLXrenderLargeHeader *) cl->largeCmdBuf;
-	    /*
-	    ** The opcode and length field in the header had already been
-	    ** swapped when the first request was received.
-	    **
-	    ** Use the opcode to index into the procedure table.
-	    */
-	    opcode = hdr->opcode;
-
-	    proc = (__GLXdispatchRenderProcPtr)
-	      __glXGetProtocolDecodeFunction(& Render_dispatch_info, opcode,
-					     client->swapped);
-	    if (proc == NULL) {
-		client->errorValue = opcode;
-		return __glXError(GLXBadLargeRequest);
-	    }
-
-	    /*
-	    ** Skip over the header and execute the command.
-	    */
-	    (*proc)(cl->largeCmdBuf + __GLX_RENDER_LARGE_HDR_SIZE);
-	    __GLX_NOTE_UNFLUSHED_CMDS(glxc);
-
-	    /*
-	    ** Reset for the next RenderLarge series.
-	    */
-	    __glXResetLargeCommandStatus(cl);
-	} else {
-	    /*
-	    ** This is neither the first nor the last request.
-	    */
-	}
-	return Success;
-    }
-}
-
-extern RESTYPE __glXSwapBarrierRes;
-
-int __glXDisp_BindSwapBarrierSGIX(__GLXclientState *cl, GLbyte *pc)
-{
-    ClientPtr client = cl->client;
-    xGLXBindSwapBarrierSGIXReq *req = (xGLXBindSwapBarrierSGIXReq *) pc;
-    XID drawable = req->drawable;
-    int barrier = req->barrier;
-    DrawablePtr pDraw;
-    int screen, rc;
-    __GLXscreen *pGlxScreen;
-
-    rc = dixLookupDrawable(&pDraw, drawable, client, 0, DixGetAttrAccess);
-    pGlxScreen = glxGetScreen(pDraw->pScreen);
-    if (rc == Success && (pDraw->type == DRAWABLE_WINDOW)) {
-	screen = pDraw->pScreen->myNum;
-        if (pGlxScreen->swapBarrierFuncs) {
-            int ret = pGlxScreen->swapBarrierFuncs->bindSwapBarrierFunc(screen, drawable, barrier);
-            if (ret == Success) {
-                if (barrier)
-                    /* add source for cleanup when drawable is gone */
-                    AddResource(drawable, __glXSwapBarrierRes, (pointer)(intptr_t)screen);
-                else
-                    /* delete source */
-                    FreeResourceByType(drawable, __glXSwapBarrierRes, FALSE);
-            }
-            return ret;
-        }
-    }
-    client->errorValue = drawable;
-    return __glXError(GLXBadDrawable);
-}
-
-
-int __glXDisp_QueryMaxSwapBarriersSGIX(__GLXclientState *cl, GLbyte *pc)
-{
-    ClientPtr client = cl->client;
-    xGLXQueryMaxSwapBarriersSGIXReq *req =
-                                    (xGLXQueryMaxSwapBarriersSGIXReq *) pc;
-    xGLXQueryMaxSwapBarriersSGIXReply reply;
-    int screen = req->screen;
-    __GLXscreen *pGlxScreen;
-
-    pGlxScreen = glxGetScreen(screenInfo.screens[screen]);
-    if (pGlxScreen->swapBarrierFuncs)
-        reply.max = pGlxScreen->swapBarrierFuncs->queryMaxSwapBarriersFunc(screen);
-    else
-        reply.max = 0;
-
-
-    reply.length = 0;
-    reply.type = X_Reply;
-    reply.sequenceNumber = client->sequence;
-
-    if (client->swapped) {
-        __GLX_DECLARE_SWAP_VARIABLES;
-        __GLX_SWAP_SHORT(&reply.sequenceNumber);
-    }
-
-    WriteToClient(client, sz_xGLXQueryMaxSwapBarriersSGIXReply,
-                        (char *) &reply);
-    return Success;
-}
-
-#define GLX_BAD_HYPERPIPE_SGIX 92
-
-int __glXDisp_QueryHyperpipeNetworkSGIX(__GLXclientState *cl, GLbyte *pc)
-{
-    ClientPtr client = cl->client;
-    xGLXQueryHyperpipeNetworkSGIXReq * req = (xGLXQueryHyperpipeNetworkSGIXReq *) pc;
-    xGLXQueryHyperpipeNetworkSGIXReply reply;
-    int screen = req->screen;
-    void *rdata = NULL;
-
-    int length=0;
-    int npipes=0;
-
-    int n= 0;
-    __GLXscreen *pGlxScreen;
-
-    pGlxScreen = glxGetScreen(screenInfo.screens[screen]);
-    if (pGlxScreen->hyperpipeFuncs) {
-        rdata =
-            (pGlxScreen->hyperpipeFuncs->queryHyperpipeNetworkFunc(screen, &npipes, &n));
-    }
-    length = __GLX_PAD(n) >> 2;
-    reply.type = X_Reply;
-    reply.sequenceNumber = client->sequence;
-    reply.length = length;
-    reply.n = n;
-    reply.npipes = npipes;
-
-    if (client->swapped) {
-        __GLX_DECLARE_SWAP_VARIABLES;
-        __GLX_SWAP_SHORT(&reply.sequenceNumber);
-        __GLX_SWAP_INT(&reply.length);
-        __GLX_SWAP_INT(&reply.n);
-        __GLX_SWAP_INT(&reply.npipes);
-    }
-    WriteToClient(client, sz_xGLXQueryHyperpipeNetworkSGIXReply,
-                  (char *) &reply);
-
-    WriteToClient(client, length << 2, (char *)rdata);
-
-    return Success;
-}
-
-int __glXDisp_DestroyHyperpipeConfigSGIX (__GLXclientState *cl, GLbyte *pc)
-{
-    ClientPtr client = cl->client;
-    xGLXDestroyHyperpipeConfigSGIXReq * req =
-        (xGLXDestroyHyperpipeConfigSGIXReq *) pc;
-    xGLXDestroyHyperpipeConfigSGIXReply reply;
-    int screen = req->screen;
-    int  success = GLX_BAD_HYPERPIPE_SGIX;
-    int hpId ;
-    __GLXscreen *pGlxScreen;
-
-    hpId = req->hpId;
-
-    pGlxScreen = glxGetScreen(screenInfo.screens[screen]);
-    if (pGlxScreen->hyperpipeFuncs) {
-        success = pGlxScreen->hyperpipeFuncs->destroyHyperpipeConfigFunc(screen, hpId);
-    }
-
-    reply.type = X_Reply;
-    reply.sequenceNumber = client->sequence;
-    reply.length = __GLX_PAD(0) >> 2;
-    reply.n = 0;
-    reply.success = success;
-
-
-    if (client->swapped) {
-        __GLX_DECLARE_SWAP_VARIABLES;
-        __GLX_SWAP_SHORT(&reply.sequenceNumber);
-    }
-    WriteToClient(client,
-                  sz_xGLXDestroyHyperpipeConfigSGIXReply,
-                  (char *) &reply);
-    return Success;
-}
-
-int __glXDisp_QueryHyperpipeConfigSGIX(__GLXclientState *cl, GLbyte *pc)
-{
-    ClientPtr client = cl->client;
-    xGLXQueryHyperpipeConfigSGIXReq * req =
-        (xGLXQueryHyperpipeConfigSGIXReq *) pc;
-    xGLXQueryHyperpipeConfigSGIXReply reply;
-    int screen = req->screen;
-    void *rdata = NULL;
-    int length;
-    int npipes=0;
-    int n= 0;
-    int hpId;
-    __GLXscreen *pGlxScreen;
-
-    hpId = req->hpId;
-
-    pGlxScreen = glxGetScreen(screenInfo.screens[screen]);
-    if (pGlxScreen->hyperpipeFuncs) {
-        rdata = pGlxScreen->hyperpipeFuncs->queryHyperpipeConfigFunc(screen, hpId,&npipes, &n);
-    }
-
-    length = __GLX_PAD(n) >> 2;
-    reply.type = X_Reply;
-    reply.sequenceNumber = client->sequence;
-    reply.length = length;
-    reply.n = n;
-    reply.npipes = npipes;
-
-
-    if (client->swapped) {
-        __GLX_DECLARE_SWAP_VARIABLES;
-        __GLX_SWAP_SHORT(&reply.sequenceNumber);
-        __GLX_SWAP_INT(&reply.length);
-        __GLX_SWAP_INT(&reply.n);
-        __GLX_SWAP_INT(&reply.npipes);
-    }
-
-    WriteToClient(client, sz_xGLXQueryHyperpipeConfigSGIXReply,
-                  (char *) &reply);
-
-    WriteToClient(client, length << 2, (char *)rdata);
-
-    return Success;
-}
-
-int __glXDisp_HyperpipeConfigSGIX(__GLXclientState *cl, GLbyte *pc)
-{
-    ClientPtr client = cl->client;
-    xGLXHyperpipeConfigSGIXReq * req =
-        (xGLXHyperpipeConfigSGIXReq *) pc;
-    xGLXHyperpipeConfigSGIXReply reply;
-    int screen = req->screen;
-    void *rdata;
-
-    int npipes=0, networkId;
-    int hpId=-1;
-    __GLXscreen *pGlxScreen;
-
-    pGlxScreen = glxGetScreen(screenInfo.screens[screen]);
-    networkId = (int)req->networkId;
-    npipes = (int)req->npipes;
-    rdata = (void *)(req +1);
-
-    if (pGlxScreen->hyperpipeFuncs) {
-        pGlxScreen->hyperpipeFuncs->hyperpipeConfigFunc(screen,networkId,
-                                                        &hpId, &npipes,
-                                                        (void *) rdata);
-    }
-
-    reply.type = X_Reply;
-    reply.sequenceNumber = client->sequence;
-    reply.length = __GLX_PAD(0) >> 2;
-    reply.n = 0;
-    reply.npipes = npipes;
-    reply.hpId = hpId;
-
-    if (client->swapped) {
-        __GLX_DECLARE_SWAP_VARIABLES;
-        __GLX_SWAP_SHORT(&reply.sequenceNumber);
-        __GLX_SWAP_INT(&reply.npipes);
-        __GLX_SWAP_INT(&reply.hpId);
-    }
-
-    WriteToClient(client, sz_xGLXHyperpipeConfigSGIXReply,
-                  (char *) &reply);
-
-    return Success;
-}
-
-
-/************************************************************************/
-
-/*
-** No support is provided for the vendor-private requests other than
-** allocating the entry points in the dispatch table.
-*/
-
-int __glXDisp_VendorPrivate(__GLXclientState *cl, GLbyte *pc)
-{
-    xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *) pc;
-    GLint vendorcode = req->vendorCode;
-    __GLXdispatchVendorPrivProcPtr proc;
-
-
-    proc = (__GLXdispatchVendorPrivProcPtr)
-      __glXGetProtocolDecodeFunction(& VendorPriv_dispatch_info,
-				     vendorcode, 0);
-    if (proc != NULL) {
-	(*proc)(cl, (GLbyte*)req);
-	return Success;
-    }
-
-    cl->client->errorValue = req->vendorCode;
-    return __glXError(GLXUnsupportedPrivateRequest);
-}
-
-int __glXDisp_VendorPrivateWithReply(__GLXclientState *cl, GLbyte *pc)
-{
-    xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *) pc;
-    GLint vendorcode = req->vendorCode;
-    __GLXdispatchVendorPrivProcPtr proc;
-
-
-    proc = (__GLXdispatchVendorPrivProcPtr)
-      __glXGetProtocolDecodeFunction(& VendorPriv_dispatch_info,
-				     vendorcode, 0);
-    if (proc != NULL) {
-	return (*proc)(cl, (GLbyte*)req);
-    }
-
-    cl->client->errorValue = vendorcode;
-    return __glXError(GLXUnsupportedPrivateRequest);
-}
-
-int __glXDisp_QueryExtensionsString(__GLXclientState *cl, GLbyte *pc)
-{
-    ClientPtr client = cl->client;
-    xGLXQueryExtensionsStringReq *req = (xGLXQueryExtensionsStringReq *) pc;
-    xGLXQueryExtensionsStringReply reply;
-    __GLXscreen *pGlxScreen;
-    size_t n, length;
-    char *buf;
-    int err;
-
-    if (!validGlxScreen(client, req->screen, &pGlxScreen, &err))
-	return err;
-
-    n = strlen(pGlxScreen->GLXextensions) + 1;
-    length = __GLX_PAD(n) >> 2;
-    reply.type = X_Reply;
-    reply.sequenceNumber = client->sequence;
-    reply.length = length;
-    reply.n = n;
-
-    /* Allocate buffer to make sure it's a multiple of 4 bytes big.*/
-    buf = (char *) xalloc(length << 2);
-    if (buf == NULL)
-        return BadAlloc;
-    memcpy(buf, pGlxScreen->GLXextensions, n);
-
-    if (client->swapped) {
-        glxSwapQueryExtensionsStringReply(client, &reply, buf);
-    } else {
-        WriteToClient(client, sz_xGLXQueryExtensionsStringReply,(char *)&reply);
-        WriteToClient(client, (int)(length << 2), (char *)buf);
-    }
-
-    xfree(buf);
-    return Success;
-}
-
-int __glXDisp_QueryServerString(__GLXclientState *cl, GLbyte *pc)
-{
-    ClientPtr client = cl->client;
-    xGLXQueryServerStringReq *req = (xGLXQueryServerStringReq *) pc;
-    xGLXQueryServerStringReply reply;
-    size_t n, length;
-    const char *ptr;
-    char *buf;
-    __GLXscreen *pGlxScreen;
-    int err;
-    char ver_str[16];
-
-    if (!validGlxScreen(client, req->screen, &pGlxScreen, &err))
-	return err;
-
-    switch(req->name) {
-	case GLX_VENDOR:
-	    ptr = pGlxScreen->GLXvendor;
-	    break;
-	case GLX_VERSION:
-	    /* Return to the server version rather than the screen version
-	     * to prevent confusion when they do not match.
-	     */
-	    snprintf(ver_str, 16, "%d.%d", glxMajorVersion, glxMinorVersion);
-	    ptr = ver_str;
-	    break;
-	case GLX_EXTENSIONS:
-	    ptr = pGlxScreen->GLXextensions;
-	    break;
-	default:
-	    return BadValue; 
-    }
-
-    n = strlen(ptr) + 1;
-    length = __GLX_PAD(n) >> 2;
-    reply.type = X_Reply;
-    reply.sequenceNumber = client->sequence;
-    reply.length = length;
-    reply.n = n;
-
-    buf = (char *) xalloc(length << 2);
-    if (buf == NULL) {
-        return BadAlloc;
-    }
-    memcpy(buf, ptr, n);
-
-    if (client->swapped) {
-        glxSwapQueryServerStringReply(client, &reply, buf);
-    } else {
-        WriteToClient(client, sz_xGLXQueryServerStringReply, (char *)&reply);
-        WriteToClient(client, (int)(length << 2), buf);
-    }
-
-    xfree(buf);
-    return Success;
-}
-
-int __glXDisp_ClientInfo(__GLXclientState *cl, GLbyte *pc)
-{
-    xGLXClientInfoReq *req = (xGLXClientInfoReq *) pc;
-    const char *buf;
-   
-    cl->GLClientmajorVersion = req->major;
-    cl->GLClientminorVersion = req->minor;
-    if (cl->GLClientextensions)
-	xfree(cl->GLClientextensions);
-    buf = (const char *)(req+1);
-    cl->GLClientextensions = xstrdup(buf);
-
-    return Success;
-}
+/*
+ * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008)
+ * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice including the dates of first publication and
+ * either this permission notice or a reference to
+ * http://oss.sgi.com/projects/FreeB/
+ * shall be included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
+ * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * Except as contained in this notice, the name of Silicon Graphics, Inc.
+ * shall not be used in advertising or otherwise to promote the sale, use or
+ * other dealings in this Software without prior written authorization from
+ * Silicon Graphics, Inc.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <string.h>
+#include <assert.h>
+
+#include "glxserver.h"
+#include <GL/glxtokens.h>
+#include <unpack.h>
+#include "g_disptab.h"
+#include <pixmapstr.h>
+#include <windowstr.h>
+#include "glxutil.h"
+#include "glxext.h"
+#include "glapitable.h"
+#include "glapi.h"
+#include "glthread.h"
+#include "dispatch.h"
+#include "indirect_dispatch.h"
+#include "indirect_table.h"
+#include "indirect_util.h"
+
+static int
+validGlxScreen(ClientPtr client, int screen, __GLXscreen **pGlxScreen, int *err)
+{
+    /*
+    ** Check if screen exists.
+    */
+    if (screen >= screenInfo.numScreens) {
+	client->errorValue = screen;
+	*err = BadValue;
+	return FALSE;
+    }
+    *pGlxScreen = glxGetScreen(screenInfo.screens[screen]);
+
+    return TRUE;
+}
+
+static int
+validGlxFBConfig(ClientPtr client, __GLXscreen *pGlxScreen, XID id,
+		 __GLXconfig **config, int *err)
+{
+    __GLXconfig *m;
+
+    for (m = pGlxScreen->fbconfigs; m != NULL; m = m->next)
+	if (m->fbconfigID == id) {
+	    *config = m;
+	    return TRUE;
+	}
+
+    client->errorValue = id;
+    *err = __glXError(GLXBadFBConfig);
+
+    return FALSE;
+}
+
+static int
+validGlxVisual(ClientPtr client, __GLXscreen *pGlxScreen, XID id,
+	       __GLXconfig **config, int *err)
+{
+    int i;
+
+    for (i = 0; i < pGlxScreen->numVisuals; i++)
+ 	if (pGlxScreen->visuals[i]->visualID == id) {
+	    *config = pGlxScreen->visuals[i];
+	    return TRUE;
+	}
+
+    client->errorValue = id;
+    *err = BadValue;
+
+    return FALSE;
+}
+
+static int
+validGlxFBConfigForWindow(ClientPtr client, __GLXconfig *config,
+			  DrawablePtr pDraw, int *err)
+{
+    ScreenPtr pScreen = pDraw->pScreen;
+    VisualPtr pVisual = NULL;
+    XID vid;
+    int i;
+
+    vid = wVisual((WindowPtr)pDraw);
+    for (i = 0; i < pScreen->numVisuals; i++) {
+	if (pScreen->visuals[i].vid == vid) {
+	    pVisual = &pScreen->visuals[i];
+	    break;
+	}
+    }
+
+    /* FIXME: What exactly should we check here... */
+    if (pVisual->class != glxConvertToXVisualType(config->visualType) ||
+	!(config->drawableType & GLX_WINDOW_BIT)) {
+	client->errorValue = pDraw->id;
+	*err = BadMatch;
+	return FALSE;
+    }
+
+    return TRUE;
+}
+
+static int
+validGlxContext(ClientPtr client, XID id, int access_mode,
+		__GLXcontext **context, int *err)
+{
+    *err = dixLookupResourceByType((pointer *) context, id,
+				   __glXContextRes, client, access_mode);
+    if (*err != Success) {
+	client->errorValue = id;
+	if (*err == BadValue)
+	    *err = __glXError(GLXBadContext);
+	return FALSE;
+    }
+
+    return TRUE;
+}
+
+static int
+validGlxDrawable(ClientPtr client, XID id, int type, int access_mode,
+		 __GLXdrawable **drawable, int *err)
+{
+    int rc;
+
+    rc = dixLookupResourceByType((pointer *) drawable, id,
+				 __glXDrawableRes, client, access_mode);
+    if (rc != Success && rc != BadValue) {
+	*err = rc;
+	client->errorValue = id;
+	return FALSE;
+    }
+
+    /* If the ID of the glx drawable we looked up doesn't match the id
+     * we looked for, it's because we looked it up under the X
+     * drawable ID (see DoCreateGLXDrawable). */
+    if (rc == BadValue ||
+	(*drawable)->drawId != id ||
+	(type != GLX_DRAWABLE_ANY && type != (*drawable)->type)) {
+	client->errorValue = id;
+	switch (type) {
+	case GLX_DRAWABLE_WINDOW:
+	    *err = __glXError(GLXBadWindow);
+	    return FALSE;
+	case GLX_DRAWABLE_PIXMAP:
+	    *err = __glXError(GLXBadPixmap);
+	    return FALSE;
+	case GLX_DRAWABLE_PBUFFER:
+	    *err = __glXError(GLXBadPbuffer);
+	    return FALSE;
+	case GLX_DRAWABLE_ANY:
+	    *err = __glXError(GLXBadDrawable);
+	    return FALSE;
+	}
+    }
+
+    return TRUE;
+}
+
+void
+__glXContextDestroy(__GLXcontext *context)
+{
+    __glXFlushContextCache();
+}
+
+static void __glXdirectContextDestroy(__GLXcontext *context)
+{
+    __glXContextDestroy(context);
+    xfree(context);
+}
+
+static __GLXcontext *__glXdirectContextCreate(__GLXscreen *screen,
+					      __GLXconfig *modes,
+					      __GLXcontext *shareContext)
+{
+    __GLXcontext *context;
+
+    context = xcalloc (1, sizeof (__GLXcontext));
+    if (context == NULL)
+	return NULL;
+
+    context->destroy = __glXdirectContextDestroy;
+
+    return context;
+}
+
+/**
+ * Create a GL context with the given properties.  This routine is used
+ * to implement \c glXCreateContext, \c glXCreateNewContext, and
+ * \c glXCreateContextWithConfigSGIX.  This works becuase of the hack way
+ * that GLXFBConfigs are implemented.  Basically, the FBConfigID is the
+ * same as the VisualID.
+ */
+
+static int
+DoCreateContext(__GLXclientState *cl, GLXContextID gcId,
+		GLXContextID shareList, __GLXconfig *config,
+		__GLXscreen *pGlxScreen, GLboolean isDirect)
+{
+    ClientPtr client = cl->client;
+    __GLXcontext *glxc, *shareglxc;
+    int err;
+    
+    LEGAL_NEW_RESOURCE(gcId, client);
+
+    /*
+    ** Find the display list space that we want to share.  
+    **
+    ** NOTE: In a multithreaded X server, we would need to keep a reference
+    ** count for each display list so that if one client detroyed a list that 
+    ** another client was using, the list would not really be freed until it 
+    ** was no longer in use.  Since this sample implementation has no support 
+    ** for multithreaded servers, we don't do this.  
+    */
+    if (shareList == None) {
+	shareglxc = 0;
+    } else {
+	if (!validGlxContext(client, shareList, DixReadAccess,
+			     &shareglxc, &err))
+	    return err;
+
+	if (shareglxc->isDirect) {
+	    /*
+	    ** NOTE: no support for sharing display lists between direct
+	    ** contexts, even if they are in the same address space.
+	    */
+#if 0
+            /* Disabling this code seems to allow shared display lists
+             * and texture objects to work.  We'll leave it disabled for now.
+             */
+	    client->errorValue = shareList;
+	    return BadMatch;
+#endif
+	} else {
+	    /*
+	    ** Create an indirect context regardless of what the client asked
+	    ** for; this way we can share display list space with shareList.
+	    */
+	    isDirect = GL_FALSE;
+	}
+    }
+
+    /*
+    ** Allocate memory for the new context
+    */
+    if (!isDirect)
+	glxc = pGlxScreen->createContext(pGlxScreen, config, shareglxc);
+    else
+	glxc = __glXdirectContextCreate(pGlxScreen, config, shareglxc);
+    if (!glxc) {
+	return BadAlloc;
+    }
+
+    /*
+    ** Initially, setup the part of the context that could be used by
+    ** a GL core that needs windowing information (e.g., Mesa).
+    */
+    glxc->pGlxScreen = pGlxScreen;
+    glxc->config = config;
+
+    /*
+    ** Register this context as a resource.
+    */
+    if (!AddResource(gcId, __glXContextRes, (pointer)glxc)) {
+	(*glxc->destroy)(glxc);
+	client->errorValue = gcId;
+	return BadAlloc;
+    }
+    
+    /*
+    ** Finally, now that everything is working, setup the rest of the
+    ** context.
+    */
+    glxc->id = gcId;
+    glxc->share_id = shareList;
+    glxc->idExists = GL_TRUE;
+    glxc->isCurrent = GL_FALSE;
+    glxc->isDirect = isDirect;
+    glxc->renderMode = GL_RENDER;
+
+    __glXAddToContextList(glxc);
+
+    return Success;
+}
+
+int __glXDisp_CreateContext(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXCreateContextReq *req = (xGLXCreateContextReq *) pc;
+    __GLXconfig *config;
+    __GLXscreen *pGlxScreen;
+    int err;
+
+    if (!validGlxScreen(cl->client, req->screen, &pGlxScreen, &err))
+	return err;
+    if (!validGlxVisual(cl->client, pGlxScreen, req->visual, &config, &err))
+	return err;
+
+    return DoCreateContext(cl, req->context, req->shareList,
+			   config, pGlxScreen, req->isDirect);
+}
+
+int __glXDisp_CreateNewContext(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXCreateNewContextReq *req = (xGLXCreateNewContextReq *) pc;
+    __GLXconfig *config;
+    __GLXscreen *pGlxScreen;
+    int err;
+
+    if (!validGlxScreen(cl->client, req->screen, &pGlxScreen, &err))
+	return err;
+    if (!validGlxFBConfig(cl->client, pGlxScreen, req->fbconfig, &config, &err))
+	return err;
+
+    return DoCreateContext(cl, req->context, req->shareList,
+			   config, pGlxScreen, req->isDirect);
+}
+
+int __glXDisp_CreateContextWithConfigSGIX(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXCreateContextWithConfigSGIXReq *req = 
+	(xGLXCreateContextWithConfigSGIXReq *) pc;
+    __GLXconfig *config;
+    __GLXscreen *pGlxScreen;
+    int err;
+
+    if (!validGlxScreen(cl->client, req->screen, &pGlxScreen, &err))
+	return err;
+    if (!validGlxFBConfig(cl->client, pGlxScreen, req->fbconfig, &config, &err))
+	return err;
+
+    return DoCreateContext(cl, req->context, req->shareList,
+			   config, pGlxScreen, req->isDirect);
+}
+int __glXDisp_DestroyContext(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXDestroyContextReq *req = (xGLXDestroyContextReq *) pc;
+    __GLXcontext *glxc;
+    int err;
+
+    if (!validGlxContext(cl->client, req->context, DixDestroyAccess,
+			 &glxc, &err))
+	    return err;
+
+    FreeResourceByType(req->context, __glXContextRes, FALSE);
+    return Success;
+}
+
+/*****************************************************************************/
+
+/*
+** For each client, the server keeps a table of all the contexts that are
+** current for that client (each thread of a client may have its own current
+** context).  These routines add, change, and lookup contexts in the table.
+*/
+
+/*
+** Add a current context, and return the tag that will be used to refer to it.
+*/
+static int AddCurrentContext(__GLXclientState *cl, __GLXcontext *glxc)
+{
+    int i;
+    int num = cl->numCurrentContexts;
+    __GLXcontext **table = cl->currentContexts;
+
+    if (!glxc) return -1;
+    
+    /*
+    ** Try to find an empty slot and use it.
+    */
+    for (i=0; i < num; i++) {
+	if (!table[i]) {
+	    table[i] = glxc;
+	    return i+1;
+	}
+    }
+    /*
+    ** Didn't find a free slot, so we'll have to grow the table.
+    */
+    if (!num) {
+	table = (__GLXcontext **) xalloc(sizeof(__GLXcontext *));
+    } else {
+	table = (__GLXcontext **) xrealloc(table,
+					   (num+1)*sizeof(__GLXcontext *));
+    }
+    table[num] = glxc;
+    cl->currentContexts = table;
+    cl->numCurrentContexts++;
+    return num+1;
+}
+
+/*
+** Given a tag, change the current context for the corresponding entry.
+*/
+static void ChangeCurrentContext(__GLXclientState *cl, __GLXcontext *glxc,
+				GLXContextTag tag)
+{
+    __GLXcontext **table = cl->currentContexts;
+    table[tag-1] = glxc;
+}
+
+/*
+** For this implementation we have chosen to simply use the index of the
+** context's entry in the table as the context tag.  A tag must be greater
+** than 0.
+*/
+__GLXcontext *__glXLookupContextByTag(__GLXclientState *cl, GLXContextTag tag)
+{
+    int num = cl->numCurrentContexts;
+
+    if (tag < 1 || tag > num) {
+	return 0;
+    } else {
+	return cl->currentContexts[tag-1];
+    }
+}
+
+/*****************************************************************************/
+
+static void StopUsingContext(__GLXcontext *glxc)
+{
+    if (glxc) {
+	if (glxc == __glXLastContext) {
+	    /* Tell server GL library */
+	    __glXLastContext = 0;
+	}
+	glxc->isCurrent = GL_FALSE;
+	if (!glxc->idExists) {
+	    __glXFreeContext(glxc);
+	}
+    }
+}
+
+static void StartUsingContext(__GLXclientState *cl, __GLXcontext *glxc)
+{
+    glxc->isCurrent = GL_TRUE;
+    __glXLastContext = glxc;	
+}
+
+/**
+ * This is a helper function to handle the legacy (pre GLX 1.3) cases
+ * where passing an X window to glXMakeCurrent is valid.  Given a
+ * resource ID, look up the GLX drawable if available, otherwise, make
+ * sure it's an X window and create a GLX drawable one the fly.
+ */
+static __GLXdrawable *
+__glXGetDrawable(__GLXcontext *glxc, GLXDrawable drawId, ClientPtr client,
+		 int *error)
+{
+    DrawablePtr pDraw;
+    __GLXdrawable *pGlxDraw;
+    int rc;
+
+    if (validGlxDrawable(client, drawId, GLX_DRAWABLE_ANY,
+			 DixWriteAccess, &pGlxDraw, &rc)) {
+	if (glxc != NULL && pGlxDraw->config != glxc->config) {
+	    client->errorValue = drawId;
+	    *error = BadMatch;
+	    return NULL;
+	}
+
+	return pGlxDraw;
+    }
+
+    /* The drawId wasn't a GLX drawable.  Make sure it's a window and
+     * create a GLXWindow for it.  Check that the drawable screen
+     * matches the context screen and that the context fbconfig is
+     * compatible with the window visual. */
+
+    rc = dixLookupDrawable(&pDraw, drawId, client, 0, DixGetAttrAccess);
+    if (rc != Success || pDraw->type != DRAWABLE_WINDOW) {
+	client->errorValue = drawId;
+	*error = __glXError(GLXBadDrawable);
+	return NULL;
+    }
+
+    if (pDraw->pScreen != glxc->pGlxScreen->pScreen) {
+	client->errorValue = pDraw->pScreen->myNum;
+	*error = BadMatch;
+	return NULL;
+    }
+
+    if (!validGlxFBConfigForWindow(client, glxc->config, pDraw, error))
+	return NULL;
+
+    pGlxDraw = glxc->pGlxScreen->createDrawable(client, glxc->pGlxScreen,
+						pDraw, drawId,
+						GLX_DRAWABLE_WINDOW,
+						drawId, glxc->config);
+
+    /* since we are creating the drawablePrivate, drawId should be new */
+    if (!AddResource(drawId, __glXDrawableRes, pGlxDraw)) {
+	pGlxDraw->destroy (pGlxDraw);
+	*error = BadAlloc;
+	return NULL;
+    }
+
+    return pGlxDraw;
+}
+
+/*****************************************************************************/
+/*
+** Make an OpenGL context and drawable current.
+*/
+
+static int
+DoMakeCurrent(__GLXclientState *cl,
+	      GLXDrawable drawId, GLXDrawable readId,
+	      GLXContextID contextId, GLXContextTag tag)
+{
+    ClientPtr client = cl->client;
+    xGLXMakeCurrentReply reply;
+    __GLXcontext *glxc, *prevglxc;
+    __GLXdrawable *drawPriv = NULL;
+    __GLXdrawable *readPriv = NULL;
+    int error;
+    GLuint  mask;
+
+    /*
+    ** If one is None and the other isn't, it's a bad match.
+    */
+
+    mask  = (drawId == None)    ? (1 << 0) : 0;
+    mask |= (readId == None)    ? (1 << 1) : 0;
+    mask |= (contextId == None) ? (1 << 2) : 0;
+
+    if ( (mask != 0x00) && (mask != 0x07) ) {
+	return BadMatch;
+    }
+    
+    /*
+    ** Lookup old context.  If we have one, it must be in a usable state.
+    */
+    if (tag != 0) {
+	prevglxc = __glXLookupContextByTag(cl, tag);
+	if (!prevglxc) {
+	    /*
+	    ** Tag for previous context is invalid.
+	    */
+	    return __glXError(GLXBadContextTag);
+	}
+	if (prevglxc->renderMode != GL_RENDER) {
+	    /* Oops.  Not in render mode render. */
+	    client->errorValue = prevglxc->id;
+	    return __glXError(GLXBadContextState);
+	}
+    } else {
+	prevglxc = 0;
+    }
+
+    /*
+    ** Lookup new context.  It must not be current for someone else.
+    */
+    if (contextId != None) {
+	int  status;
+
+	if (!validGlxContext(client, contextId, DixUseAccess, &glxc, &error))
+	    return error;
+	if ((glxc != prevglxc) && glxc->isCurrent) {
+	    /* Context is current to somebody else */
+	    return BadAccess;
+	}
+
+	assert( drawId != None );
+	assert( readId != None );
+
+	drawPriv = __glXGetDrawable(glxc, drawId, client, &status);
+	if (drawPriv == NULL)
+	    return status;
+
+	readPriv = __glXGetDrawable(glxc, readId, client, &status);
+	if (readPriv == NULL)
+	    return status;
+
+    } else {
+	/* Switching to no context.  Ignore new drawable. */
+	glxc = 0;
+	drawPriv = 0;
+	readPriv = 0;
+    }
+
+
+    if (prevglxc) {
+	/*
+	** Flush the previous context if needed.
+	*/
+	if (__GLX_HAS_UNFLUSHED_CMDS(prevglxc)) {
+	    if (__glXForceCurrent(cl, tag, (int *)&error)) {
+		CALL_Flush( GET_DISPATCH(), () );
+		__GLX_NOTE_FLUSHED_CMDS(prevglxc);
+	    } else {
+		return error;
+	    }
+	}
+
+	/*
+	** Make the previous context not current.
+	*/
+	if (!(*prevglxc->loseCurrent)(prevglxc)) {
+	    return __glXError(GLXBadContext);
+	}
+	__glXFlushContextCache();
+	if (!prevglxc->isDirect) {
+	    prevglxc->drawPriv = NULL;
+	    prevglxc->readPriv = NULL;
+	}
+    }
+	
+
+    if ((glxc != 0) && !glxc->isDirect) {
+
+	glxc->drawPriv = drawPriv;
+	glxc->readPriv = readPriv;
+
+	/* make the context current */
+	if (!(*glxc->makeCurrent)(glxc)) {
+	    glxc->drawPriv = NULL;
+	    glxc->readPriv = NULL;
+	    return __glXError(GLXBadContext);
+	}
+
+	glxc->isCurrent = GL_TRUE;
+    }
+
+    if (prevglxc) {
+	ChangeCurrentContext(cl, glxc, tag);
+	StopUsingContext(prevglxc);
+    } else {
+	tag = AddCurrentContext(cl, glxc);
+    }
+
+    if (glxc) {
+	StartUsingContext(cl, glxc);
+	reply.contextTag = tag;
+    } else {
+	reply.contextTag = 0;
+    }
+
+    reply.length = 0;
+    reply.type = X_Reply;
+    reply.sequenceNumber = client->sequence;
+
+    if (client->swapped) {
+	__glXSwapMakeCurrentReply(client, &reply);
+    } else {
+	WriteToClient(client, sz_xGLXMakeCurrentReply, (char *)&reply);
+    }
+    return Success;
+}
+
+int __glXDisp_MakeCurrent(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXMakeCurrentReq *req = (xGLXMakeCurrentReq *) pc;
+
+    return DoMakeCurrent( cl, req->drawable, req->drawable,
+			  req->context, req->oldContextTag );
+}
+
+int __glXDisp_MakeContextCurrent(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXMakeContextCurrentReq *req = (xGLXMakeContextCurrentReq *) pc;
+
+    return DoMakeCurrent( cl, req->drawable, req->readdrawable,
+			  req->context, req->oldContextTag );
+}
+
+int __glXDisp_MakeCurrentReadSGI(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXMakeCurrentReadSGIReq *req = (xGLXMakeCurrentReadSGIReq *) pc;
+
+    return DoMakeCurrent( cl, req->drawable, req->readable,
+			  req->context, req->oldContextTag );
+}
+
+int __glXDisp_IsDirect(__GLXclientState *cl, GLbyte *pc)
+{
+    ClientPtr client = cl->client;
+    xGLXIsDirectReq *req = (xGLXIsDirectReq *) pc;
+    xGLXIsDirectReply reply;
+    __GLXcontext *glxc;
+    int err;
+
+    if (!validGlxContext(cl->client, req->context, DixReadAccess, &glxc, &err))
+	return err;
+
+    reply.isDirect = glxc->isDirect;
+    reply.length = 0;
+    reply.type = X_Reply;
+    reply.sequenceNumber = client->sequence;
+
+    if (client->swapped) {
+	__glXSwapIsDirectReply(client, &reply);
+    } else {
+	WriteToClient(client, sz_xGLXIsDirectReply, (char *)&reply);
+    }
+
+    return Success;
+}
+
+int __glXDisp_QueryVersion(__GLXclientState *cl, GLbyte *pc)
+{
+    ClientPtr client = cl->client;
+    xGLXQueryVersionReq *req = (xGLXQueryVersionReq *) pc;
+    xGLXQueryVersionReply reply;
+    GLuint major, minor;
+
+    major = req->majorVersion;
+    minor = req->minorVersion;
+    (void)major;
+    (void)minor;
+
+    /*
+    ** Server should take into consideration the version numbers sent by the
+    ** client if it wants to work with older clients; however, in this
+    ** implementation the server just returns its version number.
+    */
+    reply.majorVersion = glxMajorVersion;
+    reply.minorVersion = glxMinorVersion;
+    reply.length = 0;
+    reply.type = X_Reply;
+    reply.sequenceNumber = client->sequence;
+
+    if (client->swapped) {
+	__glXSwapQueryVersionReply(client, &reply);
+    } else {
+	WriteToClient(client, sz_xGLXQueryVersionReply, (char *)&reply);
+    }
+    return Success;
+}
+
+int __glXDisp_WaitGL(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXWaitGLReq *req = (xGLXWaitGLReq *)pc;
+    GLXContextTag tag = req->contextTag;
+    __GLXcontext *glxc = NULL;
+    int error;
+
+    if (tag) {
+	glxc = __glXLookupContextByTag(cl, tag);
+	if (!glxc)
+	    return __glXError(GLXBadContextTag);
+    
+	if (!__glXForceCurrent(cl, req->contextTag, &error))
+	    return error;
+
+	CALL_Finish( GET_DISPATCH(), () );
+    }
+
+    if (glxc && glxc->drawPriv->waitGL)
+	(*glxc->drawPriv->waitGL)(glxc->drawPriv);
+
+    return Success;
+}
+
+int __glXDisp_WaitX(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXWaitXReq *req = (xGLXWaitXReq *)pc;
+    GLXContextTag tag = req->contextTag;
+    __GLXcontext *glxc = NULL;
+    int error;
+
+    if (tag) {
+	glxc = __glXLookupContextByTag(cl, tag);
+	if (!glxc)
+	    return __glXError(GLXBadContextTag);
+    
+	if (!__glXForceCurrent(cl, req->contextTag, &error))
+	    return error;
+    }
+
+    if (glxc && glxc->drawPriv->waitX)
+	(*glxc->drawPriv->waitX)(glxc->drawPriv);
+
+    return Success;
+}
+
+int __glXDisp_CopyContext(__GLXclientState *cl, GLbyte *pc)
+{
+    ClientPtr client = cl->client;
+    xGLXCopyContextReq *req = (xGLXCopyContextReq *) pc;
+    GLXContextID source = req->source;
+    GLXContextID dest = req->dest;
+    GLXContextTag tag = req->contextTag;
+    unsigned long mask = req->mask;
+    __GLXcontext *src, *dst;
+    int error;
+
+    if (!validGlxContext(cl->client, source, DixReadAccess, &src, &error))
+	return error;
+    if (!validGlxContext(cl->client, dest, DixWriteAccess, &dst, &error))
+	return error;
+
+    /*
+    ** They must be in the same address space, and same screen.
+    ** NOTE: no support for direct rendering contexts here.
+    */
+    if (src->isDirect || dst->isDirect ||
+	(src->pGlxScreen != dst->pGlxScreen)) {
+	client->errorValue = source;
+	return BadMatch;
+    }
+
+    /*
+    ** The destination context must not be current for any client.
+    */
+    if (dst->isCurrent) {
+	client->errorValue = dest;
+	return BadAccess;
+    }
+
+    if (tag) {
+	__GLXcontext *tagcx = __glXLookupContextByTag(cl, tag);
+	
+	if (!tagcx) {
+	    return __glXError(GLXBadContextTag);
+	}
+	if (tagcx != src) {
+	    /*
+	    ** This would be caused by a faulty implementation of the client
+	    ** library.
+	    */
+	    return BadMatch;
+	}
+	/*
+	** In this case, glXCopyContext is in both GL and X streams, in terms
+	** of sequentiality.
+	*/
+	if (__glXForceCurrent(cl, tag, &error)) {
+	    /*
+	    ** Do whatever is needed to make sure that all preceding requests
+	    ** in both streams are completed before the copy is executed.
+	    */
+	    CALL_Finish( GET_DISPATCH(), () );
+	    __GLX_NOTE_FLUSHED_CMDS(tagcx);
+	} else {
+	    return error;
+	}
+    }
+    /*
+    ** Issue copy.  The only reason for failure is a bad mask.
+    */
+    if (!(*dst->copy)(dst, src, mask)) {
+	client->errorValue = mask;
+	return BadValue;
+    }
+    return Success;
+}
+
+enum {
+    GLX_VIS_CONFIG_UNPAIRED = 18,
+    GLX_VIS_CONFIG_PAIRED = 20
+};
+
+enum {
+    GLX_VIS_CONFIG_TOTAL = GLX_VIS_CONFIG_UNPAIRED + GLX_VIS_CONFIG_PAIRED
+};
+
+int __glXDisp_GetVisualConfigs(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXGetVisualConfigsReq *req = (xGLXGetVisualConfigsReq *) pc;
+    ClientPtr client = cl->client;
+    xGLXGetVisualConfigsReply reply;
+    __GLXscreen *pGlxScreen;
+    __GLXconfig *modes;
+    CARD32 buf[GLX_VIS_CONFIG_TOTAL];
+    int p, i, err;
+    __GLX_DECLARE_SWAP_VARIABLES;
+    __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
+
+    if (!validGlxScreen(cl->client, req->screen, &pGlxScreen, &err))
+	return err;
+
+    reply.numVisuals = pGlxScreen->numVisuals;
+    reply.numProps = GLX_VIS_CONFIG_TOTAL;
+    reply.length = (reply.numVisuals * __GLX_SIZE_CARD32 * GLX_VIS_CONFIG_TOTAL) >> 2;
+    reply.type = X_Reply;
+    reply.sequenceNumber = client->sequence;
+
+    if (client->swapped) {
+	__GLX_SWAP_SHORT(&reply.sequenceNumber);
+	__GLX_SWAP_INT(&reply.length);
+	__GLX_SWAP_INT(&reply.numVisuals);
+	__GLX_SWAP_INT(&reply.numProps);
+    }
+
+    WriteToClient(client, sz_xGLXGetVisualConfigsReply, (char *)&reply);
+
+    for (i = 0; i < pGlxScreen->numVisuals; i++) {
+	modes = pGlxScreen->visuals[i];
+
+	p = 0;
+	buf[p++] = modes->visualID;
+	buf[p++] = glxConvertToXVisualType( modes->visualType );
+	buf[p++] = (modes->renderType & GLX_RGBA_BIT) ? GL_TRUE : GL_FALSE;
+
+	buf[p++] = modes->redBits;
+	buf[p++] = modes->greenBits;
+	buf[p++] = modes->blueBits;
+	buf[p++] = modes->alphaBits;
+	buf[p++] = modes->accumRedBits;
+	buf[p++] = modes->accumGreenBits;
+	buf[p++] = modes->accumBlueBits;
+	buf[p++] = modes->accumAlphaBits;
+
+	buf[p++] = modes->doubleBufferMode;
+	buf[p++] = modes->stereoMode;
+
+	buf[p++] = modes->rgbBits;
+	buf[p++] = modes->depthBits;
+	buf[p++] = modes->stencilBits;
+	buf[p++] = modes->numAuxBuffers;
+	buf[p++] = modes->level;
+
+	assert(p == GLX_VIS_CONFIG_UNPAIRED);
+	/* 
+	** Add token/value pairs for extensions.
+	*/
+	buf[p++] = GLX_VISUAL_CAVEAT_EXT;
+	buf[p++] = modes->visualRating;
+	buf[p++] = GLX_TRANSPARENT_TYPE;
+	buf[p++] = modes->transparentPixel;
+	buf[p++] = GLX_TRANSPARENT_RED_VALUE;
+	buf[p++] = modes->transparentRed;
+	buf[p++] = GLX_TRANSPARENT_GREEN_VALUE;
+	buf[p++] = modes->transparentGreen;
+	buf[p++] = GLX_TRANSPARENT_BLUE_VALUE;
+	buf[p++] = modes->transparentBlue;
+	buf[p++] = GLX_TRANSPARENT_ALPHA_VALUE;
+	buf[p++] = modes->transparentAlpha;
+	buf[p++] = GLX_TRANSPARENT_INDEX_VALUE;
+	buf[p++] = modes->transparentIndex;
+	buf[p++] = GLX_SAMPLES_SGIS;
+	buf[p++] = modes->samples;
+	buf[p++] = GLX_SAMPLE_BUFFERS_SGIS;
+	buf[p++] = modes->sampleBuffers;
+	buf[p++] = 0; /* copy over visualSelectGroup (GLX_VISUAL_SELECT_GROUP_SGIX)? */
+	buf[p++] = 0;
+
+	assert(p == GLX_VIS_CONFIG_TOTAL);
+	if (client->swapped) {
+	    __GLX_SWAP_INT_ARRAY(buf, p);
+	}
+	WriteToClient(client, __GLX_SIZE_CARD32 * p, (char *)buf);
+    }
+    return Success;
+}
+
+#define __GLX_TOTAL_FBCONFIG_ATTRIBS (36)
+#define __GLX_FBCONFIG_ATTRIBS_LENGTH (__GLX_TOTAL_FBCONFIG_ATTRIBS * 2)
+/**
+ * Send the set of GLXFBConfigs to the client.  There is not currently
+ * and interface into the driver on the server-side to get GLXFBConfigs,
+ * so we "invent" some based on the \c __GLXvisualConfig structures that
+ * the driver does supply.
+ * 
+ * The reply format for both \c glXGetFBConfigs and \c glXGetFBConfigsSGIX
+ * is the same, so this routine pulls double duty.
+ */
+
+static int
+DoGetFBConfigs(__GLXclientState *cl, unsigned screen)
+{
+    ClientPtr client = cl->client;
+    xGLXGetFBConfigsReply reply;
+    __GLXscreen *pGlxScreen;
+    CARD32 buf[__GLX_FBCONFIG_ATTRIBS_LENGTH];
+    int p, err;
+    __GLXconfig *modes;
+    __GLX_DECLARE_SWAP_VARIABLES;
+    __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
+
+    if (!validGlxScreen(cl->client, screen, &pGlxScreen, &err))
+	return err;
+
+    reply.numFBConfigs = pGlxScreen->numFBConfigs;
+    reply.numAttribs = __GLX_TOTAL_FBCONFIG_ATTRIBS;
+    reply.length = (__GLX_FBCONFIG_ATTRIBS_LENGTH * reply.numFBConfigs);
+    reply.type = X_Reply;
+    reply.sequenceNumber = client->sequence;
+
+    if (client->swapped) {
+	__GLX_SWAP_SHORT(&reply.sequenceNumber);
+	__GLX_SWAP_INT(&reply.length);
+	__GLX_SWAP_INT(&reply.numFBConfigs);
+	__GLX_SWAP_INT(&reply.numAttribs);
+    }
+
+    WriteToClient(client, sz_xGLXGetFBConfigsReply, (char *)&reply);
+
+    for (modes = pGlxScreen->fbconfigs; modes != NULL; modes = modes->next) {
+	p = 0;
+
+#define WRITE_PAIR(tag,value) \
+    do { buf[p++] = tag ; buf[p++] = value ; } while( 0 )
+
+	WRITE_PAIR( GLX_VISUAL_ID,        modes->visualID );
+	WRITE_PAIR( GLX_FBCONFIG_ID,      modes->fbconfigID );
+	WRITE_PAIR( GLX_X_RENDERABLE,     GL_TRUE );
+
+	WRITE_PAIR( GLX_RGBA,
+		    (modes->renderType & GLX_RGBA_BIT) ? GL_TRUE : GL_FALSE );
+	WRITE_PAIR( GLX_RENDER_TYPE,      modes->renderType );
+	WRITE_PAIR( GLX_DOUBLEBUFFER,     modes->doubleBufferMode );
+	WRITE_PAIR( GLX_STEREO,           modes->stereoMode );
+
+	WRITE_PAIR( GLX_BUFFER_SIZE,      modes->rgbBits );
+	WRITE_PAIR( GLX_LEVEL,            modes->level );
+	WRITE_PAIR( GLX_AUX_BUFFERS,      modes->numAuxBuffers );
+	WRITE_PAIR( GLX_RED_SIZE,         modes->redBits );
+	WRITE_PAIR( GLX_GREEN_SIZE,       modes->greenBits );
+	WRITE_PAIR( GLX_BLUE_SIZE,        modes->blueBits );
+	WRITE_PAIR( GLX_ALPHA_SIZE,       modes->alphaBits );
+	WRITE_PAIR( GLX_ACCUM_RED_SIZE,   modes->accumRedBits );
+	WRITE_PAIR( GLX_ACCUM_GREEN_SIZE, modes->accumGreenBits );
+	WRITE_PAIR( GLX_ACCUM_BLUE_SIZE,  modes->accumBlueBits );
+	WRITE_PAIR( GLX_ACCUM_ALPHA_SIZE, modes->accumAlphaBits );
+	WRITE_PAIR( GLX_DEPTH_SIZE,       modes->depthBits );
+	WRITE_PAIR( GLX_STENCIL_SIZE,     modes->stencilBits );
+	WRITE_PAIR( GLX_X_VISUAL_TYPE,    modes->visualType );
+	WRITE_PAIR( GLX_CONFIG_CAVEAT, modes->visualRating );
+	WRITE_PAIR( GLX_TRANSPARENT_TYPE, modes->transparentPixel );
+	WRITE_PAIR( GLX_TRANSPARENT_RED_VALUE, modes->transparentRed );
+	WRITE_PAIR( GLX_TRANSPARENT_GREEN_VALUE, modes->transparentGreen );
+	WRITE_PAIR( GLX_TRANSPARENT_BLUE_VALUE, modes->transparentBlue );
+	WRITE_PAIR( GLX_TRANSPARENT_ALPHA_VALUE, modes->transparentAlpha );
+	WRITE_PAIR( GLX_TRANSPARENT_INDEX_VALUE, modes->transparentIndex );
+	WRITE_PAIR( GLX_SWAP_METHOD_OML, modes->swapMethod );
+	WRITE_PAIR( GLX_SAMPLES_SGIS, modes->samples );
+	WRITE_PAIR( GLX_SAMPLE_BUFFERS_SGIS, modes->sampleBuffers );
+	/* GLX_VISUAL_SELECT_GROUP_SGIX ? */
+	WRITE_PAIR( GLX_DRAWABLE_TYPE, modes->drawableType );
+	WRITE_PAIR( GLX_BIND_TO_TEXTURE_RGB_EXT, modes->bindToTextureRgb );
+	WRITE_PAIR( GLX_BIND_TO_TEXTURE_RGBA_EXT, modes->bindToTextureRgba );
+	WRITE_PAIR( GLX_BIND_TO_MIPMAP_TEXTURE_EXT, modes->bindToMipmapTexture );
+	WRITE_PAIR( GLX_BIND_TO_TEXTURE_TARGETS_EXT, modes->bindToTextureTargets );
+
+	if (client->swapped) {
+	    __GLX_SWAP_INT_ARRAY(buf, __GLX_FBCONFIG_ATTRIBS_LENGTH);
+	}
+	WriteToClient(client, __GLX_SIZE_CARD32 * __GLX_FBCONFIG_ATTRIBS_LENGTH,
+		      (char *)buf);
+    }
+    return Success;
+}
+
+
+int __glXDisp_GetFBConfigs(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXGetFBConfigsReq *req = (xGLXGetFBConfigsReq *) pc;
+    return DoGetFBConfigs(cl, req->screen);
+}
+
+int __glXDisp_GetFBConfigsSGIX(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXGetFBConfigsSGIXReq *req = (xGLXGetFBConfigsSGIXReq *) pc;
+    return DoGetFBConfigs(cl, req->screen);
+}
+
+GLboolean
+__glXDrawableInit(__GLXdrawable *drawable,
+		  __GLXscreen *screen, DrawablePtr pDraw, int type,
+		  XID drawId, __GLXconfig *config)
+{
+    drawable->pDraw = pDraw;
+    drawable->type = type;
+    drawable->drawId = drawId;
+    drawable->config = config;
+    drawable->eventMask = 0;
+
+    return GL_TRUE;
+}
+
+void
+__glXDrawableRelease(__GLXdrawable *drawable)
+{
+}
+
+static int 
+DoCreateGLXDrawable(ClientPtr client, __GLXscreen *pGlxScreen,
+		    __GLXconfig *config, DrawablePtr pDraw, XID drawableId,
+		    XID glxDrawableId, int type)
+{
+    __GLXdrawable *pGlxDraw;
+
+    if (pGlxScreen->pScreen != pDraw->pScreen)
+	return BadMatch;
+
+    pGlxDraw = pGlxScreen->createDrawable(client, pGlxScreen, pDraw,
+					  drawableId, type,
+					  glxDrawableId, config);
+    if (pGlxDraw == NULL)
+	return BadAlloc;
+
+    if (!AddResource(glxDrawableId, __glXDrawableRes, pGlxDraw)) {
+	pGlxDraw->destroy (pGlxDraw);
+	return BadAlloc;
+    }
+
+    /* Add the glx drawable under the XID of the underlying X drawable
+     * too.  That way we'll get a callback in DrawableGone and can
+     * clean up properly when the drawable is destroyed. */
+    if (drawableId != glxDrawableId &&
+	!AddResource(pDraw->id, __glXDrawableRes, pGlxDraw)) {
+	pGlxDraw->destroy (pGlxDraw);
+	return BadAlloc;
+    }
+
+    return Success;
+}
+
+static int
+DoCreateGLXPixmap(ClientPtr client, __GLXscreen *pGlxScreen, __GLXconfig *config,
+		  XID drawableId, XID glxDrawableId)
+{
+    DrawablePtr pDraw;
+    int err;
+
+    LEGAL_NEW_RESOURCE(glxDrawableId, client);
+
+    err = dixLookupDrawable(&pDraw, drawableId, client, 0, DixAddAccess);
+    if (err != Success) {
+	client->errorValue = drawableId;
+	return err;
+    }
+    if (pDraw->type != DRAWABLE_PIXMAP) {
+	client->errorValue = drawableId;
+	return BadPixmap;
+    }
+
+    err = DoCreateGLXDrawable(client, pGlxScreen, config, pDraw, drawableId,
+			      glxDrawableId, GLX_DRAWABLE_PIXMAP);
+
+    return err;
+}
+
+static void
+determineTextureTarget(ClientPtr client, XID glxDrawableID,
+		       CARD32 *attribs, CARD32 numAttribs)
+{
+    GLenum target = 0;
+    GLenum format = 0;
+    int i, err;
+    __GLXdrawable *pGlxDraw;
+
+    if (!validGlxDrawable(client, glxDrawableID, GLX_DRAWABLE_PIXMAP,
+			  DixWriteAccess, &pGlxDraw, &err))
+	/* We just added it in CreatePixmap, so we should never get here. */
+	return;
+
+    for (i = 0; i < numAttribs; i++) {
+	if (attribs[2 * i] == GLX_TEXTURE_TARGET_EXT) {
+	    switch (attribs[2 * i + 1]) {
+	    case GLX_TEXTURE_2D_EXT:
+		target = GL_TEXTURE_2D;
+		break;
+	    case GLX_TEXTURE_RECTANGLE_EXT:
+		target = GL_TEXTURE_RECTANGLE_ARB;
+		break;
+	    }
+	}
+
+	if (attribs[2 * i] == GLX_TEXTURE_FORMAT_EXT)
+		format = attribs[2 * i + 1];
+    }
+ 
+    if (!target) {
+	int w = pGlxDraw->pDraw->width, h = pGlxDraw->pDraw->height;
+	
+	if (h & (h - 1) || w & (w - 1))
+	    target = GL_TEXTURE_RECTANGLE_ARB;
+	else
+	    target = GL_TEXTURE_2D;
+    }
+
+    pGlxDraw->target = target;
+    pGlxDraw->format = format;
+}
+
+int __glXDisp_CreateGLXPixmap(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXCreateGLXPixmapReq *req = (xGLXCreateGLXPixmapReq *) pc;
+    __GLXconfig *config;
+    __GLXscreen *pGlxScreen;
+    int err;
+
+    if (!validGlxScreen(cl->client, req->screen, &pGlxScreen, &err))
+	return err;
+    if (!validGlxVisual(cl->client, pGlxScreen, req->visual, &config, &err))
+	return err;
+
+    return DoCreateGLXPixmap(cl->client, pGlxScreen, config,
+			     req->pixmap, req->glxpixmap);
+}
+
+int __glXDisp_CreatePixmap(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXCreatePixmapReq *req = (xGLXCreatePixmapReq *) pc;
+    __GLXconfig *config;
+    __GLXscreen *pGlxScreen;
+    int err;
+
+    if (!validGlxScreen(cl->client, req->screen, &pGlxScreen, &err))
+	return err;
+    if (!validGlxFBConfig(cl->client, pGlxScreen, req->fbconfig, &config, &err))
+	return err;
+
+    err = DoCreateGLXPixmap(cl->client, pGlxScreen, config,
+			    req->pixmap, req->glxpixmap);
+    if (err != Success)
+	return err;
+
+    determineTextureTarget(cl->client, req->glxpixmap,
+			   (CARD32*) (req + 1), req->numAttribs);
+
+    return Success;
+}
+
+int __glXDisp_CreateGLXPixmapWithConfigSGIX(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXCreateGLXPixmapWithConfigSGIXReq *req = 
+	(xGLXCreateGLXPixmapWithConfigSGIXReq *) pc;
+    __GLXconfig *config;
+    __GLXscreen *pGlxScreen;
+    int err;
+
+    if (!validGlxScreen(cl->client, req->screen, &pGlxScreen, &err))
+	return err;
+    if (!validGlxFBConfig(cl->client, pGlxScreen, req->fbconfig, &config, &err))
+	return err;
+
+    return DoCreateGLXPixmap(cl->client, pGlxScreen,
+			     config, req->pixmap, req->glxpixmap);
+}
+
+
+static int DoDestroyDrawable(__GLXclientState *cl, XID glxdrawable, int type)
+{
+    __GLXdrawable *pGlxDraw;
+    int err;
+
+    if (!validGlxDrawable(cl->client, glxdrawable, type,
+			  DixDestroyAccess, &pGlxDraw, &err))
+	return err;
+
+    FreeResource(glxdrawable, FALSE);
+
+    return Success;
+}
+
+int __glXDisp_DestroyGLXPixmap(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXDestroyGLXPixmapReq *req = (xGLXDestroyGLXPixmapReq *) pc;
+
+    return DoDestroyDrawable(cl, req->glxpixmap, GLX_DRAWABLE_PIXMAP);
+}
+
+int __glXDisp_DestroyPixmap(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXDestroyPixmapReq *req = (xGLXDestroyPixmapReq *) pc;
+
+    return DoDestroyDrawable(cl, req->glxpixmap, GLX_DRAWABLE_PIXMAP);
+}
+
+static int
+DoCreatePbuffer(ClientPtr client, int screenNum, XID fbconfigId,
+		int width, int height, XID glxDrawableId)
+{
+    __GLXconfig	*config;
+    __GLXscreen		*pGlxScreen;
+    PixmapPtr		 pPixmap;
+    int			 err;
+
+    LEGAL_NEW_RESOURCE(glxDrawableId, client);
+
+    if (!validGlxScreen(client, screenNum, &pGlxScreen, &err))
+	return err;
+    if (!validGlxFBConfig(client, pGlxScreen, fbconfigId, &config, &err))
+	return err;
+
+    __glXenterServer(GL_FALSE);
+    pPixmap = (*pGlxScreen->pScreen->CreatePixmap) (pGlxScreen->pScreen,
+						    width, height, config->rgbBits, 0);
+    __glXleaveServer(GL_FALSE);
+
+    /* Assign the pixmap the same id as the pbuffer and add it as a
+     * resource so it and the DRI2 drawable will be reclaimed when the
+     * pbuffer is destroyed. */
+    pPixmap->drawable.id = glxDrawableId;
+    if (!AddResource(pPixmap->drawable.id, RT_PIXMAP, pPixmap))
+	return BadAlloc;
+
+    return DoCreateGLXDrawable(client, pGlxScreen, config, &pPixmap->drawable,
+			       glxDrawableId, glxDrawableId,
+			       GLX_DRAWABLE_PBUFFER);
+}
+
+int __glXDisp_CreatePbuffer(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXCreatePbufferReq	*req = (xGLXCreatePbufferReq *) pc;
+    CARD32			*attrs;
+    int				 width, height, i;
+
+    attrs = (CARD32 *) (req + 1);
+    width = 0;
+    height = 0;
+
+    for (i = 0; i < req->numAttribs; i++) {
+	switch (attrs[i * 2]) {
+	case GLX_PBUFFER_WIDTH:
+	    width = attrs[i * 2 + 1];
+	    break;
+	case GLX_PBUFFER_HEIGHT:
+	    height = attrs[i * 2 + 1];
+	    break;
+	case GLX_LARGEST_PBUFFER:
+	case GLX_PRESERVED_CONTENTS:
+	    /* FIXME: huh... */
+	    break;
+	}
+    }
+
+    return DoCreatePbuffer(cl->client, req->screen, req->fbconfig,
+			   width, height, req->pbuffer);
+}
+
+int __glXDisp_CreateGLXPbufferSGIX(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXCreateGLXPbufferSGIXReq *req = (xGLXCreateGLXPbufferSGIXReq *) pc;
+
+    return DoCreatePbuffer(cl->client, req->screen, req->fbconfig,
+			   req->width, req->height, req->pbuffer);
+}
+
+int __glXDisp_DestroyPbuffer(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXDestroyPbufferReq *req = (xGLXDestroyPbufferReq *) pc;
+
+    return DoDestroyDrawable(cl, req->pbuffer, GLX_DRAWABLE_PBUFFER);
+}
+
+int __glXDisp_DestroyGLXPbufferSGIX(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXDestroyGLXPbufferSGIXReq *req = (xGLXDestroyGLXPbufferSGIXReq *) pc;
+
+    return DoDestroyDrawable(cl, req->pbuffer, GLX_DRAWABLE_PBUFFER);
+}
+
+static int
+DoChangeDrawableAttributes(ClientPtr client, XID glxdrawable,
+			   int numAttribs, CARD32 *attribs)
+{
+    __GLXdrawable *pGlxDraw;
+    int i, err;
+
+    if (!validGlxDrawable(client, glxdrawable, GLX_DRAWABLE_ANY,
+			  DixSetAttrAccess, &pGlxDraw, &err))
+	return err;
+
+    for (i = 0; i < numAttribs; i++) {
+	switch(attribs[i * 2]) {
+	case GLX_EVENT_MASK:
+	    /* All we do is to record the event mask so we can send it
+	     * back when queried.  We never actually clobber the
+	     * pbuffers, so we never need to send out the event. */
+	    pGlxDraw->eventMask = attribs[i * 2 + 1];
+	    break;
+	}
+    }
+
+    return Success;
+}
+
+int __glXDisp_ChangeDrawableAttributes(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXChangeDrawableAttributesReq *req =
+	(xGLXChangeDrawableAttributesReq *) pc;
+
+    return DoChangeDrawableAttributes(cl->client, req->drawable,
+				      req->numAttribs, (CARD32 *) (req + 1));
+}
+
+int __glXDisp_ChangeDrawableAttributesSGIX(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXChangeDrawableAttributesSGIXReq *req =
+	(xGLXChangeDrawableAttributesSGIXReq *)pc;
+
+    return DoChangeDrawableAttributes(cl->client, req->drawable,
+				      req->numAttribs, (CARD32 *) (req + 1));
+}
+
+int __glXDisp_CreateWindow(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXCreateWindowReq	*req = (xGLXCreateWindowReq *) pc;
+    __GLXconfig	*config;
+    __GLXscreen		*pGlxScreen;
+    ClientPtr		 client = cl->client;
+    DrawablePtr		 pDraw;
+    int			 err;
+
+    LEGAL_NEW_RESOURCE(req->glxwindow, client);
+
+    if (!validGlxScreen(client, req->screen, &pGlxScreen, &err))
+	return err;
+    if (!validGlxFBConfig(client, pGlxScreen, req->fbconfig, &config, &err))
+	return err;
+
+    err = dixLookupDrawable(&pDraw, req->window, client, 0, DixAddAccess);
+    if (err != Success || pDraw->type != DRAWABLE_WINDOW) {
+	client->errorValue = req->window;
+	return BadWindow;
+    }
+
+    if (!validGlxFBConfigForWindow(client, config, pDraw, &err))
+	return err;
+
+    return DoCreateGLXDrawable(client, pGlxScreen, config,
+			       pDraw, req->window,
+			       req->glxwindow, GLX_DRAWABLE_WINDOW);
+}
+
+int __glXDisp_DestroyWindow(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXDestroyWindowReq *req = (xGLXDestroyWindowReq *) pc;
+
+    return DoDestroyDrawable(cl, req->glxwindow, GLX_DRAWABLE_WINDOW);
+}
+
+
+/*****************************************************************************/
+
+/*
+** NOTE: There is no portable implementation for swap buffers as of
+** this time that is of value.  Consequently, this code must be
+** implemented by somebody other than SGI.
+*/
+int __glXDisp_SwapBuffers(__GLXclientState *cl, GLbyte *pc)
+{
+    ClientPtr client = cl->client;
+    xGLXSwapBuffersReq *req = (xGLXSwapBuffersReq *) pc;
+    GLXContextTag tag = req->contextTag;
+    XID drawId = req->drawable;
+    __GLXcontext *glxc = NULL;
+    __GLXdrawable *pGlxDraw;
+    int error;
+
+    if (tag) {
+	glxc = __glXLookupContextByTag(cl, tag);
+	if (!glxc) {
+	    return __glXError(GLXBadContextTag);
+	}
+	/*
+	** The calling thread is swapping its current drawable.  In this case,
+	** glxSwapBuffers is in both GL and X streams, in terms of
+	** sequentiality.
+	*/
+	if (__glXForceCurrent(cl, tag, &error)) {
+	    /*
+	    ** Do whatever is needed to make sure that all preceding requests
+	    ** in both streams are completed before the swap is executed.
+	    */
+	    CALL_Finish( GET_DISPATCH(), () );
+	    __GLX_NOTE_FLUSHED_CMDS(glxc);
+	} else {
+	    return error;
+	}
+    }
+
+    pGlxDraw = __glXGetDrawable(glxc, drawId, client, &error);
+    if (pGlxDraw == NULL)
+	return error;
+
+    if (pGlxDraw->type == DRAWABLE_WINDOW &&
+	(*pGlxDraw->swapBuffers)(cl->client, pGlxDraw) == GL_FALSE)
+	return __glXError(GLXBadDrawable);
+
+    return Success;
+}
+
+
+static int
+DoQueryContext(__GLXclientState *cl, GLXContextID gcId)
+{
+    ClientPtr client = cl->client;
+    __GLXcontext *ctx;
+    xGLXQueryContextInfoEXTReply reply;
+    int nProps;
+    int *sendBuf, *pSendBuf;
+    int nReplyBytes;
+    int err;
+
+    if (!validGlxContext(cl->client, gcId, DixReadAccess, &ctx, &err))
+	return err;
+
+    nProps = 3;
+    reply.length = nProps << 1;
+    reply.type = X_Reply;
+    reply.sequenceNumber = client->sequence;
+    reply.n = nProps;
+
+    nReplyBytes = reply.length << 2;
+    sendBuf = (int *)xalloc((size_t)nReplyBytes);
+    if (sendBuf == NULL) {
+	return __glXError(GLXBadContext);	/* XXX: Is this correct? */
+    }
+    pSendBuf = sendBuf;
+    *pSendBuf++ = GLX_SHARE_CONTEXT_EXT;
+    *pSendBuf++ = (int)(ctx->share_id);
+    *pSendBuf++ = GLX_VISUAL_ID_EXT;
+    *pSendBuf++ = (int)(ctx->config->visualID);
+    *pSendBuf++ = GLX_SCREEN_EXT;
+    *pSendBuf++ = (int)(ctx->pGlxScreen->pScreen->myNum);
+
+    if (client->swapped) {
+	__glXSwapQueryContextInfoEXTReply(client, &reply, sendBuf);
+    } else {
+	WriteToClient(client, sz_xGLXQueryContextInfoEXTReply, (char *)&reply);
+	WriteToClient(client, nReplyBytes, (char *)sendBuf);
+    }
+    xfree((char *)sendBuf);
+
+    return Success;
+}
+
+int __glXDisp_QueryContextInfoEXT(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXQueryContextInfoEXTReq *req = (xGLXQueryContextInfoEXTReq *) pc;
+
+    return DoQueryContext(cl, req->context);
+}
+
+int __glXDisp_QueryContext(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXQueryContextReq *req = (xGLXQueryContextReq *) pc;
+
+    return DoQueryContext(cl, req->context);
+}
+
+int __glXDisp_BindTexImageEXT(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *) pc;
+    ClientPtr		 client = cl->client;
+    __GLXcontext	*context;
+    __GLXdrawable	*pGlxDraw;
+    GLXDrawable		 drawId;
+    int			 buffer;
+    int			 error;
+
+    pc += __GLX_VENDPRIV_HDR_SIZE;
+
+    drawId = *((CARD32 *) (pc));
+    buffer = *((INT32 *)  (pc + 4));
+
+    if (buffer != GLX_FRONT_LEFT_EXT)
+	return __glXError(GLXBadPixmap);
+
+    context = __glXForceCurrent (cl, req->contextTag, &error);
+    if (!context)
+	return error;
+
+    if (!validGlxDrawable(client, drawId, GLX_DRAWABLE_PIXMAP,
+			  DixReadAccess, &pGlxDraw, &error))
+	return error;
+
+    if (!context->textureFromPixmap)
+	return __glXError(GLXUnsupportedPrivateRequest);
+
+    return context->textureFromPixmap->bindTexImage(context,
+						    buffer,
+						    pGlxDraw);
+}
+
+int __glXDisp_ReleaseTexImageEXT(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *) pc;
+    ClientPtr		 client = cl->client;
+    __GLXdrawable	*pGlxDraw;
+    __GLXcontext	*context;
+    GLXDrawable		 drawId;
+    int			 buffer;
+    int			 error;
+
+    pc += __GLX_VENDPRIV_HDR_SIZE;
+
+    drawId = *((CARD32 *) (pc));
+    buffer = *((INT32 *)  (pc + 4));
+    
+    context = __glXForceCurrent (cl, req->contextTag, &error);
+    if (!context)
+	return error;
+
+    if (!validGlxDrawable(client, drawId, GLX_DRAWABLE_PIXMAP,
+			  DixReadAccess, &pGlxDraw, &error))
+	return error;
+
+    if (!context->textureFromPixmap)
+	return __glXError(GLXUnsupportedPrivateRequest);
+
+    return context->textureFromPixmap->releaseTexImage(context,
+						       buffer,
+						       pGlxDraw);
+}
+
+int __glXDisp_CopySubBufferMESA(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *) pc;
+    GLXContextTag         tag = req->contextTag;
+    __GLXcontext         *glxc = NULL;
+    __GLXdrawable        *pGlxDraw;
+    ClientPtr		  client = cl->client;
+    GLXDrawable		  drawId;
+    int                   error;
+    int                   x, y, width, height;
+
+    (void) client;
+    (void) req;
+
+    pc += __GLX_VENDPRIV_HDR_SIZE;
+
+    drawId = *((CARD32 *) (pc));
+    x      = *((INT32 *)  (pc + 4));
+    y      = *((INT32 *)  (pc + 8));
+    width  = *((INT32 *)  (pc + 12));
+    height = *((INT32 *)  (pc + 16));
+
+    if (tag) {
+	glxc = __glXLookupContextByTag(cl, tag);
+	if (!glxc) {
+	    return __glXError(GLXBadContextTag);
+	}
+	/*
+	** The calling thread is swapping its current drawable.  In this case,
+	** glxSwapBuffers is in both GL and X streams, in terms of
+	** sequentiality.
+	*/
+	if (__glXForceCurrent(cl, tag, &error)) {
+	    /*
+	    ** Do whatever is needed to make sure that all preceding requests
+	    ** in both streams are completed before the swap is executed.
+	    */
+	    CALL_Finish( GET_DISPATCH(), () );
+	    __GLX_NOTE_FLUSHED_CMDS(glxc);
+	} else {
+	    return error;
+	}
+    }
+
+    pGlxDraw = __glXGetDrawable(glxc, drawId, client, &error);
+    if (!pGlxDraw)
+	return error;
+
+    if (pGlxDraw == NULL ||
+	pGlxDraw->type != GLX_DRAWABLE_WINDOW ||
+	pGlxDraw->copySubBuffer == NULL)
+	return __glXError(GLXBadDrawable);
+
+    (*pGlxDraw->copySubBuffer)(pGlxDraw, x, y, width, height);
+
+    return Success;
+}
+
+/*
+** Get drawable attributes
+*/
+static int
+DoGetDrawableAttributes(__GLXclientState *cl, XID drawId)
+{
+    ClientPtr client = cl->client;
+    xGLXGetDrawableAttributesReply reply;
+    __GLXdrawable *pGlxDraw;
+    CARD32 attributes[6];
+    int numAttribs, error;
+
+    if (!validGlxDrawable(client, drawId, GLX_DRAWABLE_ANY,
+			  DixGetAttrAccess, &pGlxDraw, &error))
+	return error;
+
+    numAttribs = 3;
+    reply.length = numAttribs << 1;
+    reply.type = X_Reply;
+    reply.sequenceNumber = client->sequence;
+    reply.numAttribs = numAttribs;
+
+    attributes[0] = GLX_TEXTURE_TARGET_EXT;
+    attributes[1] = pGlxDraw->target == GL_TEXTURE_2D ? GLX_TEXTURE_2D_EXT :
+	GLX_TEXTURE_RECTANGLE_EXT;
+    attributes[2] = GLX_Y_INVERTED_EXT;
+    attributes[3] = GL_FALSE;
+    attributes[4] = GLX_EVENT_MASK;
+    attributes[5] = pGlxDraw->eventMask;
+
+    if (client->swapped) {
+	__glXSwapGetDrawableAttributesReply(client, &reply, attributes);
+    } else {
+	WriteToClient(client, sz_xGLXGetDrawableAttributesReply,
+		      (char *)&reply);
+	WriteToClient(client, reply.length * sizeof (CARD32),
+		      (char *)attributes);
+    }
+
+    return Success;
+}
+
+int __glXDisp_GetDrawableAttributes(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXGetDrawableAttributesReq *req = (xGLXGetDrawableAttributesReq *)pc;
+
+    return DoGetDrawableAttributes(cl, req->drawable);
+}
+
+int __glXDisp_GetDrawableAttributesSGIX(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXGetDrawableAttributesSGIXReq *req =
+	(xGLXGetDrawableAttributesSGIXReq *)pc;
+    
+    return DoGetDrawableAttributes(cl, req->drawable);
+}
+
+/************************************************************************/
+
+/*
+** Render and Renderlarge are not in the GLX API.  They are used by the GLX
+** client library to send batches of GL rendering commands.
+*/
+
+/*
+** Execute all the drawing commands in a request.
+*/
+int __glXDisp_Render(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXRenderReq *req;
+    ClientPtr client= cl->client;
+    int left, cmdlen, error;
+    int commandsDone;
+    CARD16 opcode;
+    __GLXrenderHeader *hdr;
+    __GLXcontext *glxc;
+    __GLX_DECLARE_SWAP_VARIABLES;
+
+    req = (xGLXRenderReq *) pc;
+    if (client->swapped) {
+	__GLX_SWAP_SHORT(&req->length);
+	__GLX_SWAP_INT(&req->contextTag);
+    }
+
+    glxc = __glXForceCurrent(cl, req->contextTag, &error);
+    if (!glxc) {
+	return error;
+    }
+
+    commandsDone = 0;
+    pc += sz_xGLXRenderReq;
+    left = (req->length << 2) - sz_xGLXRenderReq;
+    while (left > 0) {
+        __GLXrenderSizeData entry;
+        int extra;
+	__GLXdispatchRenderProcPtr proc;
+	int err;
+
+	/*
+	** Verify that the header length and the overall length agree.
+	** Also, each command must be word aligned.
+	*/
+	hdr = (__GLXrenderHeader *) pc;
+	if (client->swapped) {
+	    __GLX_SWAP_SHORT(&hdr->length);
+	    __GLX_SWAP_SHORT(&hdr->opcode);
+	}
+	cmdlen = hdr->length;
+	opcode = hdr->opcode;
+
+	/*
+	** Check for core opcodes and grab entry data.
+	*/
+	err = __glXGetProtocolSizeData(& Render_dispatch_info, opcode, & entry);
+	proc = (__GLXdispatchRenderProcPtr)
+	    __glXGetProtocolDecodeFunction(& Render_dispatch_info,
+					   opcode, client->swapped);
+
+	if ((err < 0) || (proc == NULL)) {
+	    client->errorValue = commandsDone;
+	    return __glXError(GLXBadRenderRequest);
+	}
+
+        if (entry.varsize) {
+            /* variable size command */
+            extra = (*entry.varsize)(pc + __GLX_RENDER_HDR_SIZE,
+				     client->swapped);
+            if (extra < 0) {
+                extra = 0;
+            }
+            if (cmdlen != __GLX_PAD(entry.bytes + extra)) {
+                return BadLength;
+            }
+        } else {
+            /* constant size command */
+            if (cmdlen != __GLX_PAD(entry.bytes)) {
+                return BadLength;
+            }
+        }
+	if (left < cmdlen) {
+	    return BadLength;
+	}
+
+	/*
+	** Skip over the header and execute the command.  We allow the
+	** caller to trash the command memory.  This is useful especially
+	** for things that require double alignment - they can just shift
+	** the data towards lower memory (trashing the header) by 4 bytes
+	** and achieve the required alignment.
+	*/
+	(*proc)(pc + __GLX_RENDER_HDR_SIZE);
+	pc += cmdlen;
+	left -= cmdlen;
+	commandsDone++;
+    }
+    __GLX_NOTE_UNFLUSHED_CMDS(glxc);
+    return Success;
+}
+
+
+/*
+** Execute a large rendering request (one that spans multiple X requests).
+*/
+int __glXDisp_RenderLarge(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXRenderLargeReq *req;
+    ClientPtr client= cl->client;
+    size_t dataBytes;
+    __GLXrenderLargeHeader *hdr;
+    __GLXcontext *glxc;
+    int error;
+    CARD16 opcode;
+    __GLX_DECLARE_SWAP_VARIABLES;
+    
+    req = (xGLXRenderLargeReq *) pc;
+    if (client->swapped) {
+	__GLX_SWAP_SHORT(&req->length);
+	__GLX_SWAP_INT(&req->contextTag);
+	__GLX_SWAP_INT(&req->dataBytes);
+	__GLX_SWAP_SHORT(&req->requestNumber);
+	__GLX_SWAP_SHORT(&req->requestTotal);
+    }
+
+    glxc = __glXForceCurrent(cl, req->contextTag, &error);
+    if (!glxc) {
+	/* Reset in case this isn't 1st request. */
+	__glXResetLargeCommandStatus(cl);
+	return error;
+    }
+    dataBytes = req->dataBytes;
+
+    /*
+    ** Check the request length.
+    */
+    if ((req->length << 2) != __GLX_PAD(dataBytes) + sz_xGLXRenderLargeReq) {
+	client->errorValue = req->length;
+	/* Reset in case this isn't 1st request. */
+	__glXResetLargeCommandStatus(cl);
+	return BadLength;
+    }
+    pc += sz_xGLXRenderLargeReq;
+    
+    if (cl->largeCmdRequestsSoFar == 0) {
+	__GLXrenderSizeData entry;
+	int extra;
+	size_t cmdlen;
+	int err;
+
+	/*
+	** This is the first request of a multi request command.
+	** Make enough space in the buffer, then copy the entire request.
+	*/
+	if (req->requestNumber != 1) {
+	    client->errorValue = req->requestNumber;
+	    return __glXError(GLXBadLargeRequest);
+	}
+
+	hdr = (__GLXrenderLargeHeader *) pc;
+	if (client->swapped) {
+	    __GLX_SWAP_INT(&hdr->length);
+	    __GLX_SWAP_INT(&hdr->opcode);
+	}
+	cmdlen = hdr->length;
+	opcode = hdr->opcode;
+
+	/*
+	** Check for core opcodes and grab entry data.
+	*/
+	err = __glXGetProtocolSizeData(& Render_dispatch_info, opcode, & entry);
+	if (err < 0) {
+	    client->errorValue = opcode;
+	    return __glXError(GLXBadLargeRequest);
+	}
+
+	if (entry.varsize) {
+	    /*
+	    ** If it's a variable-size command (a command whose length must
+	    ** be computed from its parameters), all the parameters needed
+	    ** will be in the 1st request, so it's okay to do this.
+	    */
+	    extra = (*entry.varsize)(pc + __GLX_RENDER_LARGE_HDR_SIZE,
+				     client->swapped);
+	    if (extra < 0) {
+		extra = 0;
+	    }
+	    /* large command's header is 4 bytes longer, so add 4 */
+	    if (cmdlen != __GLX_PAD(entry.bytes + 4 + extra)) {
+		return BadLength;
+	    }
+	} else {
+	    /* constant size command */
+	    if (cmdlen != __GLX_PAD(entry.bytes + 4)) {
+		return BadLength;
+	    }
+	}
+	/*
+	** Make enough space in the buffer, then copy the entire request.
+	*/
+	if (cl->largeCmdBufSize < cmdlen) {
+	    if (!cl->largeCmdBuf) {
+		cl->largeCmdBuf = (GLbyte *) xalloc(cmdlen);
+	    } else {
+		cl->largeCmdBuf = (GLbyte *) xrealloc(cl->largeCmdBuf, cmdlen);
+	    }
+	    if (!cl->largeCmdBuf) {
+		return BadAlloc;
+	    }
+	    cl->largeCmdBufSize = cmdlen;
+	}
+	memcpy(cl->largeCmdBuf, pc, dataBytes);
+
+	cl->largeCmdBytesSoFar = dataBytes;
+	cl->largeCmdBytesTotal = cmdlen;
+	cl->largeCmdRequestsSoFar = 1;
+	cl->largeCmdRequestsTotal = req->requestTotal;
+	return Success;
+	
+    } else {
+	/*
+	** We are receiving subsequent (i.e. not the first) requests of a
+	** multi request command.
+	*/
+
+	/*
+	** Check the request number and the total request count.
+	*/
+	if (req->requestNumber != cl->largeCmdRequestsSoFar + 1) {
+	    client->errorValue = req->requestNumber;
+	    __glXResetLargeCommandStatus(cl);
+	    return __glXError(GLXBadLargeRequest);
+	}
+	if (req->requestTotal != cl->largeCmdRequestsTotal) {
+	    client->errorValue = req->requestTotal;
+	    __glXResetLargeCommandStatus(cl);
+	    return __glXError(GLXBadLargeRequest);
+	}
+
+	/*
+	** Check that we didn't get too much data.
+	*/
+	if ((cl->largeCmdBytesSoFar + dataBytes) > cl->largeCmdBytesTotal) {
+	    client->errorValue = dataBytes;
+	    __glXResetLargeCommandStatus(cl);
+	    return __glXError(GLXBadLargeRequest);
+	}
+	memcpy(cl->largeCmdBuf + cl->largeCmdBytesSoFar, pc, dataBytes);
+	cl->largeCmdBytesSoFar += dataBytes;
+	cl->largeCmdRequestsSoFar++;
+
+	if (req->requestNumber == cl->largeCmdRequestsTotal) {
+	    __GLXdispatchRenderProcPtr proc;
+
+	    /*
+	    ** This is the last request; it must have enough bytes to complete
+	    ** the command.
+	    */
+	    /* NOTE: the two pad macros have been added below; they are needed
+	    ** because the client library pads the total byte count, but not
+	    ** the per-request byte counts.  The Protocol Encoding says the
+	    ** total byte count should not be padded, so a proposal will be 
+	    ** made to the ARB to relax the padding constraint on the total 
+	    ** byte count, thus preserving backward compatibility.  Meanwhile, 
+	    ** the padding done below fixes a bug that did not allow
+	    ** large commands of odd sizes to be accepted by the server.
+	    */
+	    if (__GLX_PAD(cl->largeCmdBytesSoFar) !=
+		__GLX_PAD(cl->largeCmdBytesTotal)) {
+		client->errorValue = dataBytes;
+		__glXResetLargeCommandStatus(cl);
+		return __glXError(GLXBadLargeRequest);
+	    }
+	    hdr = (__GLXrenderLargeHeader *) cl->largeCmdBuf;
+	    /*
+	    ** The opcode and length field in the header had already been
+	    ** swapped when the first request was received.
+	    **
+	    ** Use the opcode to index into the procedure table.
+	    */
+	    opcode = hdr->opcode;
+
+	    proc = (__GLXdispatchRenderProcPtr)
+	      __glXGetProtocolDecodeFunction(& Render_dispatch_info, opcode,
+					     client->swapped);
+	    if (proc == NULL) {
+		client->errorValue = opcode;
+		return __glXError(GLXBadLargeRequest);
+	    }
+
+	    /*
+	    ** Skip over the header and execute the command.
+	    */
+	    (*proc)(cl->largeCmdBuf + __GLX_RENDER_LARGE_HDR_SIZE);
+	    __GLX_NOTE_UNFLUSHED_CMDS(glxc);
+
+	    /*
+	    ** Reset for the next RenderLarge series.
+	    */
+	    __glXResetLargeCommandStatus(cl);
+	} else {
+	    /*
+	    ** This is neither the first nor the last request.
+	    */
+	}
+	return Success;
+    }
+}
+
+extern RESTYPE __glXSwapBarrierRes;
+
+int __glXDisp_BindSwapBarrierSGIX(__GLXclientState *cl, GLbyte *pc)
+{
+    ClientPtr client = cl->client;
+    xGLXBindSwapBarrierSGIXReq *req = (xGLXBindSwapBarrierSGIXReq *) pc;
+    XID drawable = req->drawable;
+    int barrier = req->barrier;
+    DrawablePtr pDraw;
+    int screen, rc;
+    __GLXscreen *pGlxScreen;
+
+    rc = dixLookupDrawable(&pDraw, drawable, client, 0, DixGetAttrAccess);
+    pGlxScreen = glxGetScreen(pDraw->pScreen);
+    if (rc == Success && (pDraw->type == DRAWABLE_WINDOW)) {
+	screen = pDraw->pScreen->myNum;
+        if (pGlxScreen->swapBarrierFuncs) {
+            int ret = pGlxScreen->swapBarrierFuncs->bindSwapBarrierFunc(screen, drawable, barrier);
+            if (ret == Success) {
+                if (barrier)
+                    /* add source for cleanup when drawable is gone */
+                    AddResource(drawable, __glXSwapBarrierRes, (pointer)(intptr_t)screen);
+                else
+                    /* delete source */
+                    FreeResourceByType(drawable, __glXSwapBarrierRes, FALSE);
+            }
+            return ret;
+        }
+    }
+    client->errorValue = drawable;
+    return __glXError(GLXBadDrawable);
+}
+
+
+int __glXDisp_QueryMaxSwapBarriersSGIX(__GLXclientState *cl, GLbyte *pc)
+{
+    ClientPtr client = cl->client;
+    xGLXQueryMaxSwapBarriersSGIXReq *req =
+                                    (xGLXQueryMaxSwapBarriersSGIXReq *) pc;
+    xGLXQueryMaxSwapBarriersSGIXReply reply;
+    int screen = req->screen;
+    __GLXscreen *pGlxScreen;
+
+    pGlxScreen = glxGetScreen(screenInfo.screens[screen]);
+    if (pGlxScreen->swapBarrierFuncs)
+        reply.max = pGlxScreen->swapBarrierFuncs->queryMaxSwapBarriersFunc(screen);
+    else
+        reply.max = 0;
+
+
+    reply.length = 0;
+    reply.type = X_Reply;
+    reply.sequenceNumber = client->sequence;
+
+    if (client->swapped) {
+        __GLX_DECLARE_SWAP_VARIABLES;
+        __GLX_SWAP_SHORT(&reply.sequenceNumber);
+    }
+
+    WriteToClient(client, sz_xGLXQueryMaxSwapBarriersSGIXReply,
+                        (char *) &reply);
+    return Success;
+}
+
+#define GLX_BAD_HYPERPIPE_SGIX 92
+
+int __glXDisp_QueryHyperpipeNetworkSGIX(__GLXclientState *cl, GLbyte *pc)
+{
+    ClientPtr client = cl->client;
+    xGLXQueryHyperpipeNetworkSGIXReq * req = (xGLXQueryHyperpipeNetworkSGIXReq *) pc;
+    xGLXQueryHyperpipeNetworkSGIXReply reply;
+    int screen = req->screen;
+    void *rdata = NULL;
+
+    int length=0;
+    int npipes=0;
+
+    int n= 0;
+    __GLXscreen *pGlxScreen;
+
+    pGlxScreen = glxGetScreen(screenInfo.screens[screen]);
+    if (pGlxScreen->hyperpipeFuncs) {
+        rdata =
+            (pGlxScreen->hyperpipeFuncs->queryHyperpipeNetworkFunc(screen, &npipes, &n));
+    }
+    length = __GLX_PAD(n) >> 2;
+    reply.type = X_Reply;
+    reply.sequenceNumber = client->sequence;
+    reply.length = length;
+    reply.n = n;
+    reply.npipes = npipes;
+
+    if (client->swapped) {
+        __GLX_DECLARE_SWAP_VARIABLES;
+        __GLX_SWAP_SHORT(&reply.sequenceNumber);
+        __GLX_SWAP_INT(&reply.length);
+        __GLX_SWAP_INT(&reply.n);
+        __GLX_SWAP_INT(&reply.npipes);
+    }
+    WriteToClient(client, sz_xGLXQueryHyperpipeNetworkSGIXReply,
+                  (char *) &reply);
+
+    WriteToClient(client, length << 2, (char *)rdata);
+
+    return Success;
+}
+
+int __glXDisp_DestroyHyperpipeConfigSGIX (__GLXclientState *cl, GLbyte *pc)
+{
+    ClientPtr client = cl->client;
+    xGLXDestroyHyperpipeConfigSGIXReq * req =
+        (xGLXDestroyHyperpipeConfigSGIXReq *) pc;
+    xGLXDestroyHyperpipeConfigSGIXReply reply;
+    int screen = req->screen;
+    int  success = GLX_BAD_HYPERPIPE_SGIX;
+    int hpId ;
+    __GLXscreen *pGlxScreen;
+
+    hpId = req->hpId;
+
+    pGlxScreen = glxGetScreen(screenInfo.screens[screen]);
+    if (pGlxScreen->hyperpipeFuncs) {
+        success = pGlxScreen->hyperpipeFuncs->destroyHyperpipeConfigFunc(screen, hpId);
+    }
+
+    reply.type = X_Reply;
+    reply.sequenceNumber = client->sequence;
+    reply.length = __GLX_PAD(0) >> 2;
+    reply.n = 0;
+    reply.success = success;
+
+
+    if (client->swapped) {
+        __GLX_DECLARE_SWAP_VARIABLES;
+        __GLX_SWAP_SHORT(&reply.sequenceNumber);
+    }
+    WriteToClient(client,
+                  sz_xGLXDestroyHyperpipeConfigSGIXReply,
+                  (char *) &reply);
+    return Success;
+}
+
+int __glXDisp_QueryHyperpipeConfigSGIX(__GLXclientState *cl, GLbyte *pc)
+{
+    ClientPtr client = cl->client;
+    xGLXQueryHyperpipeConfigSGIXReq * req =
+        (xGLXQueryHyperpipeConfigSGIXReq *) pc;
+    xGLXQueryHyperpipeConfigSGIXReply reply;
+    int screen = req->screen;
+    void *rdata = NULL;
+    int length;
+    int npipes=0;
+    int n= 0;
+    int hpId;
+    __GLXscreen *pGlxScreen;
+
+    hpId = req->hpId;
+
+    pGlxScreen = glxGetScreen(screenInfo.screens[screen]);
+    if (pGlxScreen->hyperpipeFuncs) {
+        rdata = pGlxScreen->hyperpipeFuncs->queryHyperpipeConfigFunc(screen, hpId,&npipes, &n);
+    }
+
+    length = __GLX_PAD(n) >> 2;
+    reply.type = X_Reply;
+    reply.sequenceNumber = client->sequence;
+    reply.length = length;
+    reply.n = n;
+    reply.npipes = npipes;
+
+
+    if (client->swapped) {
+        __GLX_DECLARE_SWAP_VARIABLES;
+        __GLX_SWAP_SHORT(&reply.sequenceNumber);
+        __GLX_SWAP_INT(&reply.length);
+        __GLX_SWAP_INT(&reply.n);
+        __GLX_SWAP_INT(&reply.npipes);
+    }
+
+    WriteToClient(client, sz_xGLXQueryHyperpipeConfigSGIXReply,
+                  (char *) &reply);
+
+    WriteToClient(client, length << 2, (char *)rdata);
+
+    return Success;
+}
+
+int __glXDisp_HyperpipeConfigSGIX(__GLXclientState *cl, GLbyte *pc)
+{
+    ClientPtr client = cl->client;
+    xGLXHyperpipeConfigSGIXReq * req =
+        (xGLXHyperpipeConfigSGIXReq *) pc;
+    xGLXHyperpipeConfigSGIXReply reply;
+    int screen = req->screen;
+    void *rdata;
+
+    int npipes=0, networkId;
+    int hpId=-1;
+    __GLXscreen *pGlxScreen;
+
+    pGlxScreen = glxGetScreen(screenInfo.screens[screen]);
+    networkId = (int)req->networkId;
+    npipes = (int)req->npipes;
+    rdata = (void *)(req +1);
+
+    if (pGlxScreen->hyperpipeFuncs) {
+        pGlxScreen->hyperpipeFuncs->hyperpipeConfigFunc(screen,networkId,
+                                                        &hpId, &npipes,
+                                                        (void *) rdata);
+    }
+
+    reply.type = X_Reply;
+    reply.sequenceNumber = client->sequence;
+    reply.length = __GLX_PAD(0) >> 2;
+    reply.n = 0;
+    reply.npipes = npipes;
+    reply.hpId = hpId;
+
+    if (client->swapped) {
+        __GLX_DECLARE_SWAP_VARIABLES;
+        __GLX_SWAP_SHORT(&reply.sequenceNumber);
+        __GLX_SWAP_INT(&reply.npipes);
+        __GLX_SWAP_INT(&reply.hpId);
+    }
+
+    WriteToClient(client, sz_xGLXHyperpipeConfigSGIXReply,
+                  (char *) &reply);
+
+    return Success;
+}
+
+
+/************************************************************************/
+
+/*
+** No support is provided for the vendor-private requests other than
+** allocating the entry points in the dispatch table.
+*/
+
+int __glXDisp_VendorPrivate(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *) pc;
+    GLint vendorcode = req->vendorCode;
+    __GLXdispatchVendorPrivProcPtr proc;
+
+
+    proc = (__GLXdispatchVendorPrivProcPtr)
+      __glXGetProtocolDecodeFunction(& VendorPriv_dispatch_info,
+				     vendorcode, 0);
+    if (proc != NULL) {
+	(*proc)(cl, (GLbyte*)req);
+	return Success;
+    }
+
+    cl->client->errorValue = req->vendorCode;
+    return __glXError(GLXUnsupportedPrivateRequest);
+}
+
+int __glXDisp_VendorPrivateWithReply(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *) pc;
+    GLint vendorcode = req->vendorCode;
+    __GLXdispatchVendorPrivProcPtr proc;
+
+
+    proc = (__GLXdispatchVendorPrivProcPtr)
+      __glXGetProtocolDecodeFunction(& VendorPriv_dispatch_info,
+				     vendorcode, 0);
+    if (proc != NULL) {
+	return (*proc)(cl, (GLbyte*)req);
+    }
+
+    cl->client->errorValue = vendorcode;
+    return __glXError(GLXUnsupportedPrivateRequest);
+}
+
+int __glXDisp_QueryExtensionsString(__GLXclientState *cl, GLbyte *pc)
+{
+    ClientPtr client = cl->client;
+    xGLXQueryExtensionsStringReq *req = (xGLXQueryExtensionsStringReq *) pc;
+    xGLXQueryExtensionsStringReply reply;
+    __GLXscreen *pGlxScreen;
+    size_t n, length;
+    char *buf;
+    int err;
+
+    if (!validGlxScreen(client, req->screen, &pGlxScreen, &err))
+	return err;
+
+    n = strlen(pGlxScreen->GLXextensions) + 1;
+    length = __GLX_PAD(n) >> 2;
+    reply.type = X_Reply;
+    reply.sequenceNumber = client->sequence;
+    reply.length = length;
+    reply.n = n;
+
+    /* Allocate buffer to make sure it's a multiple of 4 bytes big.*/
+    buf = (char *) xalloc(length << 2);
+    if (buf == NULL)
+        return BadAlloc;
+    memcpy(buf, pGlxScreen->GLXextensions, n);
+
+    if (client->swapped) {
+        glxSwapQueryExtensionsStringReply(client, &reply, buf);
+    } else {
+        WriteToClient(client, sz_xGLXQueryExtensionsStringReply,(char *)&reply);
+        WriteToClient(client, (int)(length << 2), (char *)buf);
+    }
+
+    xfree(buf);
+    return Success;
+}
+
+int __glXDisp_QueryServerString(__GLXclientState *cl, GLbyte *pc)
+{
+    ClientPtr client = cl->client;
+    xGLXQueryServerStringReq *req = (xGLXQueryServerStringReq *) pc;
+    xGLXQueryServerStringReply reply;
+    size_t n, length;
+    const char *ptr;
+    char *buf;
+    __GLXscreen *pGlxScreen;
+    int err;
+    char ver_str[16];
+
+    if (!validGlxScreen(client, req->screen, &pGlxScreen, &err))
+	return err;
+
+    switch(req->name) {
+	case GLX_VENDOR:
+	    ptr = pGlxScreen->GLXvendor;
+	    break;
+	case GLX_VERSION:
+	    /* Return to the server version rather than the screen version
+	     * to prevent confusion when they do not match.
+	     */
+	    snprintf(ver_str, 16, "%d.%d", glxMajorVersion, glxMinorVersion);
+	    ptr = ver_str;
+	    break;
+	case GLX_EXTENSIONS:
+	    ptr = pGlxScreen->GLXextensions;
+	    break;
+	default:
+	    return BadValue; 
+    }
+
+    n = strlen(ptr) + 1;
+    length = __GLX_PAD(n) >> 2;
+    reply.type = X_Reply;
+    reply.sequenceNumber = client->sequence;
+    reply.length = length;
+    reply.n = n;
+
+    buf = (char *) xalloc(length << 2);
+    if (buf == NULL) {
+        return BadAlloc;
+    }
+    memcpy(buf, ptr, n);
+
+    if (client->swapped) {
+        glxSwapQueryServerStringReply(client, &reply, buf);
+    } else {
+        WriteToClient(client, sz_xGLXQueryServerStringReply, (char *)&reply);
+        WriteToClient(client, (int)(length << 2), buf);
+    }
+
+    xfree(buf);
+    return Success;
+}
+
+int __glXDisp_ClientInfo(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXClientInfoReq *req = (xGLXClientInfoReq *) pc;
+    const char *buf;
+   
+    cl->GLClientmajorVersion = req->major;
+    cl->GLClientminorVersion = req->minor;
+    if (cl->GLClientextensions)
+	xfree(cl->GLClientextensions);
+    buf = (const char *)(req+1);
+    cl->GLClientextensions = xstrdup(buf);
+
+    return Success;
+}
diff --git a/xorg-server/glx/glxdri.c b/xorg-server/glx/glxdri.c
index 9810a73a7..7ee3d9938 100644
--- a/xorg-server/glx/glxdri.c
+++ b/xorg-server/glx/glxdri.c
@@ -1,1195 +1,1197 @@
-/*
- * Copyright © 2006 Red Hat, Inc
- *
- * Permission to use, copy, modify, distribute, and sell this software
- * and its documentation for any purpose is hereby granted without
- * fee, provided that the above copyright notice appear in all copies
- * and that both that copyright notice and this permission notice
- * appear in supporting documentation, and that the name of Red Hat,
- * Inc not be used in advertising or publicity pertaining to
- * distribution of the software without specific, written prior
- * permission.  Red Hat, Inc makes no representations about the
- * suitability of this software for any purpose.  It is provided "as
- * is" without express or implied warranty.
- *
- * RED HAT, INC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
- * NO EVENT SHALL RED HAT, INC BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
- * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
- * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <stdint.h>
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#include <sys/time.h>
-#include <dlfcn.h>
-
-#include <drm.h>
-#include <GL/gl.h>
-#include <GL/internal/dri_interface.h>
-#include <GL/glxtokens.h>
-
-#include <windowstr.h>
-#include <os.h>
-#include <damage.h>
-
-#define _XF86DRI_SERVER_
-#include <drm_sarea.h>
-#include <xf86drm.h>
-#include <X11/dri/xf86driproto.h>
-#include <xf86str.h>
-#include <xf86.h>
-#include <dri.h>
-
-#include "servermd.h"
-
-#define DRI_NEW_INTERFACE_ONLY
-#include "glxserver.h"
-#include "glxutil.h"
-#include "glxdricommon.h"
-
-#include "g_disptab.h"
-#include "glapitable.h"
-#include "glapi.h"
-#include "glthread.h"
-#include "dispatch.h"
-#include "extension_string.h"
-
-typedef struct __GLXDRIscreen   __GLXDRIscreen;
-typedef struct __GLXDRIcontext  __GLXDRIcontext;
-typedef struct __GLXDRIdrawable __GLXDRIdrawable;
-
-struct __GLXDRIscreen {
-    __GLXscreen		 base;
-    __DRIscreen		*driScreen;
-    void		*driver;
-
-    xf86EnterVTProc	*enterVT;
-    xf86LeaveVTProc	*leaveVT;
-
-    const __DRIcoreExtension *core;
-    const __DRIlegacyExtension *legacy;
-    const __DRIcopySubBufferExtension *copySubBuffer;
-    const __DRIswapControlExtension *swapControl;
-
-#ifdef __DRI_TEX_OFFSET
-    const __DRItexOffsetExtension *texOffset;
-    DRITexOffsetStartProcPtr texOffsetStart;
-    DRITexOffsetFinishProcPtr texOffsetFinish;
-    __GLXDRIdrawable *texOffsetOverride[16];
-    GLuint lastTexOffsetOverride;
-#endif
-
-    unsigned char glx_enable_bits[__GLX_EXT_BYTES];
-};
-
-struct __GLXDRIcontext {
-    __GLXcontext base;
-    __DRIcontext *driContext;
-    XID hwContextID;
-};
-
-struct __GLXDRIdrawable {
-    __GLXdrawable base;
-    __DRIdrawable *driDrawable;
-
-    /* Pulled in from old __GLXpixmap */
-#ifdef __DRI_TEX_OFFSET
-    GLint texname;
-    __GLXDRIcontext *ctx;
-    unsigned long long offset;
-    DamagePtr pDamage;
-#endif
-};
-
-static void
-__glXDRIleaveServer(GLboolean rendering)
-{
-    int i;
-
-    for (i = 0; rendering && i < screenInfo.numScreens; i++) {
-	__GLXDRIscreen * const screen =
-	    (__GLXDRIscreen *) glxGetScreen(screenInfo.screens[i]);
-	GLuint lastOverride = screen->lastTexOffsetOverride;
-
-	if (lastOverride) {
-	    __GLXDRIdrawable **texOffsetOverride = screen->texOffsetOverride;
-	    int j;
-
-	    for (j = 0; j < lastOverride; j++) {
-		__GLXDRIdrawable *pGlxPix = texOffsetOverride[j];
-
-		if (pGlxPix && pGlxPix->texname) {
-		    pGlxPix->offset =
-			screen->texOffsetStart((PixmapPtr)pGlxPix->base.pDraw);
-		}
-	    }
-	}
-    }
-
-    DRIBlockHandler(NULL, NULL, NULL);
-
-    for (i = 0; rendering && i < screenInfo.numScreens; i++) {
-	__GLXDRIscreen * const screen =
-	    (__GLXDRIscreen *) glxGetScreen(screenInfo.screens[i]);
-	GLuint lastOverride = screen->lastTexOffsetOverride;
-
-	if (lastOverride) {
-	    __GLXDRIdrawable **texOffsetOverride = screen->texOffsetOverride;
-	    int j;
-
-	    for (j = 0; j < lastOverride; j++) {
-		__GLXDRIdrawable *pGlxPix = texOffsetOverride[j];
-
-		if (pGlxPix && pGlxPix->texname) {
-		    screen->texOffset->setTexOffset(pGlxPix->ctx->driContext,
-						    pGlxPix->texname,
-						    pGlxPix->offset,
-						    pGlxPix->base.pDraw->depth,
-						    ((PixmapPtr)pGlxPix->base.pDraw)->devKind);
-		}
-	    }
-	}
-    }
-}
-    
-static void
-__glXDRIenterServer(GLboolean rendering)
-{
-    int i;
-
-    for (i = 0; rendering && i < screenInfo.numScreens; i++) {
-	__GLXDRIscreen * const screen = (__GLXDRIscreen *)
-	    glxGetScreen(screenInfo.screens[i]);
-
-	if (screen->lastTexOffsetOverride) {
-	    CALL_Flush(GET_DISPATCH(), ());
-	    break;
-	}
-    }
-
-    DRIWakeupHandler(NULL, 0, NULL);
-}
-
-
-static void
-__glXDRIdoReleaseTexImage(__GLXDRIscreen *screen, __GLXDRIdrawable *drawable)
-{
-    GLuint lastOverride = screen->lastTexOffsetOverride;
-
-    if (lastOverride) {
-	__GLXDRIdrawable **texOffsetOverride = screen->texOffsetOverride;
-	int i;
-
-	for (i = 0; i < lastOverride; i++) {
-	    if (texOffsetOverride[i] == drawable) {
-		if (screen->texOffsetFinish)
-		    screen->texOffsetFinish((PixmapPtr)drawable->base.pDraw);
-
-		texOffsetOverride[i] = NULL;
-
-		if (i + 1 == lastOverride) {
-		    lastOverride = 0;
-
-		    while (i--) {
-			if (texOffsetOverride[i]) {
-			    lastOverride = i + 1;
-			    break;
-			}
-		    }
-
-		    screen->lastTexOffsetOverride = lastOverride;
-
-		    break;
-		}
-	    }
-	}
-    }
-}
-
-
-static void
-__glXDRIdrawableDestroy(__GLXdrawable *drawable)
-{
-    __GLXDRIdrawable *private = (__GLXDRIdrawable *) drawable;
-    __GLXDRIscreen *screen;
-    int i;
-
-    for (i = 0; i < screenInfo.numScreens; i++) {
-	screen = (__GLXDRIscreen *) glxGetScreen(screenInfo.screens[i]);
-	__glXDRIdoReleaseTexImage(screen, private);
-    }
-
-    /* If the X window was destroyed, the dri DestroyWindow hook will
-     * aready have taken care of this, so only call if pDraw isn't NULL. */
-    if (drawable->pDraw != NULL) {
-	screen = (__GLXDRIscreen *) glxGetScreen(drawable->pDraw->pScreen);
-	(*screen->core->destroyDrawable)(private->driDrawable);
-
-	__glXenterServer(GL_FALSE);
-	DRIDestroyDrawable(drawable->pDraw->pScreen,
-			   serverClient, drawable->pDraw);
-	__glXleaveServer(GL_FALSE);
-    }
-
-    __glXDrawableRelease(drawable);
-
-    xfree(private);
-}
-
-static GLboolean
-__glXDRIdrawableSwapBuffers(ClientPtr client, __GLXdrawable *basePrivate)
-{
-    __GLXDRIdrawable *private = (__GLXDRIdrawable *) basePrivate;
-    __GLXDRIscreen *screen =
-	(__GLXDRIscreen *) glxGetScreen(basePrivate->pDraw->pScreen);
-
-    (*screen->core->swapBuffers)(private->driDrawable);
-
-    return TRUE;
-}
-
-
-static int
-__glXDRIdrawableSwapInterval(__GLXdrawable *baseDrawable, int interval)
-{
-    __GLXDRIdrawable *draw = (__GLXDRIdrawable *) baseDrawable;
-    __GLXDRIscreen *screen =
-	(__GLXDRIscreen *) glxGetScreen(baseDrawable->pDraw->pScreen);
-
-    if (screen->swapControl)
-	screen->swapControl->setSwapInterval(draw->driDrawable, interval);
-
-    return 0;
-}
-
-
-static void
-__glXDRIdrawableCopySubBuffer(__GLXdrawable *basePrivate,
-			       int x, int y, int w, int h)
-{
-    __GLXDRIdrawable *private = (__GLXDRIdrawable *) basePrivate;
-    __GLXDRIscreen *screen = (__GLXDRIscreen *)
-	glxGetScreen(basePrivate->pDraw->pScreen);
-
-    if (screen->copySubBuffer)
-	screen->copySubBuffer->copySubBuffer(private->driDrawable, x, y, w, h);
-}
-
-static void
-__glXDRIcontextDestroy(__GLXcontext *baseContext)
-{
-    __GLXDRIcontext *context = (__GLXDRIcontext *) baseContext;
-    __GLXDRIscreen *screen = (__GLXDRIscreen *) context->base.pGlxScreen;
-    Bool retval;
-
-    screen->core->destroyContext(context->driContext);
-
-    __glXenterServer(GL_FALSE);
-    retval = DRIDestroyContext(baseContext->pGlxScreen->pScreen,
-			       context->hwContextID);
-    __glXleaveServer(GL_FALSE);
-
-    __glXContextDestroy(&context->base);
-    xfree(context);
-}
-
-static int
-__glXDRIcontextMakeCurrent(__GLXcontext *baseContext)
-{
-    __GLXDRIcontext *context = (__GLXDRIcontext *) baseContext;
-    __GLXDRIscreen *screen = (__GLXDRIscreen *) context->base.pGlxScreen;
-    __GLXDRIdrawable *draw = (__GLXDRIdrawable *) baseContext->drawPriv;
-    __GLXDRIdrawable *read = (__GLXDRIdrawable *) baseContext->readPriv;
-
-    return (*screen->core->bindContext)(context->driContext,
-					draw->driDrawable,
-					read->driDrawable);
-}					      
-
-static int
-__glXDRIcontextLoseCurrent(__GLXcontext *baseContext)
-{
-    __GLXDRIcontext *context = (__GLXDRIcontext *) baseContext;
-    __GLXDRIscreen *screen = (__GLXDRIscreen *) context->base.pGlxScreen;
-
-    return (*screen->core->unbindContext)(context->driContext);
-}
-
-static int
-__glXDRIcontextCopy(__GLXcontext *baseDst, __GLXcontext *baseSrc,
-		    unsigned long mask)
-{
-    __GLXDRIcontext *dst = (__GLXDRIcontext *) baseDst;
-    __GLXDRIcontext *src = (__GLXDRIcontext *) baseSrc;
-    __GLXDRIscreen *screen = (__GLXDRIscreen *) dst->base.pGlxScreen;
-
-    return (*screen->core->copyContext)(dst->driContext,
-					src->driContext, mask);
-}
-
-static int
-__glXDRIcontextForceCurrent(__GLXcontext *baseContext)
-{
-    __GLXDRIcontext *context = (__GLXDRIcontext *) baseContext;
-    __GLXDRIdrawable *draw = (__GLXDRIdrawable *) baseContext->drawPriv;
-    __GLXDRIdrawable *read = (__GLXDRIdrawable *) baseContext->readPriv;
-    __GLXDRIscreen *screen = (__GLXDRIscreen *) context->base.pGlxScreen;
-
-    return (*screen->core->bindContext)(context->driContext,
-					draw->driDrawable,
-					read->driDrawable);
-}
-
-static void
-glxFillAlphaChannel (CARD32 *pixels, CARD32 rowstride, int width, int height)
-{
-    int i;
-    CARD32 *p, *end;
-
-    rowstride /= 4;
-    
-    for (i = 0; i < height; i++)
-    {
-	p = pixels;
-	end = p + width;
-	while (p < end)
-	  *p++ |= 0xFF000000;
-	pixels += rowstride;
-    }
-}
-
-static Bool
-testTexOffset(__GLXDRIscreen * const screen, PixmapPtr pPixmap)
-{
-    Bool ret;
-
-    if (!screen->texOffsetStart || !screen->texOffset)
-	return FALSE;
-
-    __glXenterServer(GL_FALSE);
-    ret = screen->texOffsetStart(pPixmap) != ~0ULL;
-    __glXleaveServer(GL_FALSE);
-
-    return ret;
-}
-
-/*
- * (sticking this here for lack of a better place)
- * Known issues with the GLX_EXT_texture_from_pixmap implementation:
- * - In general we ignore the fbconfig, lots of examples follow
- * - No fbconfig handling for multiple mipmap levels
- * - No fbconfig handling for 1D textures
- * - No fbconfig handling for TEXTURE_TARGET
- * - No fbconfig exposure of Y inversion state
- * - No GenerateMipmapEXT support (due to no FBO support)
- * - No support for anything but 16bpp and 32bpp-sparse pixmaps
- */
-
-static int
-__glXDRIbindTexImage(__GLXcontext *baseContext,
-		     int buffer,
-		     __GLXdrawable *glxPixmap)
-{
-    RegionPtr	pRegion = NULL;
-    PixmapPtr	pixmap;
-    int		bpp, override = 0, texname;
-    GLenum	format, type;
-    ScreenPtr pScreen = glxPixmap->pDraw->pScreen;
-    __GLXDRIdrawable *driDraw = (__GLXDRIdrawable *) glxPixmap;
-    __GLXDRIscreen * const screen = (__GLXDRIscreen *) glxGetScreen(pScreen);
-
-    CALL_GetIntegerv(GET_DISPATCH(), (glxPixmap->target == GL_TEXTURE_2D ?
-				      GL_TEXTURE_BINDING_2D :
-				      GL_TEXTURE_BINDING_RECTANGLE_NV,
-				      &texname));
-
-    if (!texname)
-	return __glXError(GLXBadContextState);
-
-    pixmap = (PixmapPtr) glxPixmap->pDraw;
-
-    if (testTexOffset(screen, pixmap)) {
-	__GLXDRIdrawable **texOffsetOverride = screen->texOffsetOverride;
-	int i, firstEmpty = 16;
-
-	for (i = 0; i < 16; i++) {
-	    if (texOffsetOverride[i] == driDraw)
-		goto alreadyin; 
-
-	    if (firstEmpty == 16 && !texOffsetOverride[i])
-		firstEmpty = i;
-	}
-
-	if (firstEmpty == 16) {
-	    ErrorF("%s: Failed to register texture offset override\n", __func__);
-	    goto nooverride;
-	}
-
-	if (firstEmpty >= screen->lastTexOffsetOverride)
-	    screen->lastTexOffsetOverride = firstEmpty + 1;
-
-	texOffsetOverride[firstEmpty] = driDraw;
-
-alreadyin:
-	override = 1;
-
-	driDraw->ctx = (__GLXDRIcontext*)baseContext;
-
-	if (texname == driDraw->texname)
-	    return Success;
-
-	driDraw->texname = texname;
-
-	screen->texOffset->setTexOffset(driDraw->ctx->driContext, texname, 0,
-					pixmap->drawable.depth,
-					pixmap->devKind);
-    }
-nooverride:
-
-    if (!driDraw->pDamage) {
-	if (!override) {
-	    driDraw->pDamage = DamageCreate(NULL, NULL, DamageReportNone,
-					    TRUE, pScreen, NULL);
-	    if (!driDraw->pDamage)
-		return BadAlloc;
-
-	    DamageRegister ((DrawablePtr) pixmap, driDraw->pDamage);
-	}
-
-	pRegion = NULL;
-    } else {
-	pRegion = DamageRegion(driDraw->pDamage);
-	if (REGION_NIL(pRegion))
-	    return Success;
-    }
-
-    /* XXX 24bpp packed, 8, etc */
-    if (pixmap->drawable.depth >= 24) {
-	bpp = 4;
-	format = GL_BGRA;
-	type =
-#if X_BYTE_ORDER == X_BIG_ENDIAN
-	    !override ? GL_UNSIGNED_INT_8_8_8_8_REV :
-#endif
-	    GL_UNSIGNED_BYTE;
-    } else {
-	bpp = 2;
-	format = GL_RGB;
-	type = GL_UNSIGNED_SHORT_5_6_5;
-    }
-
-    if (pRegion == NULL)
-    {
-	void *data = NULL;
-
-	if (!override) {
-	    unsigned pitch = PixmapBytePad(pixmap->drawable.width,
-					   pixmap->drawable.depth); 
-
-	    data = xalloc(pitch * pixmap->drawable.height);
-
-	    __glXenterServer(GL_FALSE);
-	    pScreen->GetImage(&pixmap->drawable, 0 /*pixmap->drawable.x*/,
-			      0 /*pixmap->drawable.y*/, pixmap->drawable.width,
-			      pixmap->drawable.height, ZPixmap, ~0, data);
-	    __glXleaveServer(GL_FALSE);
-
-	    if (pixmap->drawable.depth == 24)
-		glxFillAlphaChannel(data,
-				    pitch,
-				    pixmap->drawable.width,
-				    pixmap->drawable.height);
-
-	    CALL_PixelStorei( GET_DISPATCH(), (GL_UNPACK_ROW_LENGTH,
-					       pitch / bpp) );
-	    CALL_PixelStorei( GET_DISPATCH(), (GL_UNPACK_SKIP_PIXELS, 0) );
-	    CALL_PixelStorei( GET_DISPATCH(), (GL_UNPACK_SKIP_ROWS, 0) );
-	}
-
-	CALL_TexImage2D( GET_DISPATCH(),
-			 (glxPixmap->target,
-			  0,
-			  bpp == 4 ? 4 : 3,
-			  pixmap->drawable.width,
-			  pixmap->drawable.height,
-			  0,
-			  format,
-			  type,
-			  data) );
-
-	xfree(data);
-    } else if (!override) {
-        int i, numRects;
-	BoxPtr p;
-
-	numRects = REGION_NUM_RECTS (pRegion);
-	p = REGION_RECTS (pRegion);
-
-	CALL_PixelStorei( GET_DISPATCH(), (GL_UNPACK_SKIP_PIXELS, 0) );
-	CALL_PixelStorei( GET_DISPATCH(), (GL_UNPACK_SKIP_ROWS, 0) );
-
-	for (i = 0; i < numRects; i++)
-	{
-	    unsigned pitch = PixmapBytePad(p[i].x2 - p[i].x1,
-					   pixmap->drawable.depth);
-	    void *data = xalloc(pitch * (p[i].y2 - p[i].y1));
-
-	    __glXenterServer(GL_FALSE);
-	    pScreen->GetImage(&pixmap->drawable, /*pixmap->drawable.x +*/ p[i].x1,
-			      /*pixmap->drawable.y*/ + p[i].y1, p[i].x2 - p[i].x1,
-			      p[i].y2 - p[i].y1, ZPixmap, ~0, data);
-	    __glXleaveServer(GL_FALSE);
-
-	    if (pixmap->drawable.depth == 24)
-		glxFillAlphaChannel(data,
-				    pitch,
-				    p[i].x2 - p[i].x1,
-				    p[i].y2 - p[i].y1);
-
-	    CALL_PixelStorei( GET_DISPATCH(), (GL_UNPACK_ROW_LENGTH,
-					       pitch / bpp) );
-
-	    CALL_TexSubImage2D( GET_DISPATCH(),
-				(glxPixmap->target,
-				 0,
-				 p[i].x1, p[i].y1,
-				 p[i].x2 - p[i].x1, p[i].y2 - p[i].y1,
-				 format,
-				 type,
-				 data) );
-
-	    xfree(data);
-	}
-    }
-
-    if (!override)
-	DamageEmpty(driDraw->pDamage);
-
-    return Success;
-}
-
-static int
-__glXDRIreleaseTexImage(__GLXcontext *baseContext,
-			int buffer,
-			__GLXdrawable *pixmap)
-{
-    __GLXDRIscreen *screen =
-	(__GLXDRIscreen *) glxGetScreen(pixmap->pDraw->pScreen);
-    __GLXDRIdrawable *drawable = (__GLXDRIdrawable *) pixmap;
-
-    __glXDRIdoReleaseTexImage(screen, drawable);
-
-    return Success;
-}
-
-static __GLXtextureFromPixmap __glXDRItextureFromPixmap = {
-    __glXDRIbindTexImage,
-    __glXDRIreleaseTexImage
-};
-
-static void
-__glXDRIscreenDestroy(__GLXscreen *baseScreen)
-{
-    __GLXDRIscreen *screen = (__GLXDRIscreen *) baseScreen;
-
-    screen->core->destroyScreen(screen->driScreen);
-
-    dlclose(screen->driver);
-
-    __glXScreenDestroy(baseScreen);
-
-    xfree(screen);
-}
-
-static __GLXcontext *
-__glXDRIscreenCreateContext(__GLXscreen *baseScreen,
-			    __GLXconfig *glxConfig,
-			    __GLXcontext *baseShareContext)
-{
-    __GLXDRIscreen *screen = (__GLXDRIscreen *) baseScreen;
-    __GLXDRIcontext *context, *shareContext;
-    __GLXDRIconfig *config = (__GLXDRIconfig *) glxConfig;
-    VisualPtr visual;
-    int i;
-    GLboolean retval;
-    __DRIcontext *driShare;
-    drm_context_t hwContext;
-    ScreenPtr pScreen = baseScreen->pScreen;
-
-    shareContext = (__GLXDRIcontext *) baseShareContext;
-    if (shareContext)
-	driShare = shareContext->driContext;
-    else
-	driShare = NULL;
-
-    if (baseShareContext && baseShareContext->isDirect)
-        return NULL;
-
-    context = xcalloc(1, sizeof *context);
-    if (context == NULL)
-	return NULL;
-
-    context->base.destroy           = __glXDRIcontextDestroy;
-    context->base.makeCurrent       = __glXDRIcontextMakeCurrent;
-    context->base.loseCurrent       = __glXDRIcontextLoseCurrent;
-    context->base.copy              = __glXDRIcontextCopy;
-    context->base.forceCurrent      = __glXDRIcontextForceCurrent;
-
-    context->base.textureFromPixmap = &__glXDRItextureFromPixmap;
-    /* Find the requested X visual */
-    visual = pScreen->visuals;
-    for (i = 0; i < pScreen->numVisuals; i++, visual++)
-	if (visual->vid == glxConfig->visualID)
-	    break;
-    if (i == pScreen->numVisuals)
-	return NULL;
-
-    context->hwContextID = FakeClientID(0);
-
-    __glXenterServer(GL_FALSE);
-    retval = DRICreateContext(baseScreen->pScreen, visual,
-			      context->hwContextID, &hwContext);
-    __glXleaveServer(GL_FALSE);
-
-    if (!retval)
-    	return NULL;
-
-    context->driContext =
-	screen->legacy->createNewContext(screen->driScreen,
-					 config->driConfig,
-					 0, /* render type */
-					 driShare,
-					 hwContext,
-					 context);
-
-    if (context->driContext == NULL) {
-    	__glXenterServer(GL_FALSE);
-	retval = DRIDestroyContext(baseScreen->pScreen, context->hwContextID);
-    	__glXleaveServer(GL_FALSE);
-	xfree(context);
-	return NULL;
-    }
-
-    return &context->base;
-}
-
-static __GLXdrawable *
-__glXDRIscreenCreateDrawable(__GLXscreen *screen,
-			     DrawablePtr pDraw,
-			     int type,
-			     XID drawId,
-			     __GLXconfig *glxConfig)
-{
-    __GLXDRIscreen *driScreen = (__GLXDRIscreen *) screen;
-    __GLXDRIconfig *config = (__GLXDRIconfig *) glxConfig;
-    __GLXDRIdrawable *private;
-    GLboolean retval;
-    drm_drawable_t hwDrawable;
-
-    private = xcalloc(1, sizeof *private);
-    if (private == NULL)
-	return NULL;
-
-    if (!__glXDrawableInit(&private->base, screen,
-			   pDraw, type, drawId, glxConfig)) {
-        xfree(private);
-	return NULL;
-    }
-
-    private->base.destroy       = __glXDRIdrawableDestroy;
-    private->base.swapBuffers   = __glXDRIdrawableSwapBuffers;
-    private->base.copySubBuffer = __glXDRIdrawableCopySubBuffer;
-    private->base.waitX		= NULL;
-    private->base.waitGL	= NULL;
-
-    __glXenterServer(GL_FALSE);
-    retval = DRICreateDrawable(screen->pScreen, serverClient,
-			       pDraw, &hwDrawable);
-    __glXleaveServer(GL_FALSE);
-
-    if (!retval) {
-    	xfree(private);
-    	return NULL;
-    }
-
-    /* The last argument is 'attrs', which is used with pbuffers which
-     * we currently don't support. */
-
-    private->driDrawable =
-	(driScreen->legacy->createNewDrawable)(driScreen->driScreen,
-					       config->driConfig,
-					       hwDrawable, 0, NULL, private);
-
-    if (private->driDrawable == NULL) {
-	__glXenterServer(GL_FALSE);
-	DRIDestroyDrawable(screen->pScreen, serverClient, pDraw);
-	__glXleaveServer(GL_FALSE);
-	xfree(private);
-	return NULL;
-    }
-
-    return &private->base;
-}
-
-static GLboolean
-getDrawableInfo(__DRIdrawable *driDrawable,
-		unsigned int *index, unsigned int *stamp,
-		int *x, int *y, int *width, int *height,
-		int *numClipRects, drm_clip_rect_t **ppClipRects,
-		int *backX, int *backY,
-		int *numBackClipRects, drm_clip_rect_t **ppBackClipRects,
-		void *data)
-{
-    __GLXDRIdrawable *drawable = data;
-    ScreenPtr pScreen;
-    drm_clip_rect_t *pClipRects, *pBackClipRects;
-    GLboolean retval;
-    size_t size;
-
-    /* If the X window has been destroyed, give up here. */
-    if (drawable->base.pDraw == NULL)
-	return GL_FALSE;
-
-    pScreen = drawable->base.pDraw->pScreen;
-    __glXenterServer(GL_FALSE);
-    retval = DRIGetDrawableInfo(pScreen, drawable->base.pDraw, index, stamp,
-				x, y, width, height,
-				numClipRects, &pClipRects,
-				backX, backY,
-				numBackClipRects, &pBackClipRects);
-    __glXleaveServer(GL_FALSE);
-
-    if (retval && *numClipRects > 0) {
-	size = sizeof (drm_clip_rect_t) * *numClipRects;
-	*ppClipRects = xalloc (size);
-
-	/* Clip cliprects to screen dimensions (redirected windows) */
-	if (*ppClipRects != NULL) {
-	    int i, j;
-
-	    for (i = 0, j = 0; i < *numClipRects; i++) {
-	        (*ppClipRects)[j].x1 = max(pClipRects[i].x1, 0);
-		(*ppClipRects)[j].y1 = max(pClipRects[i].y1, 0);
-		(*ppClipRects)[j].x2 = min(pClipRects[i].x2, pScreen->width);
-		(*ppClipRects)[j].y2 = min(pClipRects[i].y2, pScreen->height);
-
-		if ((*ppClipRects)[j].x1 < (*ppClipRects)[j].x2 &&
-		    (*ppClipRects)[j].y1 < (*ppClipRects)[j].y2) {
-		    j++;
-		}
-	    }
-
-	    if (*numClipRects != j) {
-		*numClipRects = j;
-		*ppClipRects = xrealloc (*ppClipRects,
-					 sizeof (drm_clip_rect_t) *
-					 *numClipRects);
-	    }
-	} else
-	    *numClipRects = 0;
-    }
-    else {
-      *ppClipRects = NULL;
-      *numClipRects = 0;
-    }
-      
-    if (retval && *numBackClipRects > 0) {
-	size = sizeof (drm_clip_rect_t) * *numBackClipRects;
-	*ppBackClipRects = xalloc (size);
-	if (*ppBackClipRects != NULL)
-	    memcpy (*ppBackClipRects, pBackClipRects, size);
-	else
-	    *numBackClipRects = 0;
-    }
-    else {
-      *ppBackClipRects = NULL;
-      *numBackClipRects = 0;
-    }
-
-    return retval;
-}
-
-static void __glXReportDamage(__DRIdrawable *driDraw,
-			      int x, int y,
-			      drm_clip_rect_t *rects, int num_rects,
-			      GLboolean front_buffer,
-			      void *data)
-{
-    __GLXDRIdrawable *drawable = data;
-    DrawablePtr pDraw = drawable->base.pDraw;
-    RegionRec region;
-
-    __glXenterServer(GL_FALSE);
-
-    REGION_INIT(pDraw->pScreen, &region, (BoxPtr) rects, num_rects);
-    REGION_TRANSLATE(pScreen, &region, pDraw->x, pDraw->y);
-    DamageRegionAppend(pDraw, &region);
-    /* This is wrong, this needs a seperate function. */
-    DamageRegionProcessPending(pDraw);
-    REGION_UNINIT(pDraw->pScreen, &region);
-
-    __glXleaveServer(GL_FALSE);
-}
-
-static const __DRIgetDrawableInfoExtension getDrawableInfoExtension = {
-    { __DRI_GET_DRAWABLE_INFO, __DRI_GET_DRAWABLE_INFO_VERSION },
-    getDrawableInfo
-};
-
-static const __DRIdamageExtension damageExtension = {
-    { __DRI_DAMAGE, __DRI_DAMAGE_VERSION },
-    __glXReportDamage,
-};
-
-static const __DRIextension *loader_extensions[] = {
-    &systemTimeExtension.base,
-    &getDrawableInfoExtension.base,
-    &damageExtension.base,
-    NULL
-};
-
-
-
-static const char dri_driver_path[] = DRI_DRIVER_PATH;
-
-static Bool
-glxDRIEnterVT (int index, int flags)
-{
-    __GLXDRIscreen *screen = (__GLXDRIscreen *) 
-	glxGetScreen(screenInfo.screens[index]);
-
-    LogMessage(X_INFO, "AIGLX: Resuming AIGLX clients after VT switch\n");
-
-    if (!(*screen->enterVT) (index, flags))
-	return FALSE;
-    
-    glxResumeClients();
-
-    return TRUE;
-}
-
-static void
-glxDRILeaveVT (int index, int flags)
-{
-    __GLXDRIscreen *screen = (__GLXDRIscreen *)
-	glxGetScreen(screenInfo.screens[index]);
-
-    LogMessage(X_INFO, "AIGLX: Suspending AIGLX clients for VT switch\n");
-
-    glxSuspendClients();
-
-    return (*screen->leaveVT) (index, flags);
-}
-
-static void
-initializeExtensions(__GLXDRIscreen *screen)
-{
-    const __DRIextension **extensions;
-    int i;
-
-    extensions = screen->core->getExtensions(screen->driScreen);
-
-    for (i = 0; extensions[i]; i++) {
-#ifdef __DRI_READ_DRAWABLE
-	if (strcmp(extensions[i]->name, __DRI_READ_DRAWABLE) == 0) {
-	    __glXEnableExtension(screen->glx_enable_bits,
-				 "GLX_SGI_make_current_read");
-	    
-	    LogMessage(X_INFO, "AIGLX: enabled GLX_SGI_make_current_read\n");
-	}
-#endif
-
-#ifdef __DRI_COPY_SUB_BUFFER
-	if (strcmp(extensions[i]->name, __DRI_COPY_SUB_BUFFER) == 0) {
-	    screen->copySubBuffer = (__DRIcopySubBufferExtension *) extensions[i];
-	    __glXEnableExtension(screen->glx_enable_bits,
-				 "GLX_MESA_copy_sub_buffer");
-	    
-	    LogMessage(X_INFO, "AIGLX: enabled GLX_MESA_copy_sub_buffer\n");
-	}
-#endif
-
-#ifdef __DRI_SWAP_CONTROL
-	if (strcmp(extensions[i]->name, __DRI_SWAP_CONTROL) == 0) {
-	    screen->swapControl = (__DRIswapControlExtension *) extensions[i];
-	    __glXEnableExtension(screen->glx_enable_bits,
-				 "GLX_SGI_swap_control");
-	    __glXEnableExtension(screen->glx_enable_bits,
-				 "GLX_MESA_swap_control");
-	    
-	    LogMessage(X_INFO, "AIGLX: enabled GLX_SGI_swap_control and GLX_MESA_swap_control\n");
-	}
-#endif
-
-#ifdef __DRI_TEX_OFFSET
-	if (strcmp(extensions[i]->name, __DRI_TEX_OFFSET) == 0) {
-	    screen->texOffset = (__DRItexOffsetExtension *) extensions[i];
-	    LogMessage(X_INFO, "AIGLX: enabled GLX_texture_from_pixmap with driver support\n");
-	}
-#endif
-	/* Ignore unknown extensions */
-    }
-}
-    
-static __GLXscreen *
-__glXDRIscreenProbe(ScreenPtr pScreen)
-{
-    drm_handle_t hSAREA;
-    drmAddress pSAREA = NULL;
-    char *BusID;
-    __DRIversion   ddx_version;
-    __DRIversion   dri_version;
-    __DRIversion   drm_version;
-    __DRIframebuffer  framebuffer;
-    int   fd = -1;
-    int   status;
-    drm_magic_t magic;
-    drmVersionPtr version;
-    int newlyopened;
-    char *driverName;
-    drm_handle_t  hFB;
-    int        junk;
-    __GLXDRIscreen *screen;
-    char filename[128];
-    Bool isCapable;
-    size_t buffer_size;
-    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
-    const __DRIconfig **driConfigs;
-    const __DRIextension **extensions;
-    int i;
-
-    if (!xf86LoaderCheckSymbol("DRIQueryDirectRenderingCapable") ||
-	!DRIQueryDirectRenderingCapable(pScreen, &isCapable) ||
-	!isCapable) {
-	LogMessage(X_INFO,
-		   "AIGLX: Screen %d is not DRI capable\n", pScreen->myNum);
-	return NULL;
-    }
-
-    screen = xcalloc(1, sizeof *screen);
-    if (screen == NULL)
-      return NULL;
-
-    screen->base.destroy        = __glXDRIscreenDestroy;
-    screen->base.createContext  = __glXDRIscreenCreateContext;
-    screen->base.createDrawable = __glXDRIscreenCreateDrawable;
-    screen->base.swapInterval   = __glXDRIdrawableSwapInterval;
-    screen->base.pScreen       = pScreen;
-
-    __glXInitExtensionEnableBits(screen->glx_enable_bits);
-
-    /* DRI protocol version. */
-    dri_version.major = XF86DRI_MAJOR_VERSION;
-    dri_version.minor = XF86DRI_MINOR_VERSION;
-    dri_version.patch = XF86DRI_PATCH_VERSION;
-
-    if (!DRIOpenConnection(pScreen, &hSAREA, &BusID)) {
-	LogMessage(X_ERROR, "AIGLX error: DRIOpenConnection failed\n");
-	goto handle_error;
-    }
-
-    fd = drmOpenOnce(NULL, BusID, &newlyopened);
-
-    if (fd < 0) {
-	LogMessage(X_ERROR, "AIGLX error: drmOpenOnce failed (%s)\n",
-		   strerror(-fd));
-	goto handle_error;
-    }
-
-    if (drmGetMagic(fd, &magic)) {
-	LogMessage(X_ERROR, "AIGLX error: drmGetMagic failed\n");
-	goto handle_error;
-    }
-
-    version = drmGetVersion(fd);
-    if (version) {
-	drm_version.major = version->version_major;
-	drm_version.minor = version->version_minor;
-	drm_version.patch = version->version_patchlevel;
-	drmFreeVersion(version);
-    }
-    else {
-	drm_version.major = -1;
-	drm_version.minor = -1;
-	drm_version.patch = -1;
-    }
-
-    if (newlyopened && !DRIAuthConnection(pScreen, magic)) {
-	LogMessage(X_ERROR, "AIGLX error: DRIAuthConnection failed\n");
-	goto handle_error;
-    }
-
-    /* Get device name (like "tdfx") and the ddx version numbers.
-     * We'll check the version in each DRI driver's "createNewScreen"
-     * function. */
-    if (!DRIGetClientDriverName(pScreen,
-				&ddx_version.major,
-				&ddx_version.minor,
-				&ddx_version.patch,
-				&driverName)) {
-	LogMessage(X_ERROR, "AIGLX error: DRIGetClientDriverName failed\n");
-	goto handle_error;
-    }
-
-    snprintf(filename, sizeof filename, "%s/%s_dri.so",
-             dri_driver_path, driverName);
-
-    screen->driver = dlopen(filename, RTLD_LAZY | RTLD_LOCAL);
-    if (screen->driver == NULL) {
-	LogMessage(X_ERROR, "AIGLX error: dlopen of %s failed (%s)\n",
-		   filename, dlerror());
-        goto handle_error;
-    }
-
-    extensions = dlsym(screen->driver, __DRI_DRIVER_EXTENSIONS);
-    if (extensions == NULL) {
-	LogMessage(X_ERROR, "AIGLX error: %s exports no extensions (%s)\n",
-		   driverName, dlerror());
-	goto handle_error;
-    }
-    
-    for (i = 0; extensions[i]; i++) {
-	if (strcmp(extensions[i]->name, __DRI_CORE) == 0 &&
-	    extensions[i]->version >= __DRI_CORE_VERSION) {
-		screen->core = (__DRIcoreExtension *) extensions[i];
-	}
-
-	if (strcmp(extensions[i]->name, __DRI_LEGACY) == 0 &&
-	    extensions[i]->version >= __DRI_LEGACY_VERSION) {
-		screen->legacy = (__DRIlegacyExtension *) extensions[i];
-	}
-    }
-
-    if (screen->core == NULL || screen->legacy == NULL) {
-	LogMessage(X_ERROR,
-		   "AIGLX error: %s does not export required DRI extension\n",
-		   driverName);
-	goto handle_error;
-    }
-
-    /*
-     * Get device-specific info.  pDevPriv will point to a struct
-     * (such as DRIRADEONRec in xfree86/driver/ati/radeon_dri.h) that
-     * has information about the screen size, depth, pitch, ancilliary
-     * buffers, DRM mmap handles, etc.
-     */
-    if (!DRIGetDeviceInfo(pScreen, &hFB, &junk,
-			  &framebuffer.size, &framebuffer.stride,
-			  &framebuffer.dev_priv_size, &framebuffer.dev_priv)) {
-	LogMessage(X_ERROR, "AIGLX error: XF86DRIGetDeviceInfo failed\n");
-	goto handle_error;
-    }
-
-    framebuffer.width = pScreen->width;
-    framebuffer.height = pScreen->height;
-
-    /* Map the framebuffer region. */
-    status = drmMap(fd, hFB, framebuffer.size, 
-		    (drmAddressPtr)&framebuffer.base);
-    if (status != 0) {
-	LogMessage(X_ERROR, "AIGLX error: drmMap of framebuffer failed (%s)\n",
-		   strerror(-status));
-	goto handle_error;
-    }
-
-    /* Map the SAREA region.  Further mmap regions may be setup in
-     * each DRI driver's "createNewScreen" function.
-     */
-    status = drmMap(fd, hSAREA, SAREA_MAX, &pSAREA);
-    if (status != 0) {
-	LogMessage(X_ERROR, "AIGLX error: drmMap of SAREA failed (%s)\n",
-		   strerror(-status));
-	goto handle_error;
-    }
-    
-    screen->driScreen =
-	(*screen->legacy->createNewScreen)(pScreen->myNum,
-					   &ddx_version,
-					   &dri_version,
-					   &drm_version,
-					   &framebuffer,
-					   pSAREA,
-					   fd,
-					   loader_extensions,
-					   &driConfigs,
-					   screen);
-
-    if (screen->driScreen == NULL) {
-	LogMessage(X_ERROR,
-		   "AIGLX error: Calling driver entry point failed\n");
-	goto handle_error;
-    }
-
-    screen->base.fbconfigs = glxConvertConfigs(screen->core,
-					       driConfigs, GLX_WINDOW_BIT);
-
-    initializeExtensions(screen);
-
-    DRIGetTexOffsetFuncs(pScreen, &screen->texOffsetStart,
-			 &screen->texOffsetFinish);
-
-    __glXScreenInit(&screen->base, pScreen);
-
-    /* The first call simply determines the length of the extension string.
-     * This allows us to allocate some memory to hold the extension string,
-     * but it requires that we call __glXGetExtensionString a second time.
-     */
-    buffer_size = __glXGetExtensionString(screen->glx_enable_bits, NULL);
-    if (buffer_size > 0) {
-	if (screen->base.GLXextensions != NULL) {
-	    xfree(screen->base.GLXextensions);
-	}
-
-	screen->base.GLXextensions = xnfalloc(buffer_size);
-	(void) __glXGetExtensionString(screen->glx_enable_bits, 
-				       screen->base.GLXextensions);
-    }
-
-    __glXsetEnterLeaveServerFuncs(__glXDRIenterServer, __glXDRIleaveServer);
-
-    screen->enterVT = pScrn->EnterVT;
-    pScrn->EnterVT = glxDRIEnterVT;
-    screen->leaveVT = pScrn->LeaveVT;
-    pScrn->LeaveVT = glxDRILeaveVT;
-
-    LogMessage(X_INFO,
-	       "AIGLX: Loaded and initialized %s\n", filename);
-
-    return &screen->base;
-
- handle_error:
-    if (pSAREA != NULL)
-	drmUnmap(pSAREA, SAREA_MAX);
-
-    if (framebuffer.base != NULL)
-	drmUnmap((drmAddress)framebuffer.base, framebuffer.size);
-
-    if (fd >= 0)
-	drmCloseOnce(fd);
-
-    DRICloseConnection(pScreen);
-
-    if (screen->driver)
-        dlclose(screen->driver);
-
-    xfree(screen);
-
-    LogMessage(X_ERROR, "AIGLX: reverting to software rendering\n");
-
-    return NULL;
-}
-
-_X_EXPORT __GLXprovider __glXDRIProvider = {
-    __glXDRIscreenProbe,
-    "DRI",
-    NULL
-};
+/*
+ * Copyright © 2006 Red Hat, Inc
+ *
+ * Permission to use, copy, modify, distribute, and sell this software
+ * and its documentation for any purpose is hereby granted without
+ * fee, provided that the above copyright notice appear in all copies
+ * and that both that copyright notice and this permission notice
+ * appear in supporting documentation, and that the name of Red Hat,
+ * Inc not be used in advertising or publicity pertaining to
+ * distribution of the software without specific, written prior
+ * permission.  Red Hat, Inc makes no representations about the
+ * suitability of this software for any purpose.  It is provided "as
+ * is" without express or implied warranty.
+ *
+ * RED HAT, INC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
+ * NO EVENT SHALL RED HAT, INC BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
+ * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <stdint.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <sys/time.h>
+#include <dlfcn.h>
+
+#include <drm.h>
+#include <GL/gl.h>
+#include <GL/internal/dri_interface.h>
+#include <GL/glxtokens.h>
+
+#include <windowstr.h>
+#include <os.h>
+#include <damage.h>
+
+#define _XF86DRI_SERVER_
+#include <drm_sarea.h>
+#include <xf86drm.h>
+#include <X11/dri/xf86driproto.h>
+#include <xf86str.h>
+#include <xf86.h>
+#include <dri.h>
+
+#include "servermd.h"
+
+#define DRI_NEW_INTERFACE_ONLY
+#include "glxserver.h"
+#include "glxutil.h"
+#include "glxdricommon.h"
+
+#include "g_disptab.h"
+#include "glapitable.h"
+#include "glapi.h"
+#include "glthread.h"
+#include "dispatch.h"
+#include "extension_string.h"
+
+typedef struct __GLXDRIscreen   __GLXDRIscreen;
+typedef struct __GLXDRIcontext  __GLXDRIcontext;
+typedef struct __GLXDRIdrawable __GLXDRIdrawable;
+
+struct __GLXDRIscreen {
+    __GLXscreen		 base;
+    __DRIscreen		*driScreen;
+    void		*driver;
+
+    xf86EnterVTProc	*enterVT;
+    xf86LeaveVTProc	*leaveVT;
+
+    const __DRIcoreExtension *core;
+    const __DRIlegacyExtension *legacy;
+    const __DRIcopySubBufferExtension *copySubBuffer;
+    const __DRIswapControlExtension *swapControl;
+
+#ifdef __DRI_TEX_OFFSET
+    const __DRItexOffsetExtension *texOffset;
+    DRITexOffsetStartProcPtr texOffsetStart;
+    DRITexOffsetFinishProcPtr texOffsetFinish;
+    __GLXDRIdrawable *texOffsetOverride[16];
+    GLuint lastTexOffsetOverride;
+#endif
+
+    unsigned char glx_enable_bits[__GLX_EXT_BYTES];
+};
+
+struct __GLXDRIcontext {
+    __GLXcontext base;
+    __DRIcontext *driContext;
+    XID hwContextID;
+};
+
+struct __GLXDRIdrawable {
+    __GLXdrawable base;
+    __DRIdrawable *driDrawable;
+
+    /* Pulled in from old __GLXpixmap */
+#ifdef __DRI_TEX_OFFSET
+    GLint texname;
+    __GLXDRIcontext *ctx;
+    unsigned long long offset;
+    DamagePtr pDamage;
+#endif
+};
+
+static void
+__glXDRIleaveServer(GLboolean rendering)
+{
+    int i;
+
+    for (i = 0; rendering && i < screenInfo.numScreens; i++) {
+	__GLXDRIscreen * const screen =
+	    (__GLXDRIscreen *) glxGetScreen(screenInfo.screens[i]);
+	GLuint lastOverride = screen->lastTexOffsetOverride;
+
+	if (lastOverride) {
+	    __GLXDRIdrawable **texOffsetOverride = screen->texOffsetOverride;
+	    int j;
+
+	    for (j = 0; j < lastOverride; j++) {
+		__GLXDRIdrawable *pGlxPix = texOffsetOverride[j];
+
+		if (pGlxPix && pGlxPix->texname) {
+		    pGlxPix->offset =
+			screen->texOffsetStart((PixmapPtr)pGlxPix->base.pDraw);
+		}
+	    }
+	}
+    }
+
+    DRIBlockHandler(NULL, NULL, NULL);
+
+    for (i = 0; rendering && i < screenInfo.numScreens; i++) {
+	__GLXDRIscreen * const screen =
+	    (__GLXDRIscreen *) glxGetScreen(screenInfo.screens[i]);
+	GLuint lastOverride = screen->lastTexOffsetOverride;
+
+	if (lastOverride) {
+	    __GLXDRIdrawable **texOffsetOverride = screen->texOffsetOverride;
+	    int j;
+
+	    for (j = 0; j < lastOverride; j++) {
+		__GLXDRIdrawable *pGlxPix = texOffsetOverride[j];
+
+		if (pGlxPix && pGlxPix->texname) {
+		    screen->texOffset->setTexOffset(pGlxPix->ctx->driContext,
+						    pGlxPix->texname,
+						    pGlxPix->offset,
+						    pGlxPix->base.pDraw->depth,
+						    ((PixmapPtr)pGlxPix->base.pDraw)->devKind);
+		}
+	    }
+	}
+    }
+}
+    
+static void
+__glXDRIenterServer(GLboolean rendering)
+{
+    int i;
+
+    for (i = 0; rendering && i < screenInfo.numScreens; i++) {
+	__GLXDRIscreen * const screen = (__GLXDRIscreen *)
+	    glxGetScreen(screenInfo.screens[i]);
+
+	if (screen->lastTexOffsetOverride) {
+	    CALL_Flush(GET_DISPATCH(), ());
+	    break;
+	}
+    }
+
+    DRIWakeupHandler(NULL, 0, NULL);
+}
+
+
+static void
+__glXDRIdoReleaseTexImage(__GLXDRIscreen *screen, __GLXDRIdrawable *drawable)
+{
+    GLuint lastOverride = screen->lastTexOffsetOverride;
+
+    if (lastOverride) {
+	__GLXDRIdrawable **texOffsetOverride = screen->texOffsetOverride;
+	int i;
+
+	for (i = 0; i < lastOverride; i++) {
+	    if (texOffsetOverride[i] == drawable) {
+		if (screen->texOffsetFinish)
+		    screen->texOffsetFinish((PixmapPtr)drawable->base.pDraw);
+
+		texOffsetOverride[i] = NULL;
+
+		if (i + 1 == lastOverride) {
+		    lastOverride = 0;
+
+		    while (i--) {
+			if (texOffsetOverride[i]) {
+			    lastOverride = i + 1;
+			    break;
+			}
+		    }
+
+		    screen->lastTexOffsetOverride = lastOverride;
+
+		    break;
+		}
+	    }
+	}
+    }
+}
+
+
+static void
+__glXDRIdrawableDestroy(__GLXdrawable *drawable)
+{
+    __GLXDRIdrawable *private = (__GLXDRIdrawable *) drawable;
+    __GLXDRIscreen *screen;
+    int i;
+
+    for (i = 0; i < screenInfo.numScreens; i++) {
+	screen = (__GLXDRIscreen *) glxGetScreen(screenInfo.screens[i]);
+	__glXDRIdoReleaseTexImage(screen, private);
+    }
+
+    /* If the X window was destroyed, the dri DestroyWindow hook will
+     * aready have taken care of this, so only call if pDraw isn't NULL. */
+    if (drawable->pDraw != NULL) {
+	screen = (__GLXDRIscreen *) glxGetScreen(drawable->pDraw->pScreen);
+	(*screen->core->destroyDrawable)(private->driDrawable);
+
+	__glXenterServer(GL_FALSE);
+	DRIDestroyDrawable(drawable->pDraw->pScreen,
+			   serverClient, drawable->pDraw);
+	__glXleaveServer(GL_FALSE);
+    }
+
+    __glXDrawableRelease(drawable);
+
+    xfree(private);
+}
+
+static GLboolean
+__glXDRIdrawableSwapBuffers(ClientPtr client, __GLXdrawable *basePrivate)
+{
+    __GLXDRIdrawable *private = (__GLXDRIdrawable *) basePrivate;
+    __GLXDRIscreen *screen =
+	(__GLXDRIscreen *) glxGetScreen(basePrivate->pDraw->pScreen);
+
+    (*screen->core->swapBuffers)(private->driDrawable);
+
+    return TRUE;
+}
+
+
+static int
+__glXDRIdrawableSwapInterval(__GLXdrawable *baseDrawable, int interval)
+{
+    __GLXDRIdrawable *draw = (__GLXDRIdrawable *) baseDrawable;
+    __GLXDRIscreen *screen =
+	(__GLXDRIscreen *) glxGetScreen(baseDrawable->pDraw->pScreen);
+
+    if (screen->swapControl)
+	screen->swapControl->setSwapInterval(draw->driDrawable, interval);
+
+    return 0;
+}
+
+
+static void
+__glXDRIdrawableCopySubBuffer(__GLXdrawable *basePrivate,
+			       int x, int y, int w, int h)
+{
+    __GLXDRIdrawable *private = (__GLXDRIdrawable *) basePrivate;
+    __GLXDRIscreen *screen = (__GLXDRIscreen *)
+	glxGetScreen(basePrivate->pDraw->pScreen);
+
+    if (screen->copySubBuffer)
+	screen->copySubBuffer->copySubBuffer(private->driDrawable, x, y, w, h);
+}
+
+static void
+__glXDRIcontextDestroy(__GLXcontext *baseContext)
+{
+    __GLXDRIcontext *context = (__GLXDRIcontext *) baseContext;
+    __GLXDRIscreen *screen = (__GLXDRIscreen *) context->base.pGlxScreen;
+    Bool retval;
+
+    screen->core->destroyContext(context->driContext);
+
+    __glXenterServer(GL_FALSE);
+    retval = DRIDestroyContext(baseContext->pGlxScreen->pScreen,
+			       context->hwContextID);
+    __glXleaveServer(GL_FALSE);
+
+    __glXContextDestroy(&context->base);
+    xfree(context);
+}
+
+static int
+__glXDRIcontextMakeCurrent(__GLXcontext *baseContext)
+{
+    __GLXDRIcontext *context = (__GLXDRIcontext *) baseContext;
+    __GLXDRIscreen *screen = (__GLXDRIscreen *) context->base.pGlxScreen;
+    __GLXDRIdrawable *draw = (__GLXDRIdrawable *) baseContext->drawPriv;
+    __GLXDRIdrawable *read = (__GLXDRIdrawable *) baseContext->readPriv;
+
+    return (*screen->core->bindContext)(context->driContext,
+					draw->driDrawable,
+					read->driDrawable);
+}					      
+
+static int
+__glXDRIcontextLoseCurrent(__GLXcontext *baseContext)
+{
+    __GLXDRIcontext *context = (__GLXDRIcontext *) baseContext;
+    __GLXDRIscreen *screen = (__GLXDRIscreen *) context->base.pGlxScreen;
+
+    return (*screen->core->unbindContext)(context->driContext);
+}
+
+static int
+__glXDRIcontextCopy(__GLXcontext *baseDst, __GLXcontext *baseSrc,
+		    unsigned long mask)
+{
+    __GLXDRIcontext *dst = (__GLXDRIcontext *) baseDst;
+    __GLXDRIcontext *src = (__GLXDRIcontext *) baseSrc;
+    __GLXDRIscreen *screen = (__GLXDRIscreen *) dst->base.pGlxScreen;
+
+    return (*screen->core->copyContext)(dst->driContext,
+					src->driContext, mask);
+}
+
+static int
+__glXDRIcontextForceCurrent(__GLXcontext *baseContext)
+{
+    __GLXDRIcontext *context = (__GLXDRIcontext *) baseContext;
+    __GLXDRIdrawable *draw = (__GLXDRIdrawable *) baseContext->drawPriv;
+    __GLXDRIdrawable *read = (__GLXDRIdrawable *) baseContext->readPriv;
+    __GLXDRIscreen *screen = (__GLXDRIscreen *) context->base.pGlxScreen;
+
+    return (*screen->core->bindContext)(context->driContext,
+					draw->driDrawable,
+					read->driDrawable);
+}
+
+static void
+glxFillAlphaChannel (CARD32 *pixels, CARD32 rowstride, int width, int height)
+{
+    int i;
+    CARD32 *p, *end;
+
+    rowstride /= 4;
+    
+    for (i = 0; i < height; i++)
+    {
+	p = pixels;
+	end = p + width;
+	while (p < end)
+	  *p++ |= 0xFF000000;
+	pixels += rowstride;
+    }
+}
+
+static Bool
+testTexOffset(__GLXDRIscreen * const screen, PixmapPtr pPixmap)
+{
+    Bool ret;
+
+    if (!screen->texOffsetStart || !screen->texOffset)
+	return FALSE;
+
+    __glXenterServer(GL_FALSE);
+    ret = screen->texOffsetStart(pPixmap) != ~0ULL;
+    __glXleaveServer(GL_FALSE);
+
+    return ret;
+}
+
+/*
+ * (sticking this here for lack of a better place)
+ * Known issues with the GLX_EXT_texture_from_pixmap implementation:
+ * - In general we ignore the fbconfig, lots of examples follow
+ * - No fbconfig handling for multiple mipmap levels
+ * - No fbconfig handling for 1D textures
+ * - No fbconfig handling for TEXTURE_TARGET
+ * - No fbconfig exposure of Y inversion state
+ * - No GenerateMipmapEXT support (due to no FBO support)
+ * - No support for anything but 16bpp and 32bpp-sparse pixmaps
+ */
+
+static int
+__glXDRIbindTexImage(__GLXcontext *baseContext,
+		     int buffer,
+		     __GLXdrawable *glxPixmap)
+{
+    RegionPtr	pRegion = NULL;
+    PixmapPtr	pixmap;
+    int		bpp, override = 0, texname;
+    GLenum	format, type;
+    ScreenPtr pScreen = glxPixmap->pDraw->pScreen;
+    __GLXDRIdrawable *driDraw = (__GLXDRIdrawable *) glxPixmap;
+    __GLXDRIscreen * const screen = (__GLXDRIscreen *) glxGetScreen(pScreen);
+
+    CALL_GetIntegerv(GET_DISPATCH(), (glxPixmap->target == GL_TEXTURE_2D ?
+				      GL_TEXTURE_BINDING_2D :
+				      GL_TEXTURE_BINDING_RECTANGLE_NV,
+				      &texname));
+
+    if (!texname)
+	return __glXError(GLXBadContextState);
+
+    pixmap = (PixmapPtr) glxPixmap->pDraw;
+
+    if (testTexOffset(screen, pixmap)) {
+	__GLXDRIdrawable **texOffsetOverride = screen->texOffsetOverride;
+	int i, firstEmpty = 16;
+
+	for (i = 0; i < 16; i++) {
+	    if (texOffsetOverride[i] == driDraw)
+		goto alreadyin; 
+
+	    if (firstEmpty == 16 && !texOffsetOverride[i])
+		firstEmpty = i;
+	}
+
+	if (firstEmpty == 16) {
+	    ErrorF("%s: Failed to register texture offset override\n", __func__);
+	    goto nooverride;
+	}
+
+	if (firstEmpty >= screen->lastTexOffsetOverride)
+	    screen->lastTexOffsetOverride = firstEmpty + 1;
+
+	texOffsetOverride[firstEmpty] = driDraw;
+
+alreadyin:
+	override = 1;
+
+	driDraw->ctx = (__GLXDRIcontext*)baseContext;
+
+	if (texname == driDraw->texname)
+	    return Success;
+
+	driDraw->texname = texname;
+
+	screen->texOffset->setTexOffset(driDraw->ctx->driContext, texname, 0,
+					pixmap->drawable.depth,
+					pixmap->devKind);
+    }
+nooverride:
+
+    if (!driDraw->pDamage) {
+	if (!override) {
+	    driDraw->pDamage = DamageCreate(NULL, NULL, DamageReportNone,
+					    TRUE, pScreen, NULL);
+	    if (!driDraw->pDamage)
+		return BadAlloc;
+
+	    DamageRegister ((DrawablePtr) pixmap, driDraw->pDamage);
+	}
+
+	pRegion = NULL;
+    } else {
+	pRegion = DamageRegion(driDraw->pDamage);
+	if (REGION_NIL(pRegion))
+	    return Success;
+    }
+
+    /* XXX 24bpp packed, 8, etc */
+    if (pixmap->drawable.depth >= 24) {
+	bpp = 4;
+	format = GL_BGRA;
+	type =
+#if X_BYTE_ORDER == X_BIG_ENDIAN
+	    !override ? GL_UNSIGNED_INT_8_8_8_8_REV :
+#endif
+	    GL_UNSIGNED_BYTE;
+    } else {
+	bpp = 2;
+	format = GL_RGB;
+	type = GL_UNSIGNED_SHORT_5_6_5;
+    }
+
+    if (pRegion == NULL)
+    {
+	void *data = NULL;
+
+	if (!override) {
+	    unsigned pitch = PixmapBytePad(pixmap->drawable.width,
+					   pixmap->drawable.depth); 
+
+	    data = xalloc(pitch * pixmap->drawable.height);
+
+	    __glXenterServer(GL_FALSE);
+	    pScreen->GetImage(&pixmap->drawable, 0 /*pixmap->drawable.x*/,
+			      0 /*pixmap->drawable.y*/, pixmap->drawable.width,
+			      pixmap->drawable.height, ZPixmap, ~0, data);
+	    __glXleaveServer(GL_FALSE);
+
+	    if (pixmap->drawable.depth == 24)
+		glxFillAlphaChannel(data,
+				    pitch,
+				    pixmap->drawable.width,
+				    pixmap->drawable.height);
+
+	    CALL_PixelStorei( GET_DISPATCH(), (GL_UNPACK_ROW_LENGTH,
+					       pitch / bpp) );
+	    CALL_PixelStorei( GET_DISPATCH(), (GL_UNPACK_SKIP_PIXELS, 0) );
+	    CALL_PixelStorei( GET_DISPATCH(), (GL_UNPACK_SKIP_ROWS, 0) );
+	}
+
+	CALL_TexImage2D( GET_DISPATCH(),
+			 (glxPixmap->target,
+			  0,
+			  bpp == 4 ? 4 : 3,
+			  pixmap->drawable.width,
+			  pixmap->drawable.height,
+			  0,
+			  format,
+			  type,
+			  data) );
+
+	xfree(data);
+    } else if (!override) {
+        int i, numRects;
+	BoxPtr p;
+
+	numRects = REGION_NUM_RECTS (pRegion);
+	p = REGION_RECTS (pRegion);
+
+	CALL_PixelStorei( GET_DISPATCH(), (GL_UNPACK_SKIP_PIXELS, 0) );
+	CALL_PixelStorei( GET_DISPATCH(), (GL_UNPACK_SKIP_ROWS, 0) );
+
+	for (i = 0; i < numRects; i++)
+	{
+	    unsigned pitch = PixmapBytePad(p[i].x2 - p[i].x1,
+					   pixmap->drawable.depth);
+	    void *data = xalloc(pitch * (p[i].y2 - p[i].y1));
+
+	    __glXenterServer(GL_FALSE);
+	    pScreen->GetImage(&pixmap->drawable, /*pixmap->drawable.x +*/ p[i].x1,
+			      /*pixmap->drawable.y*/ + p[i].y1, p[i].x2 - p[i].x1,
+			      p[i].y2 - p[i].y1, ZPixmap, ~0, data);
+	    __glXleaveServer(GL_FALSE);
+
+	    if (pixmap->drawable.depth == 24)
+		glxFillAlphaChannel(data,
+				    pitch,
+				    p[i].x2 - p[i].x1,
+				    p[i].y2 - p[i].y1);
+
+	    CALL_PixelStorei( GET_DISPATCH(), (GL_UNPACK_ROW_LENGTH,
+					       pitch / bpp) );
+
+	    CALL_TexSubImage2D( GET_DISPATCH(),
+				(glxPixmap->target,
+				 0,
+				 p[i].x1, p[i].y1,
+				 p[i].x2 - p[i].x1, p[i].y2 - p[i].y1,
+				 format,
+				 type,
+				 data) );
+
+	    xfree(data);
+	}
+    }
+
+    if (!override)
+	DamageEmpty(driDraw->pDamage);
+
+    return Success;
+}
+
+static int
+__glXDRIreleaseTexImage(__GLXcontext *baseContext,
+			int buffer,
+			__GLXdrawable *pixmap)
+{
+    __GLXDRIscreen *screen =
+	(__GLXDRIscreen *) glxGetScreen(pixmap->pDraw->pScreen);
+    __GLXDRIdrawable *drawable = (__GLXDRIdrawable *) pixmap;
+
+    __glXDRIdoReleaseTexImage(screen, drawable);
+
+    return Success;
+}
+
+static __GLXtextureFromPixmap __glXDRItextureFromPixmap = {
+    __glXDRIbindTexImage,
+    __glXDRIreleaseTexImage
+};
+
+static void
+__glXDRIscreenDestroy(__GLXscreen *baseScreen)
+{
+    __GLXDRIscreen *screen = (__GLXDRIscreen *) baseScreen;
+
+    screen->core->destroyScreen(screen->driScreen);
+
+    dlclose(screen->driver);
+
+    __glXScreenDestroy(baseScreen);
+
+    xfree(screen);
+}
+
+static __GLXcontext *
+__glXDRIscreenCreateContext(__GLXscreen *baseScreen,
+			    __GLXconfig *glxConfig,
+			    __GLXcontext *baseShareContext)
+{
+    __GLXDRIscreen *screen = (__GLXDRIscreen *) baseScreen;
+    __GLXDRIcontext *context, *shareContext;
+    __GLXDRIconfig *config = (__GLXDRIconfig *) glxConfig;
+    VisualPtr visual;
+    int i;
+    GLboolean retval;
+    __DRIcontext *driShare;
+    drm_context_t hwContext;
+    ScreenPtr pScreen = baseScreen->pScreen;
+
+    shareContext = (__GLXDRIcontext *) baseShareContext;
+    if (shareContext)
+	driShare = shareContext->driContext;
+    else
+	driShare = NULL;
+
+    if (baseShareContext && baseShareContext->isDirect)
+        return NULL;
+
+    context = xcalloc(1, sizeof *context);
+    if (context == NULL)
+	return NULL;
+
+    context->base.destroy           = __glXDRIcontextDestroy;
+    context->base.makeCurrent       = __glXDRIcontextMakeCurrent;
+    context->base.loseCurrent       = __glXDRIcontextLoseCurrent;
+    context->base.copy              = __glXDRIcontextCopy;
+    context->base.forceCurrent      = __glXDRIcontextForceCurrent;
+
+    context->base.textureFromPixmap = &__glXDRItextureFromPixmap;
+    /* Find the requested X visual */
+    visual = pScreen->visuals;
+    for (i = 0; i < pScreen->numVisuals; i++, visual++)
+	if (visual->vid == glxConfig->visualID)
+	    break;
+    if (i == pScreen->numVisuals)
+	return NULL;
+
+    context->hwContextID = FakeClientID(0);
+
+    __glXenterServer(GL_FALSE);
+    retval = DRICreateContext(baseScreen->pScreen, visual,
+			      context->hwContextID, &hwContext);
+    __glXleaveServer(GL_FALSE);
+
+    if (!retval)
+    	return NULL;
+
+    context->driContext =
+	screen->legacy->createNewContext(screen->driScreen,
+					 config->driConfig,
+					 0, /* render type */
+					 driShare,
+					 hwContext,
+					 context);
+
+    if (context->driContext == NULL) {
+    	__glXenterServer(GL_FALSE);
+	retval = DRIDestroyContext(baseScreen->pScreen, context->hwContextID);
+    	__glXleaveServer(GL_FALSE);
+	xfree(context);
+	return NULL;
+    }
+
+    return &context->base;
+}
+
+static __GLXdrawable *
+__glXDRIscreenCreateDrawable(ClientPtr client,
+			     __GLXscreen *screen,
+			     DrawablePtr pDraw,
+			     XID drawId,
+			     int type,
+			     XID glxDrawId,
+			     __GLXconfig *glxConfig)
+{
+    __GLXDRIscreen *driScreen = (__GLXDRIscreen *) screen;
+    __GLXDRIconfig *config = (__GLXDRIconfig *) glxConfig;
+    __GLXDRIdrawable *private;
+    GLboolean retval;
+    drm_drawable_t hwDrawable;
+
+    private = xcalloc(1, sizeof *private);
+    if (private == NULL)
+	return NULL;
+
+    if (!__glXDrawableInit(&private->base, screen,
+			   pDraw, type, glxDrawId, glxConfig)) {
+        xfree(private);
+	return NULL;
+    }
+
+    private->base.destroy       = __glXDRIdrawableDestroy;
+    private->base.swapBuffers   = __glXDRIdrawableSwapBuffers;
+    private->base.copySubBuffer = __glXDRIdrawableCopySubBuffer;
+    private->base.waitX		= NULL;
+    private->base.waitGL	= NULL;
+
+    __glXenterServer(GL_FALSE);
+    retval = DRICreateDrawable(screen->pScreen, serverClient,
+			       pDraw, &hwDrawable);
+    __glXleaveServer(GL_FALSE);
+
+    if (!retval) {
+    	xfree(private);
+    	return NULL;
+    }
+
+    /* The last argument is 'attrs', which is used with pbuffers which
+     * we currently don't support. */
+
+    private->driDrawable =
+	(driScreen->legacy->createNewDrawable)(driScreen->driScreen,
+					       config->driConfig,
+					       hwDrawable, 0, NULL, private);
+
+    if (private->driDrawable == NULL) {
+	__glXenterServer(GL_FALSE);
+	DRIDestroyDrawable(screen->pScreen, serverClient, pDraw);
+	__glXleaveServer(GL_FALSE);
+	xfree(private);
+	return NULL;
+    }
+
+    return &private->base;
+}
+
+static GLboolean
+getDrawableInfo(__DRIdrawable *driDrawable,
+		unsigned int *index, unsigned int *stamp,
+		int *x, int *y, int *width, int *height,
+		int *numClipRects, drm_clip_rect_t **ppClipRects,
+		int *backX, int *backY,
+		int *numBackClipRects, drm_clip_rect_t **ppBackClipRects,
+		void *data)
+{
+    __GLXDRIdrawable *drawable = data;
+    ScreenPtr pScreen;
+    drm_clip_rect_t *pClipRects, *pBackClipRects;
+    GLboolean retval;
+    size_t size;
+
+    /* If the X window has been destroyed, give up here. */
+    if (drawable->base.pDraw == NULL)
+	return GL_FALSE;
+
+    pScreen = drawable->base.pDraw->pScreen;
+    __glXenterServer(GL_FALSE);
+    retval = DRIGetDrawableInfo(pScreen, drawable->base.pDraw, index, stamp,
+				x, y, width, height,
+				numClipRects, &pClipRects,
+				backX, backY,
+				numBackClipRects, &pBackClipRects);
+    __glXleaveServer(GL_FALSE);
+
+    if (retval && *numClipRects > 0) {
+	size = sizeof (drm_clip_rect_t) * *numClipRects;
+	*ppClipRects = xalloc (size);
+
+	/* Clip cliprects to screen dimensions (redirected windows) */
+	if (*ppClipRects != NULL) {
+	    int i, j;
+
+	    for (i = 0, j = 0; i < *numClipRects; i++) {
+	        (*ppClipRects)[j].x1 = max(pClipRects[i].x1, 0);
+		(*ppClipRects)[j].y1 = max(pClipRects[i].y1, 0);
+		(*ppClipRects)[j].x2 = min(pClipRects[i].x2, pScreen->width);
+		(*ppClipRects)[j].y2 = min(pClipRects[i].y2, pScreen->height);
+
+		if ((*ppClipRects)[j].x1 < (*ppClipRects)[j].x2 &&
+		    (*ppClipRects)[j].y1 < (*ppClipRects)[j].y2) {
+		    j++;
+		}
+	    }
+
+	    if (*numClipRects != j) {
+		*numClipRects = j;
+		*ppClipRects = xrealloc (*ppClipRects,
+					 sizeof (drm_clip_rect_t) *
+					 *numClipRects);
+	    }
+	} else
+	    *numClipRects = 0;
+    }
+    else {
+      *ppClipRects = NULL;
+      *numClipRects = 0;
+    }
+      
+    if (retval && *numBackClipRects > 0) {
+	size = sizeof (drm_clip_rect_t) * *numBackClipRects;
+	*ppBackClipRects = xalloc (size);
+	if (*ppBackClipRects != NULL)
+	    memcpy (*ppBackClipRects, pBackClipRects, size);
+	else
+	    *numBackClipRects = 0;
+    }
+    else {
+      *ppBackClipRects = NULL;
+      *numBackClipRects = 0;
+    }
+
+    return retval;
+}
+
+static void __glXReportDamage(__DRIdrawable *driDraw,
+			      int x, int y,
+			      drm_clip_rect_t *rects, int num_rects,
+			      GLboolean front_buffer,
+			      void *data)
+{
+    __GLXDRIdrawable *drawable = data;
+    DrawablePtr pDraw = drawable->base.pDraw;
+    RegionRec region;
+
+    __glXenterServer(GL_FALSE);
+
+    REGION_INIT(pDraw->pScreen, &region, (BoxPtr) rects, num_rects);
+    REGION_TRANSLATE(pScreen, &region, pDraw->x, pDraw->y);
+    DamageRegionAppend(pDraw, &region);
+    /* This is wrong, this needs a seperate function. */
+    DamageRegionProcessPending(pDraw);
+    REGION_UNINIT(pDraw->pScreen, &region);
+
+    __glXleaveServer(GL_FALSE);
+}
+
+static const __DRIgetDrawableInfoExtension getDrawableInfoExtension = {
+    { __DRI_GET_DRAWABLE_INFO, __DRI_GET_DRAWABLE_INFO_VERSION },
+    getDrawableInfo
+};
+
+static const __DRIdamageExtension damageExtension = {
+    { __DRI_DAMAGE, __DRI_DAMAGE_VERSION },
+    __glXReportDamage,
+};
+
+static const __DRIextension *loader_extensions[] = {
+    &systemTimeExtension.base,
+    &getDrawableInfoExtension.base,
+    &damageExtension.base,
+    NULL
+};
+
+
+
+static const char dri_driver_path[] = DRI_DRIVER_PATH;
+
+static Bool
+glxDRIEnterVT (int index, int flags)
+{
+    __GLXDRIscreen *screen = (__GLXDRIscreen *) 
+	glxGetScreen(screenInfo.screens[index]);
+
+    LogMessage(X_INFO, "AIGLX: Resuming AIGLX clients after VT switch\n");
+
+    if (!(*screen->enterVT) (index, flags))
+	return FALSE;
+    
+    glxResumeClients();
+
+    return TRUE;
+}
+
+static void
+glxDRILeaveVT (int index, int flags)
+{
+    __GLXDRIscreen *screen = (__GLXDRIscreen *)
+	glxGetScreen(screenInfo.screens[index]);
+
+    LogMessage(X_INFO, "AIGLX: Suspending AIGLX clients for VT switch\n");
+
+    glxSuspendClients();
+
+    return (*screen->leaveVT) (index, flags);
+}
+
+static void
+initializeExtensions(__GLXDRIscreen *screen)
+{
+    const __DRIextension **extensions;
+    int i;
+
+    extensions = screen->core->getExtensions(screen->driScreen);
+
+    for (i = 0; extensions[i]; i++) {
+#ifdef __DRI_READ_DRAWABLE
+	if (strcmp(extensions[i]->name, __DRI_READ_DRAWABLE) == 0) {
+	    __glXEnableExtension(screen->glx_enable_bits,
+				 "GLX_SGI_make_current_read");
+	    
+	    LogMessage(X_INFO, "AIGLX: enabled GLX_SGI_make_current_read\n");
+	}
+#endif
+
+#ifdef __DRI_COPY_SUB_BUFFER
+	if (strcmp(extensions[i]->name, __DRI_COPY_SUB_BUFFER) == 0) {
+	    screen->copySubBuffer = (__DRIcopySubBufferExtension *) extensions[i];
+	    __glXEnableExtension(screen->glx_enable_bits,
+				 "GLX_MESA_copy_sub_buffer");
+	    
+	    LogMessage(X_INFO, "AIGLX: enabled GLX_MESA_copy_sub_buffer\n");
+	}
+#endif
+
+#ifdef __DRI_SWAP_CONTROL
+	if (strcmp(extensions[i]->name, __DRI_SWAP_CONTROL) == 0) {
+	    screen->swapControl = (__DRIswapControlExtension *) extensions[i];
+	    __glXEnableExtension(screen->glx_enable_bits,
+				 "GLX_SGI_swap_control");
+	    __glXEnableExtension(screen->glx_enable_bits,
+				 "GLX_MESA_swap_control");
+	    
+	    LogMessage(X_INFO, "AIGLX: enabled GLX_SGI_swap_control and GLX_MESA_swap_control\n");
+	}
+#endif
+
+#ifdef __DRI_TEX_OFFSET
+	if (strcmp(extensions[i]->name, __DRI_TEX_OFFSET) == 0) {
+	    screen->texOffset = (__DRItexOffsetExtension *) extensions[i];
+	    LogMessage(X_INFO, "AIGLX: enabled GLX_texture_from_pixmap with driver support\n");
+	}
+#endif
+	/* Ignore unknown extensions */
+    }
+}
+    
+static __GLXscreen *
+__glXDRIscreenProbe(ScreenPtr pScreen)
+{
+    drm_handle_t hSAREA;
+    drmAddress pSAREA = NULL;
+    char *BusID;
+    __DRIversion   ddx_version;
+    __DRIversion   dri_version;
+    __DRIversion   drm_version;
+    __DRIframebuffer  framebuffer;
+    int   fd = -1;
+    int   status;
+    drm_magic_t magic;
+    drmVersionPtr version;
+    int newlyopened;
+    char *driverName;
+    drm_handle_t  hFB;
+    int        junk;
+    __GLXDRIscreen *screen;
+    char filename[128];
+    Bool isCapable;
+    size_t buffer_size;
+    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+    const __DRIconfig **driConfigs;
+    const __DRIextension **extensions;
+    int i;
+
+    if (!xf86LoaderCheckSymbol("DRIQueryDirectRenderingCapable") ||
+	!DRIQueryDirectRenderingCapable(pScreen, &isCapable) ||
+	!isCapable) {
+	LogMessage(X_INFO,
+		   "AIGLX: Screen %d is not DRI capable\n", pScreen->myNum);
+	return NULL;
+    }
+
+    screen = xcalloc(1, sizeof *screen);
+    if (screen == NULL)
+      return NULL;
+
+    screen->base.destroy        = __glXDRIscreenDestroy;
+    screen->base.createContext  = __glXDRIscreenCreateContext;
+    screen->base.createDrawable = __glXDRIscreenCreateDrawable;
+    screen->base.swapInterval   = __glXDRIdrawableSwapInterval;
+    screen->base.pScreen       = pScreen;
+
+    __glXInitExtensionEnableBits(screen->glx_enable_bits);
+
+    /* DRI protocol version. */
+    dri_version.major = XF86DRI_MAJOR_VERSION;
+    dri_version.minor = XF86DRI_MINOR_VERSION;
+    dri_version.patch = XF86DRI_PATCH_VERSION;
+
+    if (!DRIOpenConnection(pScreen, &hSAREA, &BusID)) {
+	LogMessage(X_ERROR, "AIGLX error: DRIOpenConnection failed\n");
+	goto handle_error;
+    }
+
+    fd = drmOpenOnce(NULL, BusID, &newlyopened);
+
+    if (fd < 0) {
+	LogMessage(X_ERROR, "AIGLX error: drmOpenOnce failed (%s)\n",
+		   strerror(-fd));
+	goto handle_error;
+    }
+
+    if (drmGetMagic(fd, &magic)) {
+	LogMessage(X_ERROR, "AIGLX error: drmGetMagic failed\n");
+	goto handle_error;
+    }
+
+    version = drmGetVersion(fd);
+    if (version) {
+	drm_version.major = version->version_major;
+	drm_version.minor = version->version_minor;
+	drm_version.patch = version->version_patchlevel;
+	drmFreeVersion(version);
+    }
+    else {
+	drm_version.major = -1;
+	drm_version.minor = -1;
+	drm_version.patch = -1;
+    }
+
+    if (newlyopened && !DRIAuthConnection(pScreen, magic)) {
+	LogMessage(X_ERROR, "AIGLX error: DRIAuthConnection failed\n");
+	goto handle_error;
+    }
+
+    /* Get device name (like "tdfx") and the ddx version numbers.
+     * We'll check the version in each DRI driver's "createNewScreen"
+     * function. */
+    if (!DRIGetClientDriverName(pScreen,
+				&ddx_version.major,
+				&ddx_version.minor,
+				&ddx_version.patch,
+				&driverName)) {
+	LogMessage(X_ERROR, "AIGLX error: DRIGetClientDriverName failed\n");
+	goto handle_error;
+    }
+
+    snprintf(filename, sizeof filename, "%s/%s_dri.so",
+             dri_driver_path, driverName);
+
+    screen->driver = dlopen(filename, RTLD_LAZY | RTLD_LOCAL);
+    if (screen->driver == NULL) {
+	LogMessage(X_ERROR, "AIGLX error: dlopen of %s failed (%s)\n",
+		   filename, dlerror());
+        goto handle_error;
+    }
+
+    extensions = dlsym(screen->driver, __DRI_DRIVER_EXTENSIONS);
+    if (extensions == NULL) {
+	LogMessage(X_ERROR, "AIGLX error: %s exports no extensions (%s)\n",
+		   driverName, dlerror());
+	goto handle_error;
+    }
+    
+    for (i = 0; extensions[i]; i++) {
+	if (strcmp(extensions[i]->name, __DRI_CORE) == 0 &&
+	    extensions[i]->version >= __DRI_CORE_VERSION) {
+		screen->core = (__DRIcoreExtension *) extensions[i];
+	}
+
+	if (strcmp(extensions[i]->name, __DRI_LEGACY) == 0 &&
+	    extensions[i]->version >= __DRI_LEGACY_VERSION) {
+		screen->legacy = (__DRIlegacyExtension *) extensions[i];
+	}
+    }
+
+    if (screen->core == NULL || screen->legacy == NULL) {
+	LogMessage(X_ERROR,
+		   "AIGLX error: %s does not export required DRI extension\n",
+		   driverName);
+	goto handle_error;
+    }
+
+    /*
+     * Get device-specific info.  pDevPriv will point to a struct
+     * (such as DRIRADEONRec in xfree86/driver/ati/radeon_dri.h) that
+     * has information about the screen size, depth, pitch, ancilliary
+     * buffers, DRM mmap handles, etc.
+     */
+    if (!DRIGetDeviceInfo(pScreen, &hFB, &junk,
+			  &framebuffer.size, &framebuffer.stride,
+			  &framebuffer.dev_priv_size, &framebuffer.dev_priv)) {
+	LogMessage(X_ERROR, "AIGLX error: XF86DRIGetDeviceInfo failed\n");
+	goto handle_error;
+    }
+
+    framebuffer.width = pScreen->width;
+    framebuffer.height = pScreen->height;
+
+    /* Map the framebuffer region. */
+    status = drmMap(fd, hFB, framebuffer.size, 
+		    (drmAddressPtr)&framebuffer.base);
+    if (status != 0) {
+	LogMessage(X_ERROR, "AIGLX error: drmMap of framebuffer failed (%s)\n",
+		   strerror(-status));
+	goto handle_error;
+    }
+
+    /* Map the SAREA region.  Further mmap regions may be setup in
+     * each DRI driver's "createNewScreen" function.
+     */
+    status = drmMap(fd, hSAREA, SAREA_MAX, &pSAREA);
+    if (status != 0) {
+	LogMessage(X_ERROR, "AIGLX error: drmMap of SAREA failed (%s)\n",
+		   strerror(-status));
+	goto handle_error;
+    }
+    
+    screen->driScreen =
+	(*screen->legacy->createNewScreen)(pScreen->myNum,
+					   &ddx_version,
+					   &dri_version,
+					   &drm_version,
+					   &framebuffer,
+					   pSAREA,
+					   fd,
+					   loader_extensions,
+					   &driConfigs,
+					   screen);
+
+    if (screen->driScreen == NULL) {
+	LogMessage(X_ERROR,
+		   "AIGLX error: Calling driver entry point failed\n");
+	goto handle_error;
+    }
+
+    screen->base.fbconfigs = glxConvertConfigs(screen->core,
+					       driConfigs, GLX_WINDOW_BIT);
+
+    initializeExtensions(screen);
+
+    DRIGetTexOffsetFuncs(pScreen, &screen->texOffsetStart,
+			 &screen->texOffsetFinish);
+
+    __glXScreenInit(&screen->base, pScreen);
+
+    /* The first call simply determines the length of the extension string.
+     * This allows us to allocate some memory to hold the extension string,
+     * but it requires that we call __glXGetExtensionString a second time.
+     */
+    buffer_size = __glXGetExtensionString(screen->glx_enable_bits, NULL);
+    if (buffer_size > 0) {
+	if (screen->base.GLXextensions != NULL) {
+	    xfree(screen->base.GLXextensions);
+	}
+
+	screen->base.GLXextensions = xnfalloc(buffer_size);
+	(void) __glXGetExtensionString(screen->glx_enable_bits, 
+				       screen->base.GLXextensions);
+    }
+
+    __glXsetEnterLeaveServerFuncs(__glXDRIenterServer, __glXDRIleaveServer);
+
+    screen->enterVT = pScrn->EnterVT;
+    pScrn->EnterVT = glxDRIEnterVT;
+    screen->leaveVT = pScrn->LeaveVT;
+    pScrn->LeaveVT = glxDRILeaveVT;
+
+    LogMessage(X_INFO,
+	       "AIGLX: Loaded and initialized %s\n", filename);
+
+    return &screen->base;
+
+ handle_error:
+    if (pSAREA != NULL)
+	drmUnmap(pSAREA, SAREA_MAX);
+
+    if (framebuffer.base != NULL)
+	drmUnmap((drmAddress)framebuffer.base, framebuffer.size);
+
+    if (fd >= 0)
+	drmCloseOnce(fd);
+
+    DRICloseConnection(pScreen);
+
+    if (screen->driver)
+        dlclose(screen->driver);
+
+    xfree(screen);
+
+    LogMessage(X_ERROR, "AIGLX: reverting to software rendering\n");
+
+    return NULL;
+}
+
+_X_EXPORT __GLXprovider __glXDRIProvider = {
+    __glXDRIscreenProbe,
+    "DRI",
+    NULL
+};
diff --git a/xorg-server/glx/glxdri2.c b/xorg-server/glx/glxdri2.c
index 74d6ebc5d..f1396b54d 100644
--- a/xorg-server/glx/glxdri2.c
+++ b/xorg-server/glx/glxdri2.c
@@ -1,805 +1,807 @@
-/*
- * Copyright © 2007 Red Hat, Inc
- *
- * Permission to use, copy, modify, distribute, and sell this software
- * and its documentation for any purpose is hereby granted without
- * fee, provided that the above copyright notice appear in all copies
- * and that both that copyright notice and this permission notice
- * appear in supporting documentation, and that the name of Red Hat,
- * Inc not be used in advertising or publicity pertaining to
- * distribution of the software without specific, written prior
- * permission.  Red Hat, Inc makes no representations about the
- * suitability of this software for any purpose.  It is provided "as
- * is" without express or implied warranty.
- *
- * RED HAT, INC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
- * NO EVENT SHALL RED HAT, INC BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
- * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
- * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <stdint.h>
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#include <dlfcn.h>
-
-#include <drm.h>
-#include <GL/gl.h>
-#include <GL/internal/dri_interface.h>
-#include <GL/glxtokens.h>
-
-#include <windowstr.h>
-#include <os.h>
-
-#define _XF86DRI_SERVER_
-#include <xf86drm.h>
-#include <xf86.h>
-#include <dri2.h>
-
-#include "glxserver.h"
-#include "glxutil.h"
-#include "glxdricommon.h"
-
-#include "g_disptab.h"
-#include "glapitable.h"
-#include "glapi.h"
-#include "glthread.h"
-#include "dispatch.h"
-#include "extension_string.h"
-
-typedef struct __GLXDRIscreen   __GLXDRIscreen;
-typedef struct __GLXDRIcontext  __GLXDRIcontext;
-typedef struct __GLXDRIdrawable __GLXDRIdrawable;
-
-struct __GLXDRIscreen {
-    __GLXscreen		 base;
-    __DRIscreen		*driScreen;
-    void		*driver;
-    int			 fd;
-
-    xf86EnterVTProc	*enterVT;
-    xf86LeaveVTProc	*leaveVT;
-
-    const __DRIcoreExtension *core;
-    const __DRIdri2Extension *dri2;
-    const __DRI2flushExtension *flush;
-    const __DRIcopySubBufferExtension *copySubBuffer;
-    const __DRIswapControlExtension *swapControl;
-    const __DRItexBufferExtension *texBuffer;
-
-    unsigned char glx_enable_bits[__GLX_EXT_BYTES];
-};
-
-struct __GLXDRIcontext {
-    __GLXcontext	 base;
-    __DRIcontext	*driContext;
-};
-
-#define MAX_DRAWABLE_BUFFERS 5
-
-struct __GLXDRIdrawable {
-    __GLXdrawable	 base;
-    __DRIdrawable	*driDrawable;
-    __GLXDRIscreen	*screen;
-
-    /* Dimensions as last reported by DRI2GetBuffers. */
-    int width;
-    int height;
-    __DRIbuffer buffers[MAX_DRAWABLE_BUFFERS];
-    int count;
-};
-
-static void
-__glXDRIdrawableDestroy(__GLXdrawable *drawable)
-{
-    __GLXDRIdrawable *private = (__GLXDRIdrawable *) drawable;
-    const __DRIcoreExtension *core = private->screen->core;
-    
-    (*core->destroyDrawable)(private->driDrawable);
-
-    __glXDrawableRelease(drawable);
-
-    xfree(private);
-}
-
-static void
-__glXDRIdrawableCopySubBuffer(__GLXdrawable *drawable,
-			       int x, int y, int w, int h)
-{
-    __GLXDRIdrawable *private = (__GLXDRIdrawable *) drawable;
-    BoxRec box;
-    RegionRec region;
-
-    box.x1 = x;
-    box.y1 = private->height - y - h;
-    box.x2 = x + w;
-    box.y2 = private->height - y;
-    REGION_INIT(drawable->pDraw->pScreen, &region, &box, 0);
-
-    DRI2CopyRegion(drawable->pDraw, &region,
-		   DRI2BufferFrontLeft, DRI2BufferBackLeft);
-}
-
-static void
-__glXDRIdrawableWaitX(__GLXdrawable *drawable)
-{
-    __GLXDRIdrawable *private = (__GLXDRIdrawable *) drawable;
-    BoxRec box;
-    RegionRec region;
-
-    box.x1 = 0;
-    box.y1 = 0;
-    box.x2 = private->width;
-    box.y2 = private->height;
-    REGION_INIT(drawable->pDraw->pScreen, &region, &box, 0);
-
-    DRI2CopyRegion(drawable->pDraw, &region,
-		   DRI2BufferFakeFrontLeft, DRI2BufferFrontLeft);
-}
-
-static void
-__glXDRIdrawableWaitGL(__GLXdrawable *drawable)
-{
-    __GLXDRIdrawable *private = (__GLXDRIdrawable *) drawable;
-    BoxRec box;
-    RegionRec region;
-
-    box.x1 = 0;
-    box.y1 = 0;
-    box.x2 = private->width;
-    box.y2 = private->height;
-    REGION_INIT(drawable->pDraw->pScreen, &region, &box, 0);
-
-    DRI2CopyRegion(drawable->pDraw, &region,
-		   DRI2BufferFrontLeft, DRI2BufferFakeFrontLeft);
-}
-
-static void
-__glXdriSwapEvent(ClientPtr client, void *data, int type, CARD64 ust,
-		  CARD64 msc, CARD64 sbc)
-{
-    __GLXdrawable *drawable = data;
-    xGLXBufferSwapComplete wire;
-
-    if (!(drawable->eventMask & GLX_BUFFER_SWAP_COMPLETE_INTEL_MASK))
-	return;
-
-    wire.type = __glXEventBase + GLX_BufferSwapComplete;
-    switch (type) {
-    case DRI2_EXCHANGE_COMPLETE:
-	wire.event_type = GLX_EXCHANGE_COMPLETE_INTEL;
-	break;
-    case DRI2_BLIT_COMPLETE:
-	wire.event_type = GLX_BLIT_COMPLETE_INTEL;
-	break;
-    case DRI2_FLIP_COMPLETE:
-	wire.event_type = GLX_FLIP_COMPLETE_INTEL;
-	break;
-    default:
-	/* unknown swap completion type */
-	break;
-    }
-    wire.sequenceNumber = client->sequence;
-    wire.drawable = drawable->drawId;
-    wire.ust_hi = ust >> 32;
-    wire.ust_lo = ust & 0xffffffff;
-    wire.msc_hi = msc >> 32;
-    wire.msc_lo = msc & 0xffffffff;
-    wire.sbc_hi = sbc >> 32;
-    wire.sbc_lo = sbc & 0xffffffff;
-
-    WriteEventsToClient(client, 1, (xEvent *) &wire);
-}
-
-/*
- * Copy or flip back to front, honoring the swap interval if possible.
- *
- * If the kernel supports it, we request an event for the frame when the
- * swap should happen, then perform the copy when we receive it.
- */
-static GLboolean
-__glXDRIdrawableSwapBuffers(ClientPtr client, __GLXdrawable *drawable)
-{
-    __GLXDRIdrawable *priv = (__GLXDRIdrawable *) drawable;
-    __GLXDRIscreen *screen = priv->screen;
-    CARD64 unused;
-
-#if __DRI2_FLUSH_VERSION >= 3
-    if (screen->flush) {
-	(*screen->flush->flush)(priv->driDrawable);
-	(*screen->flush->invalidate)(priv->driDrawable);
-    }
-#else
-    if (screen->flush)
-	(*screen->flush->flushInvalidate)(priv->driDrawable);
-#endif
-
-    if (DRI2SwapBuffers(client, drawable->pDraw, 0, 0, 0, &unused,
-			__glXdriSwapEvent, drawable->pDraw) != Success)
-	return FALSE;
-
-    return TRUE;
-}
-
-static int
-__glXDRIdrawableSwapInterval(__GLXdrawable *drawable, int interval)
-{
-    if (interval <= 0) /* || interval > BIGNUM? */
-	return GLX_BAD_VALUE;
-
-    DRI2SwapInterval(drawable->pDraw, interval);
-
-    return 0;
-}
-
-static void
-__glXDRIcontextDestroy(__GLXcontext *baseContext)
-{
-    __GLXDRIcontext *context = (__GLXDRIcontext *) baseContext;
-    __GLXDRIscreen *screen = (__GLXDRIscreen *) context->base.pGlxScreen;
-
-    (*screen->core->destroyContext)(context->driContext);
-    __glXContextDestroy(&context->base);
-    xfree(context);
-}
-
-static int
-__glXDRIcontextMakeCurrent(__GLXcontext *baseContext)
-{
-    __GLXDRIcontext *context = (__GLXDRIcontext *) baseContext;
-    __GLXDRIdrawable *draw = (__GLXDRIdrawable *) baseContext->drawPriv;
-    __GLXDRIdrawable *read = (__GLXDRIdrawable *) baseContext->readPriv;
-    __GLXDRIscreen *screen = (__GLXDRIscreen *) context->base.pGlxScreen;
-
-    return (*screen->core->bindContext)(context->driContext,
-					draw->driDrawable,
-					read->driDrawable);
-}					      
-
-static int
-__glXDRIcontextLoseCurrent(__GLXcontext *baseContext)
-{
-    __GLXDRIcontext *context = (__GLXDRIcontext *) baseContext;
-    __GLXDRIscreen *screen = (__GLXDRIscreen *) context->base.pGlxScreen;
-
-    return (*screen->core->unbindContext)(context->driContext);
-}
-
-static int
-__glXDRIcontextCopy(__GLXcontext *baseDst, __GLXcontext *baseSrc,
-		    unsigned long mask)
-{
-    __GLXDRIcontext *dst = (__GLXDRIcontext *) baseDst;
-    __GLXDRIcontext *src = (__GLXDRIcontext *) baseSrc;
-    __GLXDRIscreen *screen = (__GLXDRIscreen *) dst->base.pGlxScreen;
-
-    return (*screen->core->copyContext)(dst->driContext,
-					src->driContext, mask);
-}
-
-static int
-__glXDRIcontextForceCurrent(__GLXcontext *baseContext)
-{
-    __GLXDRIcontext *context = (__GLXDRIcontext *) baseContext;
-    __GLXDRIdrawable *draw = (__GLXDRIdrawable *) baseContext->drawPriv;
-    __GLXDRIdrawable *read = (__GLXDRIdrawable *) baseContext->readPriv;
-    __GLXDRIscreen *screen = (__GLXDRIscreen *) context->base.pGlxScreen;
-
-    return (*screen->core->bindContext)(context->driContext,
-					draw->driDrawable,
-					read->driDrawable);
-}
-
-static Bool
-__glXDRIcontextWait(__GLXcontext *baseContext,
-		    __GLXclientState *cl, int *error)
-{
-    if (DRI2WaitSwap(cl->client, baseContext->drawPriv->pDraw)) {
-	*error = cl->client->noClientException;
-	return TRUE;
-    }
-
-    return FALSE;
-}
-
-#ifdef __DRI_TEX_BUFFER
-
-static int
-__glXDRIbindTexImage(__GLXcontext *baseContext,
-		     int buffer,
-		     __GLXdrawable *glxPixmap)
-{
-    __GLXDRIdrawable *drawable = (__GLXDRIdrawable *) glxPixmap;
-    const __DRItexBufferExtension *texBuffer = drawable->screen->texBuffer;
-    __GLXDRIcontext *context = (__GLXDRIcontext *) baseContext;
-
-    if (texBuffer == NULL)
-        return Success;
-
-#if __DRI_TEX_BUFFER_VERSION >= 2
-    if (texBuffer->base.version >= 2 && texBuffer->setTexBuffer2 != NULL) {
-	(*texBuffer->setTexBuffer2)(context->driContext,
-				    glxPixmap->target,
-				    glxPixmap->format,
-				    drawable->driDrawable);
-    } else
-#endif
-    {
-	texBuffer->setTexBuffer(context->driContext,
-				glxPixmap->target,
-				drawable->driDrawable);
-    }
-
-    return Success;
-}
-
-static int
-__glXDRIreleaseTexImage(__GLXcontext *baseContext,
-			int buffer,
-			__GLXdrawable *pixmap)
-{
-    /* FIXME: Just unbind the texture? */
-    return Success;
-}
-
-#else
-
-static int
-__glXDRIbindTexImage(__GLXcontext *baseContext,
-		     int buffer,
-		     __GLXdrawable *glxPixmap)
-{
-    return Success;
-}
-
-static int
-__glXDRIreleaseTexImage(__GLXcontext *baseContext,
-			int buffer,
-			__GLXdrawable *pixmap)
-{
-    return Success;
-}
-
-#endif
-
-static __GLXtextureFromPixmap __glXDRItextureFromPixmap = {
-    __glXDRIbindTexImage,
-    __glXDRIreleaseTexImage
-};
-
-static void
-__glXDRIscreenDestroy(__GLXscreen *baseScreen)
-{
-    __GLXDRIscreen *screen = (__GLXDRIscreen *) baseScreen;
-
-    (*screen->core->destroyScreen)(screen->driScreen);
-
-    dlclose(screen->driver);
-
-    __glXScreenDestroy(baseScreen);
-
-    xfree(screen);
-}
-
-static __GLXcontext *
-__glXDRIscreenCreateContext(__GLXscreen *baseScreen,
-			    __GLXconfig *glxConfig,
-			    __GLXcontext *baseShareContext)
-{
-    __GLXDRIscreen *screen = (__GLXDRIscreen *) baseScreen;
-    __GLXDRIcontext *context, *shareContext;
-    __GLXDRIconfig *config = (__GLXDRIconfig *) glxConfig;
-    __DRIcontext *driShare;
-
-    shareContext = (__GLXDRIcontext *) baseShareContext;
-    if (shareContext)
-	driShare = shareContext->driContext;
-    else
-	driShare = NULL;
-
-    context = xcalloc(1, sizeof *context);
-    if (context == NULL)
-	return NULL;
-
-    context->base.destroy           = __glXDRIcontextDestroy;
-    context->base.makeCurrent       = __glXDRIcontextMakeCurrent;
-    context->base.loseCurrent       = __glXDRIcontextLoseCurrent;
-    context->base.copy              = __glXDRIcontextCopy;
-    context->base.forceCurrent      = __glXDRIcontextForceCurrent;
-    context->base.textureFromPixmap = &__glXDRItextureFromPixmap;
-    context->base.wait              = __glXDRIcontextWait;
-
-    context->driContext =
-	(*screen->dri2->createNewContext)(screen->driScreen,
-					  config->driConfig,
-					  driShare, context);
-    if (context->driContext == NULL) {
-	    xfree(context);
-        return NULL;
-    }
-
-    return &context->base;
-}
-
-static __GLXdrawable *
-__glXDRIscreenCreateDrawable(__GLXscreen *screen,
-			     DrawablePtr pDraw,
-			     int type,
-			     XID drawId,
-			     __GLXconfig *glxConfig)
-{
-    __GLXDRIscreen *driScreen = (__GLXDRIscreen *) screen;
-    __GLXDRIconfig *config = (__GLXDRIconfig *) glxConfig;
-    __GLXDRIdrawable *private;
-
-    private = xcalloc(1, sizeof *private);
-    if (private == NULL)
-	return NULL;
-
-    private->screen = driScreen;
-    if (!__glXDrawableInit(&private->base, screen,
-			   pDraw, type, drawId, glxConfig)) {
-        xfree(private);
-	return NULL;
-    }
-
-    private->base.destroy       = __glXDRIdrawableDestroy;
-    private->base.swapBuffers   = __glXDRIdrawableSwapBuffers;
-    private->base.copySubBuffer = __glXDRIdrawableCopySubBuffer;
-    private->base.waitGL	= __glXDRIdrawableWaitGL;
-    private->base.waitX		= __glXDRIdrawableWaitX;
-
-    if (DRI2CreateDrawable(pDraw)) {
-	    xfree(private);
-	    return NULL;
-    }
-
-    private->driDrawable =
-	(*driScreen->dri2->createNewDrawable)(driScreen->driScreen,
-					      config->driConfig, private);
-
-    return &private->base;
-}
-
-static __DRIbuffer *
-dri2GetBuffers(__DRIdrawable *driDrawable,
-	       int *width, int *height,
-	       unsigned int *attachments, int count,
-	       int *out_count, void *loaderPrivate)
-{
-    __GLXDRIdrawable *private = loaderPrivate;
-    DRI2BufferPtr *buffers;
-    int i;
-    int j;
-
-    buffers = DRI2GetBuffers(private->base.pDraw,
-			     width, height, attachments, count, out_count);
-    if (*out_count > MAX_DRAWABLE_BUFFERS) {
-	*out_count = 0;
-	return NULL;
-    }
-	
-    private->width = *width;
-    private->height = *height;
-
-    /* This assumes the DRI2 buffer attachment tokens matches the
-     * __DRIbuffer tokens. */
-    j = 0;
-    for (i = 0; i < *out_count; i++) {
-	/* Do not send the real front buffer of a window to the client.
-	 */
-	if ((private->base.pDraw->type == DRAWABLE_WINDOW)
-	    && (buffers[i]->attachment == DRI2BufferFrontLeft)) {
-	    continue;
-	}
-
-	private->buffers[j].attachment = buffers[i]->attachment;
-	private->buffers[j].name = buffers[i]->name;
-	private->buffers[j].pitch = buffers[i]->pitch;
-	private->buffers[j].cpp = buffers[i]->cpp;
-	private->buffers[j].flags = buffers[i]->flags;
-	j++;
-    }
-
-    *out_count = j;
-    return private->buffers;
-}
-
-static __DRIbuffer *
-dri2GetBuffersWithFormat(__DRIdrawable *driDrawable,
-			 int *width, int *height,
-			 unsigned int *attachments, int count,
-			 int *out_count, void *loaderPrivate)
-{
-    __GLXDRIdrawable *private = loaderPrivate;
-    DRI2BufferPtr *buffers;
-    int i;
-    int j = 0;
-
-    buffers = DRI2GetBuffersWithFormat(private->base.pDraw,
-				       width, height, attachments, count,
-				       out_count);
-    if (*out_count > MAX_DRAWABLE_BUFFERS) {
-	*out_count = 0;
-	return NULL;
-    }
-
-    private->width = *width;
-    private->height = *height;
-
-    /* This assumes the DRI2 buffer attachment tokens matches the
-     * __DRIbuffer tokens. */
-    for (i = 0; i < *out_count; i++) {
-	/* Do not send the real front buffer of a window to the client.
-	 */
-	if ((private->base.pDraw->type == DRAWABLE_WINDOW)
-	    && (buffers[i]->attachment == DRI2BufferFrontLeft)) {
-	    continue;
-	}
-
-	private->buffers[j].attachment = buffers[i]->attachment;
-	private->buffers[j].name = buffers[i]->name;
-	private->buffers[j].pitch = buffers[i]->pitch;
-	private->buffers[j].cpp = buffers[i]->cpp;
-	private->buffers[j].flags = buffers[i]->flags;
-	j++;
-    }
-
-    *out_count = j;
-    return private->buffers;
-}
-
-static void 
-dri2FlushFrontBuffer(__DRIdrawable *driDrawable, void *loaderPrivate)
-{
-    (void) driDrawable;
-    __glXDRIdrawableWaitGL((__GLXdrawable *) loaderPrivate);
-}
-
-static const __DRIdri2LoaderExtension loaderExtension = {
-    { __DRI_DRI2_LOADER, __DRI_DRI2_LOADER_VERSION },
-    dri2GetBuffers,
-    dri2FlushFrontBuffer,
-    dri2GetBuffersWithFormat,
-};
-
-static const __DRIextension *loader_extensions[] = {
-    &systemTimeExtension.base,
-    &loaderExtension.base,
-    NULL
-};
-
-static const char dri_driver_path[] = DRI_DRIVER_PATH;
-
-static Bool
-glxDRIEnterVT (int index, int flags)
-{
-    __GLXDRIscreen *screen = (__GLXDRIscreen *) 
-	glxGetScreen(screenInfo.screens[index]);
-
-    LogMessage(X_INFO, "AIGLX: Resuming AIGLX clients after VT switch\n");
-
-    if (!(*screen->enterVT) (index, flags))
-	return FALSE;
-    
-    glxResumeClients();
-
-    return TRUE;
-}
-
-static void
-glxDRILeaveVT (int index, int flags)
-{
-    __GLXDRIscreen *screen = (__GLXDRIscreen *)
-	glxGetScreen(screenInfo.screens[index]);
-
-    LogMessage(X_INFO, "AIGLX: Suspending AIGLX clients for VT switch\n");
-
-    glxSuspendClients();
-
-    return (*screen->leaveVT) (index, flags);
-}
-
-static void
-initializeExtensions(__GLXDRIscreen *screen)
-{
-    ScreenPtr pScreen = screen->base.pScreen;
-    const __DRIextension **extensions;
-    int i;
-
-    extensions = screen->core->getExtensions(screen->driScreen);
-
-    __glXEnableExtension(screen->glx_enable_bits,
-			 "GLX_MESA_copy_sub_buffer");
-    LogMessage(X_INFO, "AIGLX: enabled GLX_MESA_copy_sub_buffer\n");
-
-    __glXEnableExtension(screen->glx_enable_bits, "GLX_INTEL_swap_event");
-    LogMessage(X_INFO, "AIGLX: enabled GLX_INTEL_swap_event\n");
-
-    if (DRI2HasSwapControl(pScreen)) {
-	__glXEnableExtension(screen->glx_enable_bits,
-			     "GLX_SGI_swap_control");
-	__glXEnableExtension(screen->glx_enable_bits,
-			     "GLX_MESA_swap_control");
-	LogMessage(X_INFO, "AIGLX: enabled GLX_SGI_swap_control and GLX_MESA_swap_control\n");
-    }
-
-    for (i = 0; extensions[i]; i++) {
-#ifdef __DRI_READ_DRAWABLE
-	if (strcmp(extensions[i]->name, __DRI_READ_DRAWABLE) == 0) {
-	    __glXEnableExtension(screen->glx_enable_bits,
-				 "GLX_SGI_make_current_read");
-
-	    LogMessage(X_INFO, "AIGLX: enabled GLX_SGI_make_current_read\n");
-	}
-#endif
-
-#ifdef __DRI_TEX_BUFFER
-	if (strcmp(extensions[i]->name, __DRI_TEX_BUFFER) == 0) {
-	    screen->texBuffer =
-		(const __DRItexBufferExtension *) extensions[i];
-	    /* GLX_EXT_texture_from_pixmap is always enabled. */
-	    LogMessage(X_INFO, "AIGLX: GLX_EXT_texture_from_pixmap backed by buffer objects\n");
-	}
-#endif
-
-#ifdef __DRI2_FLUSH
-	if (strcmp(extensions[i]->name, __DRI2_FLUSH) == 0 &&
-	    extensions[i]->version >= __DRI2_FLUSH_VERSION) {
-		screen->flush = (__DRI2flushExtension *) extensions[i];
-	}
-#endif
-
-	/* Ignore unknown extensions */
-    }
-}
-
-static __GLXscreen *
-__glXDRIscreenProbe(ScreenPtr pScreen)
-{
-    const char *driverName, *deviceName;
-    __GLXDRIscreen *screen;
-    char filename[128];
-    size_t buffer_size;
-    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
-    const __DRIextension **extensions;
-    const __DRIconfig **driConfigs;
-    int i;
-
-    screen = xcalloc(1, sizeof *screen);
-    if (screen == NULL)
-	return NULL;
-
-    if (!xf86LoaderCheckSymbol("DRI2Connect") ||
-	!DRI2Connect(pScreen, DRI2DriverDRI,
-		     &screen->fd, &driverName, &deviceName)) {
-	LogMessage(X_INFO,
-		   "AIGLX: Screen %d is not DRI2 capable\n", pScreen->myNum);
-	return NULL;
-    }
-
-    screen->base.destroy        = __glXDRIscreenDestroy;
-    screen->base.createContext  = __glXDRIscreenCreateContext;
-    screen->base.createDrawable = __glXDRIscreenCreateDrawable;
-    screen->base.swapInterval   = __glXDRIdrawableSwapInterval;
-    screen->base.pScreen       = pScreen;
-
-    __glXInitExtensionEnableBits(screen->glx_enable_bits);
-
-    snprintf(filename, sizeof filename,
-	     "%s/%s_dri.so", dri_driver_path, driverName);
-
-    screen->driver = dlopen(filename, RTLD_LAZY | RTLD_LOCAL);
-    if (screen->driver == NULL) {
-	LogMessage(X_ERROR, "AIGLX error: dlopen of %s failed (%s)\n",
-		   filename, dlerror());
-        goto handle_error;
-    }
-
-    extensions = dlsym(screen->driver, __DRI_DRIVER_EXTENSIONS);
-    if (extensions == NULL) {
-	LogMessage(X_ERROR, "AIGLX error: %s exports no extensions (%s)\n",
-		   driverName, dlerror());
-	goto handle_error;
-    }
-    
-    for (i = 0; extensions[i]; i++) {
-        if (strcmp(extensions[i]->name, __DRI_CORE) == 0 &&
-	    extensions[i]->version >= __DRI_CORE_VERSION) {
-		screen->core = (const __DRIcoreExtension *) extensions[i];
-	}
-        if (strcmp(extensions[i]->name, __DRI_DRI2) == 0 &&
-	    extensions[i]->version >= __DRI_DRI2_VERSION) {
-		screen->dri2 = (const __DRIdri2Extension *) extensions[i];
-	}
-    }
-
-    if (screen->core == NULL || screen->dri2 == NULL) {
-	LogMessage(X_ERROR, "AIGLX error: %s exports no DRI extension\n",
-		   driverName);
-	goto handle_error;
-    }
-
-    screen->driScreen =
-	(*screen->dri2->createNewScreen)(pScreen->myNum,
-					 screen->fd,
-					 loader_extensions,
-					 &driConfigs,
-					 screen);
-
-    if (screen->driScreen == NULL) {
-	LogMessage(X_ERROR,
-		   "AIGLX error: Calling driver entry point failed\n");
-	goto handle_error;
-    }
-
-    initializeExtensions(screen);
-
-    screen->base.fbconfigs = glxConvertConfigs(screen->core, driConfigs,
-					       GLX_WINDOW_BIT |
-					       GLX_PIXMAP_BIT |
-					       GLX_PBUFFER_BIT);
-
-    __glXScreenInit(&screen->base, pScreen);
-
-    /* The first call simply determines the length of the extension string.
-     * This allows us to allocate some memory to hold the extension string,
-     * but it requires that we call __glXGetExtensionString a second time.
-     */
-    buffer_size = __glXGetExtensionString(screen->glx_enable_bits, NULL);
-    if (buffer_size > 0) {
-	if (screen->base.GLXextensions != NULL) {
-	    xfree(screen->base.GLXextensions);
-	}
-
-	screen->base.GLXextensions = xnfalloc(buffer_size);
-	(void) __glXGetExtensionString(screen->glx_enable_bits, 
-				       screen->base.GLXextensions);
-    }
-
-    /* We're going to assume (perhaps incorrectly?) that all DRI2-enabled
-     * drivers support the required extensions for GLX 1.4.  The extensions
-     * we're assuming are:
-     *
-     *    - GLX_SGI_make_current_read (1.3)
-     *    - GLX_SGIX_fbconfig (1.3)
-     *    - GLX_SGIX_pbuffer (1.3)
-     *    - GLX_ARB_multisample (1.4)
-     */
-    screen->base.GLXmajor = 1;
-    screen->base.GLXminor = 4;
-    
-    screen->enterVT = pScrn->EnterVT;
-    pScrn->EnterVT = glxDRIEnterVT; 
-    screen->leaveVT = pScrn->LeaveVT;
-    pScrn->LeaveVT = glxDRILeaveVT;
-
-    LogMessage(X_INFO,
-	       "AIGLX: Loaded and initialized %s\n", filename);
-
-    return &screen->base;
-
- handle_error:
-    if (screen->driver)
-        dlclose(screen->driver);
-
-    xfree(screen);
-
-    LogMessage(X_ERROR, "AIGLX: reverting to software rendering\n");
-
-    return NULL;
-}
-
-_X_EXPORT __GLXprovider __glXDRI2Provider = {
-    __glXDRIscreenProbe,
-    "DRI2",
-    NULL
-};
+/*
+ * Copyright © 2007 Red Hat, Inc
+ *
+ * Permission to use, copy, modify, distribute, and sell this software
+ * and its documentation for any purpose is hereby granted without
+ * fee, provided that the above copyright notice appear in all copies
+ * and that both that copyright notice and this permission notice
+ * appear in supporting documentation, and that the name of Red Hat,
+ * Inc not be used in advertising or publicity pertaining to
+ * distribution of the software without specific, written prior
+ * permission.  Red Hat, Inc makes no representations about the
+ * suitability of this software for any purpose.  It is provided "as
+ * is" without express or implied warranty.
+ *
+ * RED HAT, INC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
+ * NO EVENT SHALL RED HAT, INC BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
+ * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <stdint.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <dlfcn.h>
+
+#include <drm.h>
+#include <GL/gl.h>
+#include <GL/internal/dri_interface.h>
+#include <GL/glxtokens.h>
+
+#include <windowstr.h>
+#include <os.h>
+
+#define _XF86DRI_SERVER_
+#include <xf86drm.h>
+#include <xf86.h>
+#include <dri2.h>
+
+#include "glxserver.h"
+#include "glxutil.h"
+#include "glxdricommon.h"
+
+#include "g_disptab.h"
+#include "glapitable.h"
+#include "glapi.h"
+#include "glthread.h"
+#include "dispatch.h"
+#include "extension_string.h"
+
+typedef struct __GLXDRIscreen   __GLXDRIscreen;
+typedef struct __GLXDRIcontext  __GLXDRIcontext;
+typedef struct __GLXDRIdrawable __GLXDRIdrawable;
+
+struct __GLXDRIscreen {
+    __GLXscreen		 base;
+    __DRIscreen		*driScreen;
+    void		*driver;
+    int			 fd;
+
+    xf86EnterVTProc	*enterVT;
+    xf86LeaveVTProc	*leaveVT;
+
+    const __DRIcoreExtension *core;
+    const __DRIdri2Extension *dri2;
+    const __DRI2flushExtension *flush;
+    const __DRIcopySubBufferExtension *copySubBuffer;
+    const __DRIswapControlExtension *swapControl;
+    const __DRItexBufferExtension *texBuffer;
+
+    unsigned char glx_enable_bits[__GLX_EXT_BYTES];
+};
+
+struct __GLXDRIcontext {
+    __GLXcontext	 base;
+    __DRIcontext	*driContext;
+};
+
+#define MAX_DRAWABLE_BUFFERS 5
+
+struct __GLXDRIdrawable {
+    __GLXdrawable	 base;
+    __DRIdrawable	*driDrawable;
+    __GLXDRIscreen	*screen;
+
+    /* Dimensions as last reported by DRI2GetBuffers. */
+    int width;
+    int height;
+    __DRIbuffer buffers[MAX_DRAWABLE_BUFFERS];
+    int count;
+};
+
+static void
+__glXDRIdrawableDestroy(__GLXdrawable *drawable)
+{
+    __GLXDRIdrawable *private = (__GLXDRIdrawable *) drawable;
+    const __DRIcoreExtension *core = private->screen->core;
+    
+    (*core->destroyDrawable)(private->driDrawable);
+
+    __glXDrawableRelease(drawable);
+
+    xfree(private);
+}
+
+static void
+__glXDRIdrawableCopySubBuffer(__GLXdrawable *drawable,
+			       int x, int y, int w, int h)
+{
+    __GLXDRIdrawable *private = (__GLXDRIdrawable *) drawable;
+    BoxRec box;
+    RegionRec region;
+
+    box.x1 = x;
+    box.y1 = private->height - y - h;
+    box.x2 = x + w;
+    box.y2 = private->height - y;
+    REGION_INIT(drawable->pDraw->pScreen, &region, &box, 0);
+
+    DRI2CopyRegion(drawable->pDraw, &region,
+		   DRI2BufferFrontLeft, DRI2BufferBackLeft);
+}
+
+static void
+__glXDRIdrawableWaitX(__GLXdrawable *drawable)
+{
+    __GLXDRIdrawable *private = (__GLXDRIdrawable *) drawable;
+    BoxRec box;
+    RegionRec region;
+
+    box.x1 = 0;
+    box.y1 = 0;
+    box.x2 = private->width;
+    box.y2 = private->height;
+    REGION_INIT(drawable->pDraw->pScreen, &region, &box, 0);
+
+    DRI2CopyRegion(drawable->pDraw, &region,
+		   DRI2BufferFakeFrontLeft, DRI2BufferFrontLeft);
+}
+
+static void
+__glXDRIdrawableWaitGL(__GLXdrawable *drawable)
+{
+    __GLXDRIdrawable *private = (__GLXDRIdrawable *) drawable;
+    BoxRec box;
+    RegionRec region;
+
+    box.x1 = 0;
+    box.y1 = 0;
+    box.x2 = private->width;
+    box.y2 = private->height;
+    REGION_INIT(drawable->pDraw->pScreen, &region, &box, 0);
+
+    DRI2CopyRegion(drawable->pDraw, &region,
+		   DRI2BufferFrontLeft, DRI2BufferFakeFrontLeft);
+}
+
+static void
+__glXdriSwapEvent(ClientPtr client, void *data, int type, CARD64 ust,
+		  CARD64 msc, CARD64 sbc)
+{
+    __GLXdrawable *drawable = data;
+    xGLXBufferSwapComplete wire;
+
+    if (!(drawable->eventMask & GLX_BUFFER_SWAP_COMPLETE_INTEL_MASK))
+	return;
+
+    wire.type = __glXEventBase + GLX_BufferSwapComplete;
+    switch (type) {
+    case DRI2_EXCHANGE_COMPLETE:
+	wire.event_type = GLX_EXCHANGE_COMPLETE_INTEL;
+	break;
+    case DRI2_BLIT_COMPLETE:
+	wire.event_type = GLX_BLIT_COMPLETE_INTEL;
+	break;
+    case DRI2_FLIP_COMPLETE:
+	wire.event_type = GLX_FLIP_COMPLETE_INTEL;
+	break;
+    default:
+	/* unknown swap completion type */
+	break;
+    }
+    wire.sequenceNumber = client->sequence;
+    wire.drawable = drawable->drawId;
+    wire.ust_hi = ust >> 32;
+    wire.ust_lo = ust & 0xffffffff;
+    wire.msc_hi = msc >> 32;
+    wire.msc_lo = msc & 0xffffffff;
+    wire.sbc_hi = sbc >> 32;
+    wire.sbc_lo = sbc & 0xffffffff;
+
+    WriteEventsToClient(client, 1, (xEvent *) &wire);
+}
+
+/*
+ * Copy or flip back to front, honoring the swap interval if possible.
+ *
+ * If the kernel supports it, we request an event for the frame when the
+ * swap should happen, then perform the copy when we receive it.
+ */
+static GLboolean
+__glXDRIdrawableSwapBuffers(ClientPtr client, __GLXdrawable *drawable)
+{
+    __GLXDRIdrawable *priv = (__GLXDRIdrawable *) drawable;
+    __GLXDRIscreen *screen = priv->screen;
+    CARD64 unused;
+
+#if __DRI2_FLUSH_VERSION >= 3
+    if (screen->flush) {
+	(*screen->flush->flush)(priv->driDrawable);
+	(*screen->flush->invalidate)(priv->driDrawable);
+    }
+#else
+    if (screen->flush)
+	(*screen->flush->flushInvalidate)(priv->driDrawable);
+#endif
+
+    if (DRI2SwapBuffers(client, drawable->pDraw, 0, 0, 0, &unused,
+			__glXdriSwapEvent, drawable->pDraw) != Success)
+	return FALSE;
+
+    return TRUE;
+}
+
+static int
+__glXDRIdrawableSwapInterval(__GLXdrawable *drawable, int interval)
+{
+    if (interval <= 0) /* || interval > BIGNUM? */
+	return GLX_BAD_VALUE;
+
+    DRI2SwapInterval(drawable->pDraw, interval);
+
+    return 0;
+}
+
+static void
+__glXDRIcontextDestroy(__GLXcontext *baseContext)
+{
+    __GLXDRIcontext *context = (__GLXDRIcontext *) baseContext;
+    __GLXDRIscreen *screen = (__GLXDRIscreen *) context->base.pGlxScreen;
+
+    (*screen->core->destroyContext)(context->driContext);
+    __glXContextDestroy(&context->base);
+    xfree(context);
+}
+
+static int
+__glXDRIcontextMakeCurrent(__GLXcontext *baseContext)
+{
+    __GLXDRIcontext *context = (__GLXDRIcontext *) baseContext;
+    __GLXDRIdrawable *draw = (__GLXDRIdrawable *) baseContext->drawPriv;
+    __GLXDRIdrawable *read = (__GLXDRIdrawable *) baseContext->readPriv;
+    __GLXDRIscreen *screen = (__GLXDRIscreen *) context->base.pGlxScreen;
+
+    return (*screen->core->bindContext)(context->driContext,
+					draw->driDrawable,
+					read->driDrawable);
+}					      
+
+static int
+__glXDRIcontextLoseCurrent(__GLXcontext *baseContext)
+{
+    __GLXDRIcontext *context = (__GLXDRIcontext *) baseContext;
+    __GLXDRIscreen *screen = (__GLXDRIscreen *) context->base.pGlxScreen;
+
+    return (*screen->core->unbindContext)(context->driContext);
+}
+
+static int
+__glXDRIcontextCopy(__GLXcontext *baseDst, __GLXcontext *baseSrc,
+		    unsigned long mask)
+{
+    __GLXDRIcontext *dst = (__GLXDRIcontext *) baseDst;
+    __GLXDRIcontext *src = (__GLXDRIcontext *) baseSrc;
+    __GLXDRIscreen *screen = (__GLXDRIscreen *) dst->base.pGlxScreen;
+
+    return (*screen->core->copyContext)(dst->driContext,
+					src->driContext, mask);
+}
+
+static int
+__glXDRIcontextForceCurrent(__GLXcontext *baseContext)
+{
+    __GLXDRIcontext *context = (__GLXDRIcontext *) baseContext;
+    __GLXDRIdrawable *draw = (__GLXDRIdrawable *) baseContext->drawPriv;
+    __GLXDRIdrawable *read = (__GLXDRIdrawable *) baseContext->readPriv;
+    __GLXDRIscreen *screen = (__GLXDRIscreen *) context->base.pGlxScreen;
+
+    return (*screen->core->bindContext)(context->driContext,
+					draw->driDrawable,
+					read->driDrawable);
+}
+
+static Bool
+__glXDRIcontextWait(__GLXcontext *baseContext,
+		    __GLXclientState *cl, int *error)
+{
+    if (DRI2WaitSwap(cl->client, baseContext->drawPriv->pDraw)) {
+	*error = cl->client->noClientException;
+	return TRUE;
+    }
+
+    return FALSE;
+}
+
+#ifdef __DRI_TEX_BUFFER
+
+static int
+__glXDRIbindTexImage(__GLXcontext *baseContext,
+		     int buffer,
+		     __GLXdrawable *glxPixmap)
+{
+    __GLXDRIdrawable *drawable = (__GLXDRIdrawable *) glxPixmap;
+    const __DRItexBufferExtension *texBuffer = drawable->screen->texBuffer;
+    __GLXDRIcontext *context = (__GLXDRIcontext *) baseContext;
+
+    if (texBuffer == NULL)
+        return Success;
+
+#if __DRI_TEX_BUFFER_VERSION >= 2
+    if (texBuffer->base.version >= 2 && texBuffer->setTexBuffer2 != NULL) {
+	(*texBuffer->setTexBuffer2)(context->driContext,
+				    glxPixmap->target,
+				    glxPixmap->format,
+				    drawable->driDrawable);
+    } else
+#endif
+    {
+	texBuffer->setTexBuffer(context->driContext,
+				glxPixmap->target,
+				drawable->driDrawable);
+    }
+
+    return Success;
+}
+
+static int
+__glXDRIreleaseTexImage(__GLXcontext *baseContext,
+			int buffer,
+			__GLXdrawable *pixmap)
+{
+    /* FIXME: Just unbind the texture? */
+    return Success;
+}
+
+#else
+
+static int
+__glXDRIbindTexImage(__GLXcontext *baseContext,
+		     int buffer,
+		     __GLXdrawable *glxPixmap)
+{
+    return Success;
+}
+
+static int
+__glXDRIreleaseTexImage(__GLXcontext *baseContext,
+			int buffer,
+			__GLXdrawable *pixmap)
+{
+    return Success;
+}
+
+#endif
+
+static __GLXtextureFromPixmap __glXDRItextureFromPixmap = {
+    __glXDRIbindTexImage,
+    __glXDRIreleaseTexImage
+};
+
+static void
+__glXDRIscreenDestroy(__GLXscreen *baseScreen)
+{
+    __GLXDRIscreen *screen = (__GLXDRIscreen *) baseScreen;
+
+    (*screen->core->destroyScreen)(screen->driScreen);
+
+    dlclose(screen->driver);
+
+    __glXScreenDestroy(baseScreen);
+
+    xfree(screen);
+}
+
+static __GLXcontext *
+__glXDRIscreenCreateContext(__GLXscreen *baseScreen,
+			    __GLXconfig *glxConfig,
+			    __GLXcontext *baseShareContext)
+{
+    __GLXDRIscreen *screen = (__GLXDRIscreen *) baseScreen;
+    __GLXDRIcontext *context, *shareContext;
+    __GLXDRIconfig *config = (__GLXDRIconfig *) glxConfig;
+    __DRIcontext *driShare;
+
+    shareContext = (__GLXDRIcontext *) baseShareContext;
+    if (shareContext)
+	driShare = shareContext->driContext;
+    else
+	driShare = NULL;
+
+    context = xcalloc(1, sizeof *context);
+    if (context == NULL)
+	return NULL;
+
+    context->base.destroy           = __glXDRIcontextDestroy;
+    context->base.makeCurrent       = __glXDRIcontextMakeCurrent;
+    context->base.loseCurrent       = __glXDRIcontextLoseCurrent;
+    context->base.copy              = __glXDRIcontextCopy;
+    context->base.forceCurrent      = __glXDRIcontextForceCurrent;
+    context->base.textureFromPixmap = &__glXDRItextureFromPixmap;
+    context->base.wait              = __glXDRIcontextWait;
+
+    context->driContext =
+	(*screen->dri2->createNewContext)(screen->driScreen,
+					  config->driConfig,
+					  driShare, context);
+    if (context->driContext == NULL) {
+	    xfree(context);
+        return NULL;
+    }
+
+    return &context->base;
+}
+
+static __GLXdrawable *
+__glXDRIscreenCreateDrawable(ClientPtr client,
+			     __GLXscreen *screen,
+			     DrawablePtr pDraw,
+			     XID drawId,
+			     int type,
+			     XID glxDrawId,
+			     __GLXconfig *glxConfig)
+{
+    __GLXDRIscreen *driScreen = (__GLXDRIscreen *) screen;
+    __GLXDRIconfig *config = (__GLXDRIconfig *) glxConfig;
+    __GLXDRIdrawable *private;
+
+    private = xcalloc(1, sizeof *private);
+    if (private == NULL)
+	return NULL;
+
+    private->screen = driScreen;
+    if (!__glXDrawableInit(&private->base, screen,
+			   pDraw, type, glxDrawId, glxConfig)) {
+        xfree(private);
+	return NULL;
+    }
+
+    private->base.destroy       = __glXDRIdrawableDestroy;
+    private->base.swapBuffers   = __glXDRIdrawableSwapBuffers;
+    private->base.copySubBuffer = __glXDRIdrawableCopySubBuffer;
+    private->base.waitGL	= __glXDRIdrawableWaitGL;
+    private->base.waitX		= __glXDRIdrawableWaitX;
+
+    if (DRI2CreateDrawable(client, pDraw, drawId)) {
+	    xfree(private);
+	    return NULL;
+    }
+
+    private->driDrawable =
+	(*driScreen->dri2->createNewDrawable)(driScreen->driScreen,
+					      config->driConfig, private);
+
+    return &private->base;
+}
+
+static __DRIbuffer *
+dri2GetBuffers(__DRIdrawable *driDrawable,
+	       int *width, int *height,
+	       unsigned int *attachments, int count,
+	       int *out_count, void *loaderPrivate)
+{
+    __GLXDRIdrawable *private = loaderPrivate;
+    DRI2BufferPtr *buffers;
+    int i;
+    int j;
+
+    buffers = DRI2GetBuffers(private->base.pDraw,
+			     width, height, attachments, count, out_count);
+    if (*out_count > MAX_DRAWABLE_BUFFERS) {
+	*out_count = 0;
+	return NULL;
+    }
+	
+    private->width = *width;
+    private->height = *height;
+
+    /* This assumes the DRI2 buffer attachment tokens matches the
+     * __DRIbuffer tokens. */
+    j = 0;
+    for (i = 0; i < *out_count; i++) {
+	/* Do not send the real front buffer of a window to the client.
+	 */
+	if ((private->base.pDraw->type == DRAWABLE_WINDOW)
+	    && (buffers[i]->attachment == DRI2BufferFrontLeft)) {
+	    continue;
+	}
+
+	private->buffers[j].attachment = buffers[i]->attachment;
+	private->buffers[j].name = buffers[i]->name;
+	private->buffers[j].pitch = buffers[i]->pitch;
+	private->buffers[j].cpp = buffers[i]->cpp;
+	private->buffers[j].flags = buffers[i]->flags;
+	j++;
+    }
+
+    *out_count = j;
+    return private->buffers;
+}
+
+static __DRIbuffer *
+dri2GetBuffersWithFormat(__DRIdrawable *driDrawable,
+			 int *width, int *height,
+			 unsigned int *attachments, int count,
+			 int *out_count, void *loaderPrivate)
+{
+    __GLXDRIdrawable *private = loaderPrivate;
+    DRI2BufferPtr *buffers;
+    int i;
+    int j = 0;
+
+    buffers = DRI2GetBuffersWithFormat(private->base.pDraw,
+				       width, height, attachments, count,
+				       out_count);
+    if (*out_count > MAX_DRAWABLE_BUFFERS) {
+	*out_count = 0;
+	return NULL;
+    }
+
+    private->width = *width;
+    private->height = *height;
+
+    /* This assumes the DRI2 buffer attachment tokens matches the
+     * __DRIbuffer tokens. */
+    for (i = 0; i < *out_count; i++) {
+	/* Do not send the real front buffer of a window to the client.
+	 */
+	if ((private->base.pDraw->type == DRAWABLE_WINDOW)
+	    && (buffers[i]->attachment == DRI2BufferFrontLeft)) {
+	    continue;
+	}
+
+	private->buffers[j].attachment = buffers[i]->attachment;
+	private->buffers[j].name = buffers[i]->name;
+	private->buffers[j].pitch = buffers[i]->pitch;
+	private->buffers[j].cpp = buffers[i]->cpp;
+	private->buffers[j].flags = buffers[i]->flags;
+	j++;
+    }
+
+    *out_count = j;
+    return private->buffers;
+}
+
+static void 
+dri2FlushFrontBuffer(__DRIdrawable *driDrawable, void *loaderPrivate)
+{
+    (void) driDrawable;
+    __glXDRIdrawableWaitGL((__GLXdrawable *) loaderPrivate);
+}
+
+static const __DRIdri2LoaderExtension loaderExtension = {
+    { __DRI_DRI2_LOADER, __DRI_DRI2_LOADER_VERSION },
+    dri2GetBuffers,
+    dri2FlushFrontBuffer,
+    dri2GetBuffersWithFormat,
+};
+
+static const __DRIextension *loader_extensions[] = {
+    &systemTimeExtension.base,
+    &loaderExtension.base,
+    NULL
+};
+
+static const char dri_driver_path[] = DRI_DRIVER_PATH;
+
+static Bool
+glxDRIEnterVT (int index, int flags)
+{
+    __GLXDRIscreen *screen = (__GLXDRIscreen *) 
+	glxGetScreen(screenInfo.screens[index]);
+
+    LogMessage(X_INFO, "AIGLX: Resuming AIGLX clients after VT switch\n");
+
+    if (!(*screen->enterVT) (index, flags))
+	return FALSE;
+    
+    glxResumeClients();
+
+    return TRUE;
+}
+
+static void
+glxDRILeaveVT (int index, int flags)
+{
+    __GLXDRIscreen *screen = (__GLXDRIscreen *)
+	glxGetScreen(screenInfo.screens[index]);
+
+    LogMessage(X_INFO, "AIGLX: Suspending AIGLX clients for VT switch\n");
+
+    glxSuspendClients();
+
+    return (*screen->leaveVT) (index, flags);
+}
+
+static void
+initializeExtensions(__GLXDRIscreen *screen)
+{
+    ScreenPtr pScreen = screen->base.pScreen;
+    const __DRIextension **extensions;
+    int i;
+
+    extensions = screen->core->getExtensions(screen->driScreen);
+
+    __glXEnableExtension(screen->glx_enable_bits,
+			 "GLX_MESA_copy_sub_buffer");
+    LogMessage(X_INFO, "AIGLX: enabled GLX_MESA_copy_sub_buffer\n");
+
+    __glXEnableExtension(screen->glx_enable_bits, "GLX_INTEL_swap_event");
+    LogMessage(X_INFO, "AIGLX: enabled GLX_INTEL_swap_event\n");
+
+    if (DRI2HasSwapControl(pScreen)) {
+	__glXEnableExtension(screen->glx_enable_bits,
+			     "GLX_SGI_swap_control");
+	__glXEnableExtension(screen->glx_enable_bits,
+			     "GLX_MESA_swap_control");
+	LogMessage(X_INFO, "AIGLX: enabled GLX_SGI_swap_control and GLX_MESA_swap_control\n");
+    }
+
+    for (i = 0; extensions[i]; i++) {
+#ifdef __DRI_READ_DRAWABLE
+	if (strcmp(extensions[i]->name, __DRI_READ_DRAWABLE) == 0) {
+	    __glXEnableExtension(screen->glx_enable_bits,
+				 "GLX_SGI_make_current_read");
+
+	    LogMessage(X_INFO, "AIGLX: enabled GLX_SGI_make_current_read\n");
+	}
+#endif
+
+#ifdef __DRI_TEX_BUFFER
+	if (strcmp(extensions[i]->name, __DRI_TEX_BUFFER) == 0) {
+	    screen->texBuffer =
+		(const __DRItexBufferExtension *) extensions[i];
+	    /* GLX_EXT_texture_from_pixmap is always enabled. */
+	    LogMessage(X_INFO, "AIGLX: GLX_EXT_texture_from_pixmap backed by buffer objects\n");
+	}
+#endif
+
+#ifdef __DRI2_FLUSH
+	if (strcmp(extensions[i]->name, __DRI2_FLUSH) == 0 &&
+	    extensions[i]->version >= 3) {
+		screen->flush = (__DRI2flushExtension *) extensions[i];
+	}
+#endif
+
+	/* Ignore unknown extensions */
+    }
+}
+
+static __GLXscreen *
+__glXDRIscreenProbe(ScreenPtr pScreen)
+{
+    const char *driverName, *deviceName;
+    __GLXDRIscreen *screen;
+    char filename[128];
+    size_t buffer_size;
+    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+    const __DRIextension **extensions;
+    const __DRIconfig **driConfigs;
+    int i;
+
+    screen = xcalloc(1, sizeof *screen);
+    if (screen == NULL)
+	return NULL;
+
+    if (!xf86LoaderCheckSymbol("DRI2Connect") ||
+	!DRI2Connect(pScreen, DRI2DriverDRI,
+		     &screen->fd, &driverName, &deviceName)) {
+	LogMessage(X_INFO,
+		   "AIGLX: Screen %d is not DRI2 capable\n", pScreen->myNum);
+	return NULL;
+    }
+
+    screen->base.destroy        = __glXDRIscreenDestroy;
+    screen->base.createContext  = __glXDRIscreenCreateContext;
+    screen->base.createDrawable = __glXDRIscreenCreateDrawable;
+    screen->base.swapInterval   = __glXDRIdrawableSwapInterval;
+    screen->base.pScreen       = pScreen;
+
+    __glXInitExtensionEnableBits(screen->glx_enable_bits);
+
+    snprintf(filename, sizeof filename,
+	     "%s/%s_dri.so", dri_driver_path, driverName);
+
+    screen->driver = dlopen(filename, RTLD_LAZY | RTLD_LOCAL);
+    if (screen->driver == NULL) {
+	LogMessage(X_ERROR, "AIGLX error: dlopen of %s failed (%s)\n",
+		   filename, dlerror());
+        goto handle_error;
+    }
+
+    extensions = dlsym(screen->driver, __DRI_DRIVER_EXTENSIONS);
+    if (extensions == NULL) {
+	LogMessage(X_ERROR, "AIGLX error: %s exports no extensions (%s)\n",
+		   driverName, dlerror());
+	goto handle_error;
+    }
+    
+    for (i = 0; extensions[i]; i++) {
+        if (strcmp(extensions[i]->name, __DRI_CORE) == 0 &&
+	    extensions[i]->version >= 1) {
+		screen->core = (const __DRIcoreExtension *) extensions[i];
+	}
+        if (strcmp(extensions[i]->name, __DRI_DRI2) == 0 &&
+	    extensions[i]->version >= 1) {
+		screen->dri2 = (const __DRIdri2Extension *) extensions[i];
+	}
+    }
+
+    if (screen->core == NULL || screen->dri2 == NULL) {
+	LogMessage(X_ERROR, "AIGLX error: %s exports no DRI extension\n",
+		   driverName);
+	goto handle_error;
+    }
+
+    screen->driScreen =
+	(*screen->dri2->createNewScreen)(pScreen->myNum,
+					 screen->fd,
+					 loader_extensions,
+					 &driConfigs,
+					 screen);
+
+    if (screen->driScreen == NULL) {
+	LogMessage(X_ERROR,
+		   "AIGLX error: Calling driver entry point failed\n");
+	goto handle_error;
+    }
+
+    initializeExtensions(screen);
+
+    screen->base.fbconfigs = glxConvertConfigs(screen->core, driConfigs,
+					       GLX_WINDOW_BIT |
+					       GLX_PIXMAP_BIT |
+					       GLX_PBUFFER_BIT);
+
+    __glXScreenInit(&screen->base, pScreen);
+
+    /* The first call simply determines the length of the extension string.
+     * This allows us to allocate some memory to hold the extension string,
+     * but it requires that we call __glXGetExtensionString a second time.
+     */
+    buffer_size = __glXGetExtensionString(screen->glx_enable_bits, NULL);
+    if (buffer_size > 0) {
+	if (screen->base.GLXextensions != NULL) {
+	    xfree(screen->base.GLXextensions);
+	}
+
+	screen->base.GLXextensions = xnfalloc(buffer_size);
+	(void) __glXGetExtensionString(screen->glx_enable_bits, 
+				       screen->base.GLXextensions);
+    }
+
+    /* We're going to assume (perhaps incorrectly?) that all DRI2-enabled
+     * drivers support the required extensions for GLX 1.4.  The extensions
+     * we're assuming are:
+     *
+     *    - GLX_SGI_make_current_read (1.3)
+     *    - GLX_SGIX_fbconfig (1.3)
+     *    - GLX_SGIX_pbuffer (1.3)
+     *    - GLX_ARB_multisample (1.4)
+     */
+    screen->base.GLXmajor = 1;
+    screen->base.GLXminor = 4;
+    
+    screen->enterVT = pScrn->EnterVT;
+    pScrn->EnterVT = glxDRIEnterVT; 
+    screen->leaveVT = pScrn->LeaveVT;
+    pScrn->LeaveVT = glxDRILeaveVT;
+
+    LogMessage(X_INFO,
+	       "AIGLX: Loaded and initialized %s\n", filename);
+
+    return &screen->base;
+
+ handle_error:
+    if (screen->driver)
+        dlclose(screen->driver);
+
+    xfree(screen);
+
+    LogMessage(X_ERROR, "AIGLX: reverting to software rendering\n");
+
+    return NULL;
+}
+
+_X_EXPORT __GLXprovider __glXDRI2Provider = {
+    __glXDRIscreenProbe,
+    "DRI2",
+    NULL
+};
diff --git a/xorg-server/glx/glxdriswrast.c b/xorg-server/glx/glxdriswrast.c
index 918383cf0..8ab3daa46 100644
--- a/xorg-server/glx/glxdriswrast.c
+++ b/xorg-server/glx/glxdriswrast.c
@@ -1,539 +1,541 @@
-/*
- * Copyright © 2008 George Sapountzis <gsap7@yahoo.gr>
- * Copyright © 2008 Red Hat, Inc
- *
- * Permission to use, copy, modify, distribute, and sell this software
- * and its documentation for any purpose is hereby granted without
- * fee, provided that the above copyright notice appear in all copies
- * and that both that copyright notice and this permission notice
- * appear in supporting documentation, and that the name of the
- * copyright holders not be used in advertising or publicity
- * pertaining to distribution of the software without specific,
- * written prior permission.  The copyright holders make no
- * representations about the suitability of this software for any
- * purpose.  It is provided "as is" without express or implied
- * warranty.
- *
- * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
- * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
- * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
- * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
- * SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <stdint.h>
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#include <sys/time.h>
-#include <dlfcn.h>
-
-#include <GL/gl.h>
-#include <GL/internal/dri_interface.h>
-#include <GL/glxtokens.h>
-
-#include "scrnintstr.h"
-#include "pixmapstr.h"
-#include "gcstruct.h"
-#include "os.h"
-
-#include "glxserver.h"
-#include "glxutil.h"
-#include "glxdricommon.h"
-
-#include "g_disptab.h"
-#include "glapitable.h"
-#include "glapi.h"
-#include "glthread.h"
-#include "dispatch.h"
-#include "extension_string.h"
-
-/* RTLD_LOCAL is not defined on Cygwin */
-#ifdef __CYGWIN__
-#ifndef RTLD_LOCAL
-#define RTLD_LOCAL 0
-#endif
-#endif
-
-typedef struct __GLXDRIscreen   __GLXDRIscreen;
-typedef struct __GLXDRIcontext  __GLXDRIcontext;
-typedef struct __GLXDRIdrawable __GLXDRIdrawable;
-
-struct __GLXDRIscreen {
-    __GLXscreen		 base;
-    __DRIscreen		*driScreen;
-    void		*driver;
-
-    const __DRIcoreExtension *core;
-    const __DRIswrastExtension *swrast;
-    const __DRIcopySubBufferExtension *copySubBuffer;
-    const __DRItexBufferExtension *texBuffer;
-};
-
-struct __GLXDRIcontext {
-    __GLXcontext	 base;
-    __DRIcontext	*driContext;
-};
-
-struct __GLXDRIdrawable {
-    __GLXdrawable	 base;
-    __DRIdrawable	*driDrawable;
-    __GLXDRIscreen	*screen;
-
-    GCPtr gc;		/* scratch GC for span drawing */
-    GCPtr swapgc;	/* GC for swapping the color buffers */
-};
-
-static void
-__glXDRIdrawableDestroy(__GLXdrawable *drawable)
-{
-    __GLXDRIdrawable *private = (__GLXDRIdrawable *) drawable;
-    const __DRIcoreExtension *core = private->screen->core;
-
-    (*core->destroyDrawable)(private->driDrawable);
-
-    FreeScratchGC(private->gc);
-    FreeScratchGC(private->swapgc);
-
-    __glXDrawableRelease(drawable);
-
-    xfree(private);
-}
-
-static GLboolean
-__glXDRIdrawableSwapBuffers(ClientPtr client, __GLXdrawable *drawable)
-{
-    __GLXDRIdrawable *private = (__GLXDRIdrawable *) drawable;
-    const __DRIcoreExtension *core = private->screen->core;
-
-    (*core->swapBuffers)(private->driDrawable);
-
-    return TRUE;
-}
-
-static void
-__glXDRIdrawableCopySubBuffer(__GLXdrawable *basePrivate,
-			       int x, int y, int w, int h)
-{
-    __GLXDRIdrawable *private = (__GLXDRIdrawable *) basePrivate;
-    const __DRIcopySubBufferExtension *copySubBuffer =
-	    private->screen->copySubBuffer;
-
-    if (copySubBuffer)
-	(*copySubBuffer->copySubBuffer)(private->driDrawable, x, y, w, h);
-}
-
-static void
-__glXDRIcontextDestroy(__GLXcontext *baseContext)
-{
-    __GLXDRIcontext *context = (__GLXDRIcontext *) baseContext;
-    __GLXDRIscreen *screen = (__GLXDRIscreen *) context->base.pGlxScreen;
-
-    (*screen->core->destroyContext)(context->driContext);
-    __glXContextDestroy(&context->base);
-    xfree(context);
-}
-
-static int
-__glXDRIcontextMakeCurrent(__GLXcontext *baseContext)
-{
-    __GLXDRIcontext *context = (__GLXDRIcontext *) baseContext;
-    __GLXDRIdrawable *draw = (__GLXDRIdrawable *) baseContext->drawPriv;
-    __GLXDRIdrawable *read = (__GLXDRIdrawable *) baseContext->readPriv;
-    __GLXDRIscreen *screen = (__GLXDRIscreen *) context->base.pGlxScreen;
-
-    return (*screen->core->bindContext)(context->driContext,
-					draw->driDrawable,
-					read->driDrawable);
-}
-
-static int
-__glXDRIcontextLoseCurrent(__GLXcontext *baseContext)
-{
-    __GLXDRIcontext *context = (__GLXDRIcontext *) baseContext;
-    __GLXDRIscreen *screen = (__GLXDRIscreen *) context->base.pGlxScreen;
-
-    return (*screen->core->unbindContext)(context->driContext);
-}
-
-static int
-__glXDRIcontextCopy(__GLXcontext *baseDst, __GLXcontext *baseSrc,
-		    unsigned long mask)
-{
-    __GLXDRIcontext *dst = (__GLXDRIcontext *) baseDst;
-    __GLXDRIcontext *src = (__GLXDRIcontext *) baseSrc;
-    __GLXDRIscreen *screen = (__GLXDRIscreen *) dst->base.pGlxScreen;
-
-    return (*screen->core->copyContext)(dst->driContext,
-					src->driContext, mask);
-}
-
-static int
-__glXDRIcontextForceCurrent(__GLXcontext *baseContext)
-{
-    __GLXDRIcontext *context = (__GLXDRIcontext *) baseContext;
-    __GLXDRIdrawable *draw = (__GLXDRIdrawable *) baseContext->drawPriv;
-    __GLXDRIdrawable *read = (__GLXDRIdrawable *) baseContext->readPriv;
-    __GLXDRIscreen *screen = (__GLXDRIscreen *) context->base.pGlxScreen;
-
-    return (*screen->core->bindContext)(context->driContext,
-					draw->driDrawable,
-					read->driDrawable);
-}
-
-#ifdef __DRI_TEX_BUFFER
-
-static int
-__glXDRIbindTexImage(__GLXcontext *baseContext,
-		     int buffer,
-		     __GLXdrawable *glxPixmap)
-{
-    __GLXDRIdrawable *drawable = (__GLXDRIdrawable *) glxPixmap;
-    const __DRItexBufferExtension *texBuffer = drawable->screen->texBuffer;
-    __GLXDRIcontext *context = (__GLXDRIcontext *) baseContext;
-
-    if (texBuffer == NULL)
-        return Success;
-
-    texBuffer->setTexBuffer(context->driContext,
-			    glxPixmap->target,
-			    drawable->driDrawable);
-
-    return Success;
-}
-
-static int
-__glXDRIreleaseTexImage(__GLXcontext *baseContext,
-			int buffer,
-			__GLXdrawable *pixmap)
-{
-    /* FIXME: Just unbind the texture? */
-    return Success;
-}
-
-#else
-
-static int
-__glXDRIbindTexImage(__GLXcontext *baseContext,
-		     int buffer,
-		     __GLXdrawable *glxPixmap)
-{
-    return Success;
-}
-
-static int
-__glXDRIreleaseTexImage(__GLXcontext *baseContext,
-			int buffer,
-			__GLXdrawable *pixmap)
-{
-    return Success;
-}
-
-#endif
-
-static __GLXtextureFromPixmap __glXDRItextureFromPixmap = {
-    __glXDRIbindTexImage,
-    __glXDRIreleaseTexImage
-};
-
-static void
-__glXDRIscreenDestroy(__GLXscreen *baseScreen)
-{
-    __GLXDRIscreen *screen = (__GLXDRIscreen *) baseScreen;
-
-    (*screen->core->destroyScreen)(screen->driScreen);
-
-    dlclose(screen->driver);
-
-    __glXScreenDestroy(baseScreen);
-
-    xfree(screen);
-}
-
-static __GLXcontext *
-__glXDRIscreenCreateContext(__GLXscreen *baseScreen,
-			    __GLXconfig *glxConfig,
-			    __GLXcontext *baseShareContext)
-{
-    __GLXDRIscreen *screen = (__GLXDRIscreen *) baseScreen;
-    __GLXDRIcontext *context, *shareContext;
-    __GLXDRIconfig *config = (__GLXDRIconfig *) glxConfig;
-    const __DRIcoreExtension *core = screen->core;
-    __DRIcontext *driShare;
-
-    shareContext = (__GLXDRIcontext *) baseShareContext;
-    if (shareContext)
-	driShare = shareContext->driContext;
-    else
-	driShare = NULL;
-
-    context = xcalloc(1, sizeof *context);
-    if (context == NULL)
-	return NULL;
-
-    context->base.destroy           = __glXDRIcontextDestroy;
-    context->base.makeCurrent       = __glXDRIcontextMakeCurrent;
-    context->base.loseCurrent       = __glXDRIcontextLoseCurrent;
-    context->base.copy              = __glXDRIcontextCopy;
-    context->base.forceCurrent      = __glXDRIcontextForceCurrent;
-    context->base.textureFromPixmap = &__glXDRItextureFromPixmap;
-
-    context->driContext =
-	(*core->createNewContext)(screen->driScreen,
-				  config->driConfig, driShare, context);
-
-    return &context->base;
-}
-
-static void
-glxChangeGC(GCPtr gc, BITS32 mask, CARD32 val)
-{
-    CARD32 v[1];
-    v[0] = val;
-    dixChangeGC(NullClient, gc, mask, v, NULL);
-}
-
-static __GLXdrawable *
-__glXDRIscreenCreateDrawable(__GLXscreen *screen,
-			     DrawablePtr pDraw,
-			     int type,
-			     XID drawId,
-			     __GLXconfig *glxConfig)
-{
-    __GLXDRIscreen *driScreen = (__GLXDRIscreen *) screen;
-    __GLXDRIconfig *config = (__GLXDRIconfig *) glxConfig;
-    __GLXDRIdrawable *private;
-
-    ScreenPtr pScreen = driScreen->base.pScreen;
-
-    private = xcalloc(1, sizeof *private);
-    if (private == NULL)
-	return NULL;
-
-    private->screen = driScreen;
-    if (!__glXDrawableInit(&private->base, screen,
-			   pDraw, type, drawId, glxConfig)) {
-        xfree(private);
-	return NULL;
-    }
-
-    private->base.destroy       = __glXDRIdrawableDestroy;
-    private->base.swapBuffers   = __glXDRIdrawableSwapBuffers;
-    private->base.copySubBuffer = __glXDRIdrawableCopySubBuffer;
-
-    private->gc = CreateScratchGC(pScreen, pDraw->depth);
-    private->swapgc = CreateScratchGC(pScreen, pDraw->depth);
-
-    glxChangeGC(private->gc, GCFunction, GXcopy);
-    glxChangeGC(private->swapgc, GCFunction, GXcopy);
-    glxChangeGC(private->swapgc, GCGraphicsExposures, FALSE);
-
-    private->driDrawable =
-	(*driScreen->swrast->createNewDrawable)(driScreen->driScreen,
-						config->driConfig,
-						private);
-
-    return &private->base;
-}
-
-static void
-swrastGetDrawableInfo(__DRIdrawable *draw,
-		      int *x, int *y, int *w, int *h,
-		      void *loaderPrivate)
-{
-    __GLXDRIdrawable *drawable = loaderPrivate;
-    DrawablePtr pDraw = drawable->base.pDraw;
-
-    *x = pDraw->x;
-    *y = pDraw->x;
-    *w = pDraw->width;
-    *h = pDraw->height;
-}
-
-static void
-swrastPutImage(__DRIdrawable *draw, int op,
-	     int x, int y, int w, int h, char *data,
-	     void *loaderPrivate)
-{
-    __GLXDRIdrawable *drawable = loaderPrivate;
-    DrawablePtr pDraw = drawable->base.pDraw;
-    GCPtr gc;
-
-    switch (op) {
-    case __DRI_SWRAST_IMAGE_OP_DRAW:
-	gc = drawable->gc;
-	break;
-    case __DRI_SWRAST_IMAGE_OP_SWAP:
-	gc = drawable->swapgc;
-	break;
-    default:
-	return;
-    }
-
-    ValidateGC(pDraw, gc);
-
-    gc->ops->PutImage(pDraw, gc, pDraw->depth,
-		      x, y, w, h, 0, ZPixmap, data);
-}
-
-static void
-swrastGetImage(__DRIdrawable *draw,
-	     int x, int y, int w, int h, char *data,
-	     void *loaderPrivate)
-{
-    __GLXDRIdrawable *drawable = loaderPrivate;
-    DrawablePtr pDraw = drawable->base.pDraw;
-    ScreenPtr pScreen = pDraw->pScreen;
-
-    pScreen->GetImage(pDraw, x, y, w, h, ZPixmap, ~0L, data);
-}
-
-static const __DRIswrastLoaderExtension swrastLoaderExtension = {
-    { __DRI_SWRAST_LOADER, __DRI_SWRAST_LOADER_VERSION },
-    swrastGetDrawableInfo,
-    swrastPutImage,
-    swrastGetImage
-};
-
-static const __DRIextension *loader_extensions[] = {
-    &systemTimeExtension.base,
-    &swrastLoaderExtension.base,
-    NULL
-};
-
-static void
-initializeExtensions(__GLXDRIscreen *screen)
-{
-    const __DRIextension **extensions;
-    int i;
-
-    extensions = screen->core->getExtensions(screen->driScreen);
-
-    for (i = 0; extensions[i]; i++) {
-#ifdef __DRI_COPY_SUB_BUFFER
-	if (strcmp(extensions[i]->name, __DRI_COPY_SUB_BUFFER) == 0) {
-	    screen->copySubBuffer =
-		(const __DRIcopySubBufferExtension *) extensions[i];
-	    /* GLX_MESA_copy_sub_buffer is always enabled. */
-	}
-#endif
-
-#ifdef __DRI_TEX_BUFFER
-	if (strcmp(extensions[i]->name, __DRI_TEX_BUFFER) == 0) {
-	    screen->texBuffer =
-		(const __DRItexBufferExtension *) extensions[i];
-	    /* GLX_EXT_texture_from_pixmap is always enabled. */
-	}
-#endif
-	/* Ignore unknown extensions */
-    }
-}
-
-static const char dri_driver_path[] = DRI_DRIVER_PATH;
-
-static __GLXscreen *
-__glXDRIscreenProbe(ScreenPtr pScreen)
-{
-    const char *driverName = "swrast";
-    __GLXDRIscreen *screen;
-    char filename[128];
-    const __DRIextension **extensions;
-    const __DRIconfig **driConfigs;
-    int i;
-
-    screen = xcalloc(1, sizeof *screen);
-    if (screen == NULL)
-	return NULL;
-
-    screen->base.destroy        = __glXDRIscreenDestroy;
-    screen->base.createContext  = __glXDRIscreenCreateContext;
-    screen->base.createDrawable = __glXDRIscreenCreateDrawable;
-    screen->base.swapInterval   = NULL;
-    screen->base.pScreen       = pScreen;
-
-    snprintf(filename, sizeof filename,
-	     "%s/%s_dri.so", dri_driver_path, driverName);
-
-    screen->driver = dlopen(filename, RTLD_LAZY | RTLD_LOCAL);
-    if (screen->driver == NULL) {
-	LogMessage(X_ERROR, "AIGLX error: dlopen of %s failed (%s)\n",
-		   filename, dlerror());
-        goto handle_error;
-    }
-
-    extensions = dlsym(screen->driver, __DRI_DRIVER_EXTENSIONS);
-    if (extensions == NULL) {
-	LogMessage(X_ERROR, "AIGLX error: %s exports no extensions (%s)\n",
-		   driverName, dlerror());
-	goto handle_error;
-    }
-
-    for (i = 0; extensions[i]; i++) {
-        if (strcmp(extensions[i]->name, __DRI_CORE) == 0 &&
-	    extensions[i]->version >= __DRI_CORE_VERSION) {
-		screen->core = (const __DRIcoreExtension *) extensions[i];
-	}
-        if (strcmp(extensions[i]->name, __DRI_SWRAST) == 0 &&
-	    extensions[i]->version >= __DRI_SWRAST_VERSION) {
-		screen->swrast = (const __DRIswrastExtension *) extensions[i];
-	}
-    }
-
-    if (screen->core == NULL || screen->swrast == NULL) {
-	LogMessage(X_ERROR, "AIGLX error: %s exports no DRI extension\n",
-		   driverName);
-	goto handle_error;
-    }
-
-    screen->driScreen =
-	(*screen->swrast->createNewScreen)(pScreen->myNum,
-					   loader_extensions,
-					   &driConfigs,
-					   screen);
-
-    if (screen->driScreen == NULL) {
-	LogMessage(X_ERROR,
-		   "AIGLX error: Calling driver entry point failed\n");
-	goto handle_error;
-    }
-
-    initializeExtensions(screen);
-
-    screen->base.fbconfigs = glxConvertConfigs(screen->core, driConfigs,
-					       GLX_WINDOW_BIT |
-					       GLX_PIXMAP_BIT |
-					       GLX_PBUFFER_BIT);
-
-    __glXScreenInit(&screen->base, pScreen);
-
-    screen->base.GLXmajor = 1;
-    screen->base.GLXminor = 4;
-
-    LogMessage(X_INFO,
-	       "AIGLX: Loaded and initialized %s\n", filename);
-
-    return &screen->base;
-
- handle_error:
-    if (screen->driver)
-        dlclose(screen->driver);
-
-    xfree(screen);
-
-    LogMessage(X_ERROR, "GLX: could not load software renderer\n");
-
-    return NULL;
-}
-
-_X_EXPORT __GLXprovider __glXDRISWRastProvider = {
-    __glXDRIscreenProbe,
-    "DRISWRAST",
-    NULL
-};
+/*
+ * Copyright © 2008 George Sapountzis <gsap7@yahoo.gr>
+ * Copyright © 2008 Red Hat, Inc
+ *
+ * Permission to use, copy, modify, distribute, and sell this software
+ * and its documentation for any purpose is hereby granted without
+ * fee, provided that the above copyright notice appear in all copies
+ * and that both that copyright notice and this permission notice
+ * appear in supporting documentation, and that the name of the
+ * copyright holders not be used in advertising or publicity
+ * pertaining to distribution of the software without specific,
+ * written prior permission.  The copyright holders make no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
+ * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
+ * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
+ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <stdint.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <sys/time.h>
+#include <dlfcn.h>
+
+#include <GL/gl.h>
+#include <GL/internal/dri_interface.h>
+#include <GL/glxtokens.h>
+
+#include "scrnintstr.h"
+#include "pixmapstr.h"
+#include "gcstruct.h"
+#include "os.h"
+
+#include "glxserver.h"
+#include "glxutil.h"
+#include "glxdricommon.h"
+
+#include "g_disptab.h"
+#include "glapitable.h"
+#include "glapi.h"
+#include "glthread.h"
+#include "dispatch.h"
+#include "extension_string.h"
+
+/* RTLD_LOCAL is not defined on Cygwin */
+#ifdef __CYGWIN__
+#ifndef RTLD_LOCAL
+#define RTLD_LOCAL 0
+#endif
+#endif
+
+typedef struct __GLXDRIscreen   __GLXDRIscreen;
+typedef struct __GLXDRIcontext  __GLXDRIcontext;
+typedef struct __GLXDRIdrawable __GLXDRIdrawable;
+
+struct __GLXDRIscreen {
+    __GLXscreen		 base;
+    __DRIscreen		*driScreen;
+    void		*driver;
+
+    const __DRIcoreExtension *core;
+    const __DRIswrastExtension *swrast;
+    const __DRIcopySubBufferExtension *copySubBuffer;
+    const __DRItexBufferExtension *texBuffer;
+};
+
+struct __GLXDRIcontext {
+    __GLXcontext	 base;
+    __DRIcontext	*driContext;
+};
+
+struct __GLXDRIdrawable {
+    __GLXdrawable	 base;
+    __DRIdrawable	*driDrawable;
+    __GLXDRIscreen	*screen;
+
+    GCPtr gc;		/* scratch GC for span drawing */
+    GCPtr swapgc;	/* GC for swapping the color buffers */
+};
+
+static void
+__glXDRIdrawableDestroy(__GLXdrawable *drawable)
+{
+    __GLXDRIdrawable *private = (__GLXDRIdrawable *) drawable;
+    const __DRIcoreExtension *core = private->screen->core;
+
+    (*core->destroyDrawable)(private->driDrawable);
+
+    FreeScratchGC(private->gc);
+    FreeScratchGC(private->swapgc);
+
+    __glXDrawableRelease(drawable);
+
+    xfree(private);
+}
+
+static GLboolean
+__glXDRIdrawableSwapBuffers(ClientPtr client, __GLXdrawable *drawable)
+{
+    __GLXDRIdrawable *private = (__GLXDRIdrawable *) drawable;
+    const __DRIcoreExtension *core = private->screen->core;
+
+    (*core->swapBuffers)(private->driDrawable);
+
+    return TRUE;
+}
+
+static void
+__glXDRIdrawableCopySubBuffer(__GLXdrawable *basePrivate,
+			       int x, int y, int w, int h)
+{
+    __GLXDRIdrawable *private = (__GLXDRIdrawable *) basePrivate;
+    const __DRIcopySubBufferExtension *copySubBuffer =
+	    private->screen->copySubBuffer;
+
+    if (copySubBuffer)
+	(*copySubBuffer->copySubBuffer)(private->driDrawable, x, y, w, h);
+}
+
+static void
+__glXDRIcontextDestroy(__GLXcontext *baseContext)
+{
+    __GLXDRIcontext *context = (__GLXDRIcontext *) baseContext;
+    __GLXDRIscreen *screen = (__GLXDRIscreen *) context->base.pGlxScreen;
+
+    (*screen->core->destroyContext)(context->driContext);
+    __glXContextDestroy(&context->base);
+    xfree(context);
+}
+
+static int
+__glXDRIcontextMakeCurrent(__GLXcontext *baseContext)
+{
+    __GLXDRIcontext *context = (__GLXDRIcontext *) baseContext;
+    __GLXDRIdrawable *draw = (__GLXDRIdrawable *) baseContext->drawPriv;
+    __GLXDRIdrawable *read = (__GLXDRIdrawable *) baseContext->readPriv;
+    __GLXDRIscreen *screen = (__GLXDRIscreen *) context->base.pGlxScreen;
+
+    return (*screen->core->bindContext)(context->driContext,
+					draw->driDrawable,
+					read->driDrawable);
+}
+
+static int
+__glXDRIcontextLoseCurrent(__GLXcontext *baseContext)
+{
+    __GLXDRIcontext *context = (__GLXDRIcontext *) baseContext;
+    __GLXDRIscreen *screen = (__GLXDRIscreen *) context->base.pGlxScreen;
+
+    return (*screen->core->unbindContext)(context->driContext);
+}
+
+static int
+__glXDRIcontextCopy(__GLXcontext *baseDst, __GLXcontext *baseSrc,
+		    unsigned long mask)
+{
+    __GLXDRIcontext *dst = (__GLXDRIcontext *) baseDst;
+    __GLXDRIcontext *src = (__GLXDRIcontext *) baseSrc;
+    __GLXDRIscreen *screen = (__GLXDRIscreen *) dst->base.pGlxScreen;
+
+    return (*screen->core->copyContext)(dst->driContext,
+					src->driContext, mask);
+}
+
+static int
+__glXDRIcontextForceCurrent(__GLXcontext *baseContext)
+{
+    __GLXDRIcontext *context = (__GLXDRIcontext *) baseContext;
+    __GLXDRIdrawable *draw = (__GLXDRIdrawable *) baseContext->drawPriv;
+    __GLXDRIdrawable *read = (__GLXDRIdrawable *) baseContext->readPriv;
+    __GLXDRIscreen *screen = (__GLXDRIscreen *) context->base.pGlxScreen;
+
+    return (*screen->core->bindContext)(context->driContext,
+					draw->driDrawable,
+					read->driDrawable);
+}
+
+#ifdef __DRI_TEX_BUFFER
+
+static int
+__glXDRIbindTexImage(__GLXcontext *baseContext,
+		     int buffer,
+		     __GLXdrawable *glxPixmap)
+{
+    __GLXDRIdrawable *drawable = (__GLXDRIdrawable *) glxPixmap;
+    const __DRItexBufferExtension *texBuffer = drawable->screen->texBuffer;
+    __GLXDRIcontext *context = (__GLXDRIcontext *) baseContext;
+
+    if (texBuffer == NULL)
+        return Success;
+
+    texBuffer->setTexBuffer(context->driContext,
+			    glxPixmap->target,
+			    drawable->driDrawable);
+
+    return Success;
+}
+
+static int
+__glXDRIreleaseTexImage(__GLXcontext *baseContext,
+			int buffer,
+			__GLXdrawable *pixmap)
+{
+    /* FIXME: Just unbind the texture? */
+    return Success;
+}
+
+#else
+
+static int
+__glXDRIbindTexImage(__GLXcontext *baseContext,
+		     int buffer,
+		     __GLXdrawable *glxPixmap)
+{
+    return Success;
+}
+
+static int
+__glXDRIreleaseTexImage(__GLXcontext *baseContext,
+			int buffer,
+			__GLXdrawable *pixmap)
+{
+    return Success;
+}
+
+#endif
+
+static __GLXtextureFromPixmap __glXDRItextureFromPixmap = {
+    __glXDRIbindTexImage,
+    __glXDRIreleaseTexImage
+};
+
+static void
+__glXDRIscreenDestroy(__GLXscreen *baseScreen)
+{
+    __GLXDRIscreen *screen = (__GLXDRIscreen *) baseScreen;
+
+    (*screen->core->destroyScreen)(screen->driScreen);
+
+    dlclose(screen->driver);
+
+    __glXScreenDestroy(baseScreen);
+
+    xfree(screen);
+}
+
+static __GLXcontext *
+__glXDRIscreenCreateContext(__GLXscreen *baseScreen,
+			    __GLXconfig *glxConfig,
+			    __GLXcontext *baseShareContext)
+{
+    __GLXDRIscreen *screen = (__GLXDRIscreen *) baseScreen;
+    __GLXDRIcontext *context, *shareContext;
+    __GLXDRIconfig *config = (__GLXDRIconfig *) glxConfig;
+    const __DRIcoreExtension *core = screen->core;
+    __DRIcontext *driShare;
+
+    shareContext = (__GLXDRIcontext *) baseShareContext;
+    if (shareContext)
+	driShare = shareContext->driContext;
+    else
+	driShare = NULL;
+
+    context = xcalloc(1, sizeof *context);
+    if (context == NULL)
+	return NULL;
+
+    context->base.destroy           = __glXDRIcontextDestroy;
+    context->base.makeCurrent       = __glXDRIcontextMakeCurrent;
+    context->base.loseCurrent       = __glXDRIcontextLoseCurrent;
+    context->base.copy              = __glXDRIcontextCopy;
+    context->base.forceCurrent      = __glXDRIcontextForceCurrent;
+    context->base.textureFromPixmap = &__glXDRItextureFromPixmap;
+
+    context->driContext =
+	(*core->createNewContext)(screen->driScreen,
+				  config->driConfig, driShare, context);
+
+    return &context->base;
+}
+
+static void
+glxChangeGC(GCPtr gc, BITS32 mask, CARD32 val)
+{
+    CARD32 v[1];
+    v[0] = val;
+    dixChangeGC(NullClient, gc, mask, v, NULL);
+}
+
+static __GLXdrawable *
+__glXDRIscreenCreateDrawable(ClientPtr client,
+			     __GLXscreen *screen,
+			     DrawablePtr pDraw,
+			     XID drawId,
+			     int type,
+			     XID glxDrawId,
+			     __GLXconfig *glxConfig)
+{
+    __GLXDRIscreen *driScreen = (__GLXDRIscreen *) screen;
+    __GLXDRIconfig *config = (__GLXDRIconfig *) glxConfig;
+    __GLXDRIdrawable *private;
+
+    ScreenPtr pScreen = driScreen->base.pScreen;
+
+    private = xcalloc(1, sizeof *private);
+    if (private == NULL)
+	return NULL;
+
+    private->screen = driScreen;
+    if (!__glXDrawableInit(&private->base, screen,
+			   pDraw, type, glxDrawId, glxConfig)) {
+        xfree(private);
+	return NULL;
+    }
+
+    private->base.destroy       = __glXDRIdrawableDestroy;
+    private->base.swapBuffers   = __glXDRIdrawableSwapBuffers;
+    private->base.copySubBuffer = __glXDRIdrawableCopySubBuffer;
+
+    private->gc = CreateScratchGC(pScreen, pDraw->depth);
+    private->swapgc = CreateScratchGC(pScreen, pDraw->depth);
+
+    glxChangeGC(private->gc, GCFunction, GXcopy);
+    glxChangeGC(private->swapgc, GCFunction, GXcopy);
+    glxChangeGC(private->swapgc, GCGraphicsExposures, FALSE);
+
+    private->driDrawable =
+	(*driScreen->swrast->createNewDrawable)(driScreen->driScreen,
+						config->driConfig,
+						private);
+
+    return &private->base;
+}
+
+static void
+swrastGetDrawableInfo(__DRIdrawable *draw,
+		      int *x, int *y, int *w, int *h,
+		      void *loaderPrivate)
+{
+    __GLXDRIdrawable *drawable = loaderPrivate;
+    DrawablePtr pDraw = drawable->base.pDraw;
+
+    *x = pDraw->x;
+    *y = pDraw->x;
+    *w = pDraw->width;
+    *h = pDraw->height;
+}
+
+static void
+swrastPutImage(__DRIdrawable *draw, int op,
+	     int x, int y, int w, int h, char *data,
+	     void *loaderPrivate)
+{
+    __GLXDRIdrawable *drawable = loaderPrivate;
+    DrawablePtr pDraw = drawable->base.pDraw;
+    GCPtr gc;
+
+    switch (op) {
+    case __DRI_SWRAST_IMAGE_OP_DRAW:
+	gc = drawable->gc;
+	break;
+    case __DRI_SWRAST_IMAGE_OP_SWAP:
+	gc = drawable->swapgc;
+	break;
+    default:
+	return;
+    }
+
+    ValidateGC(pDraw, gc);
+
+    gc->ops->PutImage(pDraw, gc, pDraw->depth,
+		      x, y, w, h, 0, ZPixmap, data);
+}
+
+static void
+swrastGetImage(__DRIdrawable *draw,
+	     int x, int y, int w, int h, char *data,
+	     void *loaderPrivate)
+{
+    __GLXDRIdrawable *drawable = loaderPrivate;
+    DrawablePtr pDraw = drawable->base.pDraw;
+    ScreenPtr pScreen = pDraw->pScreen;
+
+    pScreen->GetImage(pDraw, x, y, w, h, ZPixmap, ~0L, data);
+}
+
+static const __DRIswrastLoaderExtension swrastLoaderExtension = {
+    { __DRI_SWRAST_LOADER, __DRI_SWRAST_LOADER_VERSION },
+    swrastGetDrawableInfo,
+    swrastPutImage,
+    swrastGetImage
+};
+
+static const __DRIextension *loader_extensions[] = {
+    &systemTimeExtension.base,
+    &swrastLoaderExtension.base,
+    NULL
+};
+
+static void
+initializeExtensions(__GLXDRIscreen *screen)
+{
+    const __DRIextension **extensions;
+    int i;
+
+    extensions = screen->core->getExtensions(screen->driScreen);
+
+    for (i = 0; extensions[i]; i++) {
+#ifdef __DRI_COPY_SUB_BUFFER
+	if (strcmp(extensions[i]->name, __DRI_COPY_SUB_BUFFER) == 0) {
+	    screen->copySubBuffer =
+		(const __DRIcopySubBufferExtension *) extensions[i];
+	    /* GLX_MESA_copy_sub_buffer is always enabled. */
+	}
+#endif
+
+#ifdef __DRI_TEX_BUFFER
+	if (strcmp(extensions[i]->name, __DRI_TEX_BUFFER) == 0) {
+	    screen->texBuffer =
+		(const __DRItexBufferExtension *) extensions[i];
+	    /* GLX_EXT_texture_from_pixmap is always enabled. */
+	}
+#endif
+	/* Ignore unknown extensions */
+    }
+}
+
+static const char dri_driver_path[] = DRI_DRIVER_PATH;
+
+static __GLXscreen *
+__glXDRIscreenProbe(ScreenPtr pScreen)
+{
+    const char *driverName = "swrast";
+    __GLXDRIscreen *screen;
+    char filename[128];
+    const __DRIextension **extensions;
+    const __DRIconfig **driConfigs;
+    int i;
+
+    screen = xcalloc(1, sizeof *screen);
+    if (screen == NULL)
+	return NULL;
+
+    screen->base.destroy        = __glXDRIscreenDestroy;
+    screen->base.createContext  = __glXDRIscreenCreateContext;
+    screen->base.createDrawable = __glXDRIscreenCreateDrawable;
+    screen->base.swapInterval   = NULL;
+    screen->base.pScreen       = pScreen;
+
+    snprintf(filename, sizeof filename,
+	     "%s/%s_dri.so", dri_driver_path, driverName);
+
+    screen->driver = dlopen(filename, RTLD_LAZY | RTLD_LOCAL);
+    if (screen->driver == NULL) {
+	LogMessage(X_ERROR, "AIGLX error: dlopen of %s failed (%s)\n",
+		   filename, dlerror());
+        goto handle_error;
+    }
+
+    extensions = dlsym(screen->driver, __DRI_DRIVER_EXTENSIONS);
+    if (extensions == NULL) {
+	LogMessage(X_ERROR, "AIGLX error: %s exports no extensions (%s)\n",
+		   driverName, dlerror());
+	goto handle_error;
+    }
+
+    for (i = 0; extensions[i]; i++) {
+        if (strcmp(extensions[i]->name, __DRI_CORE) == 0 &&
+	    extensions[i]->version >= __DRI_CORE_VERSION) {
+		screen->core = (const __DRIcoreExtension *) extensions[i];
+	}
+        if (strcmp(extensions[i]->name, __DRI_SWRAST) == 0 &&
+	    extensions[i]->version >= __DRI_SWRAST_VERSION) {
+		screen->swrast = (const __DRIswrastExtension *) extensions[i];
+	}
+    }
+
+    if (screen->core == NULL || screen->swrast == NULL) {
+	LogMessage(X_ERROR, "AIGLX error: %s exports no DRI extension\n",
+		   driverName);
+	goto handle_error;
+    }
+
+    screen->driScreen =
+	(*screen->swrast->createNewScreen)(pScreen->myNum,
+					   loader_extensions,
+					   &driConfigs,
+					   screen);
+
+    if (screen->driScreen == NULL) {
+	LogMessage(X_ERROR,
+		   "AIGLX error: Calling driver entry point failed\n");
+	goto handle_error;
+    }
+
+    initializeExtensions(screen);
+
+    screen->base.fbconfigs = glxConvertConfigs(screen->core, driConfigs,
+					       GLX_WINDOW_BIT |
+					       GLX_PIXMAP_BIT |
+					       GLX_PBUFFER_BIT);
+
+    __glXScreenInit(&screen->base, pScreen);
+
+    screen->base.GLXmajor = 1;
+    screen->base.GLXminor = 4;
+
+    LogMessage(X_INFO,
+	       "AIGLX: Loaded and initialized %s\n", filename);
+
+    return &screen->base;
+
+ handle_error:
+    if (screen->driver)
+        dlclose(screen->driver);
+
+    xfree(screen);
+
+    LogMessage(X_ERROR, "GLX: could not load software renderer\n");
+
+    return NULL;
+}
+
+_X_EXPORT __GLXprovider __glXDRISWRastProvider = {
+    __glXDRIscreenProbe,
+    "DRISWRAST",
+    NULL
+};
diff --git a/xorg-server/glx/glxscreens.h b/xorg-server/glx/glxscreens.h
index d52099fc2..335d471b3 100644
--- a/xorg-server/glx/glxscreens.h
+++ b/xorg-server/glx/glxscreens.h
@@ -1,182 +1,184 @@
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#ifndef _GLX_screens_h_
-#define _GLX_screens_h_
-
-/*
- * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008)
- * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice including the dates of first publication and
- * either this permission notice or a reference to
- * http://oss.sgi.com/projects/FreeB/
- * shall be included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
- * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- * Except as contained in this notice, the name of Silicon Graphics, Inc.
- * shall not be used in advertising or otherwise to promote the sale, use or
- * other dealings in this Software without prior written authorization from
- * Silicon Graphics, Inc.
- */
-
-typedef struct {
-    void * (* queryHyperpipeNetworkFunc)(int, int *, int *);
-    void * (* queryHyperpipeConfigFunc)(int, int, int *, int *);
-    int    (* destroyHyperpipeConfigFunc)(int, int);
-    void * (* hyperpipeConfigFunc)(int, int, int *, int *, void *);
-} __GLXHyperpipeExtensionFuncs;
-
-typedef struct {
-    int    (* bindSwapBarrierFunc)(int, XID, int);
-    int    (* queryMaxSwapBarriersFunc)(int);
-} __GLXSwapBarrierExtensionFuncs;
-
-void __glXHyperpipeInit(int screen, __GLXHyperpipeExtensionFuncs *funcs);
-void __glXSwapBarrierInit(int screen, __GLXSwapBarrierExtensionFuncs *funcs);
-
-typedef struct __GLXconfig __GLXconfig;
-struct __GLXconfig {
-    __GLXconfig *next;
-    GLuint doubleBufferMode;
-    GLuint stereoMode;
-
-    GLint redBits, greenBits, blueBits, alphaBits;	/* bits per comp */
-    GLuint redMask, greenMask, blueMask, alphaMask;
-    GLint rgbBits;		/* total bits for rgb */
-    GLint indexBits;		/* total bits for colorindex */
-
-    GLint accumRedBits, accumGreenBits, accumBlueBits, accumAlphaBits;
-    GLint depthBits;
-    GLint stencilBits;
-
-    GLint numAuxBuffers;
-
-    GLint level;
-
-    GLint pixmapMode;
-
-    /* GLX */
-    GLint visualID;
-    GLint visualType;     /**< One of the GLX X visual types. (i.e., 
-			   * \c GLX_TRUE_COLOR, etc.)
-			   */
-
-    /* EXT_visual_rating / GLX 1.2 */
-    GLint visualRating;
-
-    /* EXT_visual_info / GLX 1.2 */
-    GLint transparentPixel;
-				/*    colors are floats scaled to ints */
-    GLint transparentRed, transparentGreen, transparentBlue, transparentAlpha;
-    GLint transparentIndex;
-
-    /* ARB_multisample / SGIS_multisample */
-    GLint sampleBuffers;
-    GLint samples;
-
-    /* SGIX_fbconfig / GLX 1.3 */
-    GLint drawableType;
-    GLint renderType;
-    GLint xRenderable;
-    GLint fbconfigID;
-
-    /* SGIX_pbuffer / GLX 1.3 */
-    GLint maxPbufferWidth;
-    GLint maxPbufferHeight;
-    GLint maxPbufferPixels;
-    GLint optimalPbufferWidth;   /* Only for SGIX_pbuffer. */
-    GLint optimalPbufferHeight;  /* Only for SGIX_pbuffer. */
-
-    /* SGIX_visual_select_group */
-    GLint visualSelectGroup;
-
-    /* OML_swap_method */
-    GLint swapMethod;
-
-    GLint screen;
-
-    /* EXT_texture_from_pixmap */
-    GLint bindToTextureRgb;
-    GLint bindToTextureRgba;
-    GLint bindToMipmapTexture;
-    GLint bindToTextureTargets;
-    GLint yInverted;
-};
-
-GLint glxConvertToXVisualType(int visualType);
-
-/*
-** Screen dependent data.  These methods are the interface between the DIX
-** and DDX layers of the GLX server extension.  The methods provide an
-** interface for context management on a screen.
-*/
-typedef struct __GLXscreen __GLXscreen;
-struct __GLXscreen {
-    void          (*destroy)       (__GLXscreen *screen);
-
-    __GLXcontext *(*createContext) (__GLXscreen *screen,
-				    __GLXconfig *modes,
-				    __GLXcontext *shareContext);
-
-    __GLXdrawable *(*createDrawable)(__GLXscreen *context,
-				     DrawablePtr pDraw,
-				     int type,
-				     XID drawId,
-				     __GLXconfig *modes);
-    int            (*swapInterval)  (__GLXdrawable *drawable,
-				     int interval);
-
-    __GLXHyperpipeExtensionFuncs *hyperpipeFuncs;
-    __GLXSwapBarrierExtensionFuncs *swapBarrierFuncs;
-
-    ScreenPtr pScreen;
-
-    /* Linked list of valid fbconfigs for this screen. */
-    __GLXconfig *fbconfigs;
-    int numFBConfigs;
-
-    /* Subset of fbconfigs that are exposed as GLX visuals. */
-    __GLXconfig **visuals;
-    GLint numVisuals;
-
-    char *GLextensions;
-
-    char *GLXvendor;
-    char *GLXversion;
-    char *GLXextensions;
-
-    /**
-     * \name GLX version supported by this screen.
-     *
-     * Since the GLX version advertised by the server is for the whole server,
-     * the GLX protocol code uses the minimum version supported on all screens.
-     */
-    /*@{*/
-    unsigned GLXmajor;
-    unsigned GLXminor;
-    /*@}*/
-
-    Bool (*CloseScreen)(int index, ScreenPtr pScreen);
-};
-
-
-void __glXScreenInit(__GLXscreen *screen, ScreenPtr pScreen);
-void __glXScreenDestroy(__GLXscreen *screen);
-
-#endif /* !__GLX_screens_h__ */
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#ifndef _GLX_screens_h_
+#define _GLX_screens_h_
+
+/*
+ * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008)
+ * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice including the dates of first publication and
+ * either this permission notice or a reference to
+ * http://oss.sgi.com/projects/FreeB/
+ * shall be included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
+ * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * Except as contained in this notice, the name of Silicon Graphics, Inc.
+ * shall not be used in advertising or otherwise to promote the sale, use or
+ * other dealings in this Software without prior written authorization from
+ * Silicon Graphics, Inc.
+ */
+
+typedef struct {
+    void * (* queryHyperpipeNetworkFunc)(int, int *, int *);
+    void * (* queryHyperpipeConfigFunc)(int, int, int *, int *);
+    int    (* destroyHyperpipeConfigFunc)(int, int);
+    void * (* hyperpipeConfigFunc)(int, int, int *, int *, void *);
+} __GLXHyperpipeExtensionFuncs;
+
+typedef struct {
+    int    (* bindSwapBarrierFunc)(int, XID, int);
+    int    (* queryMaxSwapBarriersFunc)(int);
+} __GLXSwapBarrierExtensionFuncs;
+
+void __glXHyperpipeInit(int screen, __GLXHyperpipeExtensionFuncs *funcs);
+void __glXSwapBarrierInit(int screen, __GLXSwapBarrierExtensionFuncs *funcs);
+
+typedef struct __GLXconfig __GLXconfig;
+struct __GLXconfig {
+    __GLXconfig *next;
+    GLuint doubleBufferMode;
+    GLuint stereoMode;
+
+    GLint redBits, greenBits, blueBits, alphaBits;	/* bits per comp */
+    GLuint redMask, greenMask, blueMask, alphaMask;
+    GLint rgbBits;		/* total bits for rgb */
+    GLint indexBits;		/* total bits for colorindex */
+
+    GLint accumRedBits, accumGreenBits, accumBlueBits, accumAlphaBits;
+    GLint depthBits;
+    GLint stencilBits;
+
+    GLint numAuxBuffers;
+
+    GLint level;
+
+    GLint pixmapMode;
+
+    /* GLX */
+    GLint visualID;
+    GLint visualType;     /**< One of the GLX X visual types. (i.e., 
+			   * \c GLX_TRUE_COLOR, etc.)
+			   */
+
+    /* EXT_visual_rating / GLX 1.2 */
+    GLint visualRating;
+
+    /* EXT_visual_info / GLX 1.2 */
+    GLint transparentPixel;
+				/*    colors are floats scaled to ints */
+    GLint transparentRed, transparentGreen, transparentBlue, transparentAlpha;
+    GLint transparentIndex;
+
+    /* ARB_multisample / SGIS_multisample */
+    GLint sampleBuffers;
+    GLint samples;
+
+    /* SGIX_fbconfig / GLX 1.3 */
+    GLint drawableType;
+    GLint renderType;
+    GLint xRenderable;
+    GLint fbconfigID;
+
+    /* SGIX_pbuffer / GLX 1.3 */
+    GLint maxPbufferWidth;
+    GLint maxPbufferHeight;
+    GLint maxPbufferPixels;
+    GLint optimalPbufferWidth;   /* Only for SGIX_pbuffer. */
+    GLint optimalPbufferHeight;  /* Only for SGIX_pbuffer. */
+
+    /* SGIX_visual_select_group */
+    GLint visualSelectGroup;
+
+    /* OML_swap_method */
+    GLint swapMethod;
+
+    GLint screen;
+
+    /* EXT_texture_from_pixmap */
+    GLint bindToTextureRgb;
+    GLint bindToTextureRgba;
+    GLint bindToMipmapTexture;
+    GLint bindToTextureTargets;
+    GLint yInverted;
+};
+
+GLint glxConvertToXVisualType(int visualType);
+
+/*
+** Screen dependent data.  These methods are the interface between the DIX
+** and DDX layers of the GLX server extension.  The methods provide an
+** interface for context management on a screen.
+*/
+typedef struct __GLXscreen __GLXscreen;
+struct __GLXscreen {
+    void          (*destroy)       (__GLXscreen *screen);
+
+    __GLXcontext *(*createContext) (__GLXscreen *screen,
+				    __GLXconfig *modes,
+				    __GLXcontext *shareContext);
+
+    __GLXdrawable *(*createDrawable)(ClientPtr client,
+				     __GLXscreen *context,
+				     DrawablePtr pDraw,
+				     XID drawId,
+				     int type,
+				     XID glxDrawId,
+				     __GLXconfig *modes);
+    int            (*swapInterval)  (__GLXdrawable *drawable,
+				     int interval);
+
+    __GLXHyperpipeExtensionFuncs *hyperpipeFuncs;
+    __GLXSwapBarrierExtensionFuncs *swapBarrierFuncs;
+
+    ScreenPtr pScreen;
+
+    /* Linked list of valid fbconfigs for this screen. */
+    __GLXconfig *fbconfigs;
+    int numFBConfigs;
+
+    /* Subset of fbconfigs that are exposed as GLX visuals. */
+    __GLXconfig **visuals;
+    GLint numVisuals;
+
+    char *GLextensions;
+
+    char *GLXvendor;
+    char *GLXversion;
+    char *GLXextensions;
+
+    /**
+     * \name GLX version supported by this screen.
+     *
+     * Since the GLX version advertised by the server is for the whole server,
+     * the GLX protocol code uses the minimum version supported on all screens.
+     */
+    /*@{*/
+    unsigned GLXmajor;
+    unsigned GLXminor;
+    /*@}*/
+
+    Bool (*CloseScreen)(int index, ScreenPtr pScreen);
+};
+
+
+void __glXScreenInit(__GLXscreen *screen, ScreenPtr pScreen);
+void __glXScreenDestroy(__GLXscreen *screen);
+
+#endif /* !__GLX_screens_h__ */
diff --git a/xorg-server/hw/xfree86/dri2/dri2.c b/xorg-server/hw/xfree86/dri2/dri2.c
index 6c4dabc41..abcb96668 100644
--- a/xorg-server/hw/xfree86/dri2/dri2.c
+++ b/xorg-server/hw/xfree86/dri2/dri2.c
@@ -1,939 +1,1045 @@
-/*
- * Copyright © 2007, 2008 Red Hat, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Soft-
- * ware"), to deal in the Software without restriction, including without
- * limitation the rights to use, copy, modify, merge, publish, distribute,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, provided that the above copyright
- * notice(s) and this permission notice appear in all copies of the Soft-
- * ware and that both the above copyright notice(s) and this permission
- * notice appear in supporting documentation.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
- * ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY
- * RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN
- * THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSE-
- * QUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFOR-
- * MANCE OF THIS SOFTWARE.
- *
- * Except as contained in this notice, the name of a copyright holder shall
- * not be used in advertising or otherwise to promote the sale, use or
- * other dealings in this Software without prior written authorization of
- * the copyright holder.
- *
- * Authors:
- *   Kristian Høgsberg (krh@redhat.com)
- */
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#include <errno.h>
-#include <xf86drm.h>
-#include "xf86Module.h"
-#include "scrnintstr.h"
-#include "windowstr.h"
-#include "dixstruct.h"
-#include "dri2.h"
-#include "xf86VGAarbiter.h"
-
-#include "xf86.h"
-
-CARD8 dri2_major; /* version of DRI2 supported by DDX */
-CARD8 dri2_minor;
-
-static int           dri2ScreenPrivateKeyIndex;
-static DevPrivateKey dri2ScreenPrivateKey = &dri2ScreenPrivateKeyIndex;
-static RESTYPE       dri2DrawableRes;
-
-typedef struct _DRI2Screen *DRI2ScreenPtr;
-
-typedef struct _DRI2Drawable {
-    DRI2ScreenPtr        dri2_screen;
-    int			 width;
-    int			 height;
-    DRI2BufferPtr	*buffers;
-    int			 bufferCount;
-    unsigned int	 swapsPending;
-    ClientPtr		 blockedClient;
-    Bool		 blockedOnMsc;
-    int			 swap_interval;
-    CARD64		 swap_count;
-    int64_t		 target_sbc; /* -1 means no SBC wait outstanding */
-    CARD64		 last_swap_target; /* most recently queued swap target */
-    CARD64		 last_swap_msc; /* msc at completion of most recent swap */
-    CARD64		 last_swap_ust; /* ust at completion of most recent swap */
-    int			 swap_limit; /* for N-buffering */
-} DRI2DrawableRec, *DRI2DrawablePtr;
-
-typedef struct _DRI2Screen {
-    ScreenPtr			 screen;
-    unsigned int		 numDrivers;
-    const char			**driverNames;
-    const char			*deviceName;
-    int				 fd;
-    unsigned int		 lastSequence;
-
-    DRI2CreateBufferProcPtr	 CreateBuffer;
-    DRI2DestroyBufferProcPtr	 DestroyBuffer;
-    DRI2CopyRegionProcPtr	 CopyRegion;
-    DRI2ScheduleSwapProcPtr	 ScheduleSwap;
-    DRI2GetMSCProcPtr		 GetMSC;
-    DRI2ScheduleWaitMSCProcPtr	 ScheduleWaitMSC;
-
-    HandleExposuresProcPtr       HandleExposures;
-} DRI2ScreenRec;
-
-static DRI2ScreenPtr
-DRI2GetScreen(ScreenPtr pScreen)
-{
-    return dixLookupPrivate(&pScreen->devPrivates, dri2ScreenPrivateKey);
-}
-
-static DRI2DrawablePtr
-DRI2GetDrawable(DrawablePtr pDraw)
-{
-    DRI2DrawablePtr pPriv;
-    int rc;
-
-    rc = dixLookupResourceByType((pointer *) &pPriv, pDraw->id,
-				 dri2DrawableRes, NULL, DixReadAccess);
-    if (rc != Success)
-	return NULL;
-
-    return pPriv;
-}
-
-int
-DRI2CreateDrawable(DrawablePtr pDraw)
-{
-    DRI2ScreenPtr   ds = DRI2GetScreen(pDraw->pScreen);
-    DRI2DrawablePtr pPriv;
-    CARD64          ust;
-    int		    rc;
-
-    rc = dixLookupResourceByType((pointer *) &pPriv, pDraw->id,
-				 dri2DrawableRes, NULL, DixReadAccess);
-    if (rc == Success || rc != BadValue)
-	return rc;
-
-    pPriv = xalloc(sizeof *pPriv);
-    if (pPriv == NULL)
-	return BadAlloc;
-
-    pPriv->dri2_screen = ds;
-    pPriv->width = pDraw->width;
-    pPriv->height = pDraw->height;
-    pPriv->buffers = NULL;
-    pPriv->bufferCount = 0;
-    pPriv->swapsPending = 0;
-    pPriv->blockedClient = NULL;
-    pPriv->blockedOnMsc = FALSE;
-    pPriv->swap_count = 0;
-    pPriv->target_sbc = -1;
-    pPriv->swap_interval = 1;
-    /* Initialize last swap target from DDX if possible */
-    if (!ds->GetMSC || !(*ds->GetMSC)(pDraw, &ust, &pPriv->last_swap_target))
-	pPriv->last_swap_target = 0;
-
-    pPriv->swap_limit = 1; /* default to double buffering */
-    pPriv->last_swap_msc = 0;
-    pPriv->last_swap_ust = 0;
-
-    if (!AddResource(pDraw->id, dri2DrawableRes, pPriv))
-	return BadAlloc;
-
-    return Success;
-}
-
-static int DRI2DrawableGone(pointer p, XID id)
-{
-    DRI2DrawablePtr pPriv = p;
-    DRI2ScreenPtr   ds = pPriv->dri2_screen;
-    DrawablePtr     root;
-    int i;
-
-    root = &WindowTable[ds->screen->myNum]->drawable;
-    if (pPriv->buffers != NULL) {
-	for (i = 0; i < pPriv->bufferCount; i++)
-	    (*ds->DestroyBuffer)(root, pPriv->buffers[i]);
-
-	xfree(pPriv->buffers);
-    }
-
-    xfree(pPriv);
-
-    return Success;
-}
-
-static int
-find_attachment(DRI2DrawablePtr pPriv, unsigned attachment)
-{
-    int i;
-
-    if (pPriv->buffers == NULL) {
-	return -1;
-    }
-
-    for (i = 0; i < pPriv->bufferCount; i++) {
-	if ((pPriv->buffers[i] != NULL)
-	    && (pPriv->buffers[i]->attachment == attachment)) {
-	    return i;
-	}
-    }
-
-    return -1;
-}
-
-static Bool
-allocate_or_reuse_buffer(DrawablePtr pDraw, DRI2ScreenPtr ds,
-			 DRI2DrawablePtr pPriv,
-			 unsigned int attachment, unsigned int format,
-			 int dimensions_match, DRI2BufferPtr *buffer)
-{
-    int old_buf = find_attachment(pPriv, attachment);
-
-    if ((old_buf < 0)
-	|| !dimensions_match
-	|| (pPriv->buffers[old_buf]->format != format)) {
-	*buffer = (*ds->CreateBuffer)(pDraw, attachment, format);
-	return TRUE;
-
-    } else {
-	*buffer = pPriv->buffers[old_buf];
-	pPriv->buffers[old_buf] = NULL;
-	return FALSE;
-    }
-}
-
-static DRI2BufferPtr *
-do_get_buffers(DrawablePtr pDraw, int *width, int *height,
-	       unsigned int *attachments, int count, int *out_count,
-	       int has_format)
-{
-    DRI2ScreenPtr   ds = DRI2GetScreen(pDraw->pScreen);
-    DRI2DrawablePtr pPriv = DRI2GetDrawable(pDraw);
-    DRI2BufferPtr  *buffers;
-    int need_real_front = 0;
-    int need_fake_front = 0;
-    int have_fake_front = 0;
-    int front_format = 0;
-    int dimensions_match;
-    int buffers_changed = 0;
-    int i;
-
-    if (!pPriv) {
-	*width = pDraw->width;
-	*height = pDraw->height;
-	*out_count = 0;
-	return NULL;
-    }
-
-    dimensions_match = (pDraw->width == pPriv->width)
-	&& (pDraw->height == pPriv->height);
-
-    buffers = xalloc((count + 1) * sizeof(buffers[0]));
-
-    for (i = 0; i < count; i++) {
-	const unsigned attachment = *(attachments++);
-	const unsigned format = (has_format) ? *(attachments++) : 0;
-
-	if (allocate_or_reuse_buffer(pDraw, ds, pPriv, attachment,
-				     format, dimensions_match,
-				     &buffers[i]))
-		buffers_changed = 1;
-
-	/* If the drawable is a window and the front-buffer is requested,
-	 * silently add the fake front-buffer to the list of requested
-	 * attachments.  The counting logic in the loop accounts for the case
-	 * where the client requests both the fake and real front-buffer.
-	 */
-	if (attachment == DRI2BufferBackLeft) {
-	    need_real_front++;
-	    front_format = format;
-	}
-
-	if (attachment == DRI2BufferFrontLeft) {
-	    need_real_front--;
-	    front_format = format;
-
-	    if (pDraw->type == DRAWABLE_WINDOW) {
-		need_fake_front++;
-	    }
-	}
-
-	if (pDraw->type == DRAWABLE_WINDOW) {
-	    if (attachment == DRI2BufferFakeFrontLeft) {
-		need_fake_front--;
-		have_fake_front = 1;
-	    }
-	}
-    }
-
-    if (need_real_front > 0) {
-	if (allocate_or_reuse_buffer(pDraw, ds, pPriv, DRI2BufferFrontLeft,
-				     front_format, dimensions_match,
-				     &buffers[i++]))
-	    buffers_changed = 1;
-    }
-
-    if (need_fake_front > 0) {
-	if (allocate_or_reuse_buffer(pDraw, ds, pPriv, DRI2BufferFakeFrontLeft,
-				     front_format, dimensions_match,
-				     &buffers[i++]))
-	    buffers_changed = 1;
-
-	have_fake_front = 1;
-    }
-
-    *out_count = i;
-
-
-    if (pPriv->buffers != NULL) {
-	for (i = 0; i < pPriv->bufferCount; i++) {
-	    if (pPriv->buffers[i] != NULL) {
-		(*ds->DestroyBuffer)(pDraw, pPriv->buffers[i]);
-	    }
-	}
-
-	xfree(pPriv->buffers);
-    }
-
-    pPriv->buffers = buffers;
-    pPriv->bufferCount = *out_count;
-    pPriv->width = pDraw->width;
-    pPriv->height = pDraw->height;
-    *width = pPriv->width;
-    *height = pPriv->height;
-
-
-    /* If the client is getting a fake front-buffer, pre-fill it with the
-     * contents of the real front-buffer.  This ensures correct operation of
-     * applications that call glXWaitX before calling glDrawBuffer.
-     */
-    if (have_fake_front && buffers_changed) {
-	BoxRec box;
-	RegionRec region;
-
-	box.x1 = 0;
-	box.y1 = 0;
-	box.x2 = pPriv->width;
-	box.y2 = pPriv->height;
-	REGION_INIT(pDraw->pScreen, &region, &box, 0);
-
-	DRI2CopyRegion(pDraw, &region, DRI2BufferFakeFrontLeft,
-		       DRI2BufferFrontLeft);
-    }
-
-    return pPriv->buffers;
-}
-
-DRI2BufferPtr *
-DRI2GetBuffers(DrawablePtr pDraw, int *width, int *height,
-	       unsigned int *attachments, int count, int *out_count)
-{
-    return do_get_buffers(pDraw, width, height, attachments, count,
-			  out_count, FALSE);
-}
-
-DRI2BufferPtr *
-DRI2GetBuffersWithFormat(DrawablePtr pDraw, int *width, int *height,
-			 unsigned int *attachments, int count, int *out_count)
-{
-    return do_get_buffers(pDraw, width, height, attachments, count,
-			  out_count, TRUE);
-}
-
-/*
- * In the direct rendered case, we throttle the clients that have more
- * than their share of outstanding swaps (and thus busy buffers) when a
- * new GetBuffers request is received.  In the AIGLX case, we allow the
- * client to get the new buffers, but throttle when the next GLX request
- * comes in (see __glXDRIcontextWait()).
- */
-Bool
-DRI2ThrottleClient(ClientPtr client, DrawablePtr pDraw)
-{
-    DRI2DrawablePtr pPriv;
-
-    pPriv = DRI2GetDrawable(pDraw);
-    if (pPriv == NULL)
-	return FALSE;
-
-    /* Throttle to swap limit */
-    if ((pPriv->swapsPending >= pPriv->swap_limit) &&
-	!pPriv->blockedClient) {
-	ResetCurrentRequest(client);
-	client->sequence--;
-	IgnoreClient(client);
-	pPriv->blockedClient = client;
-	return TRUE;
-    }
-
-    return FALSE;
-}
-
-static void
-__DRI2BlockClient(ClientPtr client, DRI2DrawablePtr pPriv)
-{
-    if (pPriv->blockedClient == NULL) {
-	IgnoreClient(client);
-	pPriv->blockedClient = client;
-    }
-}
-
-void
-DRI2BlockClient(ClientPtr client, DrawablePtr pDraw)
-{
-    DRI2DrawablePtr pPriv;
-
-    pPriv = DRI2GetDrawable(pDraw);
-    if (pPriv == NULL)
-	return;
-
-    __DRI2BlockClient(client, pPriv);
-    pPriv->blockedOnMsc = TRUE;
-}
-
-int
-DRI2CopyRegion(DrawablePtr pDraw, RegionPtr pRegion,
-	       unsigned int dest, unsigned int src)
-{
-    DRI2ScreenPtr   ds = DRI2GetScreen(pDraw->pScreen);
-    DRI2DrawablePtr pPriv;
-    DRI2BufferPtr   pDestBuffer, pSrcBuffer;
-    int		    i;
-
-    pPriv = DRI2GetDrawable(pDraw);
-    if (pPriv == NULL)
-	return BadDrawable;
-
-    pDestBuffer = NULL;
-    pSrcBuffer = NULL;
-    for (i = 0; i < pPriv->bufferCount; i++)
-    {
-	if (pPriv->buffers[i]->attachment == dest)
-	    pDestBuffer = (DRI2BufferPtr) pPriv->buffers[i];
-	if (pPriv->buffers[i]->attachment == src)
-	    pSrcBuffer = (DRI2BufferPtr) pPriv->buffers[i];
-    }
-    if (pSrcBuffer == NULL || pDestBuffer == NULL)
-	return BadValue;
-
-    (*ds->CopyRegion)(pDraw, pRegion, pDestBuffer, pSrcBuffer);
-
-    return Success;
-}
-
-/* Can this drawable be page flipped? */
-Bool
-DRI2CanFlip(DrawablePtr pDraw)
-{
-    ScreenPtr pScreen = pDraw->pScreen;
-    WindowPtr pWin, pRoot;
-    PixmapPtr pWinPixmap, pRootPixmap;
-
-    if (pDraw->type == DRAWABLE_PIXMAP)
-	return TRUE;
-
-    pRoot = WindowTable[pScreen->myNum];
-    pRootPixmap = pScreen->GetWindowPixmap(pRoot);
-
-    pWin = (WindowPtr) pDraw;
-    pWinPixmap = pScreen->GetWindowPixmap(pWin);
-    if (pRootPixmap != pWinPixmap)
-	return FALSE;
-    if (!REGION_EQUAL(pScreen, &pWin->clipList, &pRoot->winSize))
-	return FALSE;
-
-    return TRUE;
-}
-
-/* Can we do a pixmap exchange instead of a blit? */
-Bool
-DRI2CanExchange(DrawablePtr pDraw)
-{
-    return FALSE;
-}
-
-void
-DRI2WaitMSCComplete(ClientPtr client, DrawablePtr pDraw, int frame,
-		    unsigned int tv_sec, unsigned int tv_usec)
-{
-    DRI2DrawablePtr pPriv;
-
-    pPriv = DRI2GetDrawable(pDraw);
-    if (pPriv == NULL)
-	return;
-
-    ProcDRI2WaitMSCReply(client, ((CARD64)tv_sec * 1000000) + tv_usec,
-			 frame, pPriv->swap_count);
-
-    if (pPriv->blockedClient)
-	AttendClient(pPriv->blockedClient);
-
-    pPriv->blockedClient = NULL;
-    pPriv->blockedOnMsc = FALSE;
-}
-
-static void
-DRI2WakeClient(ClientPtr client, DrawablePtr pDraw, int frame,
-	       unsigned int tv_sec, unsigned int tv_usec)
-{
-    ScreenPtr	    pScreen = pDraw->pScreen;
-    DRI2DrawablePtr pPriv;
-
-    pPriv = DRI2GetDrawable(pDraw);
-    if (pPriv == NULL) {
-        xf86DrvMsg(pScreen->myNum, X_ERROR,
-		   "[DRI2] %s: bad drawable\n", __func__);
-	return;
-    }
-
-    /*
-     * Swap completed.
-     * Wake the client iff:
-     *   - it was waiting on SBC
-     *   - was blocked due to GLX make current
-     *   - was blocked due to swap throttling
-     *   - is not blocked due to an MSC wait
-     */
-    if (pPriv->target_sbc != -1 &&
-	pPriv->target_sbc <= pPriv->swap_count) {
-	ProcDRI2WaitMSCReply(client, ((CARD64)tv_sec * 1000000) + tv_usec,
-			     frame, pPriv->swap_count);
-	pPriv->target_sbc = -1;
-
-	AttendClient(pPriv->blockedClient);
-	pPriv->blockedClient = NULL;
-    } else if (pPriv->target_sbc == -1 && !pPriv->blockedOnMsc) {
-	if (pPriv->blockedClient) {
-	    AttendClient(pPriv->blockedClient);
-	    pPriv->blockedClient = NULL;
-	}
-    }
-}
-
-void
-DRI2SwapComplete(ClientPtr client, DrawablePtr pDraw, int frame,
-		   unsigned int tv_sec, unsigned int tv_usec, int type,
-		   DRI2SwapEventPtr swap_complete, void *swap_data)
-{
-    ScreenPtr	    pScreen = pDraw->pScreen;
-    DRI2DrawablePtr pPriv;
-    CARD64          ust = 0;
-
-    pPriv = DRI2GetDrawable(pDraw);
-    if (pPriv == NULL) {
-        xf86DrvMsg(pScreen->myNum, X_ERROR,
-		   "[DRI2] %s: bad drawable\n", __func__);
-	return;
-    }
-
-    pPriv->swapsPending--;
-    pPriv->swap_count++;
-
-    ust = ((CARD64)tv_sec * 1000000) + tv_usec;
-    if (swap_complete)
-	swap_complete(client, swap_data, type, ust, frame, pPriv->swap_count);
-
-    pPriv->last_swap_msc = frame;
-    pPriv->last_swap_ust = ust;
-
-    DRI2WakeClient(client, pDraw, frame, tv_sec, tv_usec);
-}
-
-Bool
-DRI2WaitSwap(ClientPtr client, DrawablePtr pDrawable)
-{
-    DRI2DrawablePtr pPriv = DRI2GetDrawable(pDrawable);
-
-    /* If we're currently waiting for a swap on this drawable, reset
-     * the request and suspend the client.  We only support one
-     * blocked client per drawable. */
-    if ((pPriv->swapsPending) &&
-	pPriv->blockedClient == NULL) {
-	ResetCurrentRequest(client);
-	client->sequence--;
-	__DRI2BlockClient(client, pPriv);
-	return TRUE;
-    }
-
-    return FALSE;
-}
-
-int
-DRI2SwapBuffers(ClientPtr client, DrawablePtr pDraw, CARD64 target_msc,
-		CARD64 divisor, CARD64 remainder, CARD64 *swap_target,
-		DRI2SwapEventPtr func, void *data)
-{
-    ScreenPtr       pScreen = pDraw->pScreen;
-    DRI2ScreenPtr   ds = DRI2GetScreen(pDraw->pScreen);
-    DRI2DrawablePtr pPriv;
-    DRI2BufferPtr   pDestBuffer = NULL, pSrcBuffer = NULL;
-    int             ret, i;
-
-    pPriv = DRI2GetDrawable(pDraw);
-    if (pPriv == NULL) {
-        xf86DrvMsg(pScreen->myNum, X_ERROR,
-		   "[DRI2] %s: bad drawable\n", __func__);
-	return BadDrawable;
-    }
-
-    for (i = 0; i < pPriv->bufferCount; i++) {
-	if (pPriv->buffers[i]->attachment == DRI2BufferFrontLeft)
-	    pDestBuffer = (DRI2BufferPtr) pPriv->buffers[i];
-	if (pPriv->buffers[i]->attachment == DRI2BufferBackLeft)
-	    pSrcBuffer = (DRI2BufferPtr) pPriv->buffers[i];
-    }
-    if (pSrcBuffer == NULL || pDestBuffer == NULL) {
-        xf86DrvMsg(pScreen->myNum, X_ERROR,
-		   "[DRI2] %s: drawable has no back or front?\n", __func__);
-	return BadDrawable;
-    }
-
-    /* Old DDX or no swap interval, just blit */
-    if (!ds->ScheduleSwap || !pPriv->swap_interval) {
-	BoxRec box;
-	RegionRec region;
-
-	box.x1 = 0;
-	box.y1 = 0;
-	box.x2 = pDraw->width;
-	box.y2 = pDraw->height;
-	REGION_INIT(pScreen, &region, &box, 0);
-
-	pPriv->swapsPending++;
-
-	(*ds->CopyRegion)(pDraw, &region, pDestBuffer, pSrcBuffer);
-	DRI2SwapComplete(client, pDraw, target_msc, 0, 0, DRI2_BLIT_COMPLETE,
-			 func, data);
-	return Success;
-    }
-
-    /*
-     * In the simple glXSwapBuffers case, all params will be 0, and we just
-     * need to schedule a swap for the last swap target + the swap interval.
-     */
-    if (target_msc == 0 && divisor == 0 && remainder == 0) {
-	/*
-	 * Swap target for this swap is last swap target + swap interval since
-	 * we have to account for the current swap count, interval, and the
-	 * number of pending swaps.
-	 */
-	*swap_target = pPriv->last_swap_target + pPriv->swap_interval;
-    } else {
-	/* glXSwapBuffersMscOML could have a 0 target_msc, honor it */
-	*swap_target = target_msc;
-    }
-
-    pPriv->swapsPending++;
-    ret = (*ds->ScheduleSwap)(client, pDraw, pDestBuffer, pSrcBuffer,
-			      swap_target, divisor, remainder, func, data);
-    if (!ret) {
-	pPriv->swapsPending--; /* didn't schedule */
-        xf86DrvMsg(pScreen->myNum, X_ERROR,
-		   "[DRI2] %s: driver failed to schedule swap\n", __func__);
-	return BadDrawable;
-    }
-
-    pPriv->last_swap_target = *swap_target;
-
-    /* According to spec, return expected swapbuffers count SBC after this swap
-     * will complete.
-     */
-    *swap_target = pPriv->swap_count + pPriv->swapsPending;
-
-    return Success;
-}
-
-void
-DRI2SwapInterval(DrawablePtr pDrawable, int interval)
-{
-    ScreenPtr       pScreen = pDrawable->pScreen;
-    DRI2DrawablePtr pPriv = DRI2GetDrawable(pDrawable);
-
-    if (pPriv == NULL) {
-        xf86DrvMsg(pScreen->myNum, X_ERROR,
-		   "[DRI2] %s: bad drawable\n", __func__);
-	return;
-    }
-
-    /* fixme: check against arbitrary max? */
-    pPriv->swap_interval = interval;
-}
-
-int
-DRI2GetMSC(DrawablePtr pDraw, CARD64 *ust, CARD64 *msc, CARD64 *sbc)
-{
-    ScreenPtr pScreen = pDraw->pScreen;
-    DRI2ScreenPtr ds = DRI2GetScreen(pDraw->pScreen);
-    DRI2DrawablePtr pPriv;
-    Bool ret;
-
-    pPriv = DRI2GetDrawable(pDraw);
-    if (pPriv == NULL) {
-        xf86DrvMsg(pScreen->myNum, X_ERROR,
-		   "[DRI2] %s: bad drawable\n", __func__);
-	return BadDrawable;
-    }
-
-    if (!ds->GetMSC) {
-	*ust = 0;
-	*msc = 0;
-	*sbc = pPriv->swap_count;
-	return Success;
-    }
-
-    /*
-     * Spec needs to be updated to include unmapped or redirected
-     * drawables
-     */
-
-    ret = (*ds->GetMSC)(pDraw, ust, msc);
-    if (!ret)
-	return BadDrawable;
-
-    *sbc = pPriv->swap_count;
-
-    return Success;
-}
-
-int
-DRI2WaitMSC(ClientPtr client, DrawablePtr pDraw, CARD64 target_msc,
-	    CARD64 divisor, CARD64 remainder)
-{
-    DRI2ScreenPtr ds = DRI2GetScreen(pDraw->pScreen);
-    DRI2DrawablePtr pPriv;
-    Bool ret;
-
-    pPriv = DRI2GetDrawable(pDraw);
-    if (pPriv == NULL)
-	return BadDrawable;
-
-    /* Old DDX just completes immediately */
-    if (!ds->ScheduleWaitMSC) {
-	DRI2WaitMSCComplete(client, pDraw, target_msc, 0, 0);
-
-	return Success;
-    }
-
-    ret = (*ds->ScheduleWaitMSC)(client, pDraw, target_msc, divisor, remainder);
-    if (!ret)
-	return BadDrawable;
-
-    return Success;
-}
-
-int
-DRI2WaitSBC(ClientPtr client, DrawablePtr pDraw, CARD64 target_sbc,
-	    CARD64 *ust, CARD64 *msc, CARD64 *sbc)
-{
-    DRI2DrawablePtr pPriv;
-
-    pPriv = DRI2GetDrawable(pDraw);
-    if (pPriv == NULL)
-	return BadDrawable;
-
-    /* target_sbc == 0 means to block until all pending swaps are
-     * finished. Recalculate target_sbc to get that behaviour.
-     */
-    if (target_sbc == 0)
-        target_sbc = pPriv->swap_count + pPriv->swapsPending;
-
-    /* If current swap count already >= target_sbc,
-     * return immediately with (ust, msc, sbc) triplet of
-     * most recent completed swap.
-     */
-    if (pPriv->swap_count >= target_sbc) {
-        *sbc = pPriv->swap_count;
-        *msc = pPriv->last_swap_msc;
-        *ust = pPriv->last_swap_ust;
-        return Success;
-    }
-
-    pPriv->target_sbc = target_sbc;
-    __DRI2BlockClient(client, pPriv);
-
-    return Success;
-}
-
-Bool
-DRI2HasSwapControl(ScreenPtr pScreen)
-{
-    DRI2ScreenPtr ds = DRI2GetScreen(pScreen);
-
-    return (ds->ScheduleSwap && ds->GetMSC);
-}
-
-Bool
-DRI2Connect(ScreenPtr pScreen, unsigned int driverType, int *fd,
-	    const char **driverName, const char **deviceName)
-{
-    DRI2ScreenPtr ds = DRI2GetScreen(pScreen);
-
-    if (ds == NULL || driverType >= ds->numDrivers ||
-	    !ds->driverNames[driverType])
-	return FALSE;
-
-    *fd = ds->fd;
-    *driverName = ds->driverNames[driverType];
-    *deviceName = ds->deviceName;
-
-    return TRUE;
-}
-
-Bool
-DRI2Authenticate(ScreenPtr pScreen, drm_magic_t magic)
-{
-    DRI2ScreenPtr ds = DRI2GetScreen(pScreen);
-
-    if (ds == NULL || drmAuthMagic(ds->fd, magic))
-	return FALSE;
-
-    return TRUE;
-}
-
-Bool
-DRI2ScreenInit(ScreenPtr pScreen, DRI2InfoPtr info)
-{
-    DRI2ScreenPtr ds;
-    const char* driverTypeNames[] = {
-	"DRI", /* DRI2DriverDRI */
-	"VDPAU", /* DRI2DriverVDPAU */
-    };
-    unsigned int i;
-    CARD8 cur_minor;
-
-    if (info->version < 3)
-	return FALSE;
-
-    if (!xf86VGAarbiterAllowDRI(pScreen)) {
-        xf86DrvMsg(pScreen->myNum, X_WARNING,
-                  "[DRI2] Direct rendering is not supported when VGA arb is necessary for the device\n");
-        return FALSE;
-    }
-
-    ds = xcalloc(1, sizeof *ds);
-    if (!ds)
-	return FALSE;
-
-    ds->screen         = pScreen;
-    ds->fd	       = info->fd;
-    ds->deviceName     = info->deviceName;
-    dri2_major         = 1;
-
-    ds->CreateBuffer   = info->CreateBuffer;
-    ds->DestroyBuffer  = info->DestroyBuffer;
-    ds->CopyRegion     = info->CopyRegion;
-
-    if (info->version >= 4) {
-	ds->ScheduleSwap = info->ScheduleSwap;
-	ds->ScheduleWaitMSC = info->ScheduleWaitMSC;
-	ds->GetMSC = info->GetMSC;
-	cur_minor = 2;
-    } else {
-	cur_minor = 1;
-    }
-
-    /* Initialize minor if needed and set to minimum provied by DDX */
-    if (!dri2_minor || dri2_minor > cur_minor)
-	dri2_minor = cur_minor;
-
-    if (info->version == 3 || info->numDrivers == 0) {
-	/* Driver too old: use the old-style driverName field */
-	ds->numDrivers = 1;
-	ds->driverNames = xalloc(sizeof(*ds->driverNames));
-	if (!ds->driverNames) {
-	    xfree(ds);
-	    return FALSE;
-	}
-	ds->driverNames[0] = info->driverName;
-    } else {
-	ds->numDrivers = info->numDrivers;
-	ds->driverNames = xalloc(info->numDrivers * sizeof(*ds->driverNames));
-	if (!ds->driverNames) {
-	    xfree(ds);
-	    return FALSE;
-	}
-	memcpy(ds->driverNames, info->driverNames,
-	       info->numDrivers * sizeof(*ds->driverNames));
-    }
-
-    dixSetPrivate(&pScreen->devPrivates, dri2ScreenPrivateKey, ds);
-
-    xf86DrvMsg(pScreen->myNum, X_INFO, "[DRI2] Setup complete\n");
-    for (i = 0; i < sizeof(driverTypeNames) / sizeof(driverTypeNames[0]); i++) {
-	if (i < ds->numDrivers && ds->driverNames[i]) {
-	    xf86DrvMsg(pScreen->myNum, X_INFO, "[DRI2]   %s driver: %s\n",
-		       driverTypeNames[i], ds->driverNames[i]);
-	}
-    }
-
-    return TRUE;
-}
-
-void
-DRI2CloseScreen(ScreenPtr pScreen)
-{
-    DRI2ScreenPtr ds = DRI2GetScreen(pScreen);
-
-    xfree(ds->driverNames);
-    xfree(ds);
-    dixSetPrivate(&pScreen->devPrivates, dri2ScreenPrivateKey, NULL);
-}
-
-extern ExtensionModule dri2ExtensionModule;
-
-static pointer
-DRI2Setup(pointer module, pointer opts, int *errmaj, int *errmin)
-{
-    static Bool setupDone = FALSE;
-
-    dri2DrawableRes = CreateNewResourceType(DRI2DrawableGone, "DRI2Drawable");
-
-    if (!setupDone)
-    {
-	setupDone = TRUE;
-	LoadExtension(&dri2ExtensionModule, FALSE);
-    }
-    else
-    {
-	if (errmaj)
-	    *errmaj = LDR_ONCEONLY;
-    }
-
-    return (pointer) 1;
-}
-
-static XF86ModuleVersionInfo DRI2VersRec =
-{
-    "dri2",
-    MODULEVENDORSTRING,
-    MODINFOSTRING1,
-    MODINFOSTRING2,
-    XORG_VERSION_CURRENT,
-    1, 2, 0,
-    ABI_CLASS_EXTENSION,
-    ABI_EXTENSION_VERSION,
-    MOD_CLASS_NONE,
-    { 0, 0, 0, 0 }
-};
-
-_X_EXPORT XF86ModuleData dri2ModuleData = { &DRI2VersRec, DRI2Setup, NULL };
-
-void
-DRI2Version(int *major, int *minor)
-{
-    if (major != NULL)
-	*major = DRI2VersRec.majorversion;
-
-    if (minor != NULL)
-	*minor = DRI2VersRec.minorversion;
-}
+/*
+ * Copyright © 2007, 2008 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Soft-
+ * ware"), to deal in the Software without restriction, including without
+ * limitation the rights to use, copy, modify, merge, publish, distribute,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, provided that the above copyright
+ * notice(s) and this permission notice appear in all copies of the Soft-
+ * ware and that both the above copyright notice(s) and this permission
+ * notice appear in supporting documentation.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
+ * ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY
+ * RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN
+ * THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSE-
+ * QUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFOR-
+ * MANCE OF THIS SOFTWARE.
+ *
+ * Except as contained in this notice, the name of a copyright holder shall
+ * not be used in advertising or otherwise to promote the sale, use or
+ * other dealings in this Software without prior written authorization of
+ * the copyright holder.
+ *
+ * Authors:
+ *   Kristian Høgsberg (krh@redhat.com)
+ */
+
+#ifdef HAVE_XORG_CONFIG_H
+#include <xorg-config.h>
+#endif
+
+#include <errno.h>
+#include <xf86drm.h>
+#include "xf86Module.h"
+#include "list.h"
+#include "scrnintstr.h"
+#include "windowstr.h"
+#include "dixstruct.h"
+#include "dri2.h"
+#include "xf86VGAarbiter.h"
+
+#include "xf86.h"
+
+CARD8 dri2_major; /* version of DRI2 supported by DDX */
+CARD8 dri2_minor;
+
+static int           dri2ScreenPrivateKeyIndex;
+static DevPrivateKey dri2ScreenPrivateKey = &dri2ScreenPrivateKeyIndex;
+static int dri2WindowPrivateKeyIndex;
+static DevPrivateKey dri2WindowPrivateKey = &dri2WindowPrivateKeyIndex;
+static int dri2PixmapPrivateKeyIndex;
+static DevPrivateKey dri2PixmapPrivateKey = &dri2PixmapPrivateKeyIndex;
+static RESTYPE       dri2DrawableRes;
+
+typedef struct _DRI2Screen *DRI2ScreenPtr;
+
+typedef struct _DRI2Drawable {
+    DRI2ScreenPtr        dri2_screen;
+    DrawablePtr		 drawable;
+    struct list		 reference_list;
+    int			 width;
+    int			 height;
+    DRI2BufferPtr	*buffers;
+    int			 bufferCount;
+    unsigned int	 swapsPending;
+    ClientPtr		 blockedClient;
+    Bool		 blockedOnMsc;
+    int			 swap_interval;
+    CARD64		 swap_count;
+    int64_t		 target_sbc; /* -1 means no SBC wait outstanding */
+    CARD64		 last_swap_target; /* most recently queued swap target */
+    CARD64		 last_swap_msc; /* msc at completion of most recent swap */
+    CARD64		 last_swap_ust; /* ust at completion of most recent swap */
+    int			 swap_limit; /* for N-buffering */
+} DRI2DrawableRec, *DRI2DrawablePtr;
+
+typedef struct _DRI2Screen {
+    ScreenPtr			 screen;
+    int				 refcnt;
+    unsigned int		 numDrivers;
+    const char			**driverNames;
+    const char			*deviceName;
+    int				 fd;
+    unsigned int		 lastSequence;
+
+    DRI2CreateBufferProcPtr	 CreateBuffer;
+    DRI2DestroyBufferProcPtr	 DestroyBuffer;
+    DRI2CopyRegionProcPtr	 CopyRegion;
+    DRI2ScheduleSwapProcPtr	 ScheduleSwap;
+    DRI2GetMSCProcPtr		 GetMSC;
+    DRI2ScheduleWaitMSCProcPtr	 ScheduleWaitMSC;
+
+    HandleExposuresProcPtr       HandleExposures;
+} DRI2ScreenRec;
+
+static DRI2ScreenPtr
+DRI2GetScreen(ScreenPtr pScreen)
+{
+    return dixLookupPrivate(&pScreen->devPrivates, dri2ScreenPrivateKey);
+}
+
+static DRI2DrawablePtr
+DRI2GetDrawable(DrawablePtr pDraw)
+{
+    WindowPtr pWin;
+    PixmapPtr pPixmap;
+
+    if (pDraw->type == DRAWABLE_WINDOW) {
+	pWin = (WindowPtr) pDraw;
+	return dixLookupPrivate(&pWin->devPrivates, dri2WindowPrivateKey);
+    } else {
+	pPixmap = (PixmapPtr) pDraw;
+	return dixLookupPrivate(&pPixmap->devPrivates, dri2PixmapPrivateKey);
+    }
+}
+
+static DRI2DrawablePtr
+DRI2AllocateDrawable(DrawablePtr pDraw)
+{
+    DRI2ScreenPtr   ds = DRI2GetScreen(pDraw->pScreen);
+    DRI2DrawablePtr pPriv;
+    CARD64          ust;
+    WindowPtr pWin;
+    PixmapPtr pPixmap;
+
+    pPriv = xalloc(sizeof *pPriv);
+    if (pPriv == NULL)
+	return NULL;
+
+    pPriv->dri2_screen = ds;
+    pPriv->drawable = pDraw;
+    pPriv->width = pDraw->width;
+    pPriv->height = pDraw->height;
+    pPriv->buffers = NULL;
+    pPriv->bufferCount = 0;
+    pPriv->swapsPending = 0;
+    pPriv->blockedClient = NULL;
+    pPriv->blockedOnMsc = FALSE;
+    pPriv->swap_count = 0;
+    pPriv->target_sbc = -1;
+    pPriv->swap_interval = 1;
+    /* Initialize last swap target from DDX if possible */
+    if (!ds->GetMSC || !(*ds->GetMSC)(pDraw, &ust, &pPriv->last_swap_target))
+	pPriv->last_swap_target = 0;
+
+    pPriv->swap_limit = 1; /* default to double buffering */
+    pPriv->last_swap_msc = 0;
+    pPriv->last_swap_ust = 0;
+    list_init(&pPriv->reference_list);
+
+    if (pDraw->type == DRAWABLE_WINDOW) {
+	pWin = (WindowPtr) pDraw;
+	dixSetPrivate(&pWin->devPrivates, dri2WindowPrivateKey, pPriv);
+    } else {
+	pPixmap = (PixmapPtr) pDraw;
+	dixSetPrivate(&pPixmap->devPrivates, dri2PixmapPrivateKey, pPriv);
+    }
+
+    return pPriv;
+}
+
+typedef struct DRI2DrawableRefRec {
+    XID id;
+    XID dri2_id;
+    struct list link;
+} DRI2DrawableRefRec, *DRI2DrawableRefPtr;
+
+static DRI2DrawableRefPtr
+DRI2LookupDrawableRef(DRI2DrawablePtr pPriv, XID id)
+{
+    DRI2DrawableRefPtr ref;
+
+    list_for_each_entry(ref, &pPriv->reference_list, link) {
+	if (ref->id == id)
+	    return ref;
+    }
+    
+    return NULL;
+}
+
+static int
+DRI2AddDrawableRef(DRI2DrawablePtr pPriv, XID id, XID dri2_id)
+{
+    DRI2DrawableRefPtr ref;
+
+    ref = malloc(sizeof *ref);
+    if (ref == NULL)
+	return BadAlloc;
+	
+    if (!AddResource(dri2_id, dri2DrawableRes, pPriv))
+	return BadAlloc;
+    if (!DRI2LookupDrawableRef(pPriv, id))
+	if (!AddResource(id, dri2DrawableRes, pPriv))
+	    return BadAlloc;
+
+    ref->id = id;
+    ref->dri2_id = dri2_id; 
+    list_add(&ref->link, &pPriv->reference_list);
+
+    return Success;
+}
+
+int
+DRI2CreateDrawable(ClientPtr client, DrawablePtr pDraw, XID id)
+{
+    DRI2DrawablePtr pPriv;
+    XID dri2_id;
+    int rc;
+
+    pPriv = DRI2GetDrawable(pDraw);
+    if (pPriv == NULL)
+	pPriv = DRI2AllocateDrawable(pDraw);
+    if (pPriv == NULL)
+	return BadAlloc;
+    
+    dri2_id = FakeClientID(client->index);
+    rc = DRI2AddDrawableRef(pPriv, id, dri2_id);
+    if (rc != Success)
+	return rc;
+
+    return Success;
+}
+
+static int DRI2DrawableGone(pointer p, XID id)
+{
+    DRI2DrawablePtr pPriv = p;
+    DRI2ScreenPtr   ds = pPriv->dri2_screen;
+    DRI2DrawableRefPtr ref, next;
+    WindowPtr pWin;
+    PixmapPtr pPixmap;
+    DrawablePtr pDraw;
+    int i;
+
+    list_for_each_entry_safe(ref, next, &pPriv->reference_list, link) {
+	if (ref->dri2_id == id) {
+	    list_del(&ref->link);
+	    /* If this was the last ref under this X drawable XID,
+	     * unregister the X drawable resource. */
+	    if (!DRI2LookupDrawableRef(pPriv, ref->id))
+		FreeResourceByType(ref->id, dri2DrawableRes, TRUE);
+	    free(ref);
+	    break;
+	}
+
+	if (ref->id == id) {
+	    list_del(&ref->link);
+	    FreeResourceByType(ref->dri2_id, dri2DrawableRes, TRUE);
+	    free(ref);
+	}
+    }
+
+    if (!list_is_empty(&pPriv->reference_list))
+	return Success;
+
+    pDraw = pPriv->drawable;
+    if (pDraw->type == DRAWABLE_WINDOW) {
+	pWin = (WindowPtr) pDraw;
+	dixSetPrivate(&pWin->devPrivates, dri2WindowPrivateKey, NULL);
+    } else {
+	pPixmap = (PixmapPtr) pDraw;
+	dixSetPrivate(&pPixmap->devPrivates, dri2PixmapPrivateKey, NULL);
+    }
+
+    if (pPriv->buffers != NULL) {
+	for (i = 0; i < pPriv->bufferCount; i++)
+	    (*ds->DestroyBuffer)(pDraw, pPriv->buffers[i]);
+
+	xfree(pPriv->buffers);
+    }
+
+    xfree(pPriv);
+
+    return Success;
+}
+
+static int
+find_attachment(DRI2DrawablePtr pPriv, unsigned attachment)
+{
+    int i;
+
+    if (pPriv->buffers == NULL) {
+	return -1;
+    }
+
+    for (i = 0; i < pPriv->bufferCount; i++) {
+	if ((pPriv->buffers[i] != NULL)
+	    && (pPriv->buffers[i]->attachment == attachment)) {
+	    return i;
+	}
+    }
+
+    return -1;
+}
+
+static Bool
+allocate_or_reuse_buffer(DrawablePtr pDraw, DRI2ScreenPtr ds,
+			 DRI2DrawablePtr pPriv,
+			 unsigned int attachment, unsigned int format,
+			 int dimensions_match, DRI2BufferPtr *buffer)
+{
+    int old_buf = find_attachment(pPriv, attachment);
+
+    if ((old_buf < 0)
+	|| !dimensions_match
+	|| (pPriv->buffers[old_buf]->format != format)) {
+	*buffer = (*ds->CreateBuffer)(pDraw, attachment, format);
+	return TRUE;
+
+    } else {
+	*buffer = pPriv->buffers[old_buf];
+	pPriv->buffers[old_buf] = NULL;
+	return FALSE;
+    }
+}
+
+static DRI2BufferPtr *
+do_get_buffers(DrawablePtr pDraw, int *width, int *height,
+	       unsigned int *attachments, int count, int *out_count,
+	       int has_format)
+{
+    DRI2ScreenPtr   ds = DRI2GetScreen(pDraw->pScreen);
+    DRI2DrawablePtr pPriv = DRI2GetDrawable(pDraw);
+    DRI2BufferPtr  *buffers;
+    int need_real_front = 0;
+    int need_fake_front = 0;
+    int have_fake_front = 0;
+    int front_format = 0;
+    int dimensions_match;
+    int buffers_changed = 0;
+    int i;
+
+    if (!pPriv) {
+	*width = pDraw->width;
+	*height = pDraw->height;
+	*out_count = 0;
+	return NULL;
+    }
+
+    dimensions_match = (pDraw->width == pPriv->width)
+	&& (pDraw->height == pPriv->height);
+
+    buffers = xalloc((count + 1) * sizeof(buffers[0]));
+
+    for (i = 0; i < count; i++) {
+	const unsigned attachment = *(attachments++);
+	const unsigned format = (has_format) ? *(attachments++) : 0;
+
+	if (allocate_or_reuse_buffer(pDraw, ds, pPriv, attachment,
+				     format, dimensions_match,
+				     &buffers[i]))
+		buffers_changed = 1;
+
+	/* If the drawable is a window and the front-buffer is requested,
+	 * silently add the fake front-buffer to the list of requested
+	 * attachments.  The counting logic in the loop accounts for the case
+	 * where the client requests both the fake and real front-buffer.
+	 */
+	if (attachment == DRI2BufferBackLeft) {
+	    need_real_front++;
+	    front_format = format;
+	}
+
+	if (attachment == DRI2BufferFrontLeft) {
+	    need_real_front--;
+	    front_format = format;
+
+	    if (pDraw->type == DRAWABLE_WINDOW) {
+		need_fake_front++;
+	    }
+	}
+
+	if (pDraw->type == DRAWABLE_WINDOW) {
+	    if (attachment == DRI2BufferFakeFrontLeft) {
+		need_fake_front--;
+		have_fake_front = 1;
+	    }
+	}
+    }
+
+    if (need_real_front > 0) {
+	if (allocate_or_reuse_buffer(pDraw, ds, pPriv, DRI2BufferFrontLeft,
+				     front_format, dimensions_match,
+				     &buffers[i++]))
+	    buffers_changed = 1;
+    }
+
+    if (need_fake_front > 0) {
+	if (allocate_or_reuse_buffer(pDraw, ds, pPriv, DRI2BufferFakeFrontLeft,
+				     front_format, dimensions_match,
+				     &buffers[i++]))
+	    buffers_changed = 1;
+
+	have_fake_front = 1;
+    }
+
+    *out_count = i;
+
+
+    if (pPriv->buffers != NULL) {
+	for (i = 0; i < pPriv->bufferCount; i++) {
+	    if (pPriv->buffers[i] != NULL) {
+		(*ds->DestroyBuffer)(pDraw, pPriv->buffers[i]);
+	    }
+	}
+
+	xfree(pPriv->buffers);
+    }
+
+    pPriv->buffers = buffers;
+    pPriv->bufferCount = *out_count;
+    pPriv->width = pDraw->width;
+    pPriv->height = pDraw->height;
+    *width = pPriv->width;
+    *height = pPriv->height;
+
+
+    /* If the client is getting a fake front-buffer, pre-fill it with the
+     * contents of the real front-buffer.  This ensures correct operation of
+     * applications that call glXWaitX before calling glDrawBuffer.
+     */
+    if (have_fake_front && buffers_changed) {
+	BoxRec box;
+	RegionRec region;
+
+	box.x1 = 0;
+	box.y1 = 0;
+	box.x2 = pPriv->width;
+	box.y2 = pPriv->height;
+	REGION_INIT(pDraw->pScreen, &region, &box, 0);
+
+	DRI2CopyRegion(pDraw, &region, DRI2BufferFakeFrontLeft,
+		       DRI2BufferFrontLeft);
+    }
+
+    return pPriv->buffers;
+}
+
+DRI2BufferPtr *
+DRI2GetBuffers(DrawablePtr pDraw, int *width, int *height,
+	       unsigned int *attachments, int count, int *out_count)
+{
+    return do_get_buffers(pDraw, width, height, attachments, count,
+			  out_count, FALSE);
+}
+
+DRI2BufferPtr *
+DRI2GetBuffersWithFormat(DrawablePtr pDraw, int *width, int *height,
+			 unsigned int *attachments, int count, int *out_count)
+{
+    return do_get_buffers(pDraw, width, height, attachments, count,
+			  out_count, TRUE);
+}
+
+/*
+ * In the direct rendered case, we throttle the clients that have more
+ * than their share of outstanding swaps (and thus busy buffers) when a
+ * new GetBuffers request is received.  In the AIGLX case, we allow the
+ * client to get the new buffers, but throttle when the next GLX request
+ * comes in (see __glXDRIcontextWait()).
+ */
+Bool
+DRI2ThrottleClient(ClientPtr client, DrawablePtr pDraw)
+{
+    DRI2DrawablePtr pPriv;
+
+    pPriv = DRI2GetDrawable(pDraw);
+    if (pPriv == NULL)
+	return FALSE;
+
+    /* Throttle to swap limit */
+    if ((pPriv->swapsPending >= pPriv->swap_limit) &&
+	!pPriv->blockedClient) {
+	ResetCurrentRequest(client);
+	client->sequence--;
+	IgnoreClient(client);
+	pPriv->blockedClient = client;
+	return TRUE;
+    }
+
+    return FALSE;
+}
+
+static void
+__DRI2BlockClient(ClientPtr client, DRI2DrawablePtr pPriv)
+{
+    if (pPriv->blockedClient == NULL) {
+	IgnoreClient(client);
+	pPriv->blockedClient = client;
+    }
+}
+
+void
+DRI2BlockClient(ClientPtr client, DrawablePtr pDraw)
+{
+    DRI2DrawablePtr pPriv;
+
+    pPriv = DRI2GetDrawable(pDraw);
+    if (pPriv == NULL)
+	return;
+
+    __DRI2BlockClient(client, pPriv);
+    pPriv->blockedOnMsc = TRUE;
+}
+
+int
+DRI2CopyRegion(DrawablePtr pDraw, RegionPtr pRegion,
+	       unsigned int dest, unsigned int src)
+{
+    DRI2ScreenPtr   ds = DRI2GetScreen(pDraw->pScreen);
+    DRI2DrawablePtr pPriv;
+    DRI2BufferPtr   pDestBuffer, pSrcBuffer;
+    int		    i;
+
+    pPriv = DRI2GetDrawable(pDraw);
+    if (pPriv == NULL)
+	return BadDrawable;
+
+    pDestBuffer = NULL;
+    pSrcBuffer = NULL;
+    for (i = 0; i < pPriv->bufferCount; i++)
+    {
+	if (pPriv->buffers[i]->attachment == dest)
+	    pDestBuffer = (DRI2BufferPtr) pPriv->buffers[i];
+	if (pPriv->buffers[i]->attachment == src)
+	    pSrcBuffer = (DRI2BufferPtr) pPriv->buffers[i];
+    }
+    if (pSrcBuffer == NULL || pDestBuffer == NULL)
+	return BadValue;
+
+    (*ds->CopyRegion)(pDraw, pRegion, pDestBuffer, pSrcBuffer);
+
+    return Success;
+}
+
+/* Can this drawable be page flipped? */
+Bool
+DRI2CanFlip(DrawablePtr pDraw)
+{
+    ScreenPtr pScreen = pDraw->pScreen;
+    WindowPtr pWin, pRoot;
+    PixmapPtr pWinPixmap, pRootPixmap;
+
+    if (pDraw->type == DRAWABLE_PIXMAP)
+	return TRUE;
+
+    pRoot = WindowTable[pScreen->myNum];
+    pRootPixmap = pScreen->GetWindowPixmap(pRoot);
+
+    pWin = (WindowPtr) pDraw;
+    pWinPixmap = pScreen->GetWindowPixmap(pWin);
+    if (pRootPixmap != pWinPixmap)
+	return FALSE;
+    if (!REGION_EQUAL(pScreen, &pWin->clipList, &pRoot->winSize))
+	return FALSE;
+
+    return TRUE;
+}
+
+/* Can we do a pixmap exchange instead of a blit? */
+Bool
+DRI2CanExchange(DrawablePtr pDraw)
+{
+    return FALSE;
+}
+
+void
+DRI2WaitMSCComplete(ClientPtr client, DrawablePtr pDraw, int frame,
+		    unsigned int tv_sec, unsigned int tv_usec)
+{
+    DRI2DrawablePtr pPriv;
+
+    pPriv = DRI2GetDrawable(pDraw);
+    if (pPriv == NULL)
+	return;
+
+    ProcDRI2WaitMSCReply(client, ((CARD64)tv_sec * 1000000) + tv_usec,
+			 frame, pPriv->swap_count);
+
+    if (pPriv->blockedClient)
+	AttendClient(pPriv->blockedClient);
+
+    pPriv->blockedClient = NULL;
+    pPriv->blockedOnMsc = FALSE;
+}
+
+static void
+DRI2WakeClient(ClientPtr client, DrawablePtr pDraw, int frame,
+	       unsigned int tv_sec, unsigned int tv_usec)
+{
+    ScreenPtr	    pScreen = pDraw->pScreen;
+    DRI2DrawablePtr pPriv;
+
+    pPriv = DRI2GetDrawable(pDraw);
+    if (pPriv == NULL) {
+        xf86DrvMsg(pScreen->myNum, X_ERROR,
+		   "[DRI2] %s: bad drawable\n", __func__);
+	return;
+    }
+
+    /*
+     * Swap completed.
+     * Wake the client iff:
+     *   - it was waiting on SBC
+     *   - was blocked due to GLX make current
+     *   - was blocked due to swap throttling
+     *   - is not blocked due to an MSC wait
+     */
+    if (pPriv->target_sbc != -1 &&
+	pPriv->target_sbc <= pPriv->swap_count) {
+	ProcDRI2WaitMSCReply(client, ((CARD64)tv_sec * 1000000) + tv_usec,
+			     frame, pPriv->swap_count);
+	pPriv->target_sbc = -1;
+
+	AttendClient(pPriv->blockedClient);
+	pPriv->blockedClient = NULL;
+    } else if (pPriv->target_sbc == -1 && !pPriv->blockedOnMsc) {
+	if (pPriv->blockedClient) {
+	    AttendClient(pPriv->blockedClient);
+	    pPriv->blockedClient = NULL;
+	}
+    }
+}
+
+void
+DRI2SwapComplete(ClientPtr client, DrawablePtr pDraw, int frame,
+		   unsigned int tv_sec, unsigned int tv_usec, int type,
+		   DRI2SwapEventPtr swap_complete, void *swap_data)
+{
+    ScreenPtr	    pScreen = pDraw->pScreen;
+    DRI2DrawablePtr pPriv;
+    CARD64          ust = 0;
+
+    pPriv = DRI2GetDrawable(pDraw);
+    if (pPriv == NULL) {
+        xf86DrvMsg(pScreen->myNum, X_ERROR,
+		   "[DRI2] %s: bad drawable\n", __func__);
+	return;
+    }
+
+    pPriv->swapsPending--;
+    pPriv->swap_count++;
+
+    ust = ((CARD64)tv_sec * 1000000) + tv_usec;
+    if (swap_complete)
+	swap_complete(client, swap_data, type, ust, frame, pPriv->swap_count);
+
+    pPriv->last_swap_msc = frame;
+    pPriv->last_swap_ust = ust;
+
+    DRI2WakeClient(client, pDraw, frame, tv_sec, tv_usec);
+}
+
+Bool
+DRI2WaitSwap(ClientPtr client, DrawablePtr pDrawable)
+{
+    DRI2DrawablePtr pPriv = DRI2GetDrawable(pDrawable);
+
+    /* If we're currently waiting for a swap on this drawable, reset
+     * the request and suspend the client.  We only support one
+     * blocked client per drawable. */
+    if ((pPriv->swapsPending) &&
+	pPriv->blockedClient == NULL) {
+	ResetCurrentRequest(client);
+	client->sequence--;
+	__DRI2BlockClient(client, pPriv);
+	return TRUE;
+    }
+
+    return FALSE;
+}
+
+int
+DRI2SwapBuffers(ClientPtr client, DrawablePtr pDraw, CARD64 target_msc,
+		CARD64 divisor, CARD64 remainder, CARD64 *swap_target,
+		DRI2SwapEventPtr func, void *data)
+{
+    ScreenPtr       pScreen = pDraw->pScreen;
+    DRI2ScreenPtr   ds = DRI2GetScreen(pDraw->pScreen);
+    DRI2DrawablePtr pPriv;
+    DRI2BufferPtr   pDestBuffer = NULL, pSrcBuffer = NULL;
+    int             ret, i;
+
+    pPriv = DRI2GetDrawable(pDraw);
+    if (pPriv == NULL) {
+        xf86DrvMsg(pScreen->myNum, X_ERROR,
+		   "[DRI2] %s: bad drawable\n", __func__);
+	return BadDrawable;
+    }
+
+    for (i = 0; i < pPriv->bufferCount; i++) {
+	if (pPriv->buffers[i]->attachment == DRI2BufferFrontLeft)
+	    pDestBuffer = (DRI2BufferPtr) pPriv->buffers[i];
+	if (pPriv->buffers[i]->attachment == DRI2BufferBackLeft)
+	    pSrcBuffer = (DRI2BufferPtr) pPriv->buffers[i];
+    }
+    if (pSrcBuffer == NULL || pDestBuffer == NULL) {
+        xf86DrvMsg(pScreen->myNum, X_ERROR,
+		   "[DRI2] %s: drawable has no back or front?\n", __func__);
+	return BadDrawable;
+    }
+
+    /* Old DDX or no swap interval, just blit */
+    if (!ds->ScheduleSwap || !pPriv->swap_interval) {
+	BoxRec box;
+	RegionRec region;
+
+	box.x1 = 0;
+	box.y1 = 0;
+	box.x2 = pDraw->width;
+	box.y2 = pDraw->height;
+	REGION_INIT(pScreen, &region, &box, 0);
+
+	pPriv->swapsPending++;
+
+	(*ds->CopyRegion)(pDraw, &region, pDestBuffer, pSrcBuffer);
+	DRI2SwapComplete(client, pDraw, target_msc, 0, 0, DRI2_BLIT_COMPLETE,
+			 func, data);
+	return Success;
+    }
+
+    /*
+     * In the simple glXSwapBuffers case, all params will be 0, and we just
+     * need to schedule a swap for the last swap target + the swap interval.
+     */
+    if (target_msc == 0 && divisor == 0 && remainder == 0) {
+	/*
+	 * Swap target for this swap is last swap target + swap interval since
+	 * we have to account for the current swap count, interval, and the
+	 * number of pending swaps.
+	 */
+	*swap_target = pPriv->last_swap_target + pPriv->swap_interval;
+    } else {
+	/* glXSwapBuffersMscOML could have a 0 target_msc, honor it */
+	*swap_target = target_msc;
+    }
+
+    pPriv->swapsPending++;
+    ret = (*ds->ScheduleSwap)(client, pDraw, pDestBuffer, pSrcBuffer,
+			      swap_target, divisor, remainder, func, data);
+    if (!ret) {
+	pPriv->swapsPending--; /* didn't schedule */
+        xf86DrvMsg(pScreen->myNum, X_ERROR,
+		   "[DRI2] %s: driver failed to schedule swap\n", __func__);
+	return BadDrawable;
+    }
+
+    pPriv->last_swap_target = *swap_target;
+
+    /* According to spec, return expected swapbuffers count SBC after this swap
+     * will complete.
+     */
+    *swap_target = pPriv->swap_count + pPriv->swapsPending;
+
+    return Success;
+}
+
+void
+DRI2SwapInterval(DrawablePtr pDrawable, int interval)
+{
+    ScreenPtr       pScreen = pDrawable->pScreen;
+    DRI2DrawablePtr pPriv = DRI2GetDrawable(pDrawable);
+
+    if (pPriv == NULL) {
+        xf86DrvMsg(pScreen->myNum, X_ERROR,
+		   "[DRI2] %s: bad drawable\n", __func__);
+	return;
+    }
+
+    /* fixme: check against arbitrary max? */
+    pPriv->swap_interval = interval;
+}
+
+int
+DRI2GetMSC(DrawablePtr pDraw, CARD64 *ust, CARD64 *msc, CARD64 *sbc)
+{
+    ScreenPtr pScreen = pDraw->pScreen;
+    DRI2ScreenPtr ds = DRI2GetScreen(pDraw->pScreen);
+    DRI2DrawablePtr pPriv;
+    Bool ret;
+
+    pPriv = DRI2GetDrawable(pDraw);
+    if (pPriv == NULL) {
+        xf86DrvMsg(pScreen->myNum, X_ERROR,
+		   "[DRI2] %s: bad drawable\n", __func__);
+	return BadDrawable;
+    }
+
+    if (!ds->GetMSC) {
+	*ust = 0;
+	*msc = 0;
+	*sbc = pPriv->swap_count;
+	return Success;
+    }
+
+    /*
+     * Spec needs to be updated to include unmapped or redirected
+     * drawables
+     */
+
+    ret = (*ds->GetMSC)(pDraw, ust, msc);
+    if (!ret)
+	return BadDrawable;
+
+    *sbc = pPriv->swap_count;
+
+    return Success;
+}
+
+int
+DRI2WaitMSC(ClientPtr client, DrawablePtr pDraw, CARD64 target_msc,
+	    CARD64 divisor, CARD64 remainder)
+{
+    DRI2ScreenPtr ds = DRI2GetScreen(pDraw->pScreen);
+    DRI2DrawablePtr pPriv;
+    Bool ret;
+
+    pPriv = DRI2GetDrawable(pDraw);
+    if (pPriv == NULL)
+	return BadDrawable;
+
+    /* Old DDX just completes immediately */
+    if (!ds->ScheduleWaitMSC) {
+	DRI2WaitMSCComplete(client, pDraw, target_msc, 0, 0);
+
+	return Success;
+    }
+
+    ret = (*ds->ScheduleWaitMSC)(client, pDraw, target_msc, divisor, remainder);
+    if (!ret)
+	return BadDrawable;
+
+    return Success;
+}
+
+int
+DRI2WaitSBC(ClientPtr client, DrawablePtr pDraw, CARD64 target_sbc,
+	    CARD64 *ust, CARD64 *msc, CARD64 *sbc)
+{
+    DRI2DrawablePtr pPriv;
+
+    pPriv = DRI2GetDrawable(pDraw);
+    if (pPriv == NULL)
+	return BadDrawable;
+
+    /* target_sbc == 0 means to block until all pending swaps are
+     * finished. Recalculate target_sbc to get that behaviour.
+     */
+    if (target_sbc == 0)
+        target_sbc = pPriv->swap_count + pPriv->swapsPending;
+
+    /* If current swap count already >= target_sbc,
+     * return immediately with (ust, msc, sbc) triplet of
+     * most recent completed swap.
+     */
+    if (pPriv->swap_count >= target_sbc) {
+        *sbc = pPriv->swap_count;
+        *msc = pPriv->last_swap_msc;
+        *ust = pPriv->last_swap_ust;
+        return Success;
+    }
+
+    pPriv->target_sbc = target_sbc;
+    __DRI2BlockClient(client, pPriv);
+
+    return Success;
+}
+
+Bool
+DRI2HasSwapControl(ScreenPtr pScreen)
+{
+    DRI2ScreenPtr ds = DRI2GetScreen(pScreen);
+
+    return (ds->ScheduleSwap && ds->GetMSC);
+}
+
+Bool
+DRI2Connect(ScreenPtr pScreen, unsigned int driverType, int *fd,
+	    const char **driverName, const char **deviceName)
+{
+    DRI2ScreenPtr ds = DRI2GetScreen(pScreen);
+
+    if (ds == NULL || driverType >= ds->numDrivers ||
+	    !ds->driverNames[driverType])
+	return FALSE;
+
+    *fd = ds->fd;
+    *driverName = ds->driverNames[driverType];
+    *deviceName = ds->deviceName;
+
+    return TRUE;
+}
+
+Bool
+DRI2Authenticate(ScreenPtr pScreen, drm_magic_t magic)
+{
+    DRI2ScreenPtr ds = DRI2GetScreen(pScreen);
+
+    if (ds == NULL || drmAuthMagic(ds->fd, magic))
+	return FALSE;
+
+    return TRUE;
+}
+
+Bool
+DRI2ScreenInit(ScreenPtr pScreen, DRI2InfoPtr info)
+{
+    DRI2ScreenPtr ds;
+    const char* driverTypeNames[] = {
+	"DRI", /* DRI2DriverDRI */
+	"VDPAU", /* DRI2DriverVDPAU */
+    };
+    unsigned int i;
+    CARD8 cur_minor;
+
+    if (info->version < 3)
+	return FALSE;
+
+    if (!xf86VGAarbiterAllowDRI(pScreen)) {
+        xf86DrvMsg(pScreen->myNum, X_WARNING,
+                  "[DRI2] Direct rendering is not supported when VGA arb is necessary for the device\n");
+        return FALSE;
+    }
+
+    ds = xcalloc(1, sizeof *ds);
+    if (!ds)
+	return FALSE;
+
+    ds->screen         = pScreen;
+    ds->fd	       = info->fd;
+    ds->deviceName     = info->deviceName;
+    dri2_major         = 1;
+
+    ds->CreateBuffer   = info->CreateBuffer;
+    ds->DestroyBuffer  = info->DestroyBuffer;
+    ds->CopyRegion     = info->CopyRegion;
+
+    if (info->version >= 4) {
+	ds->ScheduleSwap = info->ScheduleSwap;
+	ds->ScheduleWaitMSC = info->ScheduleWaitMSC;
+	ds->GetMSC = info->GetMSC;
+	cur_minor = 2;
+    } else {
+	cur_minor = 1;
+    }
+
+    /* Initialize minor if needed and set to minimum provied by DDX */
+    if (!dri2_minor || dri2_minor > cur_minor)
+	dri2_minor = cur_minor;
+
+    if (info->version == 3 || info->numDrivers == 0) {
+	/* Driver too old: use the old-style driverName field */
+	ds->numDrivers = 1;
+	ds->driverNames = xalloc(sizeof(*ds->driverNames));
+	if (!ds->driverNames) {
+	    xfree(ds);
+	    return FALSE;
+	}
+	ds->driverNames[0] = info->driverName;
+    } else {
+	ds->numDrivers = info->numDrivers;
+	ds->driverNames = xalloc(info->numDrivers * sizeof(*ds->driverNames));
+	if (!ds->driverNames) {
+	    xfree(ds);
+	    return FALSE;
+	}
+	memcpy(ds->driverNames, info->driverNames,
+	       info->numDrivers * sizeof(*ds->driverNames));
+    }
+
+    dixSetPrivate(&pScreen->devPrivates, dri2ScreenPrivateKey, ds);
+
+    xf86DrvMsg(pScreen->myNum, X_INFO, "[DRI2] Setup complete\n");
+    for (i = 0; i < sizeof(driverTypeNames) / sizeof(driverTypeNames[0]); i++) {
+	if (i < ds->numDrivers && ds->driverNames[i]) {
+	    xf86DrvMsg(pScreen->myNum, X_INFO, "[DRI2]   %s driver: %s\n",
+		       driverTypeNames[i], ds->driverNames[i]);
+	}
+    }
+
+    return TRUE;
+}
+
+void
+DRI2CloseScreen(ScreenPtr pScreen)
+{
+    DRI2ScreenPtr ds = DRI2GetScreen(pScreen);
+
+    xfree(ds->driverNames);
+    xfree(ds);
+    dixSetPrivate(&pScreen->devPrivates, dri2ScreenPrivateKey, NULL);
+}
+
+extern ExtensionModule dri2ExtensionModule;
+
+static pointer
+DRI2Setup(pointer module, pointer opts, int *errmaj, int *errmin)
+{
+    static Bool setupDone = FALSE;
+
+    dri2DrawableRes = CreateNewResourceType(DRI2DrawableGone, "DRI2Drawable");
+
+    if (!setupDone)
+    {
+	setupDone = TRUE;
+	LoadExtension(&dri2ExtensionModule, FALSE);
+    }
+    else
+    {
+	if (errmaj)
+	    *errmaj = LDR_ONCEONLY;
+    }
+
+    return (pointer) 1;
+}
+
+static XF86ModuleVersionInfo DRI2VersRec =
+{
+    "dri2",
+    MODULEVENDORSTRING,
+    MODINFOSTRING1,
+    MODINFOSTRING2,
+    XORG_VERSION_CURRENT,
+    1, 2, 0,
+    ABI_CLASS_EXTENSION,
+    ABI_EXTENSION_VERSION,
+    MOD_CLASS_NONE,
+    { 0, 0, 0, 0 }
+};
+
+_X_EXPORT XF86ModuleData dri2ModuleData = { &DRI2VersRec, DRI2Setup, NULL };
+
+void
+DRI2Version(int *major, int *minor)
+{
+    if (major != NULL)
+	*major = DRI2VersRec.majorversion;
+
+    if (minor != NULL)
+	*minor = DRI2VersRec.minorversion;
+}
diff --git a/xorg-server/hw/xfree86/dri2/dri2.h b/xorg-server/hw/xfree86/dri2/dri2.h
index ce8a5df41..cc15f120d 100644
--- a/xorg-server/hw/xfree86/dri2/dri2.h
+++ b/xorg-server/hw/xfree86/dri2/dri2.h
@@ -1,274 +1,275 @@
-/*
- * Copyright © 2007 Red Hat, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Soft-
- * ware"), to deal in the Software without restriction, including without
- * limitation the rights to use, copy, modify, merge, publish, distribute,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, provided that the above copyright
- * notice(s) and this permission notice appear in all copies of the Soft-
- * ware and that both the above copyright notice(s) and this permission
- * notice appear in supporting documentation.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
- * ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY
- * RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN
- * THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSE-
- * QUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFOR-
- * MANCE OF THIS SOFTWARE.
- *
- * Except as contained in this notice, the name of a copyright holder shall
- * not be used in advertising or otherwise to promote the sale, use or
- * other dealings in this Software without prior written authorization of
- * the copyright holder.
- *
- * Authors:
- *   Kristian Høgsberg (krh@redhat.com)
- */
-
-#ifndef _DRI2_H_
-#define _DRI2_H_
-
-#include <X11/extensions/dri2tokens.h>
-
-/* Version 2 structure (with format at the end) */
-typedef struct {
-    unsigned int attachment;
-    unsigned int name;
-    unsigned int pitch;
-    unsigned int cpp;
-    unsigned int flags;
-    unsigned int format;
-    void *driverPrivate;
-} DRI2BufferRec, *DRI2BufferPtr;
-
-extern CARD8 dri2_major; /* version of DRI2 supported by DDX */
-extern CARD8 dri2_minor;
-
-typedef DRI2BufferRec DRI2Buffer2Rec, *DRI2Buffer2Ptr;
-typedef void (*DRI2SwapEventPtr)(ClientPtr client, void *data, int type,
-				 CARD64 ust, CARD64 msc, CARD64 sbc);
-
-
-typedef DRI2BufferPtr	(*DRI2CreateBuffersProcPtr)(DrawablePtr pDraw,
-						    unsigned int *attachments,
-						    int count);
-typedef void		(*DRI2DestroyBuffersProcPtr)(DrawablePtr pDraw,
-						     DRI2BufferPtr buffers,
-						     int count);
-typedef void		(*DRI2CopyRegionProcPtr)(DrawablePtr pDraw,
-						 RegionPtr pRegion,
-						 DRI2BufferPtr pDestBuffer,
-						 DRI2BufferPtr pSrcBuffer);
-typedef void		(*DRI2WaitProcPtr)(WindowPtr pWin,
-					   unsigned int sequence);
-/**
- * Schedule a buffer swap
- *
- * This callback is used to support glXSwapBuffers and the OML_sync_control
- * extension (see it for a description of the params).
- *
- * Drivers should queue an event for the frame count that satisfies the
- * parameters passed in.  If the event is in the future (i.e. the conditions
- * aren't currently satisfied), the server may block the client at the next
- * GLX request using DRI2WaitSwap. When the event arrives, drivers should call
- * \c DRI2SwapComplete, which will handle waking the client and returning
- * the appropriate data.
- *
- * The DDX is responsible for doing a flip, exchange, or blit of the swap
- * when the corresponding event arrives.  The \c DRI2CanFlip and
- * \c DRI2CanExchange functions can be used as helpers for this purpose.
- *
- * \param client client pointer (used for block/unblock)
- * \param pDraw drawable whose count we want
- * \param pDestBuffer current front buffer
- * \param pSrcBuffer current back buffer
- * \param target_msc frame count to wait for
- * \param divisor divisor for condition equation
- * \param remainder remainder for division equation
- * \param func function to call when the swap completes
- * \param data data for the callback \p func.
- */
-typedef int		(*DRI2ScheduleSwapProcPtr)(ClientPtr client,
-						   DrawablePtr pDraw,
-						   DRI2BufferPtr pDestBuffer,
-						   DRI2BufferPtr pSrcBuffer,
-						   CARD64 *target_msc,
-						   CARD64 divisor,
-						   CARD64 remainder,
-						   DRI2SwapEventPtr func,
-						   void *data);
-typedef DRI2BufferPtr	(*DRI2CreateBufferProcPtr)(DrawablePtr pDraw,
-						   unsigned int attachment,
-						   unsigned int format);
-typedef void		(*DRI2DestroyBufferProcPtr)(DrawablePtr pDraw,
-						    DRI2BufferPtr buffer);
-/**
- * Get current media stamp counter values
- *
- * This callback is used to support the SGI_video_sync and OML_sync_control
- * extensions.
- *
- * Drivers should return the current frame counter and the timestamp from
- * when the returned frame count was last incremented.
- *
- * The count should correspond to the screen where the drawable is currently
- * visible.  If the drawable isn't visible (e.g. redirected), the server
- * should return BadDrawable to the client, pending GLX spec updates to
- * define this behavior.
- *
- * \param pDraw drawable whose count we want
- * \param ust timestamp from when the count was last incremented.
- * \param mst current frame count
- */
-typedef int		(*DRI2GetMSCProcPtr)(DrawablePtr pDraw, CARD64 *ust,
-					     CARD64 *msc);
-/**
- * Schedule a frame count related wait
- *
- * This callback is used to support the SGI_video_sync and OML_sync_control
- * extensions.  See those specifications for details on how to handle
- * the divisor and remainder parameters.
- *
- * Drivers should queue an event for the frame count that satisfies the
- * parameters passed in.  If the event is in the future (i.e. the conditions
- * aren't currently satisfied), the driver should block the client using
- * \c DRI2BlockClient.  When the event arrives, drivers should call
- * \c DRI2WaitMSCComplete, which will handle waking the client and returning
- * the appropriate data.
- *
- * \param client client pointer (used for block/unblock)
- * \param pDraw drawable whose count we want
- * \param target_msc frame count to wait for
- * \param divisor divisor for condition equation
- * \param remainder remainder for division equation
- */
-typedef int		(*DRI2ScheduleWaitMSCProcPtr)(ClientPtr client,
-						      DrawablePtr pDraw,
-						      CARD64 target_msc,
-						      CARD64 divisor,
-						      CARD64 remainder);
-/**
- * Version of the DRI2InfoRec structure defined in this header
- */
-#define DRI2INFOREC_VERSION 4
-
-typedef struct {
-    unsigned int version;	/**< Version of this struct */
-    int fd;
-    const char *driverName;
-    const char *deviceName;
-
-    DRI2CreateBufferProcPtr	CreateBuffer;
-    DRI2DestroyBufferProcPtr	DestroyBuffer;
-    DRI2CopyRegionProcPtr	CopyRegion;
-    DRI2WaitProcPtr		Wait;
-
-    /* added in version 4 */
-
-    DRI2ScheduleSwapProcPtr	ScheduleSwap;
-    DRI2GetMSCProcPtr		GetMSC;
-    DRI2ScheduleWaitMSCProcPtr	ScheduleWaitMSC;
-
-    /* number of drivers in the driverNames array */
-    unsigned int numDrivers;
-    /* array of driver names, indexed by DRI2Driver* driver types */
-    /* a name of NULL means that driver is not supported */
-    const char * const *driverNames;
-}  DRI2InfoRec, *DRI2InfoPtr;
-
-extern _X_EXPORT int DRI2EventBase;
-
-extern _X_EXPORT Bool DRI2ScreenInit(ScreenPtr	pScreen,
-		    DRI2InfoPtr info);
-
-extern _X_EXPORT void DRI2CloseScreen(ScreenPtr pScreen);
-
-extern _X_EXPORT Bool DRI2HasSwapControl(ScreenPtr pScreen);
-
-extern _X_EXPORT Bool DRI2Connect(ScreenPtr pScreen,
-		 unsigned int driverType,
-		 int *fd,
-		 const char **driverName,
-		 const char **deviceName);
-
-extern _X_EXPORT Bool DRI2Authenticate(ScreenPtr pScreen, drm_magic_t magic);
-
-extern _X_EXPORT int DRI2CreateDrawable(DrawablePtr pDraw);
-
-extern _X_EXPORT void DRI2DestroyDrawable(DrawablePtr pDraw);
-
-extern _X_EXPORT DRI2BufferPtr *DRI2GetBuffers(DrawablePtr pDraw,
-			     int *width,
-			     int *height,
-			     unsigned int *attachments,
-			     int count,
-			     int *out_count);
-
-extern _X_EXPORT int DRI2CopyRegion(DrawablePtr pDraw,
-		   RegionPtr pRegion,
-		   unsigned int dest,
-		   unsigned int src);
-
-/**
- * Determine the major and minor version of the DRI2 extension.
- *
- * Provides a mechanism to other modules (e.g., 2D drivers) to determine the
- * version of the DRI2 extension.  While it is possible to peek directly at
- * the \c XF86ModuleData from a layered module, such a module will fail to
- * load (due to an unresolved symbol) if the DRI2 extension is not loaded.
- *
- * \param major  Location to store the major verion of the DRI2 extension
- * \param minor  Location to store the minor verion of the DRI2 extension
- *
- * \note
- * This interface was added some time after the initial release of the DRI2
- * module.  Layered modules that wish to use this interface must first test
- * its existance by calling \c xf86LoaderCheckSymbol.
- */
-extern _X_EXPORT void DRI2Version(int *major, int *minor);
-
-extern _X_EXPORT DRI2BufferPtr *DRI2GetBuffersWithFormat(DrawablePtr pDraw,
-	int *width, int *height, unsigned int *attachments, int count,
-	int *out_count);
-
-extern _X_EXPORT void DRI2SwapInterval(DrawablePtr pDrawable, int interval);
-extern _X_EXPORT int DRI2SwapBuffers(ClientPtr client, DrawablePtr pDrawable,
-				     CARD64 target_msc, CARD64 divisor,
-				     CARD64 remainder, CARD64 *swap_target,
-				     DRI2SwapEventPtr func, void *data);
-extern _X_EXPORT Bool DRI2WaitSwap(ClientPtr client, DrawablePtr pDrawable);
-
-extern _X_EXPORT int DRI2GetMSC(DrawablePtr pDrawable, CARD64 *ust,
-				CARD64 *msc, CARD64 *sbc);
-extern _X_EXPORT int DRI2WaitMSC(ClientPtr client, DrawablePtr pDrawable,
-				 CARD64 target_msc, CARD64 divisor,
-				 CARD64 remainder);
-extern _X_EXPORT int ProcDRI2WaitMSCReply(ClientPtr client, CARD64 ust,
-					  CARD64 msc, CARD64 sbc);
-extern _X_EXPORT int DRI2WaitSBC(ClientPtr client, DrawablePtr pDraw,
-				 CARD64 target_sbc, CARD64 *ust, CARD64 *msc,
-				 CARD64 *sbc);
-extern _X_EXPORT Bool DRI2ThrottleClient(ClientPtr client, DrawablePtr pDraw);
-
-extern _X_EXPORT Bool DRI2CanFlip(DrawablePtr pDraw);
-
-extern _X_EXPORT Bool DRI2CanExchange(DrawablePtr pDraw);
-
-/* Note: use *only* for MSC related waits */
-extern _X_EXPORT void DRI2BlockClient(ClientPtr client, DrawablePtr pDraw);
-
-extern _X_EXPORT void DRI2SwapComplete(ClientPtr client, DrawablePtr pDraw,
-				       int frame, unsigned int tv_sec,
-				       unsigned int tv_usec, int type,
-				       DRI2SwapEventPtr swap_complete,
-				       void *swap_data);
-extern _X_EXPORT void DRI2WaitMSCComplete(ClientPtr client, DrawablePtr pDraw,
-					  int frame, unsigned int tv_sec,
-					  unsigned int tv_usec);
-
-#endif
+/*
+ * Copyright © 2007 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Soft-
+ * ware"), to deal in the Software without restriction, including without
+ * limitation the rights to use, copy, modify, merge, publish, distribute,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, provided that the above copyright
+ * notice(s) and this permission notice appear in all copies of the Soft-
+ * ware and that both the above copyright notice(s) and this permission
+ * notice appear in supporting documentation.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
+ * ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY
+ * RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN
+ * THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSE-
+ * QUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFOR-
+ * MANCE OF THIS SOFTWARE.
+ *
+ * Except as contained in this notice, the name of a copyright holder shall
+ * not be used in advertising or otherwise to promote the sale, use or
+ * other dealings in this Software without prior written authorization of
+ * the copyright holder.
+ *
+ * Authors:
+ *   Kristian Høgsberg (krh@redhat.com)
+ */
+
+#ifndef _DRI2_H_
+#define _DRI2_H_
+
+#include <X11/extensions/dri2tokens.h>
+
+/* Version 2 structure (with format at the end) */
+typedef struct {
+    unsigned int attachment;
+    unsigned int name;
+    unsigned int pitch;
+    unsigned int cpp;
+    unsigned int flags;
+    unsigned int format;
+    void *driverPrivate;
+} DRI2BufferRec, *DRI2BufferPtr;
+
+extern CARD8 dri2_major; /* version of DRI2 supported by DDX */
+extern CARD8 dri2_minor;
+
+typedef DRI2BufferRec DRI2Buffer2Rec, *DRI2Buffer2Ptr;
+typedef void (*DRI2SwapEventPtr)(ClientPtr client, void *data, int type,
+				 CARD64 ust, CARD64 msc, CARD64 sbc);
+
+
+typedef DRI2BufferPtr	(*DRI2CreateBuffersProcPtr)(DrawablePtr pDraw,
+						    unsigned int *attachments,
+						    int count);
+typedef void		(*DRI2DestroyBuffersProcPtr)(DrawablePtr pDraw,
+						     DRI2BufferPtr buffers,
+						     int count);
+typedef void		(*DRI2CopyRegionProcPtr)(DrawablePtr pDraw,
+						 RegionPtr pRegion,
+						 DRI2BufferPtr pDestBuffer,
+						 DRI2BufferPtr pSrcBuffer);
+typedef void		(*DRI2WaitProcPtr)(WindowPtr pWin,
+					   unsigned int sequence);
+/**
+ * Schedule a buffer swap
+ *
+ * This callback is used to support glXSwapBuffers and the OML_sync_control
+ * extension (see it for a description of the params).
+ *
+ * Drivers should queue an event for the frame count that satisfies the
+ * parameters passed in.  If the event is in the future (i.e. the conditions
+ * aren't currently satisfied), the server may block the client at the next
+ * GLX request using DRI2WaitSwap. When the event arrives, drivers should call
+ * \c DRI2SwapComplete, which will handle waking the client and returning
+ * the appropriate data.
+ *
+ * The DDX is responsible for doing a flip, exchange, or blit of the swap
+ * when the corresponding event arrives.  The \c DRI2CanFlip and
+ * \c DRI2CanExchange functions can be used as helpers for this purpose.
+ *
+ * \param client client pointer (used for block/unblock)
+ * \param pDraw drawable whose count we want
+ * \param pDestBuffer current front buffer
+ * \param pSrcBuffer current back buffer
+ * \param target_msc frame count to wait for
+ * \param divisor divisor for condition equation
+ * \param remainder remainder for division equation
+ * \param func function to call when the swap completes
+ * \param data data for the callback \p func.
+ */
+typedef int		(*DRI2ScheduleSwapProcPtr)(ClientPtr client,
+						   DrawablePtr pDraw,
+						   DRI2BufferPtr pDestBuffer,
+						   DRI2BufferPtr pSrcBuffer,
+						   CARD64 *target_msc,
+						   CARD64 divisor,
+						   CARD64 remainder,
+						   DRI2SwapEventPtr func,
+						   void *data);
+typedef DRI2BufferPtr	(*DRI2CreateBufferProcPtr)(DrawablePtr pDraw,
+						   unsigned int attachment,
+						   unsigned int format);
+typedef void		(*DRI2DestroyBufferProcPtr)(DrawablePtr pDraw,
+						    DRI2BufferPtr buffer);
+/**
+ * Get current media stamp counter values
+ *
+ * This callback is used to support the SGI_video_sync and OML_sync_control
+ * extensions.
+ *
+ * Drivers should return the current frame counter and the timestamp from
+ * when the returned frame count was last incremented.
+ *
+ * The count should correspond to the screen where the drawable is currently
+ * visible.  If the drawable isn't visible (e.g. redirected), the server
+ * should return BadDrawable to the client, pending GLX spec updates to
+ * define this behavior.
+ *
+ * \param pDraw drawable whose count we want
+ * \param ust timestamp from when the count was last incremented.
+ * \param mst current frame count
+ */
+typedef int		(*DRI2GetMSCProcPtr)(DrawablePtr pDraw, CARD64 *ust,
+					     CARD64 *msc);
+/**
+ * Schedule a frame count related wait
+ *
+ * This callback is used to support the SGI_video_sync and OML_sync_control
+ * extensions.  See those specifications for details on how to handle
+ * the divisor and remainder parameters.
+ *
+ * Drivers should queue an event for the frame count that satisfies the
+ * parameters passed in.  If the event is in the future (i.e. the conditions
+ * aren't currently satisfied), the driver should block the client using
+ * \c DRI2BlockClient.  When the event arrives, drivers should call
+ * \c DRI2WaitMSCComplete, which will handle waking the client and returning
+ * the appropriate data.
+ *
+ * \param client client pointer (used for block/unblock)
+ * \param pDraw drawable whose count we want
+ * \param target_msc frame count to wait for
+ * \param divisor divisor for condition equation
+ * \param remainder remainder for division equation
+ */
+typedef int		(*DRI2ScheduleWaitMSCProcPtr)(ClientPtr client,
+						      DrawablePtr pDraw,
+						      CARD64 target_msc,
+						      CARD64 divisor,
+						      CARD64 remainder);
+/**
+ * Version of the DRI2InfoRec structure defined in this header
+ */
+#define DRI2INFOREC_VERSION 4
+
+typedef struct {
+    unsigned int version;	/**< Version of this struct */
+    int fd;
+    const char *driverName;
+    const char *deviceName;
+
+    DRI2CreateBufferProcPtr	CreateBuffer;
+    DRI2DestroyBufferProcPtr	DestroyBuffer;
+    DRI2CopyRegionProcPtr	CopyRegion;
+    DRI2WaitProcPtr		Wait;
+
+    /* added in version 4 */
+
+    DRI2ScheduleSwapProcPtr	ScheduleSwap;
+    DRI2GetMSCProcPtr		GetMSC;
+    DRI2ScheduleWaitMSCProcPtr	ScheduleWaitMSC;
+
+    /* number of drivers in the driverNames array */
+    unsigned int numDrivers;
+    /* array of driver names, indexed by DRI2Driver* driver types */
+    /* a name of NULL means that driver is not supported */
+    const char * const *driverNames;
+}  DRI2InfoRec, *DRI2InfoPtr;
+
+extern _X_EXPORT int DRI2EventBase;
+
+extern _X_EXPORT Bool DRI2ScreenInit(ScreenPtr	pScreen,
+		    DRI2InfoPtr info);
+
+extern _X_EXPORT void DRI2CloseScreen(ScreenPtr pScreen);
+
+extern _X_EXPORT Bool DRI2HasSwapControl(ScreenPtr pScreen);
+
+extern _X_EXPORT Bool DRI2Connect(ScreenPtr pScreen,
+		 unsigned int driverType,
+		 int *fd,
+		 const char **driverName,
+		 const char **deviceName);
+
+extern _X_EXPORT Bool DRI2Authenticate(ScreenPtr pScreen, drm_magic_t magic);
+
+extern _X_EXPORT int DRI2CreateDrawable(ClientPtr client,
+					DrawablePtr pDraw, XID id);
+
+extern _X_EXPORT void DRI2DestroyDrawable(DrawablePtr pDraw);
+
+extern _X_EXPORT DRI2BufferPtr *DRI2GetBuffers(DrawablePtr pDraw,
+			     int *width,
+			     int *height,
+			     unsigned int *attachments,
+			     int count,
+			     int *out_count);
+
+extern _X_EXPORT int DRI2CopyRegion(DrawablePtr pDraw,
+		   RegionPtr pRegion,
+		   unsigned int dest,
+		   unsigned int src);
+
+/**
+ * Determine the major and minor version of the DRI2 extension.
+ *
+ * Provides a mechanism to other modules (e.g., 2D drivers) to determine the
+ * version of the DRI2 extension.  While it is possible to peek directly at
+ * the \c XF86ModuleData from a layered module, such a module will fail to
+ * load (due to an unresolved symbol) if the DRI2 extension is not loaded.
+ *
+ * \param major  Location to store the major verion of the DRI2 extension
+ * \param minor  Location to store the minor verion of the DRI2 extension
+ *
+ * \note
+ * This interface was added some time after the initial release of the DRI2
+ * module.  Layered modules that wish to use this interface must first test
+ * its existance by calling \c xf86LoaderCheckSymbol.
+ */
+extern _X_EXPORT void DRI2Version(int *major, int *minor);
+
+extern _X_EXPORT DRI2BufferPtr *DRI2GetBuffersWithFormat(DrawablePtr pDraw,
+	int *width, int *height, unsigned int *attachments, int count,
+	int *out_count);
+
+extern _X_EXPORT void DRI2SwapInterval(DrawablePtr pDrawable, int interval);
+extern _X_EXPORT int DRI2SwapBuffers(ClientPtr client, DrawablePtr pDrawable,
+				     CARD64 target_msc, CARD64 divisor,
+				     CARD64 remainder, CARD64 *swap_target,
+				     DRI2SwapEventPtr func, void *data);
+extern _X_EXPORT Bool DRI2WaitSwap(ClientPtr client, DrawablePtr pDrawable);
+
+extern _X_EXPORT int DRI2GetMSC(DrawablePtr pDrawable, CARD64 *ust,
+				CARD64 *msc, CARD64 *sbc);
+extern _X_EXPORT int DRI2WaitMSC(ClientPtr client, DrawablePtr pDrawable,
+				 CARD64 target_msc, CARD64 divisor,
+				 CARD64 remainder);
+extern _X_EXPORT int ProcDRI2WaitMSCReply(ClientPtr client, CARD64 ust,
+					  CARD64 msc, CARD64 sbc);
+extern _X_EXPORT int DRI2WaitSBC(ClientPtr client, DrawablePtr pDraw,
+				 CARD64 target_sbc, CARD64 *ust, CARD64 *msc,
+				 CARD64 *sbc);
+extern _X_EXPORT Bool DRI2ThrottleClient(ClientPtr client, DrawablePtr pDraw);
+
+extern _X_EXPORT Bool DRI2CanFlip(DrawablePtr pDraw);
+
+extern _X_EXPORT Bool DRI2CanExchange(DrawablePtr pDraw);
+
+/* Note: use *only* for MSC related waits */
+extern _X_EXPORT void DRI2BlockClient(ClientPtr client, DrawablePtr pDraw);
+
+extern _X_EXPORT void DRI2SwapComplete(ClientPtr client, DrawablePtr pDraw,
+				       int frame, unsigned int tv_sec,
+				       unsigned int tv_usec, int type,
+				       DRI2SwapEventPtr swap_complete,
+				       void *swap_data);
+extern _X_EXPORT void DRI2WaitMSCComplete(ClientPtr client, DrawablePtr pDraw,
+					  int frame, unsigned int tv_sec,
+					  unsigned int tv_usec);
+
+#endif
diff --git a/xorg-server/hw/xfree86/dri2/dri2ext.c b/xorg-server/hw/xfree86/dri2/dri2ext.c
index 17df1304e..8bed02055 100644
--- a/xorg-server/hw/xfree86/dri2/dri2ext.c
+++ b/xorg-server/hw/xfree86/dri2/dri2ext.c
@@ -1,646 +1,646 @@
-/*
- * Copyright © 2008 Red Hat, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Soft-
- * ware"), to deal in the Software without restriction, including without
- * limitation the rights to use, copy, modify, merge, publish, distribute,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, provided that the above copyright
- * notice(s) and this permission notice appear in all copies of the Soft-
- * ware and that both the above copyright notice(s) and this permission
- * notice appear in supporting documentation.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
- * ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY
- * RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN
- * THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSE-
- * QUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFOR-
- * MANCE OF THIS SOFTWARE.
- *
- * Except as contained in this notice, the name of a copyright holder shall
- * not be used in advertising or otherwise to promote the sale, use or
- * other dealings in this Software without prior written authorization of
- * the copyright holder.
- *
- * Authors:
- *   Kristian Høgsberg (krh@redhat.com)
- */
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include <X11/extensions/dri2proto.h>
-#include <X11/extensions/xfixeswire.h>
-#include "dixstruct.h"
-#include "scrnintstr.h"
-#include "pixmapstr.h"
-#include "extnsionst.h"
-#include "xf86drm.h"
-#include "xfixes.h"
-#include "dri2.h"
-#include "protocol-versions.h"
-
-/* The only xf86 include */
-#include "xf86Module.h"
-
-static ExtensionEntry	*dri2Extension;
-
-static Bool
-validDrawable(ClientPtr client, XID drawable, Mask access_mode,
-	      DrawablePtr *pDrawable, int *status)
-{
-    *status = dixLookupDrawable(pDrawable, drawable, client, 0, access_mode);
-    if (*status != Success) {
-	client->errorValue = drawable;
-	return FALSE;
-    }
-
-    return TRUE;
-}
-
-static int
-ProcDRI2QueryVersion(ClientPtr client)
-{
-    REQUEST(xDRI2QueryVersionReq);
-    xDRI2QueryVersionReply rep;
-    int n;
-
-    if (client->swapped)
-	swaps(&stuff->length, n);
-
-    REQUEST_SIZE_MATCH(xDRI2QueryVersionReq);
-    rep.type = X_Reply;
-    rep.length = 0;
-    rep.sequenceNumber = client->sequence;
-    rep.majorVersion = dri2_major;
-    rep.minorVersion = dri2_minor;
-
-    if (client->swapped) {
-    	swaps(&rep.sequenceNumber, n);
-    	swapl(&rep.length, n);
-	swapl(&rep.majorVersion, n);
-	swapl(&rep.minorVersion, n);
-    }
-
-    WriteToClient(client, sizeof(xDRI2QueryVersionReply), &rep);
-
-    return client->noClientException;
-}
-
-static int
-ProcDRI2Connect(ClientPtr client)
-{
-    REQUEST(xDRI2ConnectReq);
-    xDRI2ConnectReply rep;
-    DrawablePtr pDraw;
-    int fd, status;
-    const char *driverName;
-    const char *deviceName;
-
-    REQUEST_SIZE_MATCH(xDRI2ConnectReq);
-    if (!validDrawable(client, stuff->window, DixGetAttrAccess,
-		       &pDraw, &status))
-	return status;
-    
-    rep.type = X_Reply;
-    rep.length = 0;
-    rep.sequenceNumber = client->sequence;
-    rep.driverNameLength = 0;
-    rep.deviceNameLength = 0;
-
-    if (!DRI2Connect(pDraw->pScreen,
-		     stuff->driverType, &fd, &driverName, &deviceName))
-	goto fail;
-
-    rep.driverNameLength = strlen(driverName);
-    rep.deviceNameLength = strlen(deviceName);
-    rep.length = (rep.driverNameLength + 3) / 4 +
-	    (rep.deviceNameLength + 3) / 4;
-
- fail:
-    WriteToClient(client, sizeof(xDRI2ConnectReply), &rep);
-    WriteToClient(client, rep.driverNameLength, driverName);
-    WriteToClient(client, rep.deviceNameLength, deviceName);
-
-    return client->noClientException;
-}
-
-static int
-ProcDRI2Authenticate(ClientPtr client)
-{
-    REQUEST(xDRI2AuthenticateReq);
-    xDRI2AuthenticateReply rep;
-    DrawablePtr pDraw;
-    int status;
-
-    REQUEST_SIZE_MATCH(xDRI2AuthenticateReq);
-    if (!validDrawable(client, stuff->window, DixGetAttrAccess,
-		       &pDraw, &status))
-	return status;
-
-    rep.type = X_Reply;
-    rep.sequenceNumber = client->sequence;
-    rep.length = 0;
-    rep.authenticated = DRI2Authenticate(pDraw->pScreen, stuff->magic);
-    WriteToClient(client, sizeof(xDRI2AuthenticateReply), &rep);
-
-    return client->noClientException;
-}
-
-static int
-ProcDRI2CreateDrawable(ClientPtr client)
-{
-    REQUEST(xDRI2CreateDrawableReq);
-    DrawablePtr pDrawable;
-    int status;
-
-    REQUEST_SIZE_MATCH(xDRI2CreateDrawableReq);
-
-    if (!validDrawable(client, stuff->drawable, DixAddAccess,
-		       &pDrawable, &status))
-	return status;
-
-    status = DRI2CreateDrawable(pDrawable);
-    if (status != Success)
-	return status;
-
-    return client->noClientException;
-}
-
-static int
-ProcDRI2DestroyDrawable(ClientPtr client)
-{
-    REQUEST(xDRI2DestroyDrawableReq);
-    DrawablePtr pDrawable;
-    int status;
-
-    REQUEST_SIZE_MATCH(xDRI2DestroyDrawableReq);
-    if (!validDrawable(client, stuff->drawable, DixRemoveAccess,
-		       &pDrawable, &status))
-	return status;
-
-    return client->noClientException;
-}
-
-
-static void
-send_buffers_reply(ClientPtr client, DrawablePtr pDrawable,
-		   DRI2BufferPtr *buffers, int count, int width, int height)
-{
-    xDRI2GetBuffersReply rep;
-    int skip = 0;
-    int i;
-
-    if (pDrawable->type == DRAWABLE_WINDOW) {
-	for (i = 0; i < count; i++) {
-	    /* Do not send the real front buffer of a window to the client.
-	     */
-	    if (buffers[i]->attachment == DRI2BufferFrontLeft) {
-		skip++;
-		continue;
-	    }
-	}
-    }
-
-    rep.type = X_Reply;
-    rep.length = (count - skip) * sizeof(xDRI2Buffer) / 4;
-    rep.sequenceNumber = client->sequence;
-    rep.width = width;
-    rep.height = height;
-    rep.count = count - skip;
-    WriteToClient(client, sizeof(xDRI2GetBuffersReply), &rep);
-
-    for (i = 0; i < count; i++) {
-	xDRI2Buffer buffer;
-
-	/* Do not send the real front buffer of a window to the client.
-	 */
-	if ((pDrawable->type == DRAWABLE_WINDOW)
-	    && (buffers[i]->attachment == DRI2BufferFrontLeft)) {
-	    continue;
-	}
-
-	buffer.attachment = buffers[i]->attachment;
-	buffer.name = buffers[i]->name;
-	buffer.pitch = buffers[i]->pitch;
-	buffer.cpp = buffers[i]->cpp;
-	buffer.flags = buffers[i]->flags;
-	WriteToClient(client, sizeof(xDRI2Buffer), &buffer);
-    }
-}
-
-
-static int
-ProcDRI2GetBuffers(ClientPtr client)
-{
-    REQUEST(xDRI2GetBuffersReq);
-    DrawablePtr pDrawable;
-    DRI2BufferPtr *buffers;
-    int status, width, height, count;
-    unsigned int *attachments;
-
-    REQUEST_FIXED_SIZE(xDRI2GetBuffersReq, stuff->count * 4);
-    if (!validDrawable(client, stuff->drawable, DixReadAccess | DixWriteAccess,
-		       &pDrawable, &status))
-	return status;
-
-    if (DRI2ThrottleClient(client, pDrawable))
-	return client->noClientException;
-
-    attachments = (unsigned int *) &stuff[1];
-    buffers = DRI2GetBuffers(pDrawable, &width, &height,
-			     attachments, stuff->count, &count);
-
-
-    send_buffers_reply(client, pDrawable, buffers, count, width, height);
-
-    return client->noClientException;
-}
-
-static int
-ProcDRI2GetBuffersWithFormat(ClientPtr client)
-{
-    REQUEST(xDRI2GetBuffersReq);
-    DrawablePtr pDrawable;
-    DRI2BufferPtr *buffers;
-    int status, width, height, count;
-    unsigned int *attachments;
-
-    REQUEST_FIXED_SIZE(xDRI2GetBuffersReq, stuff->count * (2 * 4));
-    if (!validDrawable(client, stuff->drawable, DixReadAccess | DixWriteAccess,
-		       &pDrawable, &status))
-	return status;
-
-    if (DRI2ThrottleClient(client, pDrawable))
-	return client->noClientException;
-
-    attachments = (unsigned int *) &stuff[1];
-    buffers = DRI2GetBuffersWithFormat(pDrawable, &width, &height,
-				       attachments, stuff->count, &count);
-
-    send_buffers_reply(client, pDrawable, buffers, count, width, height);
-
-    return client->noClientException;
-}
-
-static int
-ProcDRI2CopyRegion(ClientPtr client)
-{
-    REQUEST(xDRI2CopyRegionReq);
-    xDRI2CopyRegionReply rep;
-    DrawablePtr pDrawable;
-    int status;
-    RegionPtr pRegion;
-
-    REQUEST_SIZE_MATCH(xDRI2CopyRegionReq);
-
-    if (!validDrawable(client, stuff->drawable, DixWriteAccess,
-		       &pDrawable, &status))
-	return status;
-
-    VERIFY_REGION(pRegion, stuff->region, client, DixReadAccess);
-
-    status = DRI2CopyRegion(pDrawable, pRegion, stuff->dest, stuff->src);
-    if (status != Success)
-	return status;
-
-    /* CopyRegion needs to be a round trip to make sure the X server
-     * queues the swap buffer rendering commands before the DRI client
-     * continues rendering.  The reply has a bitmask to signal the
-     * presense of optional return values as well, but we're not using
-     * that yet.
-     */
-
-    rep.type = X_Reply;
-    rep.length = 0;
-    rep.sequenceNumber = client->sequence;
-
-    WriteToClient(client, sizeof(xDRI2CopyRegionReply), &rep);
-
-    return client->noClientException;
-}
-
-static void
-load_swap_reply(xDRI2SwapBuffersReply *rep, CARD64 sbc)
-{
-    rep->swap_hi = sbc >> 32;
-    rep->swap_lo = sbc & 0xffffffff;
-}
-
-static CARD64
-vals_to_card64(CARD32 lo, CARD32 hi)
-{
-    return (CARD64)hi << 32 | lo;
-}
-
-static void
-DRI2SwapEvent(ClientPtr client, void *data, int type, CARD64 ust, CARD64 msc,
-	      CARD64 sbc)
-{
-    xDRI2BufferSwapComplete event;
-    DrawablePtr pDrawable = data;
-
-    event.type = DRI2EventBase + DRI2_BufferSwapComplete;
-    event.sequenceNumber = client->sequence;
-    event.event_type = type;
-    event.drawable = pDrawable->id;
-    event.ust_hi = (CARD64)ust >> 32;
-    event.ust_lo = ust & 0xffffffff;
-    event.msc_hi = (CARD64)msc >> 32;
-    event.msc_lo = msc & 0xffffffff;
-    event.sbc_hi = (CARD64)sbc >> 32;
-    event.sbc_lo = sbc & 0xffffffff;
-
-    WriteEventsToClient(client, 1, (xEvent *)&event);
-}
-
-static int
-ProcDRI2SwapBuffers(ClientPtr client)
-{
-    REQUEST(xDRI2SwapBuffersReq);
-    xDRI2SwapBuffersReply rep;
-    DrawablePtr pDrawable;
-    CARD64 target_msc, divisor, remainder, swap_target;
-    int status;
-
-    REQUEST_SIZE_MATCH(xDRI2SwapBuffersReq);
-
-    if (!validDrawable(client, stuff->drawable,
-		       DixReadAccess | DixWriteAccess, &pDrawable, &status))
-	return status;
-
-    /*
-     * Ensures an out of control client can't exhaust our swap queue, and
-     * also orders swaps.
-     */
-    if (DRI2ThrottleClient(client, pDrawable))
-	return client->noClientException;
-
-    target_msc = vals_to_card64(stuff->target_msc_lo, stuff->target_msc_hi);
-    divisor = vals_to_card64(stuff->divisor_lo, stuff->divisor_hi);
-    remainder = vals_to_card64(stuff->remainder_lo, stuff->remainder_hi);
-
-    status = DRI2SwapBuffers(client, pDrawable, target_msc, divisor, remainder,
-			     &swap_target, DRI2SwapEvent, pDrawable);
-    if (status != Success)
-	return BadDrawable;
-
-    rep.type = X_Reply;
-    rep.length = 0;
-    rep.sequenceNumber = client->sequence;
-    load_swap_reply(&rep, swap_target);
-
-    WriteToClient(client, sizeof(xDRI2SwapBuffersReply), &rep);
-
-    return client->noClientException;
-}
-
-static void
-load_msc_reply(xDRI2MSCReply *rep, CARD64 ust, CARD64 msc, CARD64 sbc)
-{
-    rep->ust_hi = ust >> 32;
-    rep->ust_lo = ust & 0xffffffff;
-    rep->msc_hi = msc >> 32;
-    rep->msc_lo = msc & 0xffffffff;
-    rep->sbc_hi = sbc >> 32;
-    rep->sbc_lo = sbc & 0xffffffff;
-}
-
-static int
-ProcDRI2GetMSC(ClientPtr client)
-{
-    REQUEST(xDRI2GetMSCReq);
-    xDRI2MSCReply rep;
-    DrawablePtr pDrawable;
-    CARD64 ust, msc, sbc;
-    int status;
-
-    REQUEST_SIZE_MATCH(xDRI2GetMSCReq);
-
-    if (!validDrawable(client, stuff->drawable, DixReadAccess, &pDrawable,
-		       &status))
-	return status;
-
-    status = DRI2GetMSC(pDrawable, &ust, &msc, &sbc);
-    if (status != Success)
-	return status;
-
-    rep.type = X_Reply;
-    rep.length = 0;
-    rep.sequenceNumber = client->sequence;
-    load_msc_reply(&rep, ust, msc, sbc);
-
-    WriteToClient(client, sizeof(xDRI2MSCReply), &rep);
-
-    return client->noClientException;
-}
-
-static int
-ProcDRI2WaitMSC(ClientPtr client)
-{
-    REQUEST(xDRI2WaitMSCReq);
-    DrawablePtr pDrawable;
-    CARD64 target, divisor, remainder;
-    int status;
-
-    /* FIXME: in restart case, client may be gone at this point */
-
-    REQUEST_SIZE_MATCH(xDRI2WaitMSCReq);
-
-    if (!validDrawable(client, stuff->drawable, DixReadAccess, &pDrawable,
-		       &status))
-	return status;
-
-    target = vals_to_card64(stuff->target_msc_lo, stuff->target_msc_hi);
-    divisor = vals_to_card64(stuff->divisor_lo, stuff->divisor_hi);
-    remainder = vals_to_card64(stuff->remainder_lo, stuff->remainder_hi);
-
-    status = DRI2WaitMSC(client, pDrawable, target, divisor, remainder);
-    if (status != Success)
-	return status;
-
-    return client->noClientException;
-}
-
-int
-ProcDRI2WaitMSCReply(ClientPtr client, CARD64 ust, CARD64 msc, CARD64 sbc)
-{
-    xDRI2MSCReply rep;
-
-    rep.type = X_Reply;
-    rep.length = 0;
-    rep.sequenceNumber = client->sequence;
-    load_msc_reply(&rep, ust, msc, sbc);
-
-    WriteToClient(client, sizeof(xDRI2MSCReply), &rep);
-
-    return client->noClientException;
-}
-
-static int
-ProcDRI2SwapInterval(ClientPtr client)
-{
-    REQUEST(xDRI2SwapIntervalReq);
-    DrawablePtr pDrawable;
-    int status;
-
-    /* FIXME: in restart case, client may be gone at this point */
-
-    REQUEST_SIZE_MATCH(xDRI2SwapIntervalReq);
-
-    if (!validDrawable(client, stuff->drawable, DixReadAccess | DixWriteAccess,
-		       &pDrawable, &status))
-	return status;
-
-    DRI2SwapInterval(pDrawable, stuff->interval);
-
-    return client->noClientException;
-}
-
-static int
-ProcDRI2WaitSBC(ClientPtr client)
-{
-    REQUEST(xDRI2WaitSBCReq);
-    xDRI2MSCReply rep;
-    DrawablePtr pDrawable;
-    CARD64 target, ust, msc, sbc;
-    int status;
-
-    REQUEST_SIZE_MATCH(xDRI2WaitSBCReq);
-
-    if (!validDrawable(client, stuff->drawable, DixReadAccess, &pDrawable,
-		       &status))
-	return status;
-
-    target = vals_to_card64(stuff->target_sbc_lo, stuff->target_sbc_hi);
-    status = DRI2WaitSBC(client, pDrawable, target, &ust, &msc, &sbc);
-    if (status != Success)
-	return status;
-
-    rep.type = X_Reply;
-    rep.length = 0;
-    rep.sequenceNumber = client->sequence;
-    load_msc_reply(&rep, ust, msc, sbc);
-
-    WriteToClient(client, sizeof(xDRI2MSCReply), &rep);
-
-    return client->noClientException;
-}
-
-static int
-ProcDRI2Dispatch (ClientPtr client)
-{
-    REQUEST(xReq);
-    
-    switch (stuff->data) {
-    case X_DRI2QueryVersion:
-	return ProcDRI2QueryVersion(client);
-    }
-
-    if (!LocalClient(client))
-	return BadRequest;
-
-    switch (stuff->data) {
-    case X_DRI2Connect:
-	return ProcDRI2Connect(client);
-    case X_DRI2Authenticate:
-	return ProcDRI2Authenticate(client);
-    case X_DRI2CreateDrawable:
-	return ProcDRI2CreateDrawable(client);
-    case X_DRI2DestroyDrawable:
-	return ProcDRI2DestroyDrawable(client);
-    case X_DRI2GetBuffers:
-	return ProcDRI2GetBuffers(client);
-    case X_DRI2CopyRegion:
-	return ProcDRI2CopyRegion(client);
-    case X_DRI2GetBuffersWithFormat:
-	return ProcDRI2GetBuffersWithFormat(client);
-    case X_DRI2SwapBuffers:
-	return ProcDRI2SwapBuffers(client);
-    case X_DRI2GetMSC:
-	return ProcDRI2GetMSC(client);
-    case X_DRI2WaitMSC:
-	return ProcDRI2WaitMSC(client);
-    case X_DRI2WaitSBC:
-	return ProcDRI2WaitSBC(client);
-    case X_DRI2SwapInterval:
-	return ProcDRI2SwapInterval(client);
-    default:
-	return BadRequest;
-    }
-}
-
-static int
-SProcDRI2Connect(ClientPtr client)
-{
-    REQUEST(xDRI2ConnectReq);
-    xDRI2ConnectReply rep;
-    int n;
-
-    /* If the client is swapped, it's not local.  Talk to the hand. */
-
-    swaps(&stuff->length, n);
-    if (sizeof(*stuff) / 4 != client->req_len)
-	return BadLength;
-
-    rep.sequenceNumber = client->sequence;
-    swaps(&rep.sequenceNumber, n);
-    rep.length = 0;
-    rep.driverNameLength = 0;
-    rep.deviceNameLength = 0;
-
-    return client->noClientException;
-}
-
-static int
-SProcDRI2Dispatch (ClientPtr client)
-{
-    REQUEST(xReq);
-
-    /*
-     * Only local clients are allowed DRI access, but remote clients
-     * still need these requests to find out cleanly.
-     */
-    switch (stuff->data)
-    {
-    case X_DRI2QueryVersion:
-	return ProcDRI2QueryVersion(client);
-    case X_DRI2Connect:
-	return SProcDRI2Connect(client);
-    default:
-	return BadRequest;
-    }
-}
-
-int DRI2EventBase;
-
-static void
-DRI2ExtensionInit(void)
-{
-    dri2Extension = AddExtension(DRI2_NAME,
-				 DRI2NumberEvents,
-				 DRI2NumberErrors,
-				 ProcDRI2Dispatch,
-				 SProcDRI2Dispatch,
-				 NULL,
-				 StandardMinorOpcode);
-
-    DRI2EventBase = dri2Extension->eventBase;
-}
-
-extern Bool noDRI2Extension;
-
-_X_HIDDEN ExtensionModule dri2ExtensionModule = {
-    DRI2ExtensionInit,
-    DRI2_NAME,
-    &noDRI2Extension,
-    NULL,
-    NULL
-};
+/*
+ * Copyright © 2008 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Soft-
+ * ware"), to deal in the Software without restriction, including without
+ * limitation the rights to use, copy, modify, merge, publish, distribute,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, provided that the above copyright
+ * notice(s) and this permission notice appear in all copies of the Soft-
+ * ware and that both the above copyright notice(s) and this permission
+ * notice appear in supporting documentation.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
+ * ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY
+ * RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN
+ * THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSE-
+ * QUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFOR-
+ * MANCE OF THIS SOFTWARE.
+ *
+ * Except as contained in this notice, the name of a copyright holder shall
+ * not be used in advertising or otherwise to promote the sale, use or
+ * other dealings in this Software without prior written authorization of
+ * the copyright holder.
+ *
+ * Authors:
+ *   Kristian Høgsberg (krh@redhat.com)
+ */
+
+#ifdef HAVE_XORG_CONFIG_H
+#include <xorg-config.h>
+#endif
+
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include <X11/extensions/dri2proto.h>
+#include <X11/extensions/xfixeswire.h>
+#include "dixstruct.h"
+#include "scrnintstr.h"
+#include "pixmapstr.h"
+#include "extnsionst.h"
+#include "xf86drm.h"
+#include "xfixes.h"
+#include "dri2.h"
+#include "protocol-versions.h"
+
+/* The only xf86 include */
+#include "xf86Module.h"
+
+static ExtensionEntry	*dri2Extension;
+
+static Bool
+validDrawable(ClientPtr client, XID drawable, Mask access_mode,
+	      DrawablePtr *pDrawable, int *status)
+{
+    *status = dixLookupDrawable(pDrawable, drawable, client, 0, access_mode);
+    if (*status != Success) {
+	client->errorValue = drawable;
+	return FALSE;
+    }
+
+    return TRUE;
+}
+
+static int
+ProcDRI2QueryVersion(ClientPtr client)
+{
+    REQUEST(xDRI2QueryVersionReq);
+    xDRI2QueryVersionReply rep;
+    int n;
+
+    if (client->swapped)
+	swaps(&stuff->length, n);
+
+    REQUEST_SIZE_MATCH(xDRI2QueryVersionReq);
+    rep.type = X_Reply;
+    rep.length = 0;
+    rep.sequenceNumber = client->sequence;
+    rep.majorVersion = dri2_major;
+    rep.minorVersion = dri2_minor;
+
+    if (client->swapped) {
+    	swaps(&rep.sequenceNumber, n);
+    	swapl(&rep.length, n);
+	swapl(&rep.majorVersion, n);
+	swapl(&rep.minorVersion, n);
+    }
+
+    WriteToClient(client, sizeof(xDRI2QueryVersionReply), &rep);
+
+    return client->noClientException;
+}
+
+static int
+ProcDRI2Connect(ClientPtr client)
+{
+    REQUEST(xDRI2ConnectReq);
+    xDRI2ConnectReply rep;
+    DrawablePtr pDraw;
+    int fd, status;
+    const char *driverName;
+    const char *deviceName;
+
+    REQUEST_SIZE_MATCH(xDRI2ConnectReq);
+    if (!validDrawable(client, stuff->window, DixGetAttrAccess,
+		       &pDraw, &status))
+	return status;
+    
+    rep.type = X_Reply;
+    rep.length = 0;
+    rep.sequenceNumber = client->sequence;
+    rep.driverNameLength = 0;
+    rep.deviceNameLength = 0;
+
+    if (!DRI2Connect(pDraw->pScreen,
+		     stuff->driverType, &fd, &driverName, &deviceName))
+	goto fail;
+
+    rep.driverNameLength = strlen(driverName);
+    rep.deviceNameLength = strlen(deviceName);
+    rep.length = (rep.driverNameLength + 3) / 4 +
+	    (rep.deviceNameLength + 3) / 4;
+
+ fail:
+    WriteToClient(client, sizeof(xDRI2ConnectReply), &rep);
+    WriteToClient(client, rep.driverNameLength, driverName);
+    WriteToClient(client, rep.deviceNameLength, deviceName);
+
+    return client->noClientException;
+}
+
+static int
+ProcDRI2Authenticate(ClientPtr client)
+{
+    REQUEST(xDRI2AuthenticateReq);
+    xDRI2AuthenticateReply rep;
+    DrawablePtr pDraw;
+    int status;
+
+    REQUEST_SIZE_MATCH(xDRI2AuthenticateReq);
+    if (!validDrawable(client, stuff->window, DixGetAttrAccess,
+		       &pDraw, &status))
+	return status;
+
+    rep.type = X_Reply;
+    rep.sequenceNumber = client->sequence;
+    rep.length = 0;
+    rep.authenticated = DRI2Authenticate(pDraw->pScreen, stuff->magic);
+    WriteToClient(client, sizeof(xDRI2AuthenticateReply), &rep);
+
+    return client->noClientException;
+}
+
+static int
+ProcDRI2CreateDrawable(ClientPtr client)
+{
+    REQUEST(xDRI2CreateDrawableReq);
+    DrawablePtr pDrawable;
+    int status;
+
+    REQUEST_SIZE_MATCH(xDRI2CreateDrawableReq);
+
+    if (!validDrawable(client, stuff->drawable, DixAddAccess,
+		       &pDrawable, &status))
+	return status;
+
+    status = DRI2CreateDrawable(client, pDrawable, stuff->drawable);
+    if (status != Success)
+	return status;
+
+    return client->noClientException;
+}
+
+static int
+ProcDRI2DestroyDrawable(ClientPtr client)
+{
+    REQUEST(xDRI2DestroyDrawableReq);
+    DrawablePtr pDrawable;
+    int status;
+
+    REQUEST_SIZE_MATCH(xDRI2DestroyDrawableReq);
+    if (!validDrawable(client, stuff->drawable, DixRemoveAccess,
+		       &pDrawable, &status))
+	return status;
+
+    return client->noClientException;
+}
+
+
+static void
+send_buffers_reply(ClientPtr client, DrawablePtr pDrawable,
+		   DRI2BufferPtr *buffers, int count, int width, int height)
+{
+    xDRI2GetBuffersReply rep;
+    int skip = 0;
+    int i;
+
+    if (pDrawable->type == DRAWABLE_WINDOW) {
+	for (i = 0; i < count; i++) {
+	    /* Do not send the real front buffer of a window to the client.
+	     */
+	    if (buffers[i]->attachment == DRI2BufferFrontLeft) {
+		skip++;
+		continue;
+	    }
+	}
+    }
+
+    rep.type = X_Reply;
+    rep.length = (count - skip) * sizeof(xDRI2Buffer) / 4;
+    rep.sequenceNumber = client->sequence;
+    rep.width = width;
+    rep.height = height;
+    rep.count = count - skip;
+    WriteToClient(client, sizeof(xDRI2GetBuffersReply), &rep);
+
+    for (i = 0; i < count; i++) {
+	xDRI2Buffer buffer;
+
+	/* Do not send the real front buffer of a window to the client.
+	 */
+	if ((pDrawable->type == DRAWABLE_WINDOW)
+	    && (buffers[i]->attachment == DRI2BufferFrontLeft)) {
+	    continue;
+	}
+
+	buffer.attachment = buffers[i]->attachment;
+	buffer.name = buffers[i]->name;
+	buffer.pitch = buffers[i]->pitch;
+	buffer.cpp = buffers[i]->cpp;
+	buffer.flags = buffers[i]->flags;
+	WriteToClient(client, sizeof(xDRI2Buffer), &buffer);
+    }
+}
+
+
+static int
+ProcDRI2GetBuffers(ClientPtr client)
+{
+    REQUEST(xDRI2GetBuffersReq);
+    DrawablePtr pDrawable;
+    DRI2BufferPtr *buffers;
+    int status, width, height, count;
+    unsigned int *attachments;
+
+    REQUEST_FIXED_SIZE(xDRI2GetBuffersReq, stuff->count * 4);
+    if (!validDrawable(client, stuff->drawable, DixReadAccess | DixWriteAccess,
+		       &pDrawable, &status))
+	return status;
+
+    if (DRI2ThrottleClient(client, pDrawable))
+	return client->noClientException;
+
+    attachments = (unsigned int *) &stuff[1];
+    buffers = DRI2GetBuffers(pDrawable, &width, &height,
+			     attachments, stuff->count, &count);
+
+
+    send_buffers_reply(client, pDrawable, buffers, count, width, height);
+
+    return client->noClientException;
+}
+
+static int
+ProcDRI2GetBuffersWithFormat(ClientPtr client)
+{
+    REQUEST(xDRI2GetBuffersReq);
+    DrawablePtr pDrawable;
+    DRI2BufferPtr *buffers;
+    int status, width, height, count;
+    unsigned int *attachments;
+
+    REQUEST_FIXED_SIZE(xDRI2GetBuffersReq, stuff->count * (2 * 4));
+    if (!validDrawable(client, stuff->drawable, DixReadAccess | DixWriteAccess,
+		       &pDrawable, &status))
+	return status;
+
+    if (DRI2ThrottleClient(client, pDrawable))
+	return client->noClientException;
+
+    attachments = (unsigned int *) &stuff[1];
+    buffers = DRI2GetBuffersWithFormat(pDrawable, &width, &height,
+				       attachments, stuff->count, &count);
+
+    send_buffers_reply(client, pDrawable, buffers, count, width, height);
+
+    return client->noClientException;
+}
+
+static int
+ProcDRI2CopyRegion(ClientPtr client)
+{
+    REQUEST(xDRI2CopyRegionReq);
+    xDRI2CopyRegionReply rep;
+    DrawablePtr pDrawable;
+    int status;
+    RegionPtr pRegion;
+
+    REQUEST_SIZE_MATCH(xDRI2CopyRegionReq);
+
+    if (!validDrawable(client, stuff->drawable, DixWriteAccess,
+		       &pDrawable, &status))
+	return status;
+
+    VERIFY_REGION(pRegion, stuff->region, client, DixReadAccess);
+
+    status = DRI2CopyRegion(pDrawable, pRegion, stuff->dest, stuff->src);
+    if (status != Success)
+	return status;
+
+    /* CopyRegion needs to be a round trip to make sure the X server
+     * queues the swap buffer rendering commands before the DRI client
+     * continues rendering.  The reply has a bitmask to signal the
+     * presense of optional return values as well, but we're not using
+     * that yet.
+     */
+
+    rep.type = X_Reply;
+    rep.length = 0;
+    rep.sequenceNumber = client->sequence;
+
+    WriteToClient(client, sizeof(xDRI2CopyRegionReply), &rep);
+
+    return client->noClientException;
+}
+
+static void
+load_swap_reply(xDRI2SwapBuffersReply *rep, CARD64 sbc)
+{
+    rep->swap_hi = sbc >> 32;
+    rep->swap_lo = sbc & 0xffffffff;
+}
+
+static CARD64
+vals_to_card64(CARD32 lo, CARD32 hi)
+{
+    return (CARD64)hi << 32 | lo;
+}
+
+static void
+DRI2SwapEvent(ClientPtr client, void *data, int type, CARD64 ust, CARD64 msc,
+	      CARD64 sbc)
+{
+    xDRI2BufferSwapComplete event;
+    DrawablePtr pDrawable = data;
+
+    event.type = DRI2EventBase + DRI2_BufferSwapComplete;
+    event.sequenceNumber = client->sequence;
+    event.event_type = type;
+    event.drawable = pDrawable->id;
+    event.ust_hi = (CARD64)ust >> 32;
+    event.ust_lo = ust & 0xffffffff;
+    event.msc_hi = (CARD64)msc >> 32;
+    event.msc_lo = msc & 0xffffffff;
+    event.sbc_hi = (CARD64)sbc >> 32;
+    event.sbc_lo = sbc & 0xffffffff;
+
+    WriteEventsToClient(client, 1, (xEvent *)&event);
+}
+
+static int
+ProcDRI2SwapBuffers(ClientPtr client)
+{
+    REQUEST(xDRI2SwapBuffersReq);
+    xDRI2SwapBuffersReply rep;
+    DrawablePtr pDrawable;
+    CARD64 target_msc, divisor, remainder, swap_target;
+    int status;
+
+    REQUEST_SIZE_MATCH(xDRI2SwapBuffersReq);
+
+    if (!validDrawable(client, stuff->drawable,
+		       DixReadAccess | DixWriteAccess, &pDrawable, &status))
+	return status;
+
+    /*
+     * Ensures an out of control client can't exhaust our swap queue, and
+     * also orders swaps.
+     */
+    if (DRI2ThrottleClient(client, pDrawable))
+	return client->noClientException;
+
+    target_msc = vals_to_card64(stuff->target_msc_lo, stuff->target_msc_hi);
+    divisor = vals_to_card64(stuff->divisor_lo, stuff->divisor_hi);
+    remainder = vals_to_card64(stuff->remainder_lo, stuff->remainder_hi);
+
+    status = DRI2SwapBuffers(client, pDrawable, target_msc, divisor, remainder,
+			     &swap_target, DRI2SwapEvent, pDrawable);
+    if (status != Success)
+	return BadDrawable;
+
+    rep.type = X_Reply;
+    rep.length = 0;
+    rep.sequenceNumber = client->sequence;
+    load_swap_reply(&rep, swap_target);
+
+    WriteToClient(client, sizeof(xDRI2SwapBuffersReply), &rep);
+
+    return client->noClientException;
+}
+
+static void
+load_msc_reply(xDRI2MSCReply *rep, CARD64 ust, CARD64 msc, CARD64 sbc)
+{
+    rep->ust_hi = ust >> 32;
+    rep->ust_lo = ust & 0xffffffff;
+    rep->msc_hi = msc >> 32;
+    rep->msc_lo = msc & 0xffffffff;
+    rep->sbc_hi = sbc >> 32;
+    rep->sbc_lo = sbc & 0xffffffff;
+}
+
+static int
+ProcDRI2GetMSC(ClientPtr client)
+{
+    REQUEST(xDRI2GetMSCReq);
+    xDRI2MSCReply rep;
+    DrawablePtr pDrawable;
+    CARD64 ust, msc, sbc;
+    int status;
+
+    REQUEST_SIZE_MATCH(xDRI2GetMSCReq);
+
+    if (!validDrawable(client, stuff->drawable, DixReadAccess, &pDrawable,
+		       &status))
+	return status;
+
+    status = DRI2GetMSC(pDrawable, &ust, &msc, &sbc);
+    if (status != Success)
+	return status;
+
+    rep.type = X_Reply;
+    rep.length = 0;
+    rep.sequenceNumber = client->sequence;
+    load_msc_reply(&rep, ust, msc, sbc);
+
+    WriteToClient(client, sizeof(xDRI2MSCReply), &rep);
+
+    return client->noClientException;
+}
+
+static int
+ProcDRI2WaitMSC(ClientPtr client)
+{
+    REQUEST(xDRI2WaitMSCReq);
+    DrawablePtr pDrawable;
+    CARD64 target, divisor, remainder;
+    int status;
+
+    /* FIXME: in restart case, client may be gone at this point */
+
+    REQUEST_SIZE_MATCH(xDRI2WaitMSCReq);
+
+    if (!validDrawable(client, stuff->drawable, DixReadAccess, &pDrawable,
+		       &status))
+	return status;
+
+    target = vals_to_card64(stuff->target_msc_lo, stuff->target_msc_hi);
+    divisor = vals_to_card64(stuff->divisor_lo, stuff->divisor_hi);
+    remainder = vals_to_card64(stuff->remainder_lo, stuff->remainder_hi);
+
+    status = DRI2WaitMSC(client, pDrawable, target, divisor, remainder);
+    if (status != Success)
+	return status;
+
+    return client->noClientException;
+}
+
+int
+ProcDRI2WaitMSCReply(ClientPtr client, CARD64 ust, CARD64 msc, CARD64 sbc)
+{
+    xDRI2MSCReply rep;
+
+    rep.type = X_Reply;
+    rep.length = 0;
+    rep.sequenceNumber = client->sequence;
+    load_msc_reply(&rep, ust, msc, sbc);
+
+    WriteToClient(client, sizeof(xDRI2MSCReply), &rep);
+
+    return client->noClientException;
+}
+
+static int
+ProcDRI2SwapInterval(ClientPtr client)
+{
+    REQUEST(xDRI2SwapIntervalReq);
+    DrawablePtr pDrawable;
+    int status;
+
+    /* FIXME: in restart case, client may be gone at this point */
+
+    REQUEST_SIZE_MATCH(xDRI2SwapIntervalReq);
+
+    if (!validDrawable(client, stuff->drawable, DixReadAccess | DixWriteAccess,
+		       &pDrawable, &status))
+	return status;
+
+    DRI2SwapInterval(pDrawable, stuff->interval);
+
+    return client->noClientException;
+}
+
+static int
+ProcDRI2WaitSBC(ClientPtr client)
+{
+    REQUEST(xDRI2WaitSBCReq);
+    xDRI2MSCReply rep;
+    DrawablePtr pDrawable;
+    CARD64 target, ust, msc, sbc;
+    int status;
+
+    REQUEST_SIZE_MATCH(xDRI2WaitSBCReq);
+
+    if (!validDrawable(client, stuff->drawable, DixReadAccess, &pDrawable,
+		       &status))
+	return status;
+
+    target = vals_to_card64(stuff->target_sbc_lo, stuff->target_sbc_hi);
+    status = DRI2WaitSBC(client, pDrawable, target, &ust, &msc, &sbc);
+    if (status != Success)
+	return status;
+
+    rep.type = X_Reply;
+    rep.length = 0;
+    rep.sequenceNumber = client->sequence;
+    load_msc_reply(&rep, ust, msc, sbc);
+
+    WriteToClient(client, sizeof(xDRI2MSCReply), &rep);
+
+    return client->noClientException;
+}
+
+static int
+ProcDRI2Dispatch (ClientPtr client)
+{
+    REQUEST(xReq);
+    
+    switch (stuff->data) {
+    case X_DRI2QueryVersion:
+	return ProcDRI2QueryVersion(client);
+    }
+
+    if (!LocalClient(client))
+	return BadRequest;
+
+    switch (stuff->data) {
+    case X_DRI2Connect:
+	return ProcDRI2Connect(client);
+    case X_DRI2Authenticate:
+	return ProcDRI2Authenticate(client);
+    case X_DRI2CreateDrawable:
+	return ProcDRI2CreateDrawable(client);
+    case X_DRI2DestroyDrawable:
+	return ProcDRI2DestroyDrawable(client);
+    case X_DRI2GetBuffers:
+	return ProcDRI2GetBuffers(client);
+    case X_DRI2CopyRegion:
+	return ProcDRI2CopyRegion(client);
+    case X_DRI2GetBuffersWithFormat:
+	return ProcDRI2GetBuffersWithFormat(client);
+    case X_DRI2SwapBuffers:
+	return ProcDRI2SwapBuffers(client);
+    case X_DRI2GetMSC:
+	return ProcDRI2GetMSC(client);
+    case X_DRI2WaitMSC:
+	return ProcDRI2WaitMSC(client);
+    case X_DRI2WaitSBC:
+	return ProcDRI2WaitSBC(client);
+    case X_DRI2SwapInterval:
+	return ProcDRI2SwapInterval(client);
+    default:
+	return BadRequest;
+    }
+}
+
+static int
+SProcDRI2Connect(ClientPtr client)
+{
+    REQUEST(xDRI2ConnectReq);
+    xDRI2ConnectReply rep;
+    int n;
+
+    /* If the client is swapped, it's not local.  Talk to the hand. */
+
+    swaps(&stuff->length, n);
+    if (sizeof(*stuff) / 4 != client->req_len)
+	return BadLength;
+
+    rep.sequenceNumber = client->sequence;
+    swaps(&rep.sequenceNumber, n);
+    rep.length = 0;
+    rep.driverNameLength = 0;
+    rep.deviceNameLength = 0;
+
+    return client->noClientException;
+}
+
+static int
+SProcDRI2Dispatch (ClientPtr client)
+{
+    REQUEST(xReq);
+
+    /*
+     * Only local clients are allowed DRI access, but remote clients
+     * still need these requests to find out cleanly.
+     */
+    switch (stuff->data)
+    {
+    case X_DRI2QueryVersion:
+	return ProcDRI2QueryVersion(client);
+    case X_DRI2Connect:
+	return SProcDRI2Connect(client);
+    default:
+	return BadRequest;
+    }
+}
+
+int DRI2EventBase;
+
+static void
+DRI2ExtensionInit(void)
+{
+    dri2Extension = AddExtension(DRI2_NAME,
+				 DRI2NumberEvents,
+				 DRI2NumberErrors,
+				 ProcDRI2Dispatch,
+				 SProcDRI2Dispatch,
+				 NULL,
+				 StandardMinorOpcode);
+
+    DRI2EventBase = dri2Extension->eventBase;
+}
+
+extern Bool noDRI2Extension;
+
+_X_HIDDEN ExtensionModule dri2ExtensionModule = {
+    DRI2ExtensionInit,
+    DRI2_NAME,
+    &noDRI2Extension,
+    NULL,
+    NULL
+};
diff --git a/xorg-server/hw/xfree86/modes/xf86Cursors.c b/xorg-server/hw/xfree86/modes/xf86Cursors.c
index f90ecc227..3e765e6ff 100644
--- a/xorg-server/hw/xfree86/modes/xf86Cursors.c
+++ b/xorg-server/hw/xfree86/modes/xf86Cursors.c
@@ -1,672 +1,672 @@
-/*
- * Copyright © 2007 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that copyright
- * notice and this permission notice appear in supporting documentation, and
- * that the name of the copyright holders not be used in advertising or
- * publicity pertaining to distribution of the software without specific,
- * written prior permission.  The copyright holders make no representations
- * about the suitability of this software for any purpose.  It is provided "as
- * is" without express or implied warranty.
- *
- * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- */
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#else
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-#endif
-
-#include <stddef.h>
-#include <string.h>
-#include <stdio.h>
-
-#include "xf86.h"
-#include "xf86DDC.h"
-#include "xf86Crtc.h"
-#include "xf86Modes.h"
-#include "xf86RandR12.h"
-#include "xf86CursorPriv.h"
-#include "X11/extensions/render.h"
-#include "X11/extensions/dpmsconst.h"
-#include "X11/Xatom.h"
-#include "picturestr.h"
-#include "cursorstr.h"
-#include "inputstr.h"
-
-/*
- * Given a screen coordinate, rotate back to a cursor source coordinate
- */
-static void
-xf86_crtc_rotate_coord (Rotation    rotation,
-			int	    width,
-			int	    height,
-			int	    x_dst,
-			int	    y_dst,
-			int	    *x_src,
-			int	    *y_src)
-{
-    int t;
-    
-    switch (rotation & 0xf) {
-    case RR_Rotate_0:
-	break;
-    case RR_Rotate_90:
-	t = x_dst;
-	x_dst = height - y_dst - 1;
-	y_dst = t;
-	break;
-    case RR_Rotate_180:
-	x_dst = width - x_dst - 1;
-	y_dst = height - y_dst - 1;
-	break;
-    case RR_Rotate_270:
-	t = x_dst;
-	x_dst = y_dst;
-	y_dst = width - t - 1;
-	break;
-    }
-    if (rotation & RR_Reflect_X)
-	x_dst = width - x_dst - 1;
-    if (rotation & RR_Reflect_Y)
-	y_dst = height - y_dst - 1;
-    *x_src = x_dst;
-    *y_src = y_dst;
-}
-
-/*
- * Given a cursor source  coordinate, rotate to a screen coordinate
- */
-static void
-xf86_crtc_rotate_coord_back (Rotation    rotation,
-			     int	    width,
-			     int	    height,
-			     int	    x_dst,
-			     int	    y_dst,
-			     int	    *x_src,
-			     int	    *y_src)
-{
-    int t;
-    
-    if (rotation & RR_Reflect_X)
-	x_dst = width - x_dst - 1;
-    if (rotation & RR_Reflect_Y)
-	y_dst = height - y_dst - 1;
-
-    switch (rotation & 0xf) {
-    case RR_Rotate_0:
-	break;
-    case RR_Rotate_90:
-	t = x_dst;
-	x_dst = y_dst;
-	y_dst = width - t - 1;
-	break;
-    case RR_Rotate_180:
-	x_dst = width - x_dst - 1;
-	y_dst = height - y_dst - 1;
-	break;
-    case RR_Rotate_270:
-	t = x_dst;
-	x_dst = height - y_dst - 1;
-	y_dst = t;
-	break;
-    }
-    *x_src = x_dst;
-    *y_src = y_dst;
-}
-
-/*
- * Convert an x coordinate to a position within the cursor bitmap
- */
-static int
-cursor_bitpos (int flags, int x, Bool mask)
-{
-    if (flags & HARDWARE_CURSOR_SWAP_SOURCE_AND_MASK)
-	mask = !mask;
-    if (flags & HARDWARE_CURSOR_NIBBLE_SWAPPED)
-	x = (x & ~3) | (3 - (x & 3));
-    if (((flags & HARDWARE_CURSOR_BIT_ORDER_MSBFIRST) == 0) ==
-	(X_BYTE_ORDER == X_BIG_ENDIAN))
-	x = (x & ~7) | (7 - (x & 7));
-    if (flags & HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_1)
-	x = (x << 1) + mask;
-    else if (flags & HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_8)
-	x = ((x & ~7) << 1) | (mask << 3) | (x & 7);
-    else if (flags & HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_16)
-	x = ((x & ~15) << 1) | (mask << 4) | (x & 15);
-    else if (flags & HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_32)
-	x = ((x & ~31) << 1) | (mask << 5) | (x & 31);
-    else if (flags & HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_64)
-	x = ((x & ~63) << 1) | (mask << 6) | (x & 63);
-    return x;
-}
-
-/*
- * Fetch one bit from a cursor bitmap
- */
-static CARD8
-get_bit (CARD8 *image, int stride, int flags, int x, int y, Bool mask)
-{
-    x = cursor_bitpos (flags, x, mask);
-    image += y * stride;
-    return (image[(x >> 3)] >> (x & 7)) & 1;
-}
-
-/*
- * Set one bit in a cursor bitmap
- */
-static void
-set_bit (CARD8 *image, int stride, int flags, int x, int y, Bool mask)
-{
-    x = cursor_bitpos (flags, x, mask);
-    image += y * stride;
-    image[(x >> 3)] |= 1 << (x & 7);
-}
-    
-/*
- * Load a two color cursor into a driver that supports only ARGB cursors
- */
-static void
-xf86_crtc_convert_cursor_to_argb (xf86CrtcPtr crtc, unsigned char *src)
-{
-    ScrnInfoPtr		scrn = crtc->scrn;
-    xf86CrtcConfigPtr   xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
-    xf86CursorInfoPtr	cursor_info = xf86_config->cursor_info;
-    CARD32		*cursor_image = (CARD32 *) xf86_config->cursor_image;
-    int			x, y;
-    int			xin, yin;
-    int			stride = cursor_info->MaxWidth >> 2;
-    int			flags = cursor_info->Flags;
-    CARD32		bits;
-
-#ifdef ARGB_CURSOR
-    crtc->cursor_argb = FALSE;
-#endif
-
-    for (y = 0; y < cursor_info->MaxHeight; y++)
-	for (x = 0; x < cursor_info->MaxWidth; x++) 
-	{
-	    xf86_crtc_rotate_coord (crtc->rotation,
-				    cursor_info->MaxWidth,
-				    cursor_info->MaxHeight,
-				    x, y, &xin, &yin);
-	    if (get_bit (src, stride, flags, xin, yin, TRUE) ==
-		((flags & HARDWARE_CURSOR_INVERT_MASK) == 0))
-	    {
-		if (get_bit (src, stride, flags, xin, yin, FALSE))
-		    bits = xf86_config->cursor_fg;
-		else
-		    bits = xf86_config->cursor_bg;
-	    }
-	    else
-		bits = 0;
-	    cursor_image[y * cursor_info->MaxWidth + x] = bits;
-	}
-    crtc->funcs->load_cursor_argb (crtc, cursor_image);
-}
-
-/*
- * Set the colors for a two-color cursor (ignore for ARGB cursors)
- */
-static void
-xf86_set_cursor_colors (ScrnInfoPtr scrn, int bg, int fg)
-{
-    ScreenPtr		screen = scrn->pScreen;
-    xf86CrtcConfigPtr   xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
-    CursorPtr		cursor = xf86_config->cursor;
-    int			c;
-    CARD8		*bits = cursor ?
-#if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(7,0,0,0,0)
-        dixLookupPrivate(&cursor->devPrivates, CursorScreenKey(screen))
-#else
-        cursor->devPriv[screen->myNum]
-#endif
-      : NULL;
-
-    /* Save ARGB versions of these colors */
-    xf86_config->cursor_fg = (CARD32) fg | 0xff000000;
-    xf86_config->cursor_bg = (CARD32) bg | 0xff000000;
-    
-    for (c = 0; c < xf86_config->num_crtc; c++)
-    {
-	xf86CrtcPtr crtc = xf86_config->crtc[c];
-
-	if (crtc->enabled && !crtc->cursor_argb)
-	{
-	    if (crtc->funcs->load_cursor_image)
-		crtc->funcs->set_cursor_colors (crtc, bg, fg);
-	    else if (bits)
-		xf86_crtc_convert_cursor_to_argb (crtc, bits);
-	}
-    }
-}
-
-static void
-xf86_crtc_hide_cursor (xf86CrtcPtr crtc)
-{
-    if (crtc->cursor_shown)
-    {
-	crtc->funcs->hide_cursor (crtc);
-	crtc->cursor_shown = FALSE;
-    }
-}
-
-void
-xf86_hide_cursors (ScrnInfoPtr scrn)
-{
-    xf86CrtcConfigPtr   xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
-    int			c;
-
-    xf86_config->cursor_on = FALSE;
-    for (c = 0; c < xf86_config->num_crtc; c++)
-    {
-	xf86CrtcPtr crtc = xf86_config->crtc[c];
-
-	if (crtc->enabled)
-	    xf86_crtc_hide_cursor (crtc);
-    }
-}
-    
-static void
-xf86_crtc_show_cursor (xf86CrtcPtr crtc)
-{
-    if (!crtc->cursor_shown && crtc->cursor_in_range)
-    {
-	crtc->funcs->show_cursor (crtc);
-	crtc->cursor_shown = TRUE;
-    }
-}
-
-void
-xf86_show_cursors (ScrnInfoPtr scrn)
-{
-    xf86CrtcConfigPtr   xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
-    int			c;
-
-    xf86_config->cursor_on = TRUE;
-    for (c = 0; c < xf86_config->num_crtc; c++)
-    {
-	xf86CrtcPtr crtc = xf86_config->crtc[c];
-
-	if (crtc->enabled)
-	    xf86_crtc_show_cursor (crtc);
-    }
-}
-    
-static void
-xf86_crtc_set_cursor_position (xf86CrtcPtr crtc, int x, int y)
-{
-    ScrnInfoPtr		scrn = crtc->scrn;
-    xf86CrtcConfigPtr   xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
-    xf86CursorInfoPtr	cursor_info = xf86_config->cursor_info;
-    DisplayModePtr	mode = &crtc->mode;
-    Bool		in_range;
-    int			dx, dy;
-
-    /*
-     * Transform position of cursor on screen
-     */
-    if (crtc->transform_in_use)
-    {
-	ScreenPtr	screen = scrn->pScreen;
-	xf86CursorScreenPtr ScreenPriv =
-	    (xf86CursorScreenPtr)dixLookupPrivate(&screen->devPrivates,
-						  xf86CursorScreenKey);
-	struct pict_f_vector   v;
-
-	v.v[0] = x + ScreenPriv->HotX; v.v[1] = y + ScreenPriv->HotY; v.v[2] = 1;
-	pixman_f_transform_point (&crtc->f_framebuffer_to_crtc, &v);
-	x = floor (v.v[0] + 0.5);
-	y = floor (v.v[1] + 0.5);
-	/*
-	 * Transform position of cursor upper left corner
-	 */
-	xf86_crtc_rotate_coord_back (crtc->rotation,
-				     cursor_info->MaxWidth,
-				     cursor_info->MaxHeight,
-				     ScreenPriv->HotX, ScreenPriv->HotY, &dx, &dy);
-	x -= dx;
-	y -= dy;
-   }
-    else
-    {
-	x -= crtc->x;
-	y -= crtc->y;
-    }
-
-    /*
-     * Disable the cursor when it is outside the viewport
-     */
-    in_range = TRUE;
-    if (x >= mode->HDisplay || y >= mode->VDisplay ||
-	x <= -cursor_info->MaxWidth || y <= -cursor_info->MaxHeight) 
-    {
-	in_range = FALSE;
-	x = 0;
-	y = 0;
-    }
-
-    crtc->cursor_in_range = in_range;
-    
-    if (in_range)
-    {
-	crtc->funcs->set_cursor_position (crtc, x, y);
-	xf86_crtc_show_cursor (crtc);
-    }
-    else
-	xf86_crtc_hide_cursor (crtc);
-}
-
-static void
-xf86_set_cursor_position (ScrnInfoPtr scrn, int x, int y)
-{
-    xf86CrtcConfigPtr   xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
-    int			c;
-
-    /* undo what xf86HWCurs did to the coordinates */
-    x += scrn->frameX0;
-    y += scrn->frameY0;
-    for (c = 0; c < xf86_config->num_crtc; c++)
-    {
-	xf86CrtcPtr crtc = xf86_config->crtc[c];
-
-	if (crtc->enabled)
-	    xf86_crtc_set_cursor_position (crtc, x, y);
-    }
-}
-    
-/*
- * Load a two-color cursor into a crtc, performing rotation as needed
- */
-static void
-xf86_crtc_load_cursor_image (xf86CrtcPtr crtc, CARD8 *src)
-{
-    ScrnInfoPtr		scrn = crtc->scrn;
-    xf86CrtcConfigPtr   xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
-    xf86CursorInfoPtr	cursor_info = xf86_config->cursor_info;
-    CARD8		*cursor_image;
-
-#ifdef ARGB_CURSOR
-    crtc->cursor_argb = FALSE;
-#endif
-
-    if (crtc->rotation == RR_Rotate_0)
-	cursor_image = src;
-    else
-    {
-        int x, y;
-    	int xin, yin;
-	int stride = cursor_info->MaxWidth >> 2;
-	int flags = cursor_info->Flags;
-	
-	cursor_image = xf86_config->cursor_image;
-	memset(cursor_image, 0, cursor_info->MaxHeight * stride);
-	
-        for (y = 0; y < cursor_info->MaxHeight; y++)
-	    for (x = 0; x < cursor_info->MaxWidth; x++) 
-	    {
-		xf86_crtc_rotate_coord (crtc->rotation,
-					cursor_info->MaxWidth,
-					cursor_info->MaxHeight,
-					x, y, &xin, &yin);
-		if (get_bit(src, stride, flags, xin, yin, FALSE))
-		    set_bit(cursor_image, stride, flags, x, y, FALSE);
-		if (get_bit(src, stride, flags, xin, yin, TRUE))
-		    set_bit(cursor_image, stride, flags, x, y, TRUE);
-	    }
-    }
-    crtc->funcs->load_cursor_image (crtc, cursor_image);
-}
-    
-/*
- * Load a cursor image into all active CRTCs
- */
-static void
-xf86_load_cursor_image (ScrnInfoPtr scrn, unsigned char *src)
-{
-    xf86CrtcConfigPtr   xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
-    int			c;
-
-    for (c = 0; c < xf86_config->num_crtc; c++)
-    {
-	xf86CrtcPtr crtc = xf86_config->crtc[c];
-
-	if (crtc->enabled)
-	{
-	    if (crtc->funcs->load_cursor_image)
-		xf86_crtc_load_cursor_image (crtc, src);
-	    else if (crtc->funcs->load_cursor_argb)
-		xf86_crtc_convert_cursor_to_argb (crtc, src);
-	}
-    }
-}
-
-static Bool
-xf86_use_hw_cursor (ScreenPtr screen, CursorPtr cursor)
-{
-    ScrnInfoPtr		scrn = xf86Screens[screen->myNum];
-    xf86CrtcConfigPtr   xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
-    xf86CursorInfoPtr	cursor_info = xf86_config->cursor_info;
-
-    ++cursor->refcnt;
-    if (xf86_config->cursor)
-	FreeCursor (xf86_config->cursor, None);
-    xf86_config->cursor = cursor;
-
-    if (cursor->bits->width > cursor_info->MaxWidth ||
-	cursor->bits->height> cursor_info->MaxHeight)
-	return FALSE;
-
-    return TRUE;
-}
-
-static Bool
-xf86_use_hw_cursor_argb (ScreenPtr screen, CursorPtr cursor)
-{
-    ScrnInfoPtr		scrn = xf86Screens[screen->myNum];
-    xf86CrtcConfigPtr   xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
-    xf86CursorInfoPtr	cursor_info = xf86_config->cursor_info;
-    
-    ++cursor->refcnt;
-    if (xf86_config->cursor)
-	FreeCursor (xf86_config->cursor, None);
-    xf86_config->cursor = cursor;
-    
-    /* Make sure ARGB support is available */
-    if ((cursor_info->Flags & HARDWARE_CURSOR_ARGB) == 0)
-	return FALSE;
-    
-    if (cursor->bits->width > cursor_info->MaxWidth ||
-	cursor->bits->height> cursor_info->MaxHeight)
-	return FALSE;
-
-    return TRUE;
-}
-
-static void
-xf86_crtc_load_cursor_argb (xf86CrtcPtr crtc, CursorPtr cursor)
-{
-    ScrnInfoPtr		scrn = crtc->scrn;
-    xf86CrtcConfigPtr   xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
-    xf86CursorInfoPtr	cursor_info = xf86_config->cursor_info;
-    CARD32		*cursor_image = (CARD32 *) xf86_config->cursor_image;
-    CARD32		*cursor_source = (CARD32 *) cursor->bits->argb;
-    int			x, y;
-    int			xin, yin;
-    CARD32		bits;
-    int			source_width = cursor->bits->width;
-    int			source_height = cursor->bits->height;
-    int			image_width = cursor_info->MaxWidth;
-    int			image_height = cursor_info->MaxHeight;
-    
-    for (y = 0; y < image_height; y++)
-	for (x = 0; x < image_width; x++)
-	{
-	    xf86_crtc_rotate_coord (crtc->rotation, image_width, image_height,
-				    x, y, &xin, &yin);
-	    if (xin < source_width && yin < source_height)
-		bits = cursor_source[yin * source_width + xin];
-	    else
-		bits = 0;
-	    cursor_image[y * image_width + x] = bits;
-	}
-    
-    crtc->funcs->load_cursor_argb (crtc, cursor_image);
-}
-
-static void
-xf86_load_cursor_argb (ScrnInfoPtr scrn, CursorPtr cursor)
-{
-    xf86CrtcConfigPtr   xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
-    int			c;
-
-    for (c = 0; c < xf86_config->num_crtc; c++)
-    {
-	xf86CrtcPtr crtc = xf86_config->crtc[c];
-
-	if (crtc->enabled)
-	    xf86_crtc_load_cursor_argb (crtc, cursor);
-    }
-}
-
-Bool
-xf86_cursors_init (ScreenPtr screen, int max_width, int max_height, int flags)
-{
-    ScrnInfoPtr		scrn = xf86Screens[screen->myNum];
-    xf86CrtcConfigPtr   xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
-    xf86CursorInfoPtr	cursor_info;
-
-    cursor_info = xf86CreateCursorInfoRec();
-    if (!cursor_info)
-	return FALSE;
-
-    xf86_config->cursor_image = xalloc (max_width * max_height * 4);
-
-    if (!xf86_config->cursor_image)
-    {
-	xf86DestroyCursorInfoRec (cursor_info);
-	return FALSE;
-    }
-	
-    xf86_config->cursor_info = cursor_info;
-
-    cursor_info->MaxWidth = max_width;
-    cursor_info->MaxHeight = max_height;
-    cursor_info->Flags = flags;
-
-    cursor_info->SetCursorColors = xf86_set_cursor_colors;
-    cursor_info->SetCursorPosition = xf86_set_cursor_position;
-    cursor_info->LoadCursorImage = xf86_load_cursor_image;
-    cursor_info->HideCursor = xf86_hide_cursors;
-    cursor_info->ShowCursor = xf86_show_cursors;
-    cursor_info->UseHWCursor = xf86_use_hw_cursor;
-#ifdef ARGB_CURSOR
-    if (flags & HARDWARE_CURSOR_ARGB)
-    {
-	cursor_info->UseHWCursorARGB = xf86_use_hw_cursor_argb;
-	cursor_info->LoadCursorARGB = xf86_load_cursor_argb;
-    }
-#endif
-    
-    xf86_config->cursor = NULL;
-    xf86_hide_cursors (scrn);
-    
-    return xf86InitCursor (screen, cursor_info);
-}
-
-/**
- * Called when anything on the screen is reconfigured.
- *
- * Reloads cursor images as needed, then adjusts cursor positions
- */
-
-void
-xf86_reload_cursors (ScreenPtr screen)
-{
-    ScrnInfoPtr		scrn;
-    xf86CrtcConfigPtr   xf86_config;
-    xf86CursorInfoPtr   cursor_info;
-    CursorPtr		cursor;
-    int			x, y;
-    xf86CursorScreenPtr cursor_screen_priv;
-    
-    /* initial mode setting will not have set a screen yet.
-       May be called before the devices are initialised.
-     */
-    if (!screen || !inputInfo.pointer)
-	return;
-    cursor_screen_priv = dixLookupPrivate(&screen->devPrivates,
-					  xf86CursorScreenKey);
-    /* return if HW cursor is inactive, to avoid displaying two cursors */
-    if (!cursor_screen_priv->isUp)
-	return;
-
-    scrn = xf86Screens[screen->myNum];
-    xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
-
-    /* make sure the cursor code has been initialized */
-    cursor_info = xf86_config->cursor_info;
-    if (!cursor_info)
-	return;
-
-    cursor = xf86_config->cursor;
-    GetSpritePosition (inputInfo.pointer, &x, &y);
-    if (!(cursor_info->Flags & HARDWARE_CURSOR_UPDATE_UNHIDDEN))
-	(*cursor_info->HideCursor)(scrn);
-
-    if (cursor)
-    {
-#if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(7,0,0,0,0)
-	void *src = dixLookupPrivate(&cursor->devPrivates, CursorScreenKey(screen));
-#else
-	void *src = cursor->devPriv[screen->myNum];
-#endif
-#ifdef ARGB_CURSOR
-	if (cursor->bits->argb && cursor_info->LoadCursorARGB)
-	    (*cursor_info->LoadCursorARGB) (scrn, cursor);
-	else if (src)
-#endif
-	    (*cursor_info->LoadCursorImage)(scrn, src);
-
-	x += scrn->frameX0 + cursor_screen_priv->HotX;
-	y += scrn->frameY0 + cursor_screen_priv->HotY;
-	(*cursor_info->SetCursorPosition)(scrn, x, y);
-    }
-}
-
-/**
- * Clean up CRTC-based cursor code
- */
-void
-xf86_cursors_fini (ScreenPtr screen)
-{
-    ScrnInfoPtr		scrn = xf86Screens[screen->myNum];
-    xf86CrtcConfigPtr   xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
-    
-    if (xf86_config->cursor_info)
-    {
-	xf86DestroyCursorInfoRec (xf86_config->cursor_info);
-	xf86_config->cursor_info = NULL;
-    }
-    if (xf86_config->cursor_image)
-    {
-	xfree (xf86_config->cursor_image);
-	xf86_config->cursor_image = NULL;
-    }
-    if (xf86_config->cursor)
-    {
-	FreeCursor (xf86_config->cursor, None);
-	xf86_config->cursor = NULL;
-    }
-}
+/*
+ * Copyright © 2007 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that copyright
+ * notice and this permission notice appear in supporting documentation, and
+ * that the name of the copyright holders not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  The copyright holders make no representations
+ * about the suitability of this software for any purpose.  It is provided "as
+ * is" without express or implied warranty.
+ *
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#ifdef HAVE_XORG_CONFIG_H
+#include <xorg-config.h>
+#else
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#endif
+
+#include <stddef.h>
+#include <string.h>
+#include <stdio.h>
+
+#include "xf86.h"
+#include "xf86DDC.h"
+#include "xf86Crtc.h"
+#include "xf86Modes.h"
+#include "xf86RandR12.h"
+#include "xf86CursorPriv.h"
+#include "X11/extensions/render.h"
+#include "X11/extensions/dpmsconst.h"
+#include "X11/Xatom.h"
+#include "picturestr.h"
+#include "cursorstr.h"
+#include "inputstr.h"
+
+/*
+ * Given a screen coordinate, rotate back to a cursor source coordinate
+ */
+static void
+xf86_crtc_rotate_coord (Rotation    rotation,
+			int	    width,
+			int	    height,
+			int	    x_dst,
+			int	    y_dst,
+			int	    *x_src,
+			int	    *y_src)
+{
+    int t;
+    
+    switch (rotation & 0xf) {
+    case RR_Rotate_0:
+	break;
+    case RR_Rotate_90:
+	t = x_dst;
+	x_dst = height - y_dst - 1;
+	y_dst = t;
+	break;
+    case RR_Rotate_180:
+	x_dst = width - x_dst - 1;
+	y_dst = height - y_dst - 1;
+	break;
+    case RR_Rotate_270:
+	t = x_dst;
+	x_dst = y_dst;
+	y_dst = width - t - 1;
+	break;
+    }
+    if (rotation & RR_Reflect_X)
+	x_dst = width - x_dst - 1;
+    if (rotation & RR_Reflect_Y)
+	y_dst = height - y_dst - 1;
+    *x_src = x_dst;
+    *y_src = y_dst;
+}
+
+/*
+ * Given a cursor source  coordinate, rotate to a screen coordinate
+ */
+static void
+xf86_crtc_rotate_coord_back (Rotation    rotation,
+			     int	    width,
+			     int	    height,
+			     int	    x_dst,
+			     int	    y_dst,
+			     int	    *x_src,
+			     int	    *y_src)
+{
+    int t;
+    
+    if (rotation & RR_Reflect_X)
+	x_dst = width - x_dst - 1;
+    if (rotation & RR_Reflect_Y)
+	y_dst = height - y_dst - 1;
+
+    switch (rotation & 0xf) {
+    case RR_Rotate_0:
+	break;
+    case RR_Rotate_90:
+	t = x_dst;
+	x_dst = y_dst;
+	y_dst = width - t - 1;
+	break;
+    case RR_Rotate_180:
+	x_dst = width - x_dst - 1;
+	y_dst = height - y_dst - 1;
+	break;
+    case RR_Rotate_270:
+	t = x_dst;
+	x_dst = height - y_dst - 1;
+	y_dst = t;
+	break;
+    }
+    *x_src = x_dst;
+    *y_src = y_dst;
+}
+
+/*
+ * Convert an x coordinate to a position within the cursor bitmap
+ */
+static int
+cursor_bitpos (int flags, int x, Bool mask)
+{
+    if (flags & HARDWARE_CURSOR_SWAP_SOURCE_AND_MASK)
+	mask = !mask;
+    if (flags & HARDWARE_CURSOR_NIBBLE_SWAPPED)
+	x = (x & ~3) | (3 - (x & 3));
+    if (((flags & HARDWARE_CURSOR_BIT_ORDER_MSBFIRST) == 0) ==
+	(X_BYTE_ORDER == X_BIG_ENDIAN))
+	x = (x & ~7) | (7 - (x & 7));
+    if (flags & HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_1)
+	x = (x << 1) + mask;
+    else if (flags & HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_8)
+	x = ((x & ~7) << 1) | (mask << 3) | (x & 7);
+    else if (flags & HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_16)
+	x = ((x & ~15) << 1) | (mask << 4) | (x & 15);
+    else if (flags & HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_32)
+	x = ((x & ~31) << 1) | (mask << 5) | (x & 31);
+    else if (flags & HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_64)
+	x = ((x & ~63) << 1) | (mask << 6) | (x & 63);
+    return x;
+}
+
+/*
+ * Fetch one bit from a cursor bitmap
+ */
+static CARD8
+get_bit (CARD8 *image, int stride, int flags, int x, int y, Bool mask)
+{
+    x = cursor_bitpos (flags, x, mask);
+    image += y * stride;
+    return (image[(x >> 3)] >> (x & 7)) & 1;
+}
+
+/*
+ * Set one bit in a cursor bitmap
+ */
+static void
+set_bit (CARD8 *image, int stride, int flags, int x, int y, Bool mask)
+{
+    x = cursor_bitpos (flags, x, mask);
+    image += y * stride;
+    image[(x >> 3)] |= 1 << (x & 7);
+}
+    
+/*
+ * Load a two color cursor into a driver that supports only ARGB cursors
+ */
+static void
+xf86_crtc_convert_cursor_to_argb (xf86CrtcPtr crtc, unsigned char *src)
+{
+    ScrnInfoPtr		scrn = crtc->scrn;
+    xf86CrtcConfigPtr   xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
+    xf86CursorInfoPtr	cursor_info = xf86_config->cursor_info;
+    CARD32		*cursor_image = (CARD32 *) xf86_config->cursor_image;
+    int			x, y;
+    int			xin, yin;
+    int			stride = cursor_info->MaxWidth >> 2;
+    int			flags = cursor_info->Flags;
+    CARD32		bits;
+
+#ifdef ARGB_CURSOR
+    crtc->cursor_argb = FALSE;
+#endif
+
+    for (y = 0; y < cursor_info->MaxHeight; y++)
+	for (x = 0; x < cursor_info->MaxWidth; x++) 
+	{
+	    xf86_crtc_rotate_coord (crtc->rotation,
+				    cursor_info->MaxWidth,
+				    cursor_info->MaxHeight,
+				    x, y, &xin, &yin);
+	    if (get_bit (src, stride, flags, xin, yin, TRUE) ==
+		((flags & HARDWARE_CURSOR_INVERT_MASK) == 0))
+	    {
+		if (get_bit (src, stride, flags, xin, yin, FALSE))
+		    bits = xf86_config->cursor_fg;
+		else
+		    bits = xf86_config->cursor_bg;
+	    }
+	    else
+		bits = 0;
+	    cursor_image[y * cursor_info->MaxWidth + x] = bits;
+	}
+    crtc->funcs->load_cursor_argb (crtc, cursor_image);
+}
+
+/*
+ * Set the colors for a two-color cursor (ignore for ARGB cursors)
+ */
+static void
+xf86_set_cursor_colors (ScrnInfoPtr scrn, int bg, int fg)
+{
+    ScreenPtr		screen = scrn->pScreen;
+    xf86CrtcConfigPtr   xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
+    CursorPtr		cursor = xf86_config->cursor;
+    int			c;
+    CARD8		*bits = cursor ?
+#if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(7,0,0,0,0)
+        dixLookupPrivate(&cursor->devPrivates, CursorScreenKey(screen))
+#else
+        cursor->devPriv[screen->myNum]
+#endif
+      : NULL;
+
+    /* Save ARGB versions of these colors */
+    xf86_config->cursor_fg = (CARD32) fg | 0xff000000;
+    xf86_config->cursor_bg = (CARD32) bg | 0xff000000;
+    
+    for (c = 0; c < xf86_config->num_crtc; c++)
+    {
+	xf86CrtcPtr crtc = xf86_config->crtc[c];
+
+	if (crtc->enabled && !crtc->cursor_argb)
+	{
+	    if (crtc->funcs->load_cursor_image)
+		crtc->funcs->set_cursor_colors (crtc, bg, fg);
+	    else if (bits)
+		xf86_crtc_convert_cursor_to_argb (crtc, bits);
+	}
+    }
+}
+
+static void
+xf86_crtc_hide_cursor (xf86CrtcPtr crtc)
+{
+    if (crtc->cursor_shown)
+    {
+	crtc->funcs->hide_cursor (crtc);
+	crtc->cursor_shown = FALSE;
+    }
+}
+
+void
+xf86_hide_cursors (ScrnInfoPtr scrn)
+{
+    xf86CrtcConfigPtr   xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
+    int			c;
+
+    xf86_config->cursor_on = FALSE;
+    for (c = 0; c < xf86_config->num_crtc; c++)
+    {
+	xf86CrtcPtr crtc = xf86_config->crtc[c];
+
+	if (crtc->enabled)
+	    xf86_crtc_hide_cursor (crtc);
+    }
+}
+    
+static void
+xf86_crtc_show_cursor (xf86CrtcPtr crtc)
+{
+    if (!crtc->cursor_shown && crtc->cursor_in_range)
+    {
+	crtc->funcs->show_cursor (crtc);
+	crtc->cursor_shown = TRUE;
+    }
+}
+
+void
+xf86_show_cursors (ScrnInfoPtr scrn)
+{
+    xf86CrtcConfigPtr   xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
+    int			c;
+
+    xf86_config->cursor_on = TRUE;
+    for (c = 0; c < xf86_config->num_crtc; c++)
+    {
+	xf86CrtcPtr crtc = xf86_config->crtc[c];
+
+	if (crtc->enabled)
+	    xf86_crtc_show_cursor (crtc);
+    }
+}
+    
+static void
+xf86_crtc_set_cursor_position (xf86CrtcPtr crtc, int x, int y)
+{
+    ScrnInfoPtr		scrn = crtc->scrn;
+    xf86CrtcConfigPtr   xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
+    xf86CursorInfoPtr	cursor_info = xf86_config->cursor_info;
+    DisplayModePtr	mode = &crtc->mode;
+    Bool		in_range;
+    int			dx, dy;
+
+    /*
+     * Transform position of cursor on screen
+     */
+    if (crtc->transform_in_use)
+    {
+	ScreenPtr	screen = scrn->pScreen;
+	xf86CursorScreenPtr ScreenPriv =
+	    (xf86CursorScreenPtr)dixLookupPrivate(&screen->devPrivates,
+						  xf86CursorScreenKey);
+	struct pict_f_vector   v;
+
+	v.v[0] = x + ScreenPriv->HotX; v.v[1] = y + ScreenPriv->HotY; v.v[2] = 1;
+	pixman_f_transform_point (&crtc->f_framebuffer_to_crtc, &v);
+	x = floor (v.v[0] + 0.5);
+	y = floor (v.v[1] + 0.5);
+	/*
+	 * Transform position of cursor upper left corner
+	 */
+	xf86_crtc_rotate_coord_back (crtc->rotation,
+				     cursor_info->MaxWidth,
+				     cursor_info->MaxHeight,
+				     ScreenPriv->HotX, ScreenPriv->HotY, &dx, &dy);
+	x -= dx;
+	y -= dy;
+   }
+    else
+    {
+	x -= crtc->x;
+	y -= crtc->y;
+    }
+
+    /*
+     * Disable the cursor when it is outside the viewport
+     */
+    in_range = TRUE;
+    if (x >= mode->HDisplay || y >= mode->VDisplay ||
+	x <= -cursor_info->MaxWidth || y <= -cursor_info->MaxHeight) 
+    {
+	in_range = FALSE;
+	x = 0;
+	y = 0;
+    }
+
+    crtc->cursor_in_range = in_range;
+    
+    if (in_range)
+    {
+	crtc->funcs->set_cursor_position (crtc, x, y);
+	xf86_crtc_show_cursor (crtc);
+    }
+    else
+	xf86_crtc_hide_cursor (crtc);
+}
+
+static void
+xf86_set_cursor_position (ScrnInfoPtr scrn, int x, int y)
+{
+    xf86CrtcConfigPtr   xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
+    int			c;
+
+    /* undo what xf86HWCurs did to the coordinates */
+    x += scrn->frameX0;
+    y += scrn->frameY0;
+    for (c = 0; c < xf86_config->num_crtc; c++)
+    {
+	xf86CrtcPtr crtc = xf86_config->crtc[c];
+
+	if (crtc->enabled)
+	    xf86_crtc_set_cursor_position (crtc, x, y);
+    }
+}
+    
+/*
+ * Load a two-color cursor into a crtc, performing rotation as needed
+ */
+static void
+xf86_crtc_load_cursor_image (xf86CrtcPtr crtc, CARD8 *src)
+{
+    ScrnInfoPtr		scrn = crtc->scrn;
+    xf86CrtcConfigPtr   xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
+    xf86CursorInfoPtr	cursor_info = xf86_config->cursor_info;
+    CARD8		*cursor_image;
+
+#ifdef ARGB_CURSOR
+    crtc->cursor_argb = FALSE;
+#endif
+
+    if (crtc->rotation == RR_Rotate_0)
+	cursor_image = src;
+    else
+    {
+        int x, y;
+    	int xin, yin;
+	int stride = cursor_info->MaxWidth >> 2;
+	int flags = cursor_info->Flags;
+	
+	cursor_image = xf86_config->cursor_image;
+	memset(cursor_image, 0, cursor_info->MaxHeight * stride);
+	
+        for (y = 0; y < cursor_info->MaxHeight; y++)
+	    for (x = 0; x < cursor_info->MaxWidth; x++) 
+	    {
+		xf86_crtc_rotate_coord (crtc->rotation,
+					cursor_info->MaxWidth,
+					cursor_info->MaxHeight,
+					x, y, &xin, &yin);
+		if (get_bit(src, stride, flags, xin, yin, FALSE))
+		    set_bit(cursor_image, stride, flags, x, y, FALSE);
+		if (get_bit(src, stride, flags, xin, yin, TRUE))
+		    set_bit(cursor_image, stride, flags, x, y, TRUE);
+	    }
+    }
+    crtc->funcs->load_cursor_image (crtc, cursor_image);
+}
+    
+/*
+ * Load a cursor image into all active CRTCs
+ */
+static void
+xf86_load_cursor_image (ScrnInfoPtr scrn, unsigned char *src)
+{
+    xf86CrtcConfigPtr   xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
+    int			c;
+
+    for (c = 0; c < xf86_config->num_crtc; c++)
+    {
+	xf86CrtcPtr crtc = xf86_config->crtc[c];
+
+	if (crtc->enabled)
+	{
+	    if (crtc->funcs->load_cursor_image)
+		xf86_crtc_load_cursor_image (crtc, src);
+	    else if (crtc->funcs->load_cursor_argb)
+		xf86_crtc_convert_cursor_to_argb (crtc, src);
+	}
+    }
+}
+
+static Bool
+xf86_use_hw_cursor (ScreenPtr screen, CursorPtr cursor)
+{
+    ScrnInfoPtr		scrn = xf86Screens[screen->myNum];
+    xf86CrtcConfigPtr   xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
+    xf86CursorInfoPtr	cursor_info = xf86_config->cursor_info;
+
+    ++cursor->refcnt;
+    if (xf86_config->cursor)
+	FreeCursor (xf86_config->cursor, None);
+    xf86_config->cursor = cursor;
+
+    if (cursor->bits->width > cursor_info->MaxWidth ||
+	cursor->bits->height> cursor_info->MaxHeight)
+	return FALSE;
+
+    return TRUE;
+}
+
+static Bool
+xf86_use_hw_cursor_argb (ScreenPtr screen, CursorPtr cursor)
+{
+    ScrnInfoPtr		scrn = xf86Screens[screen->myNum];
+    xf86CrtcConfigPtr   xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
+    xf86CursorInfoPtr	cursor_info = xf86_config->cursor_info;
+    
+    ++cursor->refcnt;
+    if (xf86_config->cursor)
+	FreeCursor (xf86_config->cursor, None);
+    xf86_config->cursor = cursor;
+    
+    /* Make sure ARGB support is available */
+    if ((cursor_info->Flags & HARDWARE_CURSOR_ARGB) == 0)
+	return FALSE;
+    
+    if (cursor->bits->width > cursor_info->MaxWidth ||
+	cursor->bits->height> cursor_info->MaxHeight)
+	return FALSE;
+
+    return TRUE;
+}
+
+static void
+xf86_crtc_load_cursor_argb (xf86CrtcPtr crtc, CursorPtr cursor)
+{
+    ScrnInfoPtr		scrn = crtc->scrn;
+    xf86CrtcConfigPtr   xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
+    xf86CursorInfoPtr	cursor_info = xf86_config->cursor_info;
+    CARD32		*cursor_image = (CARD32 *) xf86_config->cursor_image;
+    CARD32		*cursor_source = (CARD32 *) cursor->bits->argb;
+    int			x, y;
+    int			xin, yin;
+    CARD32		bits;
+    int			source_width = cursor->bits->width;
+    int			source_height = cursor->bits->height;
+    int			image_width = cursor_info->MaxWidth;
+    int			image_height = cursor_info->MaxHeight;
+    
+    for (y = 0; y < image_height; y++)
+	for (x = 0; x < image_width; x++)
+	{
+	    xf86_crtc_rotate_coord (crtc->rotation, image_width, image_height,
+				    x, y, &xin, &yin);
+	    if (xin < source_width && yin < source_height)
+		bits = cursor_source[yin * source_width + xin];
+	    else
+		bits = 0;
+	    cursor_image[y * image_width + x] = bits;
+	}
+    
+    crtc->funcs->load_cursor_argb (crtc, cursor_image);
+}
+
+static void
+xf86_load_cursor_argb (ScrnInfoPtr scrn, CursorPtr cursor)
+{
+    xf86CrtcConfigPtr   xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
+    int			c;
+
+    for (c = 0; c < xf86_config->num_crtc; c++)
+    {
+	xf86CrtcPtr crtc = xf86_config->crtc[c];
+
+	if (crtc->enabled)
+	    xf86_crtc_load_cursor_argb (crtc, cursor);
+    }
+}
+
+Bool
+xf86_cursors_init (ScreenPtr screen, int max_width, int max_height, int flags)
+{
+    ScrnInfoPtr		scrn = xf86Screens[screen->myNum];
+    xf86CrtcConfigPtr   xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
+    xf86CursorInfoPtr	cursor_info;
+
+    cursor_info = xf86CreateCursorInfoRec();
+    if (!cursor_info)
+	return FALSE;
+
+    xf86_config->cursor_image = xalloc (max_width * max_height * 4);
+
+    if (!xf86_config->cursor_image)
+    {
+	xf86DestroyCursorInfoRec (cursor_info);
+	return FALSE;
+    }
+	
+    xf86_config->cursor_info = cursor_info;
+
+    cursor_info->MaxWidth = max_width;
+    cursor_info->MaxHeight = max_height;
+    cursor_info->Flags = flags;
+
+    cursor_info->SetCursorColors = xf86_set_cursor_colors;
+    cursor_info->SetCursorPosition = xf86_set_cursor_position;
+    cursor_info->LoadCursorImage = xf86_load_cursor_image;
+    cursor_info->HideCursor = xf86_hide_cursors;
+    cursor_info->ShowCursor = xf86_show_cursors;
+    cursor_info->UseHWCursor = xf86_use_hw_cursor;
+#ifdef ARGB_CURSOR
+    if (flags & HARDWARE_CURSOR_ARGB)
+    {
+	cursor_info->UseHWCursorARGB = xf86_use_hw_cursor_argb;
+	cursor_info->LoadCursorARGB = xf86_load_cursor_argb;
+    }
+#endif
+    
+    xf86_config->cursor = NULL;
+    xf86_hide_cursors (scrn);
+    
+    return xf86InitCursor (screen, cursor_info);
+}
+
+/**
+ * Called when anything on the screen is reconfigured.
+ *
+ * Reloads cursor images as needed, then adjusts cursor positions
+ */
+
+void
+xf86_reload_cursors (ScreenPtr screen)
+{
+    ScrnInfoPtr		scrn;
+    xf86CrtcConfigPtr   xf86_config;
+    xf86CursorInfoPtr   cursor_info;
+    CursorPtr		cursor;
+    int			x, y;
+    xf86CursorScreenPtr cursor_screen_priv;
+    
+    /* initial mode setting will not have set a screen yet.
+       May be called before the devices are initialised.
+     */
+    if (!screen || !inputInfo.pointer)
+	return;
+    cursor_screen_priv = dixLookupPrivate(&screen->devPrivates,
+					  xf86CursorScreenKey);
+    /* return if HW cursor is inactive, to avoid displaying two cursors */
+    if (!cursor_screen_priv || !cursor_screen_priv->isUp)
+	return;
+
+    scrn = xf86Screens[screen->myNum];
+    xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
+
+    /* make sure the cursor code has been initialized */
+    cursor_info = xf86_config->cursor_info;
+    if (!cursor_info)
+	return;
+
+    cursor = xf86_config->cursor;
+    GetSpritePosition (inputInfo.pointer, &x, &y);
+    if (!(cursor_info->Flags & HARDWARE_CURSOR_UPDATE_UNHIDDEN))
+	(*cursor_info->HideCursor)(scrn);
+
+    if (cursor)
+    {
+#if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(7,0,0,0,0)
+	void *src = dixLookupPrivate(&cursor->devPrivates, CursorScreenKey(screen));
+#else
+	void *src = cursor->devPriv[screen->myNum];
+#endif
+#ifdef ARGB_CURSOR
+	if (cursor->bits->argb && cursor_info->LoadCursorARGB)
+	    (*cursor_info->LoadCursorARGB) (scrn, cursor);
+	else if (src)
+#endif
+	    (*cursor_info->LoadCursorImage)(scrn, src);
+
+	x += scrn->frameX0 + cursor_screen_priv->HotX;
+	y += scrn->frameY0 + cursor_screen_priv->HotY;
+	(*cursor_info->SetCursorPosition)(scrn, x, y);
+    }
+}
+
+/**
+ * Clean up CRTC-based cursor code
+ */
+void
+xf86_cursors_fini (ScreenPtr screen)
+{
+    ScrnInfoPtr		scrn = xf86Screens[screen->myNum];
+    xf86CrtcConfigPtr   xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
+    
+    if (xf86_config->cursor_info)
+    {
+	xf86DestroyCursorInfoRec (xf86_config->cursor_info);
+	xf86_config->cursor_info = NULL;
+    }
+    if (xf86_config->cursor_image)
+    {
+	xfree (xf86_config->cursor_image);
+	xf86_config->cursor_image = NULL;
+    }
+    if (xf86_config->cursor)
+    {
+	FreeCursor (xf86_config->cursor, None);
+	xf86_config->cursor = NULL;
+    }
+}
diff --git a/xorg-server/hw/xquartz/GL/indirect.c b/xorg-server/hw/xquartz/GL/indirect.c
index ad9ebbdac..e56dac1a1 100644
--- a/xorg-server/hw/xquartz/GL/indirect.c
+++ b/xorg-server/hw/xquartz/GL/indirect.c
@@ -1,1639 +1,1641 @@
-/*
- * GLX implementation that uses Apple's OpenGL.framework
- * (Indirect rendering path -- it's also used for some direct mode code too)
- *
- * Copyright (c) 2007, 2008, 2009 Apple Inc.
- * Copyright (c) 2004 Torrey T. Lyons. All Rights Reserved.
- * Copyright (c) 2002 Greg Parker. All Rights Reserved.
- *
- * Portions of this file are copied from Mesa's xf86glx.c,
- * which contains the following copyright:
- *
- * Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include "dri.h"
-
-#include <AvailabilityMacros.h>
-
-#define GL_GLEXT_WUNDEF_SUPPORT
-
-#include <OpenGL/OpenGL.h>
-#include <OpenGL/gl.h>
-#include <OpenGL/glext.h>
-#include <OpenGL/CGLContext.h>
-
-/* These next few GL_EXT pre-processing blocks are to explicitly define 
- * these symbols to 0 if they are not set by OpenGL.framework.  This
- * prevents the X11 glext.h from setting them to 1.
- */
-
-#ifndef GL_EXT_fragment_shader
-#define GL_EXT_fragment_shader 0
-#endif
-
-#ifndef GL_EXT_blend_equation_separate
-#define GL_EXT_blend_equation_separate 0
-#endif
-
-#ifndef GL_EXT_blend_func_separate
-#define GL_EXT_blend_func_separate 0
-#endif
-
-#ifndef GL_EXT_depth_bounds_test
-#define GL_EXT_depth_bounds_test 0
-#endif
-
-#ifndef GL_EXT_compiled_vertex_array
-#define GL_EXT_compiled_vertex_array 0
-#endif
-
-#ifndef GL_EXT_cull_vertex
-#define GL_EXT_cull_vertex 0
-#endif
-
-#ifndef GL_EXT_fog_coord
-#define GL_EXT_fog_coord 0
-#endif
-
-#ifndef GL_EXT_framebuffer_blit
-#define GL_EXT_framebuffer_blit 0
-#endif
-
-#ifndef GL_EXT_framebuffer_object
-#define GL_EXT_framebuffer_object 0
-#endif
-
-#ifndef GL_EXT_gpu_program_parameters
-#define GL_EXT_gpu_program_parameters 0
-#endif
-
-#ifndef GL_EXT_multi_draw_arrays
-#define GL_EXT_multi_draw_arrays 0
-#endif
-
-#ifndef GL_EXT_point_parameters
-#define GL_EXT_point_parameters 0
-#endif
-
-#ifndef GL_EXT_polygon_offset
-#define GL_EXT_polygon_offset 0
-#endif
-
-#ifndef GL_EXT_secondary_color
-#define GL_EXT_secondary_color 0
-#endif
-
-#ifndef GL_EXT_stencil_two_side
-#define GL_EXT_stencil_two_side 0
-#endif
-
-#ifndef GL_EXT_timer_query
-#define GL_EXT_timer_query 0
-#endif
-
-#ifndef GL_EXT_vertex_array
-#define GL_EXT_vertex_array 0
-#endif
-
-/* Tiger PPC doesn't have the associated symbols, but glext.h says it does.  Liars!
- * http://trac.macports.org/ticket/20638
- */
-#if defined(__ppc__) && MAC_OS_X_VERSION_MIN_REQUIRED < 1050
-#undef GL_EXT_gpu_program_parameters
-#define GL_EXT_gpu_program_parameters 0
-#endif
-
-#include <GL/glxproto.h>
-#include <windowstr.h>
-#include <resource.h>
-#include <GL/glxint.h>
-#include <GL/glxtokens.h>
-#include <scrnintstr.h>
-#include <glxserver.h>
-#include <glxscreens.h>
-#include <glxdrawable.h>
-#include <glxcontext.h>
-#include <glxext.h>
-#include <glxutil.h>
-#include <glxscreens.h>
-#include <GL/internal/glcore.h>
-#include "x-hash.h"
-#include "x-list.h"
-
-//#include "capabilities.h"
-#include "visualConfigs.h"
-
-typedef unsigned long long GLuint64EXT;
-typedef long long GLint64EXT;
-#include <dispatch.h>
-#include <Xplugin.h>
-#include <glapi.h>
-#include <glapitable.h>
-
-__GLXprovider * GlxGetDRISWrastProvider (void);
-
-// Write debugging output, or not
-#ifdef GLAQUA_DEBUG
-#define GLAQUA_DEBUG_MSG ErrorF
-#else
-#define GLAQUA_DEBUG_MSG(a, ...)
-#endif
-
-static void setup_dispatch_table(void);
-GLuint __glFloorLog2(GLuint val);
-void warn_func(void * p1, char *format, ...);
-
-// some prototypes
-static __GLXscreen * __glXAquaScreenProbe(ScreenPtr pScreen);
-static __GLXdrawable * __glXAquaScreenCreateDrawable(__GLXscreen *screen, DrawablePtr pDraw, int type, XID drawId, __GLXconfig *conf);
-
-static void __glXAquaContextDestroy(__GLXcontext *baseContext);
-static int __glXAquaContextMakeCurrent(__GLXcontext *baseContext);
-static int __glXAquaContextLoseCurrent(__GLXcontext *baseContext);
-static int __glXAquaContextForceCurrent(__GLXcontext *baseContext);
-static int __glXAquaContextCopy(__GLXcontext *baseDst, __GLXcontext *baseSrc, unsigned long mask);
-
-static CGLPixelFormatObj makeFormat(__GLXconfig *conf);
-
-__GLXprovider __glXDRISWRastProvider = {
-    __glXAquaScreenProbe,
-    "Core OpenGL",
-    NULL
-};
-
-typedef struct __GLXAquaScreen   __GLXAquaScreen;
-typedef struct __GLXAquaContext  __GLXAquaContext;
-typedef struct __GLXAquaDrawable __GLXAquaDrawable;
-
-struct __GLXAquaScreen {
-    __GLXscreen base;
-    int index;
-    int num_vis;
-};
-
-struct __GLXAquaContext {
-    __GLXcontext base;
-    CGLContextObj ctx;
-    CGLPixelFormatObj pixelFormat;
-    xp_surface_id sid;
-    unsigned isAttached :1;
-};
-
-struct __GLXAquaDrawable {
-    __GLXdrawable base;
-    DrawablePtr pDraw;
-    xp_surface_id sid;
-    __GLXAquaContext *context;
-};
-
-
-static __GLXcontext *
-__glXAquaScreenCreateContext(__GLXscreen *screen,
-			     __GLXconfig *conf,
-			     __GLXcontext *baseShareContext)
-{
-    __GLXAquaContext *context;
-    __GLXAquaContext *shareContext = (__GLXAquaContext *) baseShareContext;
-    CGLError gl_err;
-  
-    GLAQUA_DEBUG_MSG("glXAquaScreenCreateContext\n");
-    
-    context = xcalloc(1, sizeof (__GLXAquaContext));
-    
-    if (context == NULL)
-	return NULL;
-
-    memset(context, 0, sizeof *context);
-    
-    context->base.pGlxScreen = screen;
-    
-    context->base.destroy        = __glXAquaContextDestroy;
-    context->base.makeCurrent    = __glXAquaContextMakeCurrent;
-    context->base.loseCurrent    = __glXAquaContextLoseCurrent;
-    context->base.copy           = __glXAquaContextCopy;
-    context->base.forceCurrent   = __glXAquaContextForceCurrent;
-    /*FIXME verify that the context->base is fully initialized. */
-    
-    context->pixelFormat = makeFormat(conf);
-    
-    if (!context->pixelFormat) {
-        xfree(context);
-        return NULL;
-    }
-
-    context->ctx = NULL;
-    gl_err = CGLCreateContext(context->pixelFormat,
-			      shareContext ? shareContext->ctx : NULL,
-			      &context->ctx);
-    
-    if (gl_err != 0) {
-	ErrorF("CGLCreateContext error: %s\n", CGLErrorString(gl_err));
-	CGLDestroyPixelFormat(context->pixelFormat);
-	xfree(context);
-	return NULL;
-    }
-    
-    setup_dispatch_table();
-    GLAQUA_DEBUG_MSG("glAquaCreateContext done\n");
-    
-    return &context->base;
-}
-
-/* maps from surface id -> list of __GLcontext */
-static x_hash_table *surface_hash;
-
-static void __glXAquaContextDestroy(__GLXcontext *baseContext) {
-    x_list *lst;
-
-    __GLXAquaContext *context = (__GLXAquaContext *) baseContext;
-    
-    GLAQUA_DEBUG_MSG("glAquaContextDestroy (ctx 0x%x)\n",
-                     (unsigned int) baseContext);
-    if (context != NULL) {
-      if (context->sid != 0 && surface_hash != NULL) {
-		lst = x_hash_table_lookup(surface_hash, x_cvt_uint_to_vptr(context->sid), NULL);
-		lst = x_list_remove(lst, context);
-		x_hash_table_insert(surface_hash, x_cvt_uint_to_vptr(context->sid), lst);
-      }
-
-      if (context->ctx != NULL)
-	  CGLDestroyContext(context->ctx);
-
-      if (context->pixelFormat != NULL)
-	  CGLDestroyPixelFormat(context->pixelFormat);
-      
-      xfree(context);
-    }
-}
-
-static int __glXAquaContextLoseCurrent(__GLXcontext *baseContext) {
-    CGLError gl_err;
-
-    GLAQUA_DEBUG_MSG("glAquaLoseCurrent (ctx 0x%p)\n", baseContext);
-
-    gl_err = CGLSetCurrentContext(NULL);
-    if (gl_err != 0)
-      ErrorF("CGLSetCurrentContext error: %s\n", CGLErrorString(gl_err));
-
-    __glXLastContext = NULL; // Mesa does this; why?
-
-    return GL_TRUE;
-}
-
-/* Called when a surface is destroyed as a side effect of destroying
-   the window it's attached to. */
-static void surface_notify(void *_arg, void *data) {
-    DRISurfaceNotifyArg *arg = (DRISurfaceNotifyArg *)_arg;
-    __GLXAquaDrawable *draw = (__GLXAquaDrawable *)data;
-    __GLXAquaContext *context;
-    x_list *lst;
-    if(_arg == NULL || data == NULL) {
-	    ErrorF("surface_notify called with bad params");
-	    return;
-    }
-	
-    GLAQUA_DEBUG_MSG("surface_notify(%p, %p)\n", _arg, data);
-    switch (arg->kind) {
-    case AppleDRISurfaceNotifyDestroyed:
-        if (surface_hash != NULL)
-            x_hash_table_remove(surface_hash, x_cvt_uint_to_vptr(arg->id));
-	draw->base.pDraw = NULL;
-	draw->sid = 0;
-        break;
-
-    case AppleDRISurfaceNotifyChanged:
-        if (surface_hash != NULL) {
-            lst = x_hash_table_lookup(surface_hash, x_cvt_uint_to_vptr(arg->id), NULL);
-            for (; lst != NULL; lst = lst->next)
-		{
-                context = lst->data;
-                xp_update_gl_context(context->ctx);
-            }
-        }
-        break;
-    default:
-	ErrorF("surface_notify: unknown kind %d\n", arg->kind);
-	break;
-    }
-}
-
-static BOOL attach(__GLXAquaContext *context, __GLXAquaDrawable *draw) {
-    DrawablePtr pDraw;
-    
-    GLAQUA_DEBUG_MSG("attach(%p, %p)\n", context, draw);
-	
-    if(NULL == context || NULL == draw)
-	return TRUE;
-
-    pDraw = draw->base.pDraw;
-
-    if(NULL == pDraw) {
-	ErrorF("%s:%s() pDraw is NULL!\n", __FILE__, __func__);
-	return TRUE;
-    }
-
-    if (draw->sid == 0) {
-	//if (!quartzProcs->CreateSurface(pDraw->pScreen, pDraw->id, pDraw,
-        if (!DRICreateSurface(pDraw->pScreen, pDraw->id, pDraw,
-			      0, &draw->sid, NULL,
-			      surface_notify, draw))
-            return TRUE;
-        draw->pDraw = pDraw;
-    } 
-    
-    if (!context->isAttached || context->sid != draw->sid) {
-        x_list *lst;
-	
-        if (xp_attach_gl_context(context->ctx, draw->sid) != Success) {
-	    //quartzProcs->DestroySurface(pDraw->pScreen, pDraw->id, pDraw,
-            DRIDestroySurface(pDraw->pScreen, pDraw->id, pDraw,
-			      surface_notify, draw);
-            if (surface_hash != NULL)
-                x_hash_table_remove(surface_hash, x_cvt_uint_to_vptr(draw->sid));
-	    
-            draw->sid = 0;
-            return TRUE;
-        }
-	
-        context->isAttached = TRUE;
-        context->sid = draw->sid;
-	
-        if (surface_hash == NULL)
-            surface_hash = x_hash_table_new(NULL, NULL, NULL, NULL);
-	
-        lst = x_hash_table_lookup(surface_hash, x_cvt_uint_to_vptr(context->sid), NULL);
-        if (x_list_find(lst, context) == NULL) {
-            lst = x_list_prepend(lst, context);
-            x_hash_table_insert(surface_hash, x_cvt_uint_to_vptr(context->sid), lst);
-        }
-	
-	
-
-        GLAQUA_DEBUG_MSG("attached 0x%x to 0x%x\n", (unsigned int) pDraw->id,
-                         (unsigned int) draw->sid);
-    } 
-
-    draw->context = context;
-
-    return FALSE;
-}
-
-#if 0     // unused
-static void unattach(__GLXAquaContext *context) {
-	x_list *lst;
-	GLAQUA_DEBUG_MSG("unattach\n");
-	if (context == NULL) {
-		ErrorF("Tried to unattach a null context\n");
-		return;
-	}
-    if (context->isAttached) {
-        GLAQUA_DEBUG_MSG("unattaching\n");
-
-        if (surface_hash != NULL) {
-            lst = x_hash_table_lookup(surface_hash, (void *) context->sid, NULL);
-            lst = x_list_remove(lst, context);
-            x_hash_table_insert(surface_hash, (void *) context->sid, lst);
-        }
-
-        CGLClearDrawable(context->ctx);
-        context->isAttached = FALSE;
-        context->sid = 0;
-    }
-}
-#endif
-
-static int __glXAquaContextMakeCurrent(__GLXcontext *baseContext) {
-    CGLError gl_err;
-    __GLXAquaContext *context = (__GLXAquaContext *) baseContext;
-    __GLXAquaDrawable *drawPriv = (__GLXAquaDrawable *) context->base.drawPriv;
-    
-    GLAQUA_DEBUG_MSG("glAquaMakeCurrent (ctx 0x%p)\n", baseContext);
-    
-    if(attach(context, drawPriv))
-	return /*error*/ 0;
-
-    gl_err = CGLSetCurrentContext(context->ctx);
-    if (gl_err != 0)
-        ErrorF("CGLSetCurrentContext error: %s\n", CGLErrorString(gl_err));
-    
-    return gl_err == 0;
-}
-
-static int __glXAquaContextCopy(__GLXcontext *baseDst, __GLXcontext *baseSrc, unsigned long mask)
-{
-    CGLError gl_err;
-
-    __GLXAquaContext *dst = (__GLXAquaContext *) baseDst;
-    __GLXAquaContext *src = (__GLXAquaContext *) baseSrc;
-
-    GLAQUA_DEBUG_MSG("GLXAquaContextCopy\n");
-
-    gl_err = CGLCopyContext(src->ctx, dst->ctx, mask);
-    if (gl_err != 0)
-        ErrorF("CGLCopyContext error: %s\n", CGLErrorString(gl_err));
-
-    return gl_err == 0;
-}
-
-static int __glXAquaContextForceCurrent(__GLXcontext *baseContext)
-{
-    CGLError gl_err;
-    __GLXAquaContext *context = (__GLXAquaContext *) baseContext;
-    GLAQUA_DEBUG_MSG("glAquaForceCurrent (ctx %p)\n", context->ctx);
-
-    gl_err = CGLSetCurrentContext(context->ctx);
-    if (gl_err != 0)
-        ErrorF("CGLSetCurrentContext error: %s\n", CGLErrorString(gl_err));
-
-    return gl_err == 0;
-}
-
-/* Drawing surface notification callbacks */
-static GLboolean __glXAquaDrawableSwapBuffers(ClientPtr client, __GLXdrawable *base) {
-    CGLError err;
-    __GLXAquaDrawable *drawable;
- 
-    //    GLAQUA_DEBUG_MSG("glAquaDrawableSwapBuffers(%p)\n",base);
-	
-    if(!base) {
-	ErrorF("%s passed NULL\n", __func__);
-	return GL_FALSE;
-    }
-
-    drawable = (__GLXAquaDrawable *)base;
-
-    if(NULL == drawable->context) {
-	ErrorF("%s called with a NULL->context for drawable %p!\n",
-	       __func__, (void *)drawable);
-	return GL_FALSE;
-    }
-
-    err = CGLFlushDrawable(drawable->context->ctx);
-
-    if(kCGLNoError != err) {
-	ErrorF("CGLFlushDrawable error: %s in %s\n", CGLErrorString(err),
-	       __func__);
-	return GL_FALSE;
-    }
-
-    return GL_TRUE;
-}
-
-
-static CGLPixelFormatObj makeFormat(__GLXconfig *conf) {
-    CGLPixelFormatAttribute attr[64];
-    CGLPixelFormatObj fobj;
-    GLint formats;
-    CGLError error;
-    int i = 0;
-    
-    if(conf->doubleBufferMode)
-	attr[i++] = kCGLPFADoubleBuffer;
-
-    if(conf->stereoMode)
-	attr[i++] = kCGLPFAStereo;
-
-    attr[i++] = kCGLPFAColorSize;
-    attr[i++] = conf->redBits + conf->greenBits + conf->blueBits;
-    attr[i++] = kCGLPFAAlphaSize;
-    attr[i++] = conf->alphaBits;
-
-    if((conf->accumRedBits + conf->accumGreenBits + conf->accumBlueBits +
-	conf->accumAlphaBits) > 0) {
-
-	attr[i++] = kCGLPFAAccumSize;
-        attr[i++] = conf->accumRedBits + conf->accumGreenBits
-	    + conf->accumBlueBits + conf->accumAlphaBits;
-    }
-    
-    attr[i++] = kCGLPFADepthSize;
-    attr[i++] = conf->depthBits;
-
-    if(conf->stencilBits) {
-	attr[i++] = kCGLPFAStencilSize;
-        attr[i++] = conf->stencilBits;	
-    }
-    
-    if(conf->numAuxBuffers > 0) {
-	attr[i++] = kCGLPFAAuxBuffers;
-	attr[i++] = conf->numAuxBuffers;
-    }
-
-    if(conf->sampleBuffers > 0) {
-       attr[i++] = kCGLPFASampleBuffers;
-       attr[i++] = conf->sampleBuffers;
-       attr[i++] = kCGLPFASamples;
-       attr[i++] = conf->samples;
-    }
-     
-    attr[i] = 0;
-
-    error = CGLChoosePixelFormat(attr, &fobj, &formats);
-    if(error) {
-	ErrorF("error: creating pixel format %s\n", CGLErrorString(error));
-	return NULL;
-    }
-
-    return fobj;
-}
-
-static void __glXAquaScreenDestroy(__GLXscreen *screen) {
-
-    GLAQUA_DEBUG_MSG("glXAquaScreenDestroy(%p)\n", screen);
-    __glXScreenDestroy(screen);
-
-    xfree(screen);
-}
-
-/* This is called by __glXInitScreens(). */
-static __GLXscreen * __glXAquaScreenProbe(ScreenPtr pScreen) {
-    __GLXAquaScreen *screen;
-
-    GLAQUA_DEBUG_MSG("glXAquaScreenProbe\n");
-
-    if (pScreen == NULL) 
-	return NULL;
-
-    screen = xcalloc(1, sizeof *screen);
-
-    if(NULL == screen)
-	return NULL;
-    
-    screen->base.destroy        = __glXAquaScreenDestroy;
-    screen->base.createContext  = __glXAquaScreenCreateContext;
-    screen->base.createDrawable = __glXAquaScreenCreateDrawable;
-    screen->base.swapInterval = /*FIXME*/ NULL;
-    screen->base.hyperpipeFuncs = NULL;
-    screen->base.swapBarrierFuncs = NULL;
-    screen->base.pScreen       = pScreen;
-    
-    screen->base.fbconfigs = __glXAquaCreateVisualConfigs(&screen->base.numFBConfigs, pScreen->myNum);
-
-    __glXScreenInit(&screen->base, pScreen);
-
-    screen->base.GLXversion = xstrdup("1.4");
-    screen->base.GLXextensions = xstrdup("GLX_SGIX_fbconfig "
-					 "GLX_SGIS_multisample "
-					 "GLX_ARB_multisample "
-					 "GLX_EXT_visual_info "
-					 "GLX_EXT_import_context ");
-    
-    /*We may be able to add more GLXextensions at a later time. */
-    
-    return &screen->base;
-}
-
-#if 0 // unused
-static void __glXAquaDrawableCopySubBuffer (__GLXdrawable *drawable,
-					    int x, int y, int w, int h) {
-    /*TODO finish me*/
-}
-#endif
-
-static void __glXAquaDrawableDestroy(__GLXdrawable *base) {
-    /* gstaplin: base is the head of the structure, so it's at the same 
-     * offset in memory.
-     * Is this safe with strict aliasing?   I noticed that the other dri code
-     * does this too...
-     */
-    __GLXAquaDrawable *glxPriv = (__GLXAquaDrawable *)base;
-
-    GLAQUA_DEBUG_MSG(__func__);
-    
-    /* It doesn't work to call DRIDestroySurface here, the drawable's
-       already gone.. But dri.c notices the window destruction and
-       frees the surface itself. */
-
-    /*gstaplin: verify the statement above.  The surface destroy
-     *messages weren't making it through, and may still not be.
-     *We need a good test case for surface creation and destruction.
-     *We also need a good way to enable introspection on the server
-     *to validate the test, beyond using gdb with print.
-     */
-
-    xfree(glxPriv);
-}
-
-static __GLXdrawable *
-__glXAquaScreenCreateDrawable(__GLXscreen *screen,
-			      DrawablePtr pDraw,
-			      int type,
-			      XID drawId,
-			      __GLXconfig *conf) {
-  __GLXAquaDrawable *glxPriv;
-
-  glxPriv = xalloc(sizeof *glxPriv);
-
-  if(glxPriv == NULL)
-      return NULL;
-
-  memset(glxPriv, 0, sizeof *glxPriv);
-
-  if(!__glXDrawableInit(&glxPriv->base, screen, pDraw, type, drawId, conf)) {
-    xfree(glxPriv);
-    return NULL;
-  }
-
-  glxPriv->base.destroy       = __glXAquaDrawableDestroy;
-  glxPriv->base.swapBuffers   = __glXAquaDrawableSwapBuffers;
-  glxPriv->base.copySubBuffer = NULL; /* __glXAquaDrawableCopySubBuffer; */
-
-  glxPriv->pDraw = pDraw;
-  glxPriv->sid = 0;
-  glxPriv->context = NULL;
-  
-  return &glxPriv->base;
-}
-
-// Extra goodies for glx
-
-GLuint __glFloorLog2(GLuint val)
-{
-    int c = 0;
-
-    while (val > 1) {
-        c++;
-        val >>= 1;
-    }
-    return c;
-}
-
-void warn_func(void * p1, char *format, ...) {
-    va_list v;
-    va_start(v, format);
-    vfprintf(stderr, format, v);
-    va_end(v);
-}
-
-static void setup_dispatch_table(void) {
-    struct _glapi_table *disp=_glapi_get_dispatch();
-    _glapi_set_warning_func((_glapi_warning_func)warn_func);
-    _glapi_noop_enable_warnings(TRUE);
-
-    /* to update:
-     * for f in $(grep 'define SET_' ../../../glx/dispatch.h  | cut -f2 -d' ' | cut -f1 -d\( | sort -u); do grep -q $f indirect.c || echo $f ; done | grep -v by_offset | sed 's:SET_\(.*\)$:SET_\1(disp, gl\1)\;:' | pbcopy
-     */
-
-    SET_Accum(disp, glAccum);
-    SET_AlphaFunc(disp, glAlphaFunc);
-    SET_AreTexturesResident(disp, glAreTexturesResident);
-    SET_ArrayElement(disp, glArrayElement);
-    SET_Begin(disp, glBegin);
-    SET_BindTexture(disp, glBindTexture);
-    SET_Bitmap(disp, glBitmap);
-    SET_BlendColor(disp, glBlendColor);
-    SET_BlendEquation(disp, glBlendEquation);
-    SET_BlendFunc(disp, glBlendFunc);
-    SET_CallList(disp, glCallList);
-    SET_CallLists(disp, glCallLists);
-    SET_Clear(disp, glClear);
-    SET_ClearAccum(disp, glClearAccum);
-    SET_ClearColor(disp, glClearColor);
-    SET_ClearDepth(disp, glClearDepth);
-    SET_ClearIndex(disp, glClearIndex);
-    SET_ClearStencil(disp, glClearStencil);
-    SET_ClipPlane(disp, glClipPlane);
-    SET_Color3b(disp, glColor3b);
-    SET_Color3bv(disp, glColor3bv);
-    SET_Color3d(disp, glColor3d);
-    SET_Color3dv(disp, glColor3dv);
-    SET_Color3f(disp, glColor3f);
-    SET_Color3fv(disp, glColor3fv);
-    SET_Color3i(disp, glColor3i);
-    SET_Color3iv(disp, glColor3iv);
-    SET_Color3s(disp, glColor3s);
-    SET_Color3sv(disp, glColor3sv);
-    SET_Color3ub(disp, glColor3ub);
-    SET_Color3ubv(disp, glColor3ubv);
-    SET_Color3ui(disp, glColor3ui);
-    SET_Color3uiv(disp, glColor3uiv);
-    SET_Color3us(disp, glColor3us);
-    SET_Color3usv(disp, glColor3usv);
-    SET_Color4b(disp, glColor4b);
-    SET_Color4bv(disp, glColor4bv);
-    SET_Color4d(disp, glColor4d);
-    SET_Color4dv(disp, glColor4dv);
-    SET_Color4f(disp, glColor4f);
-    SET_Color4fv(disp, glColor4fv);
-    SET_Color4i(disp, glColor4i);
-    SET_Color4iv(disp, glColor4iv);
-    SET_Color4s(disp, glColor4s);
-    SET_Color4sv(disp, glColor4sv);
-    SET_Color4ub(disp, glColor4ub);
-    SET_Color4ubv(disp, glColor4ubv);
-    SET_Color4ui(disp, glColor4ui);
-    SET_Color4uiv(disp, glColor4uiv);
-    SET_Color4us(disp, glColor4us);
-    SET_Color4usv(disp, glColor4usv);
-    SET_ColorMask(disp, glColorMask);
-    SET_ColorMaterial(disp, glColorMaterial);
-    SET_ColorPointer(disp, glColorPointer);
-    SET_ColorSubTable(disp, glColorSubTable);
-    SET_ColorTable(disp, glColorTable);
-    SET_ColorTableParameterfv(disp, glColorTableParameterfv);
-    SET_ColorTableParameteriv(disp, glColorTableParameteriv);
-    SET_ConvolutionFilter1D(disp, glConvolutionFilter1D);
-    SET_ConvolutionFilter2D(disp, glConvolutionFilter2D);
-    SET_ConvolutionParameterf(disp, glConvolutionParameterf);
-    SET_ConvolutionParameterfv(disp, glConvolutionParameterfv);
-    SET_ConvolutionParameteri(disp, glConvolutionParameteri);
-    SET_ConvolutionParameteriv(disp, glConvolutionParameteriv);
-    SET_CopyColorSubTable(disp, glCopyColorSubTable);
-    SET_CopyColorTable(disp, glCopyColorTable);
-    SET_CopyConvolutionFilter1D(disp, glCopyConvolutionFilter1D);
-    SET_CopyConvolutionFilter2D(disp, glCopyConvolutionFilter2D);
-    SET_CopyPixels(disp, glCopyPixels);
-    SET_CopyTexImage1D(disp, glCopyTexImage1D);
-    SET_CopyTexImage2D(disp, glCopyTexImage2D);
-    SET_CopyTexSubImage1D(disp, glCopyTexSubImage1D);
-    SET_CopyTexSubImage2D(disp, glCopyTexSubImage2D);
-    SET_CopyTexSubImage3D(disp, glCopyTexSubImage3D);
-    SET_CullFace(disp, glCullFace);
-    SET_DeleteLists(disp, glDeleteLists);
-    SET_DeleteTextures(disp, glDeleteTextures);
-    SET_DepthFunc(disp, glDepthFunc);
-    SET_DepthMask(disp, glDepthMask);
-    SET_DepthRange(disp, glDepthRange);
-    SET_Disable(disp, glDisable);
-    SET_DisableClientState(disp, glDisableClientState);
-    SET_DrawArrays(disp, glDrawArrays);
-    SET_DrawBuffer(disp, glDrawBuffer);
-    SET_DrawElements(disp, glDrawElements);
-    SET_DrawPixels(disp, glDrawPixels);
-    SET_DrawRangeElements(disp, glDrawRangeElements);
-    SET_EdgeFlag(disp, glEdgeFlag);
-    SET_EdgeFlagPointer(disp, glEdgeFlagPointer);
-    SET_EdgeFlagv(disp, glEdgeFlagv);
-    SET_Enable(disp, glEnable);
-    SET_EnableClientState(disp, glEnableClientState);
-    SET_End(disp, glEnd);
-    SET_EndList(disp, glEndList);
-    SET_EvalCoord1d(disp, glEvalCoord1d);
-    SET_EvalCoord1dv(disp, glEvalCoord1dv);
-    SET_EvalCoord1f(disp, glEvalCoord1f);
-    SET_EvalCoord1fv(disp, glEvalCoord1fv);
-    SET_EvalCoord2d(disp, glEvalCoord2d);
-    SET_EvalCoord2dv(disp, glEvalCoord2dv);
-    SET_EvalCoord2f(disp, glEvalCoord2f);
-    SET_EvalCoord2fv(disp, glEvalCoord2fv);
-    SET_EvalMesh1(disp, glEvalMesh1);
-    SET_EvalMesh2(disp, glEvalMesh2);
-    SET_EvalPoint1(disp, glEvalPoint1);
-    SET_EvalPoint2(disp, glEvalPoint2);
-    SET_FeedbackBuffer(disp, glFeedbackBuffer);
-    SET_Finish(disp, glFinish);
-    SET_Flush(disp, glFlush);
-    SET_Fogf(disp, glFogf);
-    SET_Fogfv(disp, glFogfv);
-    SET_Fogi(disp, glFogi);
-    SET_Fogiv(disp, glFogiv);
-    SET_FrontFace(disp, glFrontFace);
-    SET_Frustum(disp, glFrustum);
-    SET_GenLists(disp, glGenLists);
-    SET_GenTextures(disp, glGenTextures);
-    SET_GetBooleanv(disp, glGetBooleanv);
-    SET_GetClipPlane(disp, glGetClipPlane);
-    SET_GetColorTable(disp, glGetColorTable);
-    SET_GetColorTableParameterfv(disp, glGetColorTableParameterfv);
-    SET_GetColorTableParameteriv(disp, glGetColorTableParameteriv);
-    SET_GetConvolutionFilter(disp, glGetConvolutionFilter);
-    SET_GetConvolutionParameterfv(disp, glGetConvolutionParameterfv);
-    SET_GetConvolutionParameteriv(disp, glGetConvolutionParameteriv);
-    SET_GetDoublev(disp, glGetDoublev);
-    SET_GetError(disp, glGetError);
-    SET_GetFloatv(disp, glGetFloatv);
-    SET_GetHistogram(disp, glGetHistogram);
-    SET_GetHistogramParameterfv(disp, glGetHistogramParameterfv);
-    SET_GetHistogramParameteriv(disp, glGetHistogramParameteriv);
-    SET_GetIntegerv(disp, glGetIntegerv);
-    SET_GetLightfv(disp, glGetLightfv);
-    SET_GetLightiv(disp, glGetLightiv);
-    SET_GetMapdv(disp, glGetMapdv);
-    SET_GetMapfv(disp, glGetMapfv);
-    SET_GetMapiv(disp, glGetMapiv);
-    SET_GetMaterialfv(disp, glGetMaterialfv);
-    SET_GetMaterialiv(disp, glGetMaterialiv);
-    SET_GetMinmax(disp, glGetMinmax);
-    SET_GetMinmaxParameterfv(disp, glGetMinmaxParameterfv);
-    SET_GetMinmaxParameteriv(disp, glGetMinmaxParameteriv);
-    SET_GetPixelMapfv(disp, glGetPixelMapfv);
-    SET_GetPixelMapuiv(disp, glGetPixelMapuiv);
-    SET_GetPixelMapusv(disp, glGetPixelMapusv);
-    SET_GetPointerv(disp, glGetPointerv);
-    SET_GetPolygonStipple(disp, glGetPolygonStipple);
-    SET_GetSeparableFilter(disp, glGetSeparableFilter);
-    SET_GetString(disp, glGetString);
-    SET_GetTexEnvfv(disp, glGetTexEnvfv);
-    SET_GetTexEnviv(disp, glGetTexEnviv);
-    SET_GetTexGendv(disp, glGetTexGendv);
-    SET_GetTexGenfv(disp, glGetTexGenfv);
-    SET_GetTexGeniv(disp, glGetTexGeniv);
-    SET_GetTexImage(disp, glGetTexImage);
-    SET_GetTexLevelParameterfv(disp, glGetTexLevelParameterfv);
-    SET_GetTexLevelParameteriv(disp, glGetTexLevelParameteriv);
-    SET_GetTexParameterfv(disp, glGetTexParameterfv);
-    SET_GetTexParameteriv(disp, glGetTexParameteriv);
-    SET_Hint(disp, glHint);
-    SET_Histogram(disp, glHistogram);
-    SET_IndexMask(disp, glIndexMask);
-    SET_IndexPointer(disp, glIndexPointer);
-    SET_Indexd(disp, glIndexd);
-    SET_Indexdv(disp, glIndexdv);
-    SET_Indexf(disp, glIndexf);
-    SET_Indexfv(disp, glIndexfv);
-    SET_Indexi(disp, glIndexi);
-    SET_Indexiv(disp, glIndexiv);
-    SET_Indexs(disp, glIndexs);
-    SET_Indexsv(disp, glIndexsv);
-    SET_Indexub(disp, glIndexub);
-    SET_Indexubv(disp, glIndexubv);
-    SET_InitNames(disp, glInitNames);
-    SET_InterleavedArrays(disp, glInterleavedArrays);
-    SET_IsEnabled(disp, glIsEnabled);
-    SET_IsList(disp, glIsList);
-    SET_IsTexture(disp, glIsTexture);
-    SET_LightModelf(disp, glLightModelf);
-    SET_LightModelfv(disp, glLightModelfv);
-    SET_LightModeli(disp, glLightModeli);
-    SET_LightModeliv(disp, glLightModeliv);
-    SET_Lightf(disp, glLightf);
-    SET_Lightfv(disp, glLightfv);
-    SET_Lighti(disp, glLighti);
-    SET_Lightiv(disp, glLightiv);
-    SET_LineStipple(disp, glLineStipple);
-    SET_LineWidth(disp, glLineWidth);
-    SET_ListBase(disp, glListBase);
-    SET_LoadIdentity(disp, glLoadIdentity);
-    SET_LoadMatrixd(disp, glLoadMatrixd);
-    SET_LoadMatrixf(disp, glLoadMatrixf);
-    SET_LoadName(disp, glLoadName);
-    SET_LogicOp(disp, glLogicOp);
-    SET_Map1d(disp, glMap1d);
-    SET_Map1f(disp, glMap1f);
-    SET_Map2d(disp, glMap2d);
-    SET_Map2f(disp, glMap2f);
-    SET_MapGrid1d(disp, glMapGrid1d);
-    SET_MapGrid1f(disp, glMapGrid1f);
-    SET_MapGrid2d(disp, glMapGrid2d);
-    SET_MapGrid2f(disp, glMapGrid2f);
-    SET_Materialf(disp, glMaterialf);
-    SET_Materialfv(disp, glMaterialfv);
-    SET_Materiali(disp, glMateriali);
-    SET_Materialiv(disp, glMaterialiv);
-    SET_MatrixMode(disp, glMatrixMode);
-    SET_Minmax(disp, glMinmax);
-    SET_MultMatrixd(disp, glMultMatrixd);
-    SET_MultMatrixf(disp, glMultMatrixf);
-    SET_NewList(disp, glNewList);
-    SET_Normal3b(disp, glNormal3b);
-    SET_Normal3bv(disp, glNormal3bv);
-    SET_Normal3d(disp, glNormal3d);
-    SET_Normal3dv(disp, glNormal3dv);
-    SET_Normal3f(disp, glNormal3f);
-    SET_Normal3fv(disp, glNormal3fv);
-    SET_Normal3i(disp, glNormal3i);
-    SET_Normal3iv(disp, glNormal3iv);
-    SET_Normal3s(disp, glNormal3s);
-    SET_Normal3sv(disp, glNormal3sv);
-    SET_NormalPointer(disp, glNormalPointer);
-    SET_Ortho(disp, glOrtho);
-    SET_PassThrough(disp, glPassThrough);
-    SET_PixelMapfv(disp, glPixelMapfv);
-    SET_PixelMapuiv(disp, glPixelMapuiv);
-    SET_PixelMapusv(disp, glPixelMapusv);
-    SET_PixelStoref(disp, glPixelStoref);
-    SET_PixelStorei(disp, glPixelStorei);
-    SET_PixelTransferf(disp, glPixelTransferf);
-    SET_PixelTransferi(disp, glPixelTransferi);
-    SET_PixelZoom(disp, glPixelZoom);
-    SET_PointSize(disp, glPointSize);
-    SET_PolygonMode(disp, glPolygonMode);
-    SET_PolygonOffset(disp, glPolygonOffset);
-    SET_PolygonStipple(disp, glPolygonStipple);
-    SET_PopAttrib(disp, glPopAttrib);
-    SET_PopClientAttrib(disp, glPopClientAttrib);
-    SET_PopMatrix(disp, glPopMatrix);
-    SET_PopName(disp, glPopName);
-    SET_PrioritizeTextures(disp, glPrioritizeTextures);
-    SET_PushAttrib(disp, glPushAttrib);
-    SET_PushClientAttrib(disp, glPushClientAttrib);
-    SET_PushMatrix(disp, glPushMatrix);
-    SET_PushName(disp, glPushName);
-    SET_RasterPos2d(disp, glRasterPos2d);
-    SET_RasterPos2dv(disp, glRasterPos2dv);
-    SET_RasterPos2f(disp, glRasterPos2f);
-    SET_RasterPos2fv(disp, glRasterPos2fv);
-    SET_RasterPos2i(disp, glRasterPos2i);
-    SET_RasterPos2iv(disp, glRasterPos2iv);
-    SET_RasterPos2s(disp, glRasterPos2s);
-    SET_RasterPos2sv(disp, glRasterPos2sv);
-    SET_RasterPos3d(disp, glRasterPos3d);
-    SET_RasterPos3dv(disp, glRasterPos3dv);
-    SET_RasterPos3f(disp, glRasterPos3f);
-    SET_RasterPos3fv(disp, glRasterPos3fv);
-    SET_RasterPos3i(disp, glRasterPos3i);
-    SET_RasterPos3iv(disp, glRasterPos3iv);
-    SET_RasterPos3s(disp, glRasterPos3s);
-    SET_RasterPos3sv(disp, glRasterPos3sv);
-    SET_RasterPos4d(disp, glRasterPos4d);
-    SET_RasterPos4dv(disp, glRasterPos4dv);
-    SET_RasterPos4f(disp, glRasterPos4f);
-    SET_RasterPos4fv(disp, glRasterPos4fv);
-    SET_RasterPos4i(disp, glRasterPos4i);
-    SET_RasterPos4iv(disp, glRasterPos4iv);
-    SET_RasterPos4s(disp, glRasterPos4s);
-    SET_RasterPos4sv(disp, glRasterPos4sv);
-    SET_ReadBuffer(disp, glReadBuffer);
-    SET_ReadPixels(disp, glReadPixels);
-    SET_Rectd(disp, glRectd);
-    SET_Rectdv(disp, glRectdv);
-    SET_Rectf(disp, glRectf);
-    SET_Rectfv(disp, glRectfv);
-    SET_Recti(disp, glRecti);
-    SET_Rectiv(disp, glRectiv);
-    SET_Rects(disp, glRects);
-    SET_Rectsv(disp, glRectsv);
-    SET_RenderMode(disp, glRenderMode);
-    SET_ResetHistogram(disp, glResetHistogram);
-    SET_ResetMinmax(disp, glResetMinmax);
-    SET_Rotated(disp, glRotated);
-    SET_Rotatef(disp, glRotatef);
-    SET_Scaled(disp, glScaled);
-    SET_Scalef(disp, glScalef);
-    SET_Scissor(disp, glScissor);
-    SET_SelectBuffer(disp, glSelectBuffer);
-    SET_SeparableFilter2D(disp, glSeparableFilter2D);
-    SET_ShadeModel(disp, glShadeModel);
-    SET_StencilFunc(disp, glStencilFunc);
-    SET_StencilMask(disp, glStencilMask);
-    SET_StencilOp(disp, glStencilOp);
-    SET_TexCoord1d(disp, glTexCoord1d);
-    SET_TexCoord1dv(disp, glTexCoord1dv);
-    SET_TexCoord1f(disp, glTexCoord1f);
-    SET_TexCoord1fv(disp, glTexCoord1fv);
-    SET_TexCoord1i(disp, glTexCoord1i);
-    SET_TexCoord1iv(disp, glTexCoord1iv);
-    SET_TexCoord1s(disp, glTexCoord1s);
-    SET_TexCoord1sv(disp, glTexCoord1sv);
-    SET_TexCoord2d(disp, glTexCoord2d);
-    SET_TexCoord2dv(disp, glTexCoord2dv);
-    SET_TexCoord2f(disp, glTexCoord2f);
-    SET_TexCoord2fv(disp, glTexCoord2fv);
-    SET_TexCoord2i(disp, glTexCoord2i);
-    SET_TexCoord2iv(disp, glTexCoord2iv);
-    SET_TexCoord2s(disp, glTexCoord2s);
-    SET_TexCoord2sv(disp, glTexCoord2sv);
-    SET_TexCoord3d(disp, glTexCoord3d);
-    SET_TexCoord3dv(disp, glTexCoord3dv);
-    SET_TexCoord3f(disp, glTexCoord3f);
-    SET_TexCoord3fv(disp, glTexCoord3fv);
-    SET_TexCoord3i(disp, glTexCoord3i);
-    SET_TexCoord3iv(disp, glTexCoord3iv);
-    SET_TexCoord3s(disp, glTexCoord3s);
-    SET_TexCoord3sv(disp, glTexCoord3sv);
-    SET_TexCoord4d(disp, glTexCoord4d);
-    SET_TexCoord4dv(disp, glTexCoord4dv);
-    SET_TexCoord4f(disp, glTexCoord4f);
-    SET_TexCoord4fv(disp, glTexCoord4fv);
-    SET_TexCoord4i(disp, glTexCoord4i);
-    SET_TexCoord4iv(disp, glTexCoord4iv);
-    SET_TexCoord4s(disp, glTexCoord4s);
-    SET_TexCoord4sv(disp, glTexCoord4sv);
-    SET_TexCoordPointer(disp, glTexCoordPointer);
-    SET_TexEnvf(disp, glTexEnvf);
-    SET_TexEnvfv(disp, glTexEnvfv);
-    SET_TexEnvi(disp, glTexEnvi);
-    SET_TexEnviv(disp, glTexEnviv);
-    SET_TexGend(disp, glTexGend);
-    SET_TexGendv(disp, glTexGendv);
-    SET_TexGenf(disp, glTexGenf);
-    SET_TexGenfv(disp, glTexGenfv);
-    SET_TexGeni(disp, glTexGeni);
-    SET_TexGeniv(disp, glTexGeniv);
-    
-    /* Pointer Incompatability:
-     * internalformat is a GLenum according to /System/Library/Frameworks/OpenGL.framework/Headers/gl.h
-     * extern void glTexImage1D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
-     * extern void glTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
-     * extern void glTexImage3D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
-     *
-     * and it's a GLint in glx/glapitable.h and according to the man page
-     * void ( * TexImage1D)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid * pixels);
-     * void ( * TexImage2D)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid * pixels);
-     * void ( * TexImage3D)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * pixels);
-     *
-     * <rdar://problem/6953344> gl.h contains incorrect prototypes for glTexImage[123]D
-     */
-    
-    SET_TexImage1D(disp, (void *)glTexImage1D);
-    SET_TexImage2D(disp, (void *)glTexImage2D);
-    SET_TexImage3D(disp, (void *)glTexImage3D);
-    SET_TexParameterf(disp, glTexParameterf);
-    SET_TexParameterfv(disp, glTexParameterfv);
-    SET_TexParameteri(disp, glTexParameteri);
-    SET_TexParameteriv(disp, glTexParameteriv);
-    SET_TexSubImage1D(disp, glTexSubImage1D);
-    SET_TexSubImage2D(disp, glTexSubImage2D);
-    SET_TexSubImage3D(disp, glTexSubImage3D);
-    SET_Translated(disp, glTranslated);
-    SET_Translatef(disp, glTranslatef);
-    SET_Vertex2d(disp, glVertex2d);
-    SET_Vertex2dv(disp, glVertex2dv);
-    SET_Vertex2f(disp, glVertex2f);
-    SET_Vertex2fv(disp, glVertex2fv);
-    SET_Vertex2i(disp, glVertex2i);
-    SET_Vertex2iv(disp, glVertex2iv);
-    SET_Vertex2s(disp, glVertex2s);
-    SET_Vertex2sv(disp, glVertex2sv);
-    SET_Vertex3d(disp, glVertex3d);
-    SET_Vertex3dv(disp, glVertex3dv);
-    SET_Vertex3f(disp, glVertex3f);
-    SET_Vertex3fv(disp, glVertex3fv);
-    SET_Vertex3i(disp, glVertex3i);
-    SET_Vertex3iv(disp, glVertex3iv);
-    SET_Vertex3s(disp, glVertex3s);
-    SET_Vertex3sv(disp, glVertex3sv);
-    SET_Vertex4d(disp, glVertex4d);
-    SET_Vertex4dv(disp, glVertex4dv);
-    SET_Vertex4f(disp, glVertex4f);
-    SET_Vertex4fv(disp, glVertex4fv);
-    SET_Vertex4i(disp, glVertex4i);
-    SET_Vertex4iv(disp, glVertex4iv);
-    SET_Vertex4s(disp, glVertex4s);
-    SET_Vertex4sv(disp, glVertex4sv);
-    SET_VertexPointer(disp, glVertexPointer);
-    SET_Viewport(disp, glViewport);
-
-#if GL_VERSION_2_0
-    SET_AttachShader(disp, glAttachShader);
-    SET_DeleteShader(disp, glDeleteShader);
-    SET_DetachShader(disp, glDetachShader);
-    SET_GetAttachedShaders(disp, glGetAttachedShaders);
-    SET_GetProgramInfoLog(disp, glGetProgramInfoLog);
-    SET_GetShaderInfoLog(disp, glGetShaderInfoLog);
-    SET_GetShaderiv(disp, glGetShaderiv);
-    SET_IsShader(disp, glIsShader);
-    SET_StencilFuncSeparate(disp, glStencilFuncSeparate);
-    SET_StencilMaskSeparate(disp, glStencilMaskSeparate);
-    SET_StencilOpSeparate(disp, glStencilOpSeparate);
-#endif
-
-#if GL_VERSION_2_1
-    SET_UniformMatrix2x3fv(disp, glUniformMatrix2x3fv);
-    SET_UniformMatrix2x4fv(disp, glUniformMatrix2x4fv);
-    SET_UniformMatrix3x2fv(disp, glUniformMatrix3x2fv);
-    SET_UniformMatrix3x4fv(disp, glUniformMatrix3x4fv);
-    SET_UniformMatrix4x2fv(disp, glUniformMatrix4x2fv);
-    SET_UniformMatrix4x3fv(disp, glUniformMatrix4x3fv);
-#endif
-
-#if GL_APPLE_vertex_array_object
-    SET_BindVertexArrayAPPLE(disp, glBindVertexArrayAPPLE);
-    SET_DeleteVertexArraysAPPLE(disp, glDeleteVertexArraysAPPLE);
-    SET_GenVertexArraysAPPLE(disp, glGenVertexArraysAPPLE);
-    SET_IsVertexArrayAPPLE(disp, glIsVertexArrayAPPLE);
-#endif
-
-#if GL_ARB_draw_buffers
-    SET_DrawBuffersARB(disp, glDrawBuffersARB);
-#endif
-
-#if GL_ARB_multisample
-    SET_SampleCoverageARB(disp, glSampleCoverageARB);
-#endif
-
-#if GL_ARB_multitexture
-    SET_ActiveTextureARB(disp, glActiveTextureARB);
-    SET_ClientActiveTextureARB(disp, glClientActiveTextureARB);
-    SET_MultiTexCoord1dARB(disp, glMultiTexCoord1dARB);
-    SET_MultiTexCoord1dvARB(disp, glMultiTexCoord1dvARB);
-    SET_MultiTexCoord1fARB(disp, glMultiTexCoord1fARB);
-    SET_MultiTexCoord1fvARB(disp, glMultiTexCoord1fvARB);
-    SET_MultiTexCoord1iARB(disp, glMultiTexCoord1iARB);
-    SET_MultiTexCoord1ivARB(disp, glMultiTexCoord1ivARB);
-    SET_MultiTexCoord1sARB(disp, glMultiTexCoord1sARB);
-    SET_MultiTexCoord1svARB(disp, glMultiTexCoord1svARB);
-    SET_MultiTexCoord2dARB(disp, glMultiTexCoord2dARB);
-    SET_MultiTexCoord2dvARB(disp, glMultiTexCoord2dvARB);
-    SET_MultiTexCoord2fARB(disp, glMultiTexCoord2fARB);
-    SET_MultiTexCoord2fvARB(disp, glMultiTexCoord2fvARB);
-    SET_MultiTexCoord2iARB(disp, glMultiTexCoord2iARB);
-    SET_MultiTexCoord2ivARB(disp, glMultiTexCoord2ivARB);
-    SET_MultiTexCoord2sARB(disp, glMultiTexCoord2sARB);
-    SET_MultiTexCoord2svARB(disp, glMultiTexCoord2svARB);
-    SET_MultiTexCoord3dARB(disp, glMultiTexCoord3dARB);
-    SET_MultiTexCoord3dvARB(disp, glMultiTexCoord3dvARB);
-    SET_MultiTexCoord3fARB(disp, glMultiTexCoord3fARB);
-    SET_MultiTexCoord3fvARB(disp, glMultiTexCoord3fvARB);
-    SET_MultiTexCoord3iARB(disp, glMultiTexCoord3iARB);
-    SET_MultiTexCoord3ivARB(disp, glMultiTexCoord3ivARB);
-    SET_MultiTexCoord3sARB(disp, glMultiTexCoord3sARB);
-    SET_MultiTexCoord3svARB(disp, glMultiTexCoord3svARB);
-    SET_MultiTexCoord4dARB(disp, glMultiTexCoord4dARB);
-    SET_MultiTexCoord4dvARB(disp, glMultiTexCoord4dvARB);
-    SET_MultiTexCoord4fARB(disp, glMultiTexCoord4fARB);
-    SET_MultiTexCoord4fvARB(disp, glMultiTexCoord4fvARB);
-    SET_MultiTexCoord4iARB(disp, glMultiTexCoord4iARB);
-    SET_MultiTexCoord4ivARB(disp, glMultiTexCoord4ivARB);
-    SET_MultiTexCoord4sARB(disp, glMultiTexCoord4sARB);
-    SET_MultiTexCoord4svARB(disp, glMultiTexCoord4svARB);
-#endif
-
-#if GL_ARB_occlusion_query
-    SET_BeginQueryARB(disp, glBeginQueryARB);
-    SET_DeleteQueriesARB(disp, glDeleteQueriesARB);
-    SET_EndQueryARB(disp, glEndQueryARB);
-    SET_GenQueriesARB(disp, glGenQueriesARB);
-    SET_GetQueryObjectivARB(disp, glGetQueryObjectivARB);
-    SET_GetQueryObjectuivARB(disp, glGetQueryObjectuivARB);
-    SET_GetQueryivARB(disp, glGetQueryivARB);
-    SET_IsQueryARB(disp, glIsQueryARB);
-#endif
-
-#if GL_ARB_shader_objects
-    SET_AttachObjectARB(disp, glAttachObjectARB);
-    SET_CompileShaderARB(disp, glCompileShaderARB);
-    SET_DeleteObjectARB(disp, glDeleteObjectARB);
-    SET_GetHandleARB(disp, glGetHandleARB);
-    SET_DetachObjectARB(disp, glDetachObjectARB);
-    SET_CreateProgramObjectARB(disp, glCreateProgramObjectARB);
-    SET_CreateShaderObjectARB(disp, glCreateShaderObjectARB);
-    SET_GetInfoLogARB(disp, glGetInfoLogARB);
-    SET_GetActiveUniformARB(disp, glGetActiveUniformARB);
-    SET_GetAttachedObjectsARB(disp, glGetAttachedObjectsARB);
-    SET_GetObjectParameterfvARB(disp, glGetObjectParameterfvARB);
-    SET_GetObjectParameterivARB(disp, glGetObjectParameterivARB);
-    SET_GetShaderSourceARB(disp, glGetShaderSourceARB);
-    SET_GetUniformLocationARB(disp, glGetUniformLocationARB);
-    SET_GetUniformfvARB(disp, glGetUniformfvARB);
-    SET_GetUniformivARB(disp, glGetUniformivARB);
-    SET_LinkProgramARB(disp, glLinkProgramARB);
-    SET_ShaderSourceARB(disp, glShaderSourceARB);
-    SET_Uniform1fARB(disp, glUniform1fARB);
-    SET_Uniform1fvARB(disp, glUniform1fvARB);
-    SET_Uniform1iARB(disp, glUniform1iARB);
-    SET_Uniform1ivARB(disp, glUniform1ivARB);
-    SET_Uniform2fARB(disp, glUniform2fARB);
-    SET_Uniform2fvARB(disp, glUniform2fvARB);
-    SET_Uniform2iARB(disp, glUniform2iARB);
-    SET_Uniform2ivARB(disp, glUniform2ivARB);
-    SET_Uniform3fARB(disp, glUniform3fARB);
-    SET_Uniform3fvARB(disp, glUniform3fvARB);
-    SET_Uniform3iARB(disp, glUniform3iARB);
-    SET_Uniform3ivARB(disp, glUniform3ivARB);
-    SET_Uniform4fARB(disp, glUniform4fARB);
-    SET_Uniform4fvARB(disp, glUniform4fvARB);
-    SET_Uniform4iARB(disp, glUniform4iARB);
-    SET_Uniform4ivARB(disp, glUniform4ivARB);
-    SET_UniformMatrix2fvARB(disp, glUniformMatrix2fvARB);
-    SET_UniformMatrix3fvARB(disp, glUniformMatrix3fvARB);
-    SET_UniformMatrix4fvARB(disp, glUniformMatrix4fvARB);
-    SET_UseProgramObjectARB(disp, glUseProgramObjectARB);
-    SET_ValidateProgramARB(disp, glValidateProgramARB);
-#endif
-
-#if GL_ARB_texture_compression
-    SET_CompressedTexImage1DARB(disp, glCompressedTexImage1DARB);
-    SET_CompressedTexImage2DARB(disp, glCompressedTexImage2DARB);
-    SET_CompressedTexImage3DARB(disp, glCompressedTexImage3DARB);
-    SET_CompressedTexSubImage1DARB(disp, glCompressedTexSubImage1DARB);
-    SET_CompressedTexSubImage2DARB(disp, glCompressedTexSubImage2DARB);
-    SET_CompressedTexSubImage3DARB(disp, glCompressedTexSubImage3DARB);
-    SET_GetCompressedTexImageARB(disp, glGetCompressedTexImageARB);
-#endif
-
-#if GL_ARB_transpose_matrix
-    SET_LoadTransposeMatrixdARB(disp, glLoadTransposeMatrixdARB);
-    SET_LoadTransposeMatrixfARB(disp, glLoadTransposeMatrixfARB);
-    SET_MultTransposeMatrixdARB(disp, glMultTransposeMatrixdARB);
-    SET_MultTransposeMatrixfARB(disp, glMultTransposeMatrixfARB);
-#endif
-
-#if GL_ARB_vertex_buffer_object
-    SET_BindBufferARB(disp, glBindBufferARB);
-    SET_BufferDataARB(disp, glBufferDataARB);
-    SET_BufferSubDataARB(disp, glBufferSubDataARB);
-    SET_DeleteBuffersARB(disp, glDeleteBuffersARB);
-    SET_GenBuffersARB(disp, glGenBuffersARB);
-    SET_GetBufferParameterivARB(disp, glGetBufferParameterivARB);
-    SET_GetBufferPointervARB(disp, glGetBufferPointervARB);
-    SET_GetBufferSubDataARB(disp, glGetBufferSubDataARB);
-    SET_IsBufferARB(disp, glIsBufferARB);
-    SET_MapBufferARB(disp, glMapBufferARB);
-    SET_UnmapBufferARB(disp, glUnmapBufferARB);
-#endif
-
-#if GL_ARB_vertex_program
-    SET_DisableVertexAttribArrayARB(disp, glDisableVertexAttribArrayARB);
-    SET_EnableVertexAttribArrayARB(disp, glEnableVertexAttribArrayARB);
-    SET_GetProgramEnvParameterdvARB(disp, glGetProgramEnvParameterdvARB);
-    SET_GetProgramEnvParameterfvARB(disp, glGetProgramEnvParameterfvARB);
-    SET_GetProgramLocalParameterdvARB(disp, glGetProgramLocalParameterdvARB);
-    SET_GetProgramLocalParameterfvARB(disp, glGetProgramLocalParameterfvARB);
-    SET_GetProgramStringARB(disp, glGetProgramStringARB);
-    SET_GetProgramivARB(disp, glGetProgramivARB);
-    SET_GetVertexAttribdvARB(disp, glGetVertexAttribdvARB);
-    SET_GetVertexAttribfvARB(disp, glGetVertexAttribfvARB);
-    SET_GetVertexAttribivARB(disp, glGetVertexAttribivARB);
-    SET_ProgramEnvParameter4dARB(disp, glProgramEnvParameter4dARB);
-    SET_ProgramEnvParameter4dvARB(disp, glProgramEnvParameter4dvARB);
-    SET_ProgramEnvParameter4fARB(disp, glProgramEnvParameter4fARB);
-    SET_ProgramEnvParameter4fvARB(disp, glProgramEnvParameter4fvARB);
-    SET_ProgramLocalParameter4dARB(disp, glProgramLocalParameter4dARB);
-    SET_ProgramLocalParameter4dvARB(disp, glProgramLocalParameter4dvARB);
-    SET_ProgramLocalParameter4fARB(disp, glProgramLocalParameter4fARB);
-    SET_ProgramLocalParameter4fvARB(disp, glProgramLocalParameter4fvARB);
-    SET_ProgramStringARB(disp, glProgramStringARB);
-    SET_VertexAttrib1dARB(disp, glVertexAttrib1dARB);
-    SET_VertexAttrib1dvARB(disp, glVertexAttrib1dvARB);
-    SET_VertexAttrib1fARB(disp, glVertexAttrib1fARB);
-    SET_VertexAttrib1fvARB(disp, glVertexAttrib1fvARB);
-    SET_VertexAttrib1sARB(disp, glVertexAttrib1sARB);
-    SET_VertexAttrib1svARB(disp, glVertexAttrib1svARB);
-    SET_VertexAttrib2dARB(disp, glVertexAttrib2dARB);
-    SET_VertexAttrib2dvARB(disp, glVertexAttrib2dvARB);
-    SET_VertexAttrib2fARB(disp, glVertexAttrib2fARB);
-    SET_VertexAttrib2fvARB(disp, glVertexAttrib2fvARB);
-    SET_VertexAttrib2sARB(disp, glVertexAttrib2sARB);
-    SET_VertexAttrib2svARB(disp, glVertexAttrib2svARB);
-    SET_VertexAttrib3dARB(disp, glVertexAttrib3dARB);
-    SET_VertexAttrib3dvARB(disp, glVertexAttrib3dvARB);
-    SET_VertexAttrib3fARB(disp, glVertexAttrib3fARB);
-    SET_VertexAttrib3fvARB(disp, glVertexAttrib3fvARB);
-    SET_VertexAttrib3sARB(disp, glVertexAttrib3sARB);
-    SET_VertexAttrib3svARB(disp, glVertexAttrib3svARB);
-    SET_VertexAttrib4NbvARB(disp, glVertexAttrib4NbvARB);
-    SET_VertexAttrib4NivARB(disp, glVertexAttrib4NivARB);
-    SET_VertexAttrib4NsvARB(disp, glVertexAttrib4NsvARB);
-    SET_VertexAttrib4NubARB(disp, glVertexAttrib4NubARB);
-    SET_VertexAttrib4NubvARB(disp, glVertexAttrib4NubvARB);
-    SET_VertexAttrib4NuivARB(disp, glVertexAttrib4NuivARB);
-    SET_VertexAttrib4NusvARB(disp, glVertexAttrib4NusvARB);
-    SET_VertexAttrib4bvARB(disp, glVertexAttrib4bvARB);
-    SET_VertexAttrib4dARB(disp, glVertexAttrib4dARB);
-    SET_VertexAttrib4dvARB(disp, glVertexAttrib4dvARB);
-    SET_VertexAttrib4fARB(disp, glVertexAttrib4fARB);
-    SET_VertexAttrib4fvARB(disp, glVertexAttrib4fvARB);
-    SET_VertexAttrib4ivARB(disp, glVertexAttrib4ivARB);
-    SET_VertexAttrib4sARB(disp, glVertexAttrib4sARB);
-    SET_VertexAttrib4svARB(disp, glVertexAttrib4svARB);
-    SET_VertexAttrib4ubvARB(disp, glVertexAttrib4ubvARB);
-    SET_VertexAttrib4uivARB(disp, glVertexAttrib4uivARB);
-    SET_VertexAttrib4usvARB(disp, glVertexAttrib4usvARB);
-    SET_VertexAttribPointerARB(disp, glVertexAttribPointerARB);
-#endif
-
-#if GL_ARB_vertex_shader
-    SET_BindAttribLocationARB(disp, glBindAttribLocationARB);
-    SET_GetActiveAttribARB(disp, glGetActiveAttribARB);
-    SET_GetAttribLocationARB(disp, glGetAttribLocationARB);
-#endif
-
-#if GL_ARB_window_pos
-    SET_WindowPos2dMESA(disp, glWindowPos2dARB);
-    SET_WindowPos2dvMESA(disp, glWindowPos2dvARB);
-    SET_WindowPos2fMESA(disp, glWindowPos2fARB);
-    SET_WindowPos2fvMESA(disp, glWindowPos2fvARB);
-    SET_WindowPos2iMESA(disp, glWindowPos2iARB);
-    SET_WindowPos2ivMESA(disp, glWindowPos2ivARB);
-    SET_WindowPos2sMESA(disp, glWindowPos2sARB);
-    SET_WindowPos2svMESA(disp, glWindowPos2svARB);
-    SET_WindowPos3dMESA(disp, glWindowPos3dARB);
-    SET_WindowPos3dvMESA(disp, glWindowPos3dvARB);
-    SET_WindowPos3fMESA(disp, glWindowPos3fARB);
-    SET_WindowPos3fvMESA(disp, glWindowPos3fvARB);
-    SET_WindowPos3iMESA(disp, glWindowPos3iARB);
-    SET_WindowPos3ivMESA(disp, glWindowPos3ivARB);
-    SET_WindowPos3sMESA(disp, glWindowPos3sARB);
-    SET_WindowPos3svMESA(disp, glWindowPos3svARB);
-#endif
-
-#if GL_ATI_fragment_shader
-    SET_AlphaFragmentOp1ATI(disp, glAlphaFragmentOp1ATI);
-    SET_AlphaFragmentOp2ATI(disp, glAlphaFragmentOp2ATI);
-    SET_AlphaFragmentOp3ATI(disp, glAlphaFragmentOp3ATI);
-    SET_BeginFragmentShaderATI(disp, glBeginFragmentShaderATI);
-    SET_BindFragmentShaderATI(disp, glBindFragmentShaderATI);
-    SET_ColorFragmentOp1ATI(disp, glColorFragmentOp1ATI);
-    SET_ColorFragmentOp2ATI(disp, glColorFragmentOp2ATI);
-    SET_ColorFragmentOp3ATI(disp, glColorFragmentOp3ATI);
-    SET_DeleteFragmentShaderATI(disp, glDeleteFragmentShaderATI);
-    SET_EndFragmentShaderATI(disp, glEndFragmentShaderATI);
-    SET_GenFragmentShadersATI(disp, glGenFragmentShadersATI);
-    SET_PassTexCoordATI(disp, glPassTexCoordATI);
-    SET_SampleMapATI(disp, glSampleMapATI);
-    SET_SetFragmentShaderConstantATI(disp, glSetFragmentShaderConstantATI);
-#elif GL_EXT_fragment_shader
-    SET_AlphaFragmentOp1ATI(disp, glAlphaFragmentOp1EXT);
-    SET_AlphaFragmentOp2ATI(disp, glAlphaFragmentOp2EXT);
-    SET_AlphaFragmentOp3ATI(disp, glAlphaFragmentOp3EXT);
-    SET_BeginFragmentShaderATI(disp, glBeginFragmentShaderEXT);
-    SET_BindFragmentShaderATI(disp, glBindFragmentShaderEXT);
-    SET_ColorFragmentOp1ATI(disp, glColorFragmentOp1EXT);
-    SET_ColorFragmentOp2ATI(disp, glColorFragmentOp2EXT);
-    SET_ColorFragmentOp3ATI(disp, glColorFragmentOp3EXT);
-    SET_DeleteFragmentShaderATI(disp, glDeleteFragmentShaderEXT);
-    SET_EndFragmentShaderATI(disp, glEndFragmentShaderEXT);
-    SET_GenFragmentShadersATI(disp, glGenFragmentShadersEXT);
-    SET_PassTexCoordATI(disp, glPassTexCoordEXT);
-    SET_SampleMapATI(disp, glSampleMapEXT);
-    SET_SetFragmentShaderConstantATI(disp, glSetFragmentShaderConstantEXT);
-#endif
-
-#if GL_ATI_separate_stencil
-    SET_StencilFuncSeparateATI(disp, glStencilFuncSeparateATI);
-#endif
-
-#if GL_EXT_blend_equation_separate
-    SET_BlendEquationSeparateEXT(disp, glBlendEquationSeparateEXT);
-#endif
-
-#if GL_EXT_blend_func_separate
-    SET_BlendFuncSeparateEXT(disp, glBlendFuncSeparateEXT);
-#endif
-
-#if GL_EXT_depth_bounds_test
-    SET_DepthBoundsEXT(disp, glDepthBoundsEXT);
-#endif
-
-#if GL_EXT_compiled_vertex_array
-    SET_LockArraysEXT(disp, glLockArraysEXT);
-    SET_UnlockArraysEXT(disp, glUnlockArraysEXT);
-#endif
-
-#if GL_EXT_cull_vertex
-    SET_CullParameterdvEXT(disp, glCullParameterdvEXT);
-    SET_CullParameterfvEXT(disp, glCullParameterfvEXT);
-#endif
-
-#if GL_EXT_fog_coord
-    SET_FogCoordPointerEXT(disp, glFogCoordPointerEXT);
-    SET_FogCoorddEXT(disp, glFogCoorddEXT);
-    SET_FogCoorddvEXT(disp, glFogCoorddvEXT);
-    SET_FogCoordfEXT(disp, glFogCoordfEXT);
-    SET_FogCoordfvEXT(disp, glFogCoordfvEXT);
-#endif
-
-#if GL_EXT_framebuffer_blit
-    SET_BlitFramebufferEXT(disp, glBlitFramebufferEXT);
-#endif
-
-#if GL_EXT_framebuffer_object
-    SET_BindFramebufferEXT(disp, glBindFramebufferEXT);
-    SET_BindRenderbufferEXT(disp, glBindRenderbufferEXT);
-    SET_CheckFramebufferStatusEXT(disp, glCheckFramebufferStatusEXT);
-    SET_DeleteFramebuffersEXT(disp, glDeleteFramebuffersEXT);
-    SET_DeleteRenderbuffersEXT(disp, glDeleteRenderbuffersEXT);
-    SET_FramebufferRenderbufferEXT(disp, glFramebufferRenderbufferEXT);
-    SET_FramebufferTexture1DEXT(disp, glFramebufferTexture1DEXT);
-    SET_FramebufferTexture2DEXT(disp, glFramebufferTexture2DEXT);
-    SET_FramebufferTexture3DEXT(disp, glFramebufferTexture3DEXT);
-    SET_GenerateMipmapEXT(disp, glGenerateMipmapEXT);
-    SET_GenFramebuffersEXT(disp, glGenFramebuffersEXT);
-    SET_GenRenderbuffersEXT(disp, glGenRenderbuffersEXT);
-    SET_GetFramebufferAttachmentParameterivEXT(disp, glGetFramebufferAttachmentParameterivEXT);
-    SET_GetRenderbufferParameterivEXT(disp, glGetRenderbufferParameterivEXT);
-    SET_IsFramebufferEXT(disp, glIsFramebufferEXT);
-    SET_IsRenderbufferEXT(disp, glIsRenderbufferEXT);
-    SET_RenderbufferStorageEXT(disp, glRenderbufferStorageEXT);
-#endif
-
-#if GL_EXT_gpu_program_parameters
-    SET_ProgramEnvParameters4fvEXT(disp, glProgramEnvParameters4fvEXT);
-    SET_ProgramLocalParameters4fvEXT(disp, glProgramLocalParameters4fvEXT);
-#endif
-
-#if GL_EXT_multi_draw_arrays
-    /* Pointer Incompatability:
-     * This warning can be safely ignored.  OpenGL.framework adds const to the
-     * two pointers.
-     *
-     * extern void glMultiDrawArraysEXT (GLenum, const GLint *, const GLsizei *, GLsizei);
-     *
-     * void ( * MultiDrawArraysEXT)(GLenum mode, GLint * first, GLsizei * count, GLsizei primcount);
-     */
-    SET_MultiDrawArraysEXT(disp, (void *)glMultiDrawArraysEXT);
-    SET_MultiDrawElementsEXT(disp, glMultiDrawElementsEXT);
-#endif
-
-#if GL_EXT_point_parameters
-    SET_PointParameterfEXT(disp, glPointParameterfEXT);
-    SET_PointParameterfvEXT(disp, glPointParameterfvEXT);
-#elif GL_ARB_point_parameters
-    SET_PointParameterfEXT(disp, glPointParameterfARB);
-    SET_PointParameterfvEXT(disp, glPointParameterfvARB);
-#endif
-
-#if GL_EXT_polygon_offset
-    SET_PolygonOffsetEXT(disp, glPolygonOffsetEXT);
-#endif
-
-#if GL_EXT_secondary_color
-    SET_SecondaryColor3bEXT(disp, glSecondaryColor3bEXT);
-    SET_SecondaryColor3bvEXT(disp, glSecondaryColor3bvEXT);
-    SET_SecondaryColor3dEXT(disp, glSecondaryColor3dEXT);
-    SET_SecondaryColor3dvEXT(disp, glSecondaryColor3dvEXT);
-    SET_SecondaryColor3fEXT(disp, glSecondaryColor3fEXT);
-    SET_SecondaryColor3fvEXT(disp, glSecondaryColor3fvEXT);
-    SET_SecondaryColor3iEXT(disp, glSecondaryColor3iEXT);
-    SET_SecondaryColor3ivEXT(disp, glSecondaryColor3ivEXT);
-    SET_SecondaryColor3sEXT(disp, glSecondaryColor3sEXT);
-    SET_SecondaryColor3svEXT(disp, glSecondaryColor3svEXT);
-    SET_SecondaryColor3ubEXT(disp, glSecondaryColor3ubEXT);
-    SET_SecondaryColor3ubvEXT(disp, glSecondaryColor3ubvEXT);
-    SET_SecondaryColor3uiEXT(disp, glSecondaryColor3uiEXT);
-    SET_SecondaryColor3uivEXT(disp, glSecondaryColor3uivEXT);
-    SET_SecondaryColor3usEXT(disp, glSecondaryColor3usEXT);
-    SET_SecondaryColor3usvEXT(disp, glSecondaryColor3usvEXT);
-    SET_SecondaryColorPointerEXT(disp, glSecondaryColorPointerEXT);
-#endif
-
-#if GL_EXT_stencil_two_side
-    SET_ActiveStencilFaceEXT(disp, glActiveStencilFaceEXT);
-#endif
-
-#if GL_EXT_timer_query
-    SET_GetQueryObjecti64vEXT(disp, glGetQueryObjecti64vEXT);
-    SET_GetQueryObjectui64vEXT(disp, glGetQueryObjectui64vEXT);
-#endif
-
-#if GL_EXT_vertex_array
-    SET_ColorPointerEXT(disp, glColorPointerEXT);
-    SET_EdgeFlagPointerEXT(disp, glEdgeFlagPointerEXT);
-    SET_IndexPointerEXT(disp, glIndexPointerEXT);
-    SET_NormalPointerEXT(disp, glNormalPointerEXT);
-    SET_TexCoordPointerEXT(disp, glTexCoordPointerEXT);
-    SET_VertexPointerEXT(disp, glVertexPointerEXT);
-#endif
-
-#if GL_IBM_multimode_draw_arrays
-    SET_MultiModeDrawArraysIBM(disp, glMultiModeDrawArraysIBM);
-    SET_MultiModeDrawElementsIBM(disp, glMultiModeDrawElementsIBM);
-#endif
-
-#if GL_MESA_resize_buffers
-    SET_ResizeBuffersMESA(disp, glResizeBuffersMESA);
-#endif
-
-#if GL_MESA_window_pos
-    SET_WindowPos4dMESA(disp, glWindowPos4dMESA);
-    SET_WindowPos4dvMESA(disp, glWindowPos4dvMESA);
-    SET_WindowPos4fMESA(disp, glWindowPos4fMESA);
-    SET_WindowPos4fvMESA(disp, glWindowPos4fvMESA);
-    SET_WindowPos4iMESA(disp, glWindowPos4iMESA);
-    SET_WindowPos4ivMESA(disp, glWindowPos4ivMESA);
-    SET_WindowPos4sMESA(disp, glWindowPos4sMESA);
-    SET_WindowPos4svMESA(disp, glWindowPos4svMESA);
-#endif
-
-#if GL_NV_fence
-    SET_DeleteFencesNV(disp, glDeleteFencesNV);
-    SET_FinishFenceNV(disp, glFinishFenceNV);
-    SET_GenFencesNV(disp, glGenFencesNV);
-    SET_GetFenceivNV(disp, glGetFenceivNV);
-    SET_IsFenceNV(disp, glIsFenceNV);
-    SET_SetFenceNV(disp, glSetFenceNV);
-    SET_TestFenceNV(disp, glTestFenceNV);
-#endif
-
-#if GL_NV_fragment_program
-    SET_GetProgramNamedParameterdvNV(disp, glGetProgramNamedParameterdvNV);
-    SET_GetProgramNamedParameterfvNV(disp, glGetProgramNamedParameterfvNV);
-    SET_ProgramNamedParameter4dNV(disp, glProgramNamedParameter4dNV);
-    SET_ProgramNamedParameter4dvNV(disp, glProgramNamedParameter4dvNV);
-    SET_ProgramNamedParameter4fNV(disp, glProgramNamedParameter4fNV);
-    SET_ProgramNamedParameter4fvNV(disp, glProgramNamedParameter4fvNV);
-#endif
-
-#if GL_NV_geometry_program4
-    SET_FramebufferTextureLayerEXT(disp, glFramebufferTextureLayerEXT);
-#endif
-
-#if GL_NV_point_sprite
-    SET_PointParameteriNV(disp, glPointParameteriNV);
-    SET_PointParameterivNV(disp, glPointParameterivNV);
-#endif
-
-#if GL_NV_register_combiners
-    SET_CombinerInputNV(disp, glCombinerInputNV);
-    SET_CombinerOutputNV(disp, glCombinerOutputNV);
-    SET_CombinerParameterfNV(disp, glCombinerParameterfNV);
-    SET_CombinerParameterfvNV(disp, glCombinerParameterfvNV);
-    SET_CombinerParameteriNV(disp, glCombinerParameteriNV);
-    SET_CombinerParameterivNV(disp, glCombinerParameterivNV);
-    SET_FinalCombinerInputNV(disp, glFinalCombinerInputNV);
-    SET_GetCombinerInputParameterfvNV(disp, glGetCombinerInputParameterfvNV);
-    SET_GetCombinerInputParameterivNV(disp, glGetCombinerInputParameterivNV);
-    SET_GetCombinerOutputParameterfvNV(disp, glGetCombinerOutputParameterfvNV);
-    SET_GetCombinerOutputParameterivNV(disp, glGetCombinerOutputParameterivNV);
-    SET_GetFinalCombinerInputParameterfvNV(disp, glGetFinalCombinerInputParameterfvNV);
-    SET_GetFinalCombinerInputParameterivNV(disp, glGetFinalCombinerInputParameterivNV);
-#endif
-
-#if GL_NV_vertex_array_range
-    SET_FlushVertexArrayRangeNV(disp, glFlushVertexArrayRangeNV);
-    SET_VertexArrayRangeNV(disp, glVertexArrayRangeNV);
-#endif
-
-#if GL_NV_vertex_program
-    SET_AreProgramsResidentNV(disp, glAreProgramsResidentNV);
-    SET_BindProgramNV(disp, glBindProgramNV);
-    SET_DeleteProgramsNV(disp, glDeleteProgramsNV);
-    SET_ExecuteProgramNV(disp, glExecuteProgramNV);
-    SET_GenProgramsNV(disp, glGenProgramsNV);
-    SET_GetProgramParameterdvNV(disp, glGetProgramParameterdvNV);
-    SET_GetProgramParameterfvNV(disp, glGetProgramParameterfvNV);
-    SET_GetProgramStringNV(disp, glGetProgramStringNV);
-    SET_GetProgramivNV(disp, glGetProgramivNV);
-    SET_GetTrackMatrixivNV(disp, glGetTrackMatrixivNV);
-    SET_GetVertexAttribPointervNV(disp, glGetVertexAttribPointervNV);
-    SET_GetVertexAttribdvNV(disp, glGetVertexAttribdvNV);
-    SET_GetVertexAttribfvNV(disp, glGetVertexAttribfvNV);
-    SET_GetVertexAttribivNV(disp, glGetVertexAttribivNV);
-    SET_IsProgramNV(disp, glIsProgramNV);
-    SET_LoadProgramNV(disp, glLoadProgramNV);
-    SET_ProgramParameters4dvNV(disp, glProgramParameters4dvNV);
-    SET_ProgramParameters4fvNV(disp, glProgramParameters4fvNV);
-    SET_RequestResidentProgramsNV(disp, glRequestResidentProgramsNV);
-    SET_TrackMatrixNV(disp, glTrackMatrixNV);
-    SET_VertexAttrib1dNV(disp, glVertexAttrib1dNV)
-    SET_VertexAttrib1dvNV(disp, glVertexAttrib1dvNV)
-    SET_VertexAttrib1fNV(disp, glVertexAttrib1fNV)
-    SET_VertexAttrib1fvNV(disp, glVertexAttrib1fvNV)
-    SET_VertexAttrib1sNV(disp, glVertexAttrib1sNV)
-    SET_VertexAttrib1svNV(disp, glVertexAttrib1svNV)
-    SET_VertexAttrib2dNV(disp, glVertexAttrib2dNV)
-    SET_VertexAttrib2dvNV(disp, glVertexAttrib2dvNV)
-    SET_VertexAttrib2fNV(disp, glVertexAttrib2fNV)
-    SET_VertexAttrib2fvNV(disp, glVertexAttrib2fvNV)
-    SET_VertexAttrib2sNV(disp, glVertexAttrib2sNV)
-    SET_VertexAttrib2svNV(disp, glVertexAttrib2svNV)
-    SET_VertexAttrib3dNV(disp, glVertexAttrib3dNV)
-    SET_VertexAttrib3dvNV(disp, glVertexAttrib3dvNV)
-    SET_VertexAttrib3fNV(disp, glVertexAttrib3fNV)
-    SET_VertexAttrib3fvNV(disp, glVertexAttrib3fvNV)
-    SET_VertexAttrib3sNV(disp, glVertexAttrib3sNV)
-    SET_VertexAttrib3svNV(disp, glVertexAttrib3svNV)
-    SET_VertexAttrib4dNV(disp, glVertexAttrib4dNV)
-    SET_VertexAttrib4dvNV(disp, glVertexAttrib4dvNV)
-    SET_VertexAttrib4fNV(disp, glVertexAttrib4fNV)
-    SET_VertexAttrib4fvNV(disp, glVertexAttrib4fvNV)
-    SET_VertexAttrib4sNV(disp, glVertexAttrib4sNV)
-    SET_VertexAttrib4svNV(disp, glVertexAttrib4svNV)
-    SET_VertexAttrib4ubNV(disp, glVertexAttrib4ubNV)
-    SET_VertexAttrib4ubvNV(disp, glVertexAttrib4ubvNV)
-    SET_VertexAttribPointerNV(disp, glVertexAttribPointerNV)
-    SET_VertexAttribs1dvNV(disp, glVertexAttribs1dvNV)
-    SET_VertexAttribs1fvNV(disp, glVertexAttribs1fvNV)
-    SET_VertexAttribs1svNV(disp, glVertexAttribs1svNV)
-    SET_VertexAttribs2dvNV(disp, glVertexAttribs2dvNV)
-    SET_VertexAttribs2fvNV(disp, glVertexAttribs2fvNV)
-    SET_VertexAttribs2svNV(disp, glVertexAttribs2svNV)
-    SET_VertexAttribs3dvNV(disp, glVertexAttribs3dvNV)
-    SET_VertexAttribs3fvNV(disp, glVertexAttribs3fvNV)
-    SET_VertexAttribs3svNV(disp, glVertexAttribs3svNV)
-    SET_VertexAttribs4dvNV(disp, glVertexAttribs4dvNV)
-    SET_VertexAttribs4fvNV(disp, glVertexAttribs4fvNV)
-    SET_VertexAttribs4svNV(disp, glVertexAttribs4svNV)
-    SET_VertexAttribs4ubvNV(disp, glVertexAttribs4ubvNV)
-#endif
-
-#if GL_SGIS_multisample
-    SET_SampleMaskSGIS(disp, glSampleMaskSGIS);
-    SET_SamplePatternSGIS(disp, glSamplePatternSGIS);
-#endif
-
-#if GL_SGIS_pixel_texture
-    SET_GetPixelTexGenParameterfvSGIS(disp, glGetPixelTexGenParameterfvSGIS);
-    SET_GetPixelTexGenParameterivSGIS(disp, glGetPixelTexGenParameterivSGIS);
-    SET_PixelTexGenParameterfSGIS(disp, glPixelTexGenParameterfSGIS);
-    SET_PixelTexGenParameterfvSGIS(disp, glPixelTexGenParameterfvSGIS);
-    SET_PixelTexGenParameteriSGIS(disp, glPixelTexGenParameteriSGIS);
-    SET_PixelTexGenParameterivSGIS(disp, glPixelTexGenParameterivSGIS);
-    SET_PixelTexGenSGIX(disp, glPixelTexGenSGIX);
-#endif
-}
+/*
+ * GLX implementation that uses Apple's OpenGL.framework
+ * (Indirect rendering path -- it's also used for some direct mode code too)
+ *
+ * Copyright (c) 2007, 2008, 2009 Apple Inc.
+ * Copyright (c) 2004 Torrey T. Lyons. All Rights Reserved.
+ * Copyright (c) 2002 Greg Parker. All Rights Reserved.
+ *
+ * Portions of this file are copied from Mesa's xf86glx.c,
+ * which contains the following copyright:
+ *
+ * Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "dri.h"
+
+#include <AvailabilityMacros.h>
+
+#define GL_GLEXT_WUNDEF_SUPPORT
+
+#include <OpenGL/OpenGL.h>
+#include <OpenGL/gl.h>
+#include <OpenGL/glext.h>
+#include <OpenGL/CGLContext.h>
+
+/* These next few GL_EXT pre-processing blocks are to explicitly define 
+ * these symbols to 0 if they are not set by OpenGL.framework.  This
+ * prevents the X11 glext.h from setting them to 1.
+ */
+
+#ifndef GL_EXT_fragment_shader
+#define GL_EXT_fragment_shader 0
+#endif
+
+#ifndef GL_EXT_blend_equation_separate
+#define GL_EXT_blend_equation_separate 0
+#endif
+
+#ifndef GL_EXT_blend_func_separate
+#define GL_EXT_blend_func_separate 0
+#endif
+
+#ifndef GL_EXT_depth_bounds_test
+#define GL_EXT_depth_bounds_test 0
+#endif
+
+#ifndef GL_EXT_compiled_vertex_array
+#define GL_EXT_compiled_vertex_array 0
+#endif
+
+#ifndef GL_EXT_cull_vertex
+#define GL_EXT_cull_vertex 0
+#endif
+
+#ifndef GL_EXT_fog_coord
+#define GL_EXT_fog_coord 0
+#endif
+
+#ifndef GL_EXT_framebuffer_blit
+#define GL_EXT_framebuffer_blit 0
+#endif
+
+#ifndef GL_EXT_framebuffer_object
+#define GL_EXT_framebuffer_object 0
+#endif
+
+#ifndef GL_EXT_gpu_program_parameters
+#define GL_EXT_gpu_program_parameters 0
+#endif
+
+#ifndef GL_EXT_multi_draw_arrays
+#define GL_EXT_multi_draw_arrays 0
+#endif
+
+#ifndef GL_EXT_point_parameters
+#define GL_EXT_point_parameters 0
+#endif
+
+#ifndef GL_EXT_polygon_offset
+#define GL_EXT_polygon_offset 0
+#endif
+
+#ifndef GL_EXT_secondary_color
+#define GL_EXT_secondary_color 0
+#endif
+
+#ifndef GL_EXT_stencil_two_side
+#define GL_EXT_stencil_two_side 0
+#endif
+
+#ifndef GL_EXT_timer_query
+#define GL_EXT_timer_query 0
+#endif
+
+#ifndef GL_EXT_vertex_array
+#define GL_EXT_vertex_array 0
+#endif
+
+/* Tiger PPC doesn't have the associated symbols, but glext.h says it does.  Liars!
+ * http://trac.macports.org/ticket/20638
+ */
+#if defined(__ppc__) && MAC_OS_X_VERSION_MIN_REQUIRED < 1050
+#undef GL_EXT_gpu_program_parameters
+#define GL_EXT_gpu_program_parameters 0
+#endif
+
+#include <GL/glxproto.h>
+#include <windowstr.h>
+#include <resource.h>
+#include <GL/glxint.h>
+#include <GL/glxtokens.h>
+#include <scrnintstr.h>
+#include <glxserver.h>
+#include <glxscreens.h>
+#include <glxdrawable.h>
+#include <glxcontext.h>
+#include <glxext.h>
+#include <glxutil.h>
+#include <glxscreens.h>
+#include <GL/internal/glcore.h>
+#include "x-hash.h"
+#include "x-list.h"
+
+//#include "capabilities.h"
+#include "visualConfigs.h"
+
+typedef unsigned long long GLuint64EXT;
+typedef long long GLint64EXT;
+#include <dispatch.h>
+#include <Xplugin.h>
+#include <glapi.h>
+#include <glapitable.h>
+
+__GLXprovider * GlxGetDRISWrastProvider (void);
+
+// Write debugging output, or not
+#ifdef GLAQUA_DEBUG
+#define GLAQUA_DEBUG_MSG ErrorF
+#else
+#define GLAQUA_DEBUG_MSG(a, ...)
+#endif
+
+static void setup_dispatch_table(void);
+GLuint __glFloorLog2(GLuint val);
+void warn_func(void * p1, char *format, ...);
+
+// some prototypes
+static __GLXscreen * __glXAquaScreenProbe(ScreenPtr pScreen);
+static __GLXdrawable * __glXAquaScreenCreateDrawable(ClientPtr client, __GLXscreen *screen, DrawablePtr pDraw, XID drawId, int type, XID glxDrawId, __GLXconfig *conf);
+
+static void __glXAquaContextDestroy(__GLXcontext *baseContext);
+static int __glXAquaContextMakeCurrent(__GLXcontext *baseContext);
+static int __glXAquaContextLoseCurrent(__GLXcontext *baseContext);
+static int __glXAquaContextForceCurrent(__GLXcontext *baseContext);
+static int __glXAquaContextCopy(__GLXcontext *baseDst, __GLXcontext *baseSrc, unsigned long mask);
+
+static CGLPixelFormatObj makeFormat(__GLXconfig *conf);
+
+__GLXprovider __glXDRISWRastProvider = {
+    __glXAquaScreenProbe,
+    "Core OpenGL",
+    NULL
+};
+
+typedef struct __GLXAquaScreen   __GLXAquaScreen;
+typedef struct __GLXAquaContext  __GLXAquaContext;
+typedef struct __GLXAquaDrawable __GLXAquaDrawable;
+
+struct __GLXAquaScreen {
+    __GLXscreen base;
+    int index;
+    int num_vis;
+};
+
+struct __GLXAquaContext {
+    __GLXcontext base;
+    CGLContextObj ctx;
+    CGLPixelFormatObj pixelFormat;
+    xp_surface_id sid;
+    unsigned isAttached :1;
+};
+
+struct __GLXAquaDrawable {
+    __GLXdrawable base;
+    DrawablePtr pDraw;
+    xp_surface_id sid;
+    __GLXAquaContext *context;
+};
+
+
+static __GLXcontext *
+__glXAquaScreenCreateContext(__GLXscreen *screen,
+			     __GLXconfig *conf,
+			     __GLXcontext *baseShareContext)
+{
+    __GLXAquaContext *context;
+    __GLXAquaContext *shareContext = (__GLXAquaContext *) baseShareContext;
+    CGLError gl_err;
+  
+    GLAQUA_DEBUG_MSG("glXAquaScreenCreateContext\n");
+    
+    context = xcalloc(1, sizeof (__GLXAquaContext));
+    
+    if (context == NULL)
+	return NULL;
+
+    memset(context, 0, sizeof *context);
+    
+    context->base.pGlxScreen = screen;
+    
+    context->base.destroy        = __glXAquaContextDestroy;
+    context->base.makeCurrent    = __glXAquaContextMakeCurrent;
+    context->base.loseCurrent    = __glXAquaContextLoseCurrent;
+    context->base.copy           = __glXAquaContextCopy;
+    context->base.forceCurrent   = __glXAquaContextForceCurrent;
+    /*FIXME verify that the context->base is fully initialized. */
+    
+    context->pixelFormat = makeFormat(conf);
+    
+    if (!context->pixelFormat) {
+        xfree(context);
+        return NULL;
+    }
+
+    context->ctx = NULL;
+    gl_err = CGLCreateContext(context->pixelFormat,
+			      shareContext ? shareContext->ctx : NULL,
+			      &context->ctx);
+    
+    if (gl_err != 0) {
+	ErrorF("CGLCreateContext error: %s\n", CGLErrorString(gl_err));
+	CGLDestroyPixelFormat(context->pixelFormat);
+	xfree(context);
+	return NULL;
+    }
+    
+    setup_dispatch_table();
+    GLAQUA_DEBUG_MSG("glAquaCreateContext done\n");
+    
+    return &context->base;
+}
+
+/* maps from surface id -> list of __GLcontext */
+static x_hash_table *surface_hash;
+
+static void __glXAquaContextDestroy(__GLXcontext *baseContext) {
+    x_list *lst;
+
+    __GLXAquaContext *context = (__GLXAquaContext *) baseContext;
+    
+    GLAQUA_DEBUG_MSG("glAquaContextDestroy (ctx 0x%x)\n",
+                     (unsigned int) baseContext);
+    if (context != NULL) {
+      if (context->sid != 0 && surface_hash != NULL) {
+		lst = x_hash_table_lookup(surface_hash, x_cvt_uint_to_vptr(context->sid), NULL);
+		lst = x_list_remove(lst, context);
+		x_hash_table_insert(surface_hash, x_cvt_uint_to_vptr(context->sid), lst);
+      }
+
+      if (context->ctx != NULL)
+	  CGLDestroyContext(context->ctx);
+
+      if (context->pixelFormat != NULL)
+	  CGLDestroyPixelFormat(context->pixelFormat);
+      
+      xfree(context);
+    }
+}
+
+static int __glXAquaContextLoseCurrent(__GLXcontext *baseContext) {
+    CGLError gl_err;
+
+    GLAQUA_DEBUG_MSG("glAquaLoseCurrent (ctx 0x%p)\n", baseContext);
+
+    gl_err = CGLSetCurrentContext(NULL);
+    if (gl_err != 0)
+      ErrorF("CGLSetCurrentContext error: %s\n", CGLErrorString(gl_err));
+
+    __glXLastContext = NULL; // Mesa does this; why?
+
+    return GL_TRUE;
+}
+
+/* Called when a surface is destroyed as a side effect of destroying
+   the window it's attached to. */
+static void surface_notify(void *_arg, void *data) {
+    DRISurfaceNotifyArg *arg = (DRISurfaceNotifyArg *)_arg;
+    __GLXAquaDrawable *draw = (__GLXAquaDrawable *)data;
+    __GLXAquaContext *context;
+    x_list *lst;
+    if(_arg == NULL || data == NULL) {
+	    ErrorF("surface_notify called with bad params");
+	    return;
+    }
+	
+    GLAQUA_DEBUG_MSG("surface_notify(%p, %p)\n", _arg, data);
+    switch (arg->kind) {
+    case AppleDRISurfaceNotifyDestroyed:
+        if (surface_hash != NULL)
+            x_hash_table_remove(surface_hash, x_cvt_uint_to_vptr(arg->id));
+	draw->base.pDraw = NULL;
+	draw->sid = 0;
+        break;
+
+    case AppleDRISurfaceNotifyChanged:
+        if (surface_hash != NULL) {
+            lst = x_hash_table_lookup(surface_hash, x_cvt_uint_to_vptr(arg->id), NULL);
+            for (; lst != NULL; lst = lst->next)
+		{
+                context = lst->data;
+                xp_update_gl_context(context->ctx);
+            }
+        }
+        break;
+    default:
+	ErrorF("surface_notify: unknown kind %d\n", arg->kind);
+	break;
+    }
+}
+
+static BOOL attach(__GLXAquaContext *context, __GLXAquaDrawable *draw) {
+    DrawablePtr pDraw;
+    
+    GLAQUA_DEBUG_MSG("attach(%p, %p)\n", context, draw);
+	
+    if(NULL == context || NULL == draw)
+	return TRUE;
+
+    pDraw = draw->base.pDraw;
+
+    if(NULL == pDraw) {
+	ErrorF("%s:%s() pDraw is NULL!\n", __FILE__, __func__);
+	return TRUE;
+    }
+
+    if (draw->sid == 0) {
+	//if (!quartzProcs->CreateSurface(pDraw->pScreen, pDraw->id, pDraw,
+        if (!DRICreateSurface(pDraw->pScreen, pDraw->id, pDraw,
+			      0, &draw->sid, NULL,
+			      surface_notify, draw))
+            return TRUE;
+        draw->pDraw = pDraw;
+    } 
+    
+    if (!context->isAttached || context->sid != draw->sid) {
+        x_list *lst;
+	
+        if (xp_attach_gl_context(context->ctx, draw->sid) != Success) {
+	    //quartzProcs->DestroySurface(pDraw->pScreen, pDraw->id, pDraw,
+            DRIDestroySurface(pDraw->pScreen, pDraw->id, pDraw,
+			      surface_notify, draw);
+            if (surface_hash != NULL)
+                x_hash_table_remove(surface_hash, x_cvt_uint_to_vptr(draw->sid));
+	    
+            draw->sid = 0;
+            return TRUE;
+        }
+	
+        context->isAttached = TRUE;
+        context->sid = draw->sid;
+	
+        if (surface_hash == NULL)
+            surface_hash = x_hash_table_new(NULL, NULL, NULL, NULL);
+	
+        lst = x_hash_table_lookup(surface_hash, x_cvt_uint_to_vptr(context->sid), NULL);
+        if (x_list_find(lst, context) == NULL) {
+            lst = x_list_prepend(lst, context);
+            x_hash_table_insert(surface_hash, x_cvt_uint_to_vptr(context->sid), lst);
+        }
+	
+	
+
+        GLAQUA_DEBUG_MSG("attached 0x%x to 0x%x\n", (unsigned int) pDraw->id,
+                         (unsigned int) draw->sid);
+    } 
+
+    draw->context = context;
+
+    return FALSE;
+}
+
+#if 0     // unused
+static void unattach(__GLXAquaContext *context) {
+	x_list *lst;
+	GLAQUA_DEBUG_MSG("unattach\n");
+	if (context == NULL) {
+		ErrorF("Tried to unattach a null context\n");
+		return;
+	}
+    if (context->isAttached) {
+        GLAQUA_DEBUG_MSG("unattaching\n");
+
+        if (surface_hash != NULL) {
+            lst = x_hash_table_lookup(surface_hash, (void *) context->sid, NULL);
+            lst = x_list_remove(lst, context);
+            x_hash_table_insert(surface_hash, (void *) context->sid, lst);
+        }
+
+        CGLClearDrawable(context->ctx);
+        context->isAttached = FALSE;
+        context->sid = 0;
+    }
+}
+#endif
+
+static int __glXAquaContextMakeCurrent(__GLXcontext *baseContext) {
+    CGLError gl_err;
+    __GLXAquaContext *context = (__GLXAquaContext *) baseContext;
+    __GLXAquaDrawable *drawPriv = (__GLXAquaDrawable *) context->base.drawPriv;
+    
+    GLAQUA_DEBUG_MSG("glAquaMakeCurrent (ctx 0x%p)\n", baseContext);
+    
+    if(attach(context, drawPriv))
+	return /*error*/ 0;
+
+    gl_err = CGLSetCurrentContext(context->ctx);
+    if (gl_err != 0)
+        ErrorF("CGLSetCurrentContext error: %s\n", CGLErrorString(gl_err));
+    
+    return gl_err == 0;
+}
+
+static int __glXAquaContextCopy(__GLXcontext *baseDst, __GLXcontext *baseSrc, unsigned long mask)
+{
+    CGLError gl_err;
+
+    __GLXAquaContext *dst = (__GLXAquaContext *) baseDst;
+    __GLXAquaContext *src = (__GLXAquaContext *) baseSrc;
+
+    GLAQUA_DEBUG_MSG("GLXAquaContextCopy\n");
+
+    gl_err = CGLCopyContext(src->ctx, dst->ctx, mask);
+    if (gl_err != 0)
+        ErrorF("CGLCopyContext error: %s\n", CGLErrorString(gl_err));
+
+    return gl_err == 0;
+}
+
+static int __glXAquaContextForceCurrent(__GLXcontext *baseContext)
+{
+    CGLError gl_err;
+    __GLXAquaContext *context = (__GLXAquaContext *) baseContext;
+    GLAQUA_DEBUG_MSG("glAquaForceCurrent (ctx %p)\n", context->ctx);
+
+    gl_err = CGLSetCurrentContext(context->ctx);
+    if (gl_err != 0)
+        ErrorF("CGLSetCurrentContext error: %s\n", CGLErrorString(gl_err));
+
+    return gl_err == 0;
+}
+
+/* Drawing surface notification callbacks */
+static GLboolean __glXAquaDrawableSwapBuffers(ClientPtr client, __GLXdrawable *base) {
+    CGLError err;
+    __GLXAquaDrawable *drawable;
+ 
+    //    GLAQUA_DEBUG_MSG("glAquaDrawableSwapBuffers(%p)\n",base);
+	
+    if(!base) {
+	ErrorF("%s passed NULL\n", __func__);
+	return GL_FALSE;
+    }
+
+    drawable = (__GLXAquaDrawable *)base;
+
+    if(NULL == drawable->context) {
+	ErrorF("%s called with a NULL->context for drawable %p!\n",
+	       __func__, (void *)drawable);
+	return GL_FALSE;
+    }
+
+    err = CGLFlushDrawable(drawable->context->ctx);
+
+    if(kCGLNoError != err) {
+	ErrorF("CGLFlushDrawable error: %s in %s\n", CGLErrorString(err),
+	       __func__);
+	return GL_FALSE;
+    }
+
+    return GL_TRUE;
+}
+
+
+static CGLPixelFormatObj makeFormat(__GLXconfig *conf) {
+    CGLPixelFormatAttribute attr[64];
+    CGLPixelFormatObj fobj;
+    GLint formats;
+    CGLError error;
+    int i = 0;
+    
+    if(conf->doubleBufferMode)
+	attr[i++] = kCGLPFADoubleBuffer;
+
+    if(conf->stereoMode)
+	attr[i++] = kCGLPFAStereo;
+
+    attr[i++] = kCGLPFAColorSize;
+    attr[i++] = conf->redBits + conf->greenBits + conf->blueBits;
+    attr[i++] = kCGLPFAAlphaSize;
+    attr[i++] = conf->alphaBits;
+
+    if((conf->accumRedBits + conf->accumGreenBits + conf->accumBlueBits +
+	conf->accumAlphaBits) > 0) {
+
+	attr[i++] = kCGLPFAAccumSize;
+        attr[i++] = conf->accumRedBits + conf->accumGreenBits
+	    + conf->accumBlueBits + conf->accumAlphaBits;
+    }
+    
+    attr[i++] = kCGLPFADepthSize;
+    attr[i++] = conf->depthBits;
+
+    if(conf->stencilBits) {
+	attr[i++] = kCGLPFAStencilSize;
+        attr[i++] = conf->stencilBits;	
+    }
+    
+    if(conf->numAuxBuffers > 0) {
+	attr[i++] = kCGLPFAAuxBuffers;
+	attr[i++] = conf->numAuxBuffers;
+    }
+
+    if(conf->sampleBuffers > 0) {
+       attr[i++] = kCGLPFASampleBuffers;
+       attr[i++] = conf->sampleBuffers;
+       attr[i++] = kCGLPFASamples;
+       attr[i++] = conf->samples;
+    }
+     
+    attr[i] = 0;
+
+    error = CGLChoosePixelFormat(attr, &fobj, &formats);
+    if(error) {
+	ErrorF("error: creating pixel format %s\n", CGLErrorString(error));
+	return NULL;
+    }
+
+    return fobj;
+}
+
+static void __glXAquaScreenDestroy(__GLXscreen *screen) {
+
+    GLAQUA_DEBUG_MSG("glXAquaScreenDestroy(%p)\n", screen);
+    __glXScreenDestroy(screen);
+
+    xfree(screen);
+}
+
+/* This is called by __glXInitScreens(). */
+static __GLXscreen * __glXAquaScreenProbe(ScreenPtr pScreen) {
+    __GLXAquaScreen *screen;
+
+    GLAQUA_DEBUG_MSG("glXAquaScreenProbe\n");
+
+    if (pScreen == NULL) 
+	return NULL;
+
+    screen = xcalloc(1, sizeof *screen);
+
+    if(NULL == screen)
+	return NULL;
+    
+    screen->base.destroy        = __glXAquaScreenDestroy;
+    screen->base.createContext  = __glXAquaScreenCreateContext;
+    screen->base.createDrawable = __glXAquaScreenCreateDrawable;
+    screen->base.swapInterval = /*FIXME*/ NULL;
+    screen->base.hyperpipeFuncs = NULL;
+    screen->base.swapBarrierFuncs = NULL;
+    screen->base.pScreen       = pScreen;
+    
+    screen->base.fbconfigs = __glXAquaCreateVisualConfigs(&screen->base.numFBConfigs, pScreen->myNum);
+
+    __glXScreenInit(&screen->base, pScreen);
+
+    screen->base.GLXversion = xstrdup("1.4");
+    screen->base.GLXextensions = xstrdup("GLX_SGIX_fbconfig "
+					 "GLX_SGIS_multisample "
+					 "GLX_ARB_multisample "
+					 "GLX_EXT_visual_info "
+					 "GLX_EXT_import_context ");
+    
+    /*We may be able to add more GLXextensions at a later time. */
+    
+    return &screen->base;
+}
+
+#if 0 // unused
+static void __glXAquaDrawableCopySubBuffer (__GLXdrawable *drawable,
+					    int x, int y, int w, int h) {
+    /*TODO finish me*/
+}
+#endif
+
+static void __glXAquaDrawableDestroy(__GLXdrawable *base) {
+    /* gstaplin: base is the head of the structure, so it's at the same 
+     * offset in memory.
+     * Is this safe with strict aliasing?   I noticed that the other dri code
+     * does this too...
+     */
+    __GLXAquaDrawable *glxPriv = (__GLXAquaDrawable *)base;
+
+    GLAQUA_DEBUG_MSG(__func__);
+    
+    /* It doesn't work to call DRIDestroySurface here, the drawable's
+       already gone.. But dri.c notices the window destruction and
+       frees the surface itself. */
+
+    /*gstaplin: verify the statement above.  The surface destroy
+     *messages weren't making it through, and may still not be.
+     *We need a good test case for surface creation and destruction.
+     *We also need a good way to enable introspection on the server
+     *to validate the test, beyond using gdb with print.
+     */
+
+    xfree(glxPriv);
+}
+
+static __GLXdrawable *
+__glXAquaScreenCreateDrawable(ClientPtr client,
+                              __GLXscreen *screen,
+			      DrawablePtr pDraw,
+			      XID drawId,
+			      int type,
+			      XID glxDrawId,
+			      __GLXconfig *conf) {
+  __GLXAquaDrawable *glxPriv;
+
+  glxPriv = xalloc(sizeof *glxPriv);
+
+  if(glxPriv == NULL)
+      return NULL;
+
+  memset(glxPriv, 0, sizeof *glxPriv);
+
+  if(!__glXDrawableInit(&glxPriv->base, screen, pDraw, type, glxDrawId, conf)) {
+    xfree(glxPriv);
+    return NULL;
+  }
+
+  glxPriv->base.destroy       = __glXAquaDrawableDestroy;
+  glxPriv->base.swapBuffers   = __glXAquaDrawableSwapBuffers;
+  glxPriv->base.copySubBuffer = NULL; /* __glXAquaDrawableCopySubBuffer; */
+
+  glxPriv->pDraw = pDraw;
+  glxPriv->sid = 0;
+  glxPriv->context = NULL;
+  
+  return &glxPriv->base;
+}
+
+// Extra goodies for glx
+
+GLuint __glFloorLog2(GLuint val)
+{
+    int c = 0;
+
+    while (val > 1) {
+        c++;
+        val >>= 1;
+    }
+    return c;
+}
+
+void warn_func(void * p1, char *format, ...) {
+    va_list v;
+    va_start(v, format);
+    vfprintf(stderr, format, v);
+    va_end(v);
+}
+
+static void setup_dispatch_table(void) {
+    struct _glapi_table *disp=_glapi_get_dispatch();
+    _glapi_set_warning_func((_glapi_warning_func)warn_func);
+    _glapi_noop_enable_warnings(TRUE);
+
+    /* to update:
+     * for f in $(grep 'define SET_' ../../../glx/dispatch.h  | cut -f2 -d' ' | cut -f1 -d\( | sort -u); do grep -q $f indirect.c || echo $f ; done | grep -v by_offset | sed 's:SET_\(.*\)$:SET_\1(disp, gl\1)\;:' | pbcopy
+     */
+
+    SET_Accum(disp, glAccum);
+    SET_AlphaFunc(disp, glAlphaFunc);
+    SET_AreTexturesResident(disp, glAreTexturesResident);
+    SET_ArrayElement(disp, glArrayElement);
+    SET_Begin(disp, glBegin);
+    SET_BindTexture(disp, glBindTexture);
+    SET_Bitmap(disp, glBitmap);
+    SET_BlendColor(disp, glBlendColor);
+    SET_BlendEquation(disp, glBlendEquation);
+    SET_BlendFunc(disp, glBlendFunc);
+    SET_CallList(disp, glCallList);
+    SET_CallLists(disp, glCallLists);
+    SET_Clear(disp, glClear);
+    SET_ClearAccum(disp, glClearAccum);
+    SET_ClearColor(disp, glClearColor);
+    SET_ClearDepth(disp, glClearDepth);
+    SET_ClearIndex(disp, glClearIndex);
+    SET_ClearStencil(disp, glClearStencil);
+    SET_ClipPlane(disp, glClipPlane);
+    SET_Color3b(disp, glColor3b);
+    SET_Color3bv(disp, glColor3bv);
+    SET_Color3d(disp, glColor3d);
+    SET_Color3dv(disp, glColor3dv);
+    SET_Color3f(disp, glColor3f);
+    SET_Color3fv(disp, glColor3fv);
+    SET_Color3i(disp, glColor3i);
+    SET_Color3iv(disp, glColor3iv);
+    SET_Color3s(disp, glColor3s);
+    SET_Color3sv(disp, glColor3sv);
+    SET_Color3ub(disp, glColor3ub);
+    SET_Color3ubv(disp, glColor3ubv);
+    SET_Color3ui(disp, glColor3ui);
+    SET_Color3uiv(disp, glColor3uiv);
+    SET_Color3us(disp, glColor3us);
+    SET_Color3usv(disp, glColor3usv);
+    SET_Color4b(disp, glColor4b);
+    SET_Color4bv(disp, glColor4bv);
+    SET_Color4d(disp, glColor4d);
+    SET_Color4dv(disp, glColor4dv);
+    SET_Color4f(disp, glColor4f);
+    SET_Color4fv(disp, glColor4fv);
+    SET_Color4i(disp, glColor4i);
+    SET_Color4iv(disp, glColor4iv);
+    SET_Color4s(disp, glColor4s);
+    SET_Color4sv(disp, glColor4sv);
+    SET_Color4ub(disp, glColor4ub);
+    SET_Color4ubv(disp, glColor4ubv);
+    SET_Color4ui(disp, glColor4ui);
+    SET_Color4uiv(disp, glColor4uiv);
+    SET_Color4us(disp, glColor4us);
+    SET_Color4usv(disp, glColor4usv);
+    SET_ColorMask(disp, glColorMask);
+    SET_ColorMaterial(disp, glColorMaterial);
+    SET_ColorPointer(disp, glColorPointer);
+    SET_ColorSubTable(disp, glColorSubTable);
+    SET_ColorTable(disp, glColorTable);
+    SET_ColorTableParameterfv(disp, glColorTableParameterfv);
+    SET_ColorTableParameteriv(disp, glColorTableParameteriv);
+    SET_ConvolutionFilter1D(disp, glConvolutionFilter1D);
+    SET_ConvolutionFilter2D(disp, glConvolutionFilter2D);
+    SET_ConvolutionParameterf(disp, glConvolutionParameterf);
+    SET_ConvolutionParameterfv(disp, glConvolutionParameterfv);
+    SET_ConvolutionParameteri(disp, glConvolutionParameteri);
+    SET_ConvolutionParameteriv(disp, glConvolutionParameteriv);
+    SET_CopyColorSubTable(disp, glCopyColorSubTable);
+    SET_CopyColorTable(disp, glCopyColorTable);
+    SET_CopyConvolutionFilter1D(disp, glCopyConvolutionFilter1D);
+    SET_CopyConvolutionFilter2D(disp, glCopyConvolutionFilter2D);
+    SET_CopyPixels(disp, glCopyPixels);
+    SET_CopyTexImage1D(disp, glCopyTexImage1D);
+    SET_CopyTexImage2D(disp, glCopyTexImage2D);
+    SET_CopyTexSubImage1D(disp, glCopyTexSubImage1D);
+    SET_CopyTexSubImage2D(disp, glCopyTexSubImage2D);
+    SET_CopyTexSubImage3D(disp, glCopyTexSubImage3D);
+    SET_CullFace(disp, glCullFace);
+    SET_DeleteLists(disp, glDeleteLists);
+    SET_DeleteTextures(disp, glDeleteTextures);
+    SET_DepthFunc(disp, glDepthFunc);
+    SET_DepthMask(disp, glDepthMask);
+    SET_DepthRange(disp, glDepthRange);
+    SET_Disable(disp, glDisable);
+    SET_DisableClientState(disp, glDisableClientState);
+    SET_DrawArrays(disp, glDrawArrays);
+    SET_DrawBuffer(disp, glDrawBuffer);
+    SET_DrawElements(disp, glDrawElements);
+    SET_DrawPixels(disp, glDrawPixels);
+    SET_DrawRangeElements(disp, glDrawRangeElements);
+    SET_EdgeFlag(disp, glEdgeFlag);
+    SET_EdgeFlagPointer(disp, glEdgeFlagPointer);
+    SET_EdgeFlagv(disp, glEdgeFlagv);
+    SET_Enable(disp, glEnable);
+    SET_EnableClientState(disp, glEnableClientState);
+    SET_End(disp, glEnd);
+    SET_EndList(disp, glEndList);
+    SET_EvalCoord1d(disp, glEvalCoord1d);
+    SET_EvalCoord1dv(disp, glEvalCoord1dv);
+    SET_EvalCoord1f(disp, glEvalCoord1f);
+    SET_EvalCoord1fv(disp, glEvalCoord1fv);
+    SET_EvalCoord2d(disp, glEvalCoord2d);
+    SET_EvalCoord2dv(disp, glEvalCoord2dv);
+    SET_EvalCoord2f(disp, glEvalCoord2f);
+    SET_EvalCoord2fv(disp, glEvalCoord2fv);
+    SET_EvalMesh1(disp, glEvalMesh1);
+    SET_EvalMesh2(disp, glEvalMesh2);
+    SET_EvalPoint1(disp, glEvalPoint1);
+    SET_EvalPoint2(disp, glEvalPoint2);
+    SET_FeedbackBuffer(disp, glFeedbackBuffer);
+    SET_Finish(disp, glFinish);
+    SET_Flush(disp, glFlush);
+    SET_Fogf(disp, glFogf);
+    SET_Fogfv(disp, glFogfv);
+    SET_Fogi(disp, glFogi);
+    SET_Fogiv(disp, glFogiv);
+    SET_FrontFace(disp, glFrontFace);
+    SET_Frustum(disp, glFrustum);
+    SET_GenLists(disp, glGenLists);
+    SET_GenTextures(disp, glGenTextures);
+    SET_GetBooleanv(disp, glGetBooleanv);
+    SET_GetClipPlane(disp, glGetClipPlane);
+    SET_GetColorTable(disp, glGetColorTable);
+    SET_GetColorTableParameterfv(disp, glGetColorTableParameterfv);
+    SET_GetColorTableParameteriv(disp, glGetColorTableParameteriv);
+    SET_GetConvolutionFilter(disp, glGetConvolutionFilter);
+    SET_GetConvolutionParameterfv(disp, glGetConvolutionParameterfv);
+    SET_GetConvolutionParameteriv(disp, glGetConvolutionParameteriv);
+    SET_GetDoublev(disp, glGetDoublev);
+    SET_GetError(disp, glGetError);
+    SET_GetFloatv(disp, glGetFloatv);
+    SET_GetHistogram(disp, glGetHistogram);
+    SET_GetHistogramParameterfv(disp, glGetHistogramParameterfv);
+    SET_GetHistogramParameteriv(disp, glGetHistogramParameteriv);
+    SET_GetIntegerv(disp, glGetIntegerv);
+    SET_GetLightfv(disp, glGetLightfv);
+    SET_GetLightiv(disp, glGetLightiv);
+    SET_GetMapdv(disp, glGetMapdv);
+    SET_GetMapfv(disp, glGetMapfv);
+    SET_GetMapiv(disp, glGetMapiv);
+    SET_GetMaterialfv(disp, glGetMaterialfv);
+    SET_GetMaterialiv(disp, glGetMaterialiv);
+    SET_GetMinmax(disp, glGetMinmax);
+    SET_GetMinmaxParameterfv(disp, glGetMinmaxParameterfv);
+    SET_GetMinmaxParameteriv(disp, glGetMinmaxParameteriv);
+    SET_GetPixelMapfv(disp, glGetPixelMapfv);
+    SET_GetPixelMapuiv(disp, glGetPixelMapuiv);
+    SET_GetPixelMapusv(disp, glGetPixelMapusv);
+    SET_GetPointerv(disp, glGetPointerv);
+    SET_GetPolygonStipple(disp, glGetPolygonStipple);
+    SET_GetSeparableFilter(disp, glGetSeparableFilter);
+    SET_GetString(disp, glGetString);
+    SET_GetTexEnvfv(disp, glGetTexEnvfv);
+    SET_GetTexEnviv(disp, glGetTexEnviv);
+    SET_GetTexGendv(disp, glGetTexGendv);
+    SET_GetTexGenfv(disp, glGetTexGenfv);
+    SET_GetTexGeniv(disp, glGetTexGeniv);
+    SET_GetTexImage(disp, glGetTexImage);
+    SET_GetTexLevelParameterfv(disp, glGetTexLevelParameterfv);
+    SET_GetTexLevelParameteriv(disp, glGetTexLevelParameteriv);
+    SET_GetTexParameterfv(disp, glGetTexParameterfv);
+    SET_GetTexParameteriv(disp, glGetTexParameteriv);
+    SET_Hint(disp, glHint);
+    SET_Histogram(disp, glHistogram);
+    SET_IndexMask(disp, glIndexMask);
+    SET_IndexPointer(disp, glIndexPointer);
+    SET_Indexd(disp, glIndexd);
+    SET_Indexdv(disp, glIndexdv);
+    SET_Indexf(disp, glIndexf);
+    SET_Indexfv(disp, glIndexfv);
+    SET_Indexi(disp, glIndexi);
+    SET_Indexiv(disp, glIndexiv);
+    SET_Indexs(disp, glIndexs);
+    SET_Indexsv(disp, glIndexsv);
+    SET_Indexub(disp, glIndexub);
+    SET_Indexubv(disp, glIndexubv);
+    SET_InitNames(disp, glInitNames);
+    SET_InterleavedArrays(disp, glInterleavedArrays);
+    SET_IsEnabled(disp, glIsEnabled);
+    SET_IsList(disp, glIsList);
+    SET_IsTexture(disp, glIsTexture);
+    SET_LightModelf(disp, glLightModelf);
+    SET_LightModelfv(disp, glLightModelfv);
+    SET_LightModeli(disp, glLightModeli);
+    SET_LightModeliv(disp, glLightModeliv);
+    SET_Lightf(disp, glLightf);
+    SET_Lightfv(disp, glLightfv);
+    SET_Lighti(disp, glLighti);
+    SET_Lightiv(disp, glLightiv);
+    SET_LineStipple(disp, glLineStipple);
+    SET_LineWidth(disp, glLineWidth);
+    SET_ListBase(disp, glListBase);
+    SET_LoadIdentity(disp, glLoadIdentity);
+    SET_LoadMatrixd(disp, glLoadMatrixd);
+    SET_LoadMatrixf(disp, glLoadMatrixf);
+    SET_LoadName(disp, glLoadName);
+    SET_LogicOp(disp, glLogicOp);
+    SET_Map1d(disp, glMap1d);
+    SET_Map1f(disp, glMap1f);
+    SET_Map2d(disp, glMap2d);
+    SET_Map2f(disp, glMap2f);
+    SET_MapGrid1d(disp, glMapGrid1d);
+    SET_MapGrid1f(disp, glMapGrid1f);
+    SET_MapGrid2d(disp, glMapGrid2d);
+    SET_MapGrid2f(disp, glMapGrid2f);
+    SET_Materialf(disp, glMaterialf);
+    SET_Materialfv(disp, glMaterialfv);
+    SET_Materiali(disp, glMateriali);
+    SET_Materialiv(disp, glMaterialiv);
+    SET_MatrixMode(disp, glMatrixMode);
+    SET_Minmax(disp, glMinmax);
+    SET_MultMatrixd(disp, glMultMatrixd);
+    SET_MultMatrixf(disp, glMultMatrixf);
+    SET_NewList(disp, glNewList);
+    SET_Normal3b(disp, glNormal3b);
+    SET_Normal3bv(disp, glNormal3bv);
+    SET_Normal3d(disp, glNormal3d);
+    SET_Normal3dv(disp, glNormal3dv);
+    SET_Normal3f(disp, glNormal3f);
+    SET_Normal3fv(disp, glNormal3fv);
+    SET_Normal3i(disp, glNormal3i);
+    SET_Normal3iv(disp, glNormal3iv);
+    SET_Normal3s(disp, glNormal3s);
+    SET_Normal3sv(disp, glNormal3sv);
+    SET_NormalPointer(disp, glNormalPointer);
+    SET_Ortho(disp, glOrtho);
+    SET_PassThrough(disp, glPassThrough);
+    SET_PixelMapfv(disp, glPixelMapfv);
+    SET_PixelMapuiv(disp, glPixelMapuiv);
+    SET_PixelMapusv(disp, glPixelMapusv);
+    SET_PixelStoref(disp, glPixelStoref);
+    SET_PixelStorei(disp, glPixelStorei);
+    SET_PixelTransferf(disp, glPixelTransferf);
+    SET_PixelTransferi(disp, glPixelTransferi);
+    SET_PixelZoom(disp, glPixelZoom);
+    SET_PointSize(disp, glPointSize);
+    SET_PolygonMode(disp, glPolygonMode);
+    SET_PolygonOffset(disp, glPolygonOffset);
+    SET_PolygonStipple(disp, glPolygonStipple);
+    SET_PopAttrib(disp, glPopAttrib);
+    SET_PopClientAttrib(disp, glPopClientAttrib);
+    SET_PopMatrix(disp, glPopMatrix);
+    SET_PopName(disp, glPopName);
+    SET_PrioritizeTextures(disp, glPrioritizeTextures);
+    SET_PushAttrib(disp, glPushAttrib);
+    SET_PushClientAttrib(disp, glPushClientAttrib);
+    SET_PushMatrix(disp, glPushMatrix);
+    SET_PushName(disp, glPushName);
+    SET_RasterPos2d(disp, glRasterPos2d);
+    SET_RasterPos2dv(disp, glRasterPos2dv);
+    SET_RasterPos2f(disp, glRasterPos2f);
+    SET_RasterPos2fv(disp, glRasterPos2fv);
+    SET_RasterPos2i(disp, glRasterPos2i);
+    SET_RasterPos2iv(disp, glRasterPos2iv);
+    SET_RasterPos2s(disp, glRasterPos2s);
+    SET_RasterPos2sv(disp, glRasterPos2sv);
+    SET_RasterPos3d(disp, glRasterPos3d);
+    SET_RasterPos3dv(disp, glRasterPos3dv);
+    SET_RasterPos3f(disp, glRasterPos3f);
+    SET_RasterPos3fv(disp, glRasterPos3fv);
+    SET_RasterPos3i(disp, glRasterPos3i);
+    SET_RasterPos3iv(disp, glRasterPos3iv);
+    SET_RasterPos3s(disp, glRasterPos3s);
+    SET_RasterPos3sv(disp, glRasterPos3sv);
+    SET_RasterPos4d(disp, glRasterPos4d);
+    SET_RasterPos4dv(disp, glRasterPos4dv);
+    SET_RasterPos4f(disp, glRasterPos4f);
+    SET_RasterPos4fv(disp, glRasterPos4fv);
+    SET_RasterPos4i(disp, glRasterPos4i);
+    SET_RasterPos4iv(disp, glRasterPos4iv);
+    SET_RasterPos4s(disp, glRasterPos4s);
+    SET_RasterPos4sv(disp, glRasterPos4sv);
+    SET_ReadBuffer(disp, glReadBuffer);
+    SET_ReadPixels(disp, glReadPixels);
+    SET_Rectd(disp, glRectd);
+    SET_Rectdv(disp, glRectdv);
+    SET_Rectf(disp, glRectf);
+    SET_Rectfv(disp, glRectfv);
+    SET_Recti(disp, glRecti);
+    SET_Rectiv(disp, glRectiv);
+    SET_Rects(disp, glRects);
+    SET_Rectsv(disp, glRectsv);
+    SET_RenderMode(disp, glRenderMode);
+    SET_ResetHistogram(disp, glResetHistogram);
+    SET_ResetMinmax(disp, glResetMinmax);
+    SET_Rotated(disp, glRotated);
+    SET_Rotatef(disp, glRotatef);
+    SET_Scaled(disp, glScaled);
+    SET_Scalef(disp, glScalef);
+    SET_Scissor(disp, glScissor);
+    SET_SelectBuffer(disp, glSelectBuffer);
+    SET_SeparableFilter2D(disp, glSeparableFilter2D);
+    SET_ShadeModel(disp, glShadeModel);
+    SET_StencilFunc(disp, glStencilFunc);
+    SET_StencilMask(disp, glStencilMask);
+    SET_StencilOp(disp, glStencilOp);
+    SET_TexCoord1d(disp, glTexCoord1d);
+    SET_TexCoord1dv(disp, glTexCoord1dv);
+    SET_TexCoord1f(disp, glTexCoord1f);
+    SET_TexCoord1fv(disp, glTexCoord1fv);
+    SET_TexCoord1i(disp, glTexCoord1i);
+    SET_TexCoord1iv(disp, glTexCoord1iv);
+    SET_TexCoord1s(disp, glTexCoord1s);
+    SET_TexCoord1sv(disp, glTexCoord1sv);
+    SET_TexCoord2d(disp, glTexCoord2d);
+    SET_TexCoord2dv(disp, glTexCoord2dv);
+    SET_TexCoord2f(disp, glTexCoord2f);
+    SET_TexCoord2fv(disp, glTexCoord2fv);
+    SET_TexCoord2i(disp, glTexCoord2i);
+    SET_TexCoord2iv(disp, glTexCoord2iv);
+    SET_TexCoord2s(disp, glTexCoord2s);
+    SET_TexCoord2sv(disp, glTexCoord2sv);
+    SET_TexCoord3d(disp, glTexCoord3d);
+    SET_TexCoord3dv(disp, glTexCoord3dv);
+    SET_TexCoord3f(disp, glTexCoord3f);
+    SET_TexCoord3fv(disp, glTexCoord3fv);
+    SET_TexCoord3i(disp, glTexCoord3i);
+    SET_TexCoord3iv(disp, glTexCoord3iv);
+    SET_TexCoord3s(disp, glTexCoord3s);
+    SET_TexCoord3sv(disp, glTexCoord3sv);
+    SET_TexCoord4d(disp, glTexCoord4d);
+    SET_TexCoord4dv(disp, glTexCoord4dv);
+    SET_TexCoord4f(disp, glTexCoord4f);
+    SET_TexCoord4fv(disp, glTexCoord4fv);
+    SET_TexCoord4i(disp, glTexCoord4i);
+    SET_TexCoord4iv(disp, glTexCoord4iv);
+    SET_TexCoord4s(disp, glTexCoord4s);
+    SET_TexCoord4sv(disp, glTexCoord4sv);
+    SET_TexCoordPointer(disp, glTexCoordPointer);
+    SET_TexEnvf(disp, glTexEnvf);
+    SET_TexEnvfv(disp, glTexEnvfv);
+    SET_TexEnvi(disp, glTexEnvi);
+    SET_TexEnviv(disp, glTexEnviv);
+    SET_TexGend(disp, glTexGend);
+    SET_TexGendv(disp, glTexGendv);
+    SET_TexGenf(disp, glTexGenf);
+    SET_TexGenfv(disp, glTexGenfv);
+    SET_TexGeni(disp, glTexGeni);
+    SET_TexGeniv(disp, glTexGeniv);
+    
+    /* Pointer Incompatability:
+     * internalformat is a GLenum according to /System/Library/Frameworks/OpenGL.framework/Headers/gl.h
+     * extern void glTexImage1D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+     * extern void glTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+     * extern void glTexImage3D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+     *
+     * and it's a GLint in glx/glapitable.h and according to the man page
+     * void ( * TexImage1D)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid * pixels);
+     * void ( * TexImage2D)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid * pixels);
+     * void ( * TexImage3D)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * pixels);
+     *
+     * <rdar://problem/6953344> gl.h contains incorrect prototypes for glTexImage[123]D
+     */
+    
+    SET_TexImage1D(disp, (void *)glTexImage1D);
+    SET_TexImage2D(disp, (void *)glTexImage2D);
+    SET_TexImage3D(disp, (void *)glTexImage3D);
+    SET_TexParameterf(disp, glTexParameterf);
+    SET_TexParameterfv(disp, glTexParameterfv);
+    SET_TexParameteri(disp, glTexParameteri);
+    SET_TexParameteriv(disp, glTexParameteriv);
+    SET_TexSubImage1D(disp, glTexSubImage1D);
+    SET_TexSubImage2D(disp, glTexSubImage2D);
+    SET_TexSubImage3D(disp, glTexSubImage3D);
+    SET_Translated(disp, glTranslated);
+    SET_Translatef(disp, glTranslatef);
+    SET_Vertex2d(disp, glVertex2d);
+    SET_Vertex2dv(disp, glVertex2dv);
+    SET_Vertex2f(disp, glVertex2f);
+    SET_Vertex2fv(disp, glVertex2fv);
+    SET_Vertex2i(disp, glVertex2i);
+    SET_Vertex2iv(disp, glVertex2iv);
+    SET_Vertex2s(disp, glVertex2s);
+    SET_Vertex2sv(disp, glVertex2sv);
+    SET_Vertex3d(disp, glVertex3d);
+    SET_Vertex3dv(disp, glVertex3dv);
+    SET_Vertex3f(disp, glVertex3f);
+    SET_Vertex3fv(disp, glVertex3fv);
+    SET_Vertex3i(disp, glVertex3i);
+    SET_Vertex3iv(disp, glVertex3iv);
+    SET_Vertex3s(disp, glVertex3s);
+    SET_Vertex3sv(disp, glVertex3sv);
+    SET_Vertex4d(disp, glVertex4d);
+    SET_Vertex4dv(disp, glVertex4dv);
+    SET_Vertex4f(disp, glVertex4f);
+    SET_Vertex4fv(disp, glVertex4fv);
+    SET_Vertex4i(disp, glVertex4i);
+    SET_Vertex4iv(disp, glVertex4iv);
+    SET_Vertex4s(disp, glVertex4s);
+    SET_Vertex4sv(disp, glVertex4sv);
+    SET_VertexPointer(disp, glVertexPointer);
+    SET_Viewport(disp, glViewport);
+
+#if GL_VERSION_2_0
+    SET_AttachShader(disp, glAttachShader);
+    SET_DeleteShader(disp, glDeleteShader);
+    SET_DetachShader(disp, glDetachShader);
+    SET_GetAttachedShaders(disp, glGetAttachedShaders);
+    SET_GetProgramInfoLog(disp, glGetProgramInfoLog);
+    SET_GetShaderInfoLog(disp, glGetShaderInfoLog);
+    SET_GetShaderiv(disp, glGetShaderiv);
+    SET_IsShader(disp, glIsShader);
+    SET_StencilFuncSeparate(disp, glStencilFuncSeparate);
+    SET_StencilMaskSeparate(disp, glStencilMaskSeparate);
+    SET_StencilOpSeparate(disp, glStencilOpSeparate);
+#endif
+
+#if GL_VERSION_2_1
+    SET_UniformMatrix2x3fv(disp, glUniformMatrix2x3fv);
+    SET_UniformMatrix2x4fv(disp, glUniformMatrix2x4fv);
+    SET_UniformMatrix3x2fv(disp, glUniformMatrix3x2fv);
+    SET_UniformMatrix3x4fv(disp, glUniformMatrix3x4fv);
+    SET_UniformMatrix4x2fv(disp, glUniformMatrix4x2fv);
+    SET_UniformMatrix4x3fv(disp, glUniformMatrix4x3fv);
+#endif
+
+#if GL_APPLE_vertex_array_object
+    SET_BindVertexArrayAPPLE(disp, glBindVertexArrayAPPLE);
+    SET_DeleteVertexArraysAPPLE(disp, glDeleteVertexArraysAPPLE);
+    SET_GenVertexArraysAPPLE(disp, glGenVertexArraysAPPLE);
+    SET_IsVertexArrayAPPLE(disp, glIsVertexArrayAPPLE);
+#endif
+
+#if GL_ARB_draw_buffers
+    SET_DrawBuffersARB(disp, glDrawBuffersARB);
+#endif
+
+#if GL_ARB_multisample
+    SET_SampleCoverageARB(disp, glSampleCoverageARB);
+#endif
+
+#if GL_ARB_multitexture
+    SET_ActiveTextureARB(disp, glActiveTextureARB);
+    SET_ClientActiveTextureARB(disp, glClientActiveTextureARB);
+    SET_MultiTexCoord1dARB(disp, glMultiTexCoord1dARB);
+    SET_MultiTexCoord1dvARB(disp, glMultiTexCoord1dvARB);
+    SET_MultiTexCoord1fARB(disp, glMultiTexCoord1fARB);
+    SET_MultiTexCoord1fvARB(disp, glMultiTexCoord1fvARB);
+    SET_MultiTexCoord1iARB(disp, glMultiTexCoord1iARB);
+    SET_MultiTexCoord1ivARB(disp, glMultiTexCoord1ivARB);
+    SET_MultiTexCoord1sARB(disp, glMultiTexCoord1sARB);
+    SET_MultiTexCoord1svARB(disp, glMultiTexCoord1svARB);
+    SET_MultiTexCoord2dARB(disp, glMultiTexCoord2dARB);
+    SET_MultiTexCoord2dvARB(disp, glMultiTexCoord2dvARB);
+    SET_MultiTexCoord2fARB(disp, glMultiTexCoord2fARB);
+    SET_MultiTexCoord2fvARB(disp, glMultiTexCoord2fvARB);
+    SET_MultiTexCoord2iARB(disp, glMultiTexCoord2iARB);
+    SET_MultiTexCoord2ivARB(disp, glMultiTexCoord2ivARB);
+    SET_MultiTexCoord2sARB(disp, glMultiTexCoord2sARB);
+    SET_MultiTexCoord2svARB(disp, glMultiTexCoord2svARB);
+    SET_MultiTexCoord3dARB(disp, glMultiTexCoord3dARB);
+    SET_MultiTexCoord3dvARB(disp, glMultiTexCoord3dvARB);
+    SET_MultiTexCoord3fARB(disp, glMultiTexCoord3fARB);
+    SET_MultiTexCoord3fvARB(disp, glMultiTexCoord3fvARB);
+    SET_MultiTexCoord3iARB(disp, glMultiTexCoord3iARB);
+    SET_MultiTexCoord3ivARB(disp, glMultiTexCoord3ivARB);
+    SET_MultiTexCoord3sARB(disp, glMultiTexCoord3sARB);
+    SET_MultiTexCoord3svARB(disp, glMultiTexCoord3svARB);
+    SET_MultiTexCoord4dARB(disp, glMultiTexCoord4dARB);
+    SET_MultiTexCoord4dvARB(disp, glMultiTexCoord4dvARB);
+    SET_MultiTexCoord4fARB(disp, glMultiTexCoord4fARB);
+    SET_MultiTexCoord4fvARB(disp, glMultiTexCoord4fvARB);
+    SET_MultiTexCoord4iARB(disp, glMultiTexCoord4iARB);
+    SET_MultiTexCoord4ivARB(disp, glMultiTexCoord4ivARB);
+    SET_MultiTexCoord4sARB(disp, glMultiTexCoord4sARB);
+    SET_MultiTexCoord4svARB(disp, glMultiTexCoord4svARB);
+#endif
+
+#if GL_ARB_occlusion_query
+    SET_BeginQueryARB(disp, glBeginQueryARB);
+    SET_DeleteQueriesARB(disp, glDeleteQueriesARB);
+    SET_EndQueryARB(disp, glEndQueryARB);
+    SET_GenQueriesARB(disp, glGenQueriesARB);
+    SET_GetQueryObjectivARB(disp, glGetQueryObjectivARB);
+    SET_GetQueryObjectuivARB(disp, glGetQueryObjectuivARB);
+    SET_GetQueryivARB(disp, glGetQueryivARB);
+    SET_IsQueryARB(disp, glIsQueryARB);
+#endif
+
+#if GL_ARB_shader_objects
+    SET_AttachObjectARB(disp, glAttachObjectARB);
+    SET_CompileShaderARB(disp, glCompileShaderARB);
+    SET_DeleteObjectARB(disp, glDeleteObjectARB);
+    SET_GetHandleARB(disp, glGetHandleARB);
+    SET_DetachObjectARB(disp, glDetachObjectARB);
+    SET_CreateProgramObjectARB(disp, glCreateProgramObjectARB);
+    SET_CreateShaderObjectARB(disp, glCreateShaderObjectARB);
+    SET_GetInfoLogARB(disp, glGetInfoLogARB);
+    SET_GetActiveUniformARB(disp, glGetActiveUniformARB);
+    SET_GetAttachedObjectsARB(disp, glGetAttachedObjectsARB);
+    SET_GetObjectParameterfvARB(disp, glGetObjectParameterfvARB);
+    SET_GetObjectParameterivARB(disp, glGetObjectParameterivARB);
+    SET_GetShaderSourceARB(disp, glGetShaderSourceARB);
+    SET_GetUniformLocationARB(disp, glGetUniformLocationARB);
+    SET_GetUniformfvARB(disp, glGetUniformfvARB);
+    SET_GetUniformivARB(disp, glGetUniformivARB);
+    SET_LinkProgramARB(disp, glLinkProgramARB);
+    SET_ShaderSourceARB(disp, glShaderSourceARB);
+    SET_Uniform1fARB(disp, glUniform1fARB);
+    SET_Uniform1fvARB(disp, glUniform1fvARB);
+    SET_Uniform1iARB(disp, glUniform1iARB);
+    SET_Uniform1ivARB(disp, glUniform1ivARB);
+    SET_Uniform2fARB(disp, glUniform2fARB);
+    SET_Uniform2fvARB(disp, glUniform2fvARB);
+    SET_Uniform2iARB(disp, glUniform2iARB);
+    SET_Uniform2ivARB(disp, glUniform2ivARB);
+    SET_Uniform3fARB(disp, glUniform3fARB);
+    SET_Uniform3fvARB(disp, glUniform3fvARB);
+    SET_Uniform3iARB(disp, glUniform3iARB);
+    SET_Uniform3ivARB(disp, glUniform3ivARB);
+    SET_Uniform4fARB(disp, glUniform4fARB);
+    SET_Uniform4fvARB(disp, glUniform4fvARB);
+    SET_Uniform4iARB(disp, glUniform4iARB);
+    SET_Uniform4ivARB(disp, glUniform4ivARB);
+    SET_UniformMatrix2fvARB(disp, glUniformMatrix2fvARB);
+    SET_UniformMatrix3fvARB(disp, glUniformMatrix3fvARB);
+    SET_UniformMatrix4fvARB(disp, glUniformMatrix4fvARB);
+    SET_UseProgramObjectARB(disp, glUseProgramObjectARB);
+    SET_ValidateProgramARB(disp, glValidateProgramARB);
+#endif
+
+#if GL_ARB_texture_compression
+    SET_CompressedTexImage1DARB(disp, glCompressedTexImage1DARB);
+    SET_CompressedTexImage2DARB(disp, glCompressedTexImage2DARB);
+    SET_CompressedTexImage3DARB(disp, glCompressedTexImage3DARB);
+    SET_CompressedTexSubImage1DARB(disp, glCompressedTexSubImage1DARB);
+    SET_CompressedTexSubImage2DARB(disp, glCompressedTexSubImage2DARB);
+    SET_CompressedTexSubImage3DARB(disp, glCompressedTexSubImage3DARB);
+    SET_GetCompressedTexImageARB(disp, glGetCompressedTexImageARB);
+#endif
+
+#if GL_ARB_transpose_matrix
+    SET_LoadTransposeMatrixdARB(disp, glLoadTransposeMatrixdARB);
+    SET_LoadTransposeMatrixfARB(disp, glLoadTransposeMatrixfARB);
+    SET_MultTransposeMatrixdARB(disp, glMultTransposeMatrixdARB);
+    SET_MultTransposeMatrixfARB(disp, glMultTransposeMatrixfARB);
+#endif
+
+#if GL_ARB_vertex_buffer_object
+    SET_BindBufferARB(disp, glBindBufferARB);
+    SET_BufferDataARB(disp, glBufferDataARB);
+    SET_BufferSubDataARB(disp, glBufferSubDataARB);
+    SET_DeleteBuffersARB(disp, glDeleteBuffersARB);
+    SET_GenBuffersARB(disp, glGenBuffersARB);
+    SET_GetBufferParameterivARB(disp, glGetBufferParameterivARB);
+    SET_GetBufferPointervARB(disp, glGetBufferPointervARB);
+    SET_GetBufferSubDataARB(disp, glGetBufferSubDataARB);
+    SET_IsBufferARB(disp, glIsBufferARB);
+    SET_MapBufferARB(disp, glMapBufferARB);
+    SET_UnmapBufferARB(disp, glUnmapBufferARB);
+#endif
+
+#if GL_ARB_vertex_program
+    SET_DisableVertexAttribArrayARB(disp, glDisableVertexAttribArrayARB);
+    SET_EnableVertexAttribArrayARB(disp, glEnableVertexAttribArrayARB);
+    SET_GetProgramEnvParameterdvARB(disp, glGetProgramEnvParameterdvARB);
+    SET_GetProgramEnvParameterfvARB(disp, glGetProgramEnvParameterfvARB);
+    SET_GetProgramLocalParameterdvARB(disp, glGetProgramLocalParameterdvARB);
+    SET_GetProgramLocalParameterfvARB(disp, glGetProgramLocalParameterfvARB);
+    SET_GetProgramStringARB(disp, glGetProgramStringARB);
+    SET_GetProgramivARB(disp, glGetProgramivARB);
+    SET_GetVertexAttribdvARB(disp, glGetVertexAttribdvARB);
+    SET_GetVertexAttribfvARB(disp, glGetVertexAttribfvARB);
+    SET_GetVertexAttribivARB(disp, glGetVertexAttribivARB);
+    SET_ProgramEnvParameter4dARB(disp, glProgramEnvParameter4dARB);
+    SET_ProgramEnvParameter4dvARB(disp, glProgramEnvParameter4dvARB);
+    SET_ProgramEnvParameter4fARB(disp, glProgramEnvParameter4fARB);
+    SET_ProgramEnvParameter4fvARB(disp, glProgramEnvParameter4fvARB);
+    SET_ProgramLocalParameter4dARB(disp, glProgramLocalParameter4dARB);
+    SET_ProgramLocalParameter4dvARB(disp, glProgramLocalParameter4dvARB);
+    SET_ProgramLocalParameter4fARB(disp, glProgramLocalParameter4fARB);
+    SET_ProgramLocalParameter4fvARB(disp, glProgramLocalParameter4fvARB);
+    SET_ProgramStringARB(disp, glProgramStringARB);
+    SET_VertexAttrib1dARB(disp, glVertexAttrib1dARB);
+    SET_VertexAttrib1dvARB(disp, glVertexAttrib1dvARB);
+    SET_VertexAttrib1fARB(disp, glVertexAttrib1fARB);
+    SET_VertexAttrib1fvARB(disp, glVertexAttrib1fvARB);
+    SET_VertexAttrib1sARB(disp, glVertexAttrib1sARB);
+    SET_VertexAttrib1svARB(disp, glVertexAttrib1svARB);
+    SET_VertexAttrib2dARB(disp, glVertexAttrib2dARB);
+    SET_VertexAttrib2dvARB(disp, glVertexAttrib2dvARB);
+    SET_VertexAttrib2fARB(disp, glVertexAttrib2fARB);
+    SET_VertexAttrib2fvARB(disp, glVertexAttrib2fvARB);
+    SET_VertexAttrib2sARB(disp, glVertexAttrib2sARB);
+    SET_VertexAttrib2svARB(disp, glVertexAttrib2svARB);
+    SET_VertexAttrib3dARB(disp, glVertexAttrib3dARB);
+    SET_VertexAttrib3dvARB(disp, glVertexAttrib3dvARB);
+    SET_VertexAttrib3fARB(disp, glVertexAttrib3fARB);
+    SET_VertexAttrib3fvARB(disp, glVertexAttrib3fvARB);
+    SET_VertexAttrib3sARB(disp, glVertexAttrib3sARB);
+    SET_VertexAttrib3svARB(disp, glVertexAttrib3svARB);
+    SET_VertexAttrib4NbvARB(disp, glVertexAttrib4NbvARB);
+    SET_VertexAttrib4NivARB(disp, glVertexAttrib4NivARB);
+    SET_VertexAttrib4NsvARB(disp, glVertexAttrib4NsvARB);
+    SET_VertexAttrib4NubARB(disp, glVertexAttrib4NubARB);
+    SET_VertexAttrib4NubvARB(disp, glVertexAttrib4NubvARB);
+    SET_VertexAttrib4NuivARB(disp, glVertexAttrib4NuivARB);
+    SET_VertexAttrib4NusvARB(disp, glVertexAttrib4NusvARB);
+    SET_VertexAttrib4bvARB(disp, glVertexAttrib4bvARB);
+    SET_VertexAttrib4dARB(disp, glVertexAttrib4dARB);
+    SET_VertexAttrib4dvARB(disp, glVertexAttrib4dvARB);
+    SET_VertexAttrib4fARB(disp, glVertexAttrib4fARB);
+    SET_VertexAttrib4fvARB(disp, glVertexAttrib4fvARB);
+    SET_VertexAttrib4ivARB(disp, glVertexAttrib4ivARB);
+    SET_VertexAttrib4sARB(disp, glVertexAttrib4sARB);
+    SET_VertexAttrib4svARB(disp, glVertexAttrib4svARB);
+    SET_VertexAttrib4ubvARB(disp, glVertexAttrib4ubvARB);
+    SET_VertexAttrib4uivARB(disp, glVertexAttrib4uivARB);
+    SET_VertexAttrib4usvARB(disp, glVertexAttrib4usvARB);
+    SET_VertexAttribPointerARB(disp, glVertexAttribPointerARB);
+#endif
+
+#if GL_ARB_vertex_shader
+    SET_BindAttribLocationARB(disp, glBindAttribLocationARB);
+    SET_GetActiveAttribARB(disp, glGetActiveAttribARB);
+    SET_GetAttribLocationARB(disp, glGetAttribLocationARB);
+#endif
+
+#if GL_ARB_window_pos
+    SET_WindowPos2dMESA(disp, glWindowPos2dARB);
+    SET_WindowPos2dvMESA(disp, glWindowPos2dvARB);
+    SET_WindowPos2fMESA(disp, glWindowPos2fARB);
+    SET_WindowPos2fvMESA(disp, glWindowPos2fvARB);
+    SET_WindowPos2iMESA(disp, glWindowPos2iARB);
+    SET_WindowPos2ivMESA(disp, glWindowPos2ivARB);
+    SET_WindowPos2sMESA(disp, glWindowPos2sARB);
+    SET_WindowPos2svMESA(disp, glWindowPos2svARB);
+    SET_WindowPos3dMESA(disp, glWindowPos3dARB);
+    SET_WindowPos3dvMESA(disp, glWindowPos3dvARB);
+    SET_WindowPos3fMESA(disp, glWindowPos3fARB);
+    SET_WindowPos3fvMESA(disp, glWindowPos3fvARB);
+    SET_WindowPos3iMESA(disp, glWindowPos3iARB);
+    SET_WindowPos3ivMESA(disp, glWindowPos3ivARB);
+    SET_WindowPos3sMESA(disp, glWindowPos3sARB);
+    SET_WindowPos3svMESA(disp, glWindowPos3svARB);
+#endif
+
+#if GL_ATI_fragment_shader
+    SET_AlphaFragmentOp1ATI(disp, glAlphaFragmentOp1ATI);
+    SET_AlphaFragmentOp2ATI(disp, glAlphaFragmentOp2ATI);
+    SET_AlphaFragmentOp3ATI(disp, glAlphaFragmentOp3ATI);
+    SET_BeginFragmentShaderATI(disp, glBeginFragmentShaderATI);
+    SET_BindFragmentShaderATI(disp, glBindFragmentShaderATI);
+    SET_ColorFragmentOp1ATI(disp, glColorFragmentOp1ATI);
+    SET_ColorFragmentOp2ATI(disp, glColorFragmentOp2ATI);
+    SET_ColorFragmentOp3ATI(disp, glColorFragmentOp3ATI);
+    SET_DeleteFragmentShaderATI(disp, glDeleteFragmentShaderATI);
+    SET_EndFragmentShaderATI(disp, glEndFragmentShaderATI);
+    SET_GenFragmentShadersATI(disp, glGenFragmentShadersATI);
+    SET_PassTexCoordATI(disp, glPassTexCoordATI);
+    SET_SampleMapATI(disp, glSampleMapATI);
+    SET_SetFragmentShaderConstantATI(disp, glSetFragmentShaderConstantATI);
+#elif GL_EXT_fragment_shader
+    SET_AlphaFragmentOp1ATI(disp, glAlphaFragmentOp1EXT);
+    SET_AlphaFragmentOp2ATI(disp, glAlphaFragmentOp2EXT);
+    SET_AlphaFragmentOp3ATI(disp, glAlphaFragmentOp3EXT);
+    SET_BeginFragmentShaderATI(disp, glBeginFragmentShaderEXT);
+    SET_BindFragmentShaderATI(disp, glBindFragmentShaderEXT);
+    SET_ColorFragmentOp1ATI(disp, glColorFragmentOp1EXT);
+    SET_ColorFragmentOp2ATI(disp, glColorFragmentOp2EXT);
+    SET_ColorFragmentOp3ATI(disp, glColorFragmentOp3EXT);
+    SET_DeleteFragmentShaderATI(disp, glDeleteFragmentShaderEXT);
+    SET_EndFragmentShaderATI(disp, glEndFragmentShaderEXT);
+    SET_GenFragmentShadersATI(disp, glGenFragmentShadersEXT);
+    SET_PassTexCoordATI(disp, glPassTexCoordEXT);
+    SET_SampleMapATI(disp, glSampleMapEXT);
+    SET_SetFragmentShaderConstantATI(disp, glSetFragmentShaderConstantEXT);
+#endif
+
+#if GL_ATI_separate_stencil
+    SET_StencilFuncSeparateATI(disp, glStencilFuncSeparateATI);
+#endif
+
+#if GL_EXT_blend_equation_separate
+    SET_BlendEquationSeparateEXT(disp, glBlendEquationSeparateEXT);
+#endif
+
+#if GL_EXT_blend_func_separate
+    SET_BlendFuncSeparateEXT(disp, glBlendFuncSeparateEXT);
+#endif
+
+#if GL_EXT_depth_bounds_test
+    SET_DepthBoundsEXT(disp, glDepthBoundsEXT);
+#endif
+
+#if GL_EXT_compiled_vertex_array
+    SET_LockArraysEXT(disp, glLockArraysEXT);
+    SET_UnlockArraysEXT(disp, glUnlockArraysEXT);
+#endif
+
+#if GL_EXT_cull_vertex
+    SET_CullParameterdvEXT(disp, glCullParameterdvEXT);
+    SET_CullParameterfvEXT(disp, glCullParameterfvEXT);
+#endif
+
+#if GL_EXT_fog_coord
+    SET_FogCoordPointerEXT(disp, glFogCoordPointerEXT);
+    SET_FogCoorddEXT(disp, glFogCoorddEXT);
+    SET_FogCoorddvEXT(disp, glFogCoorddvEXT);
+    SET_FogCoordfEXT(disp, glFogCoordfEXT);
+    SET_FogCoordfvEXT(disp, glFogCoordfvEXT);
+#endif
+
+#if GL_EXT_framebuffer_blit
+    SET_BlitFramebufferEXT(disp, glBlitFramebufferEXT);
+#endif
+
+#if GL_EXT_framebuffer_object
+    SET_BindFramebufferEXT(disp, glBindFramebufferEXT);
+    SET_BindRenderbufferEXT(disp, glBindRenderbufferEXT);
+    SET_CheckFramebufferStatusEXT(disp, glCheckFramebufferStatusEXT);
+    SET_DeleteFramebuffersEXT(disp, glDeleteFramebuffersEXT);
+    SET_DeleteRenderbuffersEXT(disp, glDeleteRenderbuffersEXT);
+    SET_FramebufferRenderbufferEXT(disp, glFramebufferRenderbufferEXT);
+    SET_FramebufferTexture1DEXT(disp, glFramebufferTexture1DEXT);
+    SET_FramebufferTexture2DEXT(disp, glFramebufferTexture2DEXT);
+    SET_FramebufferTexture3DEXT(disp, glFramebufferTexture3DEXT);
+    SET_GenerateMipmapEXT(disp, glGenerateMipmapEXT);
+    SET_GenFramebuffersEXT(disp, glGenFramebuffersEXT);
+    SET_GenRenderbuffersEXT(disp, glGenRenderbuffersEXT);
+    SET_GetFramebufferAttachmentParameterivEXT(disp, glGetFramebufferAttachmentParameterivEXT);
+    SET_GetRenderbufferParameterivEXT(disp, glGetRenderbufferParameterivEXT);
+    SET_IsFramebufferEXT(disp, glIsFramebufferEXT);
+    SET_IsRenderbufferEXT(disp, glIsRenderbufferEXT);
+    SET_RenderbufferStorageEXT(disp, glRenderbufferStorageEXT);
+#endif
+
+#if GL_EXT_gpu_program_parameters
+    SET_ProgramEnvParameters4fvEXT(disp, glProgramEnvParameters4fvEXT);
+    SET_ProgramLocalParameters4fvEXT(disp, glProgramLocalParameters4fvEXT);
+#endif
+
+#if GL_EXT_multi_draw_arrays
+    /* Pointer Incompatability:
+     * This warning can be safely ignored.  OpenGL.framework adds const to the
+     * two pointers.
+     *
+     * extern void glMultiDrawArraysEXT (GLenum, const GLint *, const GLsizei *, GLsizei);
+     *
+     * void ( * MultiDrawArraysEXT)(GLenum mode, GLint * first, GLsizei * count, GLsizei primcount);
+     */
+    SET_MultiDrawArraysEXT(disp, (void *)glMultiDrawArraysEXT);
+    SET_MultiDrawElementsEXT(disp, glMultiDrawElementsEXT);
+#endif
+
+#if GL_EXT_point_parameters
+    SET_PointParameterfEXT(disp, glPointParameterfEXT);
+    SET_PointParameterfvEXT(disp, glPointParameterfvEXT);
+#elif GL_ARB_point_parameters
+    SET_PointParameterfEXT(disp, glPointParameterfARB);
+    SET_PointParameterfvEXT(disp, glPointParameterfvARB);
+#endif
+
+#if GL_EXT_polygon_offset
+    SET_PolygonOffsetEXT(disp, glPolygonOffsetEXT);
+#endif
+
+#if GL_EXT_secondary_color
+    SET_SecondaryColor3bEXT(disp, glSecondaryColor3bEXT);
+    SET_SecondaryColor3bvEXT(disp, glSecondaryColor3bvEXT);
+    SET_SecondaryColor3dEXT(disp, glSecondaryColor3dEXT);
+    SET_SecondaryColor3dvEXT(disp, glSecondaryColor3dvEXT);
+    SET_SecondaryColor3fEXT(disp, glSecondaryColor3fEXT);
+    SET_SecondaryColor3fvEXT(disp, glSecondaryColor3fvEXT);
+    SET_SecondaryColor3iEXT(disp, glSecondaryColor3iEXT);
+    SET_SecondaryColor3ivEXT(disp, glSecondaryColor3ivEXT);
+    SET_SecondaryColor3sEXT(disp, glSecondaryColor3sEXT);
+    SET_SecondaryColor3svEXT(disp, glSecondaryColor3svEXT);
+    SET_SecondaryColor3ubEXT(disp, glSecondaryColor3ubEXT);
+    SET_SecondaryColor3ubvEXT(disp, glSecondaryColor3ubvEXT);
+    SET_SecondaryColor3uiEXT(disp, glSecondaryColor3uiEXT);
+    SET_SecondaryColor3uivEXT(disp, glSecondaryColor3uivEXT);
+    SET_SecondaryColor3usEXT(disp, glSecondaryColor3usEXT);
+    SET_SecondaryColor3usvEXT(disp, glSecondaryColor3usvEXT);
+    SET_SecondaryColorPointerEXT(disp, glSecondaryColorPointerEXT);
+#endif
+
+#if GL_EXT_stencil_two_side
+    SET_ActiveStencilFaceEXT(disp, glActiveStencilFaceEXT);
+#endif
+
+#if GL_EXT_timer_query
+    SET_GetQueryObjecti64vEXT(disp, glGetQueryObjecti64vEXT);
+    SET_GetQueryObjectui64vEXT(disp, glGetQueryObjectui64vEXT);
+#endif
+
+#if GL_EXT_vertex_array
+    SET_ColorPointerEXT(disp, glColorPointerEXT);
+    SET_EdgeFlagPointerEXT(disp, glEdgeFlagPointerEXT);
+    SET_IndexPointerEXT(disp, glIndexPointerEXT);
+    SET_NormalPointerEXT(disp, glNormalPointerEXT);
+    SET_TexCoordPointerEXT(disp, glTexCoordPointerEXT);
+    SET_VertexPointerEXT(disp, glVertexPointerEXT);
+#endif
+
+#if GL_IBM_multimode_draw_arrays
+    SET_MultiModeDrawArraysIBM(disp, glMultiModeDrawArraysIBM);
+    SET_MultiModeDrawElementsIBM(disp, glMultiModeDrawElementsIBM);
+#endif
+
+#if GL_MESA_resize_buffers
+    SET_ResizeBuffersMESA(disp, glResizeBuffersMESA);
+#endif
+
+#if GL_MESA_window_pos
+    SET_WindowPos4dMESA(disp, glWindowPos4dMESA);
+    SET_WindowPos4dvMESA(disp, glWindowPos4dvMESA);
+    SET_WindowPos4fMESA(disp, glWindowPos4fMESA);
+    SET_WindowPos4fvMESA(disp, glWindowPos4fvMESA);
+    SET_WindowPos4iMESA(disp, glWindowPos4iMESA);
+    SET_WindowPos4ivMESA(disp, glWindowPos4ivMESA);
+    SET_WindowPos4sMESA(disp, glWindowPos4sMESA);
+    SET_WindowPos4svMESA(disp, glWindowPos4svMESA);
+#endif
+
+#if GL_NV_fence
+    SET_DeleteFencesNV(disp, glDeleteFencesNV);
+    SET_FinishFenceNV(disp, glFinishFenceNV);
+    SET_GenFencesNV(disp, glGenFencesNV);
+    SET_GetFenceivNV(disp, glGetFenceivNV);
+    SET_IsFenceNV(disp, glIsFenceNV);
+    SET_SetFenceNV(disp, glSetFenceNV);
+    SET_TestFenceNV(disp, glTestFenceNV);
+#endif
+
+#if GL_NV_fragment_program
+    SET_GetProgramNamedParameterdvNV(disp, glGetProgramNamedParameterdvNV);
+    SET_GetProgramNamedParameterfvNV(disp, glGetProgramNamedParameterfvNV);
+    SET_ProgramNamedParameter4dNV(disp, glProgramNamedParameter4dNV);
+    SET_ProgramNamedParameter4dvNV(disp, glProgramNamedParameter4dvNV);
+    SET_ProgramNamedParameter4fNV(disp, glProgramNamedParameter4fNV);
+    SET_ProgramNamedParameter4fvNV(disp, glProgramNamedParameter4fvNV);
+#endif
+
+#if GL_NV_geometry_program4
+    SET_FramebufferTextureLayerEXT(disp, glFramebufferTextureLayerEXT);
+#endif
+
+#if GL_NV_point_sprite
+    SET_PointParameteriNV(disp, glPointParameteriNV);
+    SET_PointParameterivNV(disp, glPointParameterivNV);
+#endif
+
+#if GL_NV_register_combiners
+    SET_CombinerInputNV(disp, glCombinerInputNV);
+    SET_CombinerOutputNV(disp, glCombinerOutputNV);
+    SET_CombinerParameterfNV(disp, glCombinerParameterfNV);
+    SET_CombinerParameterfvNV(disp, glCombinerParameterfvNV);
+    SET_CombinerParameteriNV(disp, glCombinerParameteriNV);
+    SET_CombinerParameterivNV(disp, glCombinerParameterivNV);
+    SET_FinalCombinerInputNV(disp, glFinalCombinerInputNV);
+    SET_GetCombinerInputParameterfvNV(disp, glGetCombinerInputParameterfvNV);
+    SET_GetCombinerInputParameterivNV(disp, glGetCombinerInputParameterivNV);
+    SET_GetCombinerOutputParameterfvNV(disp, glGetCombinerOutputParameterfvNV);
+    SET_GetCombinerOutputParameterivNV(disp, glGetCombinerOutputParameterivNV);
+    SET_GetFinalCombinerInputParameterfvNV(disp, glGetFinalCombinerInputParameterfvNV);
+    SET_GetFinalCombinerInputParameterivNV(disp, glGetFinalCombinerInputParameterivNV);
+#endif
+
+#if GL_NV_vertex_array_range
+    SET_FlushVertexArrayRangeNV(disp, glFlushVertexArrayRangeNV);
+    SET_VertexArrayRangeNV(disp, glVertexArrayRangeNV);
+#endif
+
+#if GL_NV_vertex_program
+    SET_AreProgramsResidentNV(disp, glAreProgramsResidentNV);
+    SET_BindProgramNV(disp, glBindProgramNV);
+    SET_DeleteProgramsNV(disp, glDeleteProgramsNV);
+    SET_ExecuteProgramNV(disp, glExecuteProgramNV);
+    SET_GenProgramsNV(disp, glGenProgramsNV);
+    SET_GetProgramParameterdvNV(disp, glGetProgramParameterdvNV);
+    SET_GetProgramParameterfvNV(disp, glGetProgramParameterfvNV);
+    SET_GetProgramStringNV(disp, glGetProgramStringNV);
+    SET_GetProgramivNV(disp, glGetProgramivNV);
+    SET_GetTrackMatrixivNV(disp, glGetTrackMatrixivNV);
+    SET_GetVertexAttribPointervNV(disp, glGetVertexAttribPointervNV);
+    SET_GetVertexAttribdvNV(disp, glGetVertexAttribdvNV);
+    SET_GetVertexAttribfvNV(disp, glGetVertexAttribfvNV);
+    SET_GetVertexAttribivNV(disp, glGetVertexAttribivNV);
+    SET_IsProgramNV(disp, glIsProgramNV);
+    SET_LoadProgramNV(disp, glLoadProgramNV);
+    SET_ProgramParameters4dvNV(disp, glProgramParameters4dvNV);
+    SET_ProgramParameters4fvNV(disp, glProgramParameters4fvNV);
+    SET_RequestResidentProgramsNV(disp, glRequestResidentProgramsNV);
+    SET_TrackMatrixNV(disp, glTrackMatrixNV);
+    SET_VertexAttrib1dNV(disp, glVertexAttrib1dNV)
+    SET_VertexAttrib1dvNV(disp, glVertexAttrib1dvNV)
+    SET_VertexAttrib1fNV(disp, glVertexAttrib1fNV)
+    SET_VertexAttrib1fvNV(disp, glVertexAttrib1fvNV)
+    SET_VertexAttrib1sNV(disp, glVertexAttrib1sNV)
+    SET_VertexAttrib1svNV(disp, glVertexAttrib1svNV)
+    SET_VertexAttrib2dNV(disp, glVertexAttrib2dNV)
+    SET_VertexAttrib2dvNV(disp, glVertexAttrib2dvNV)
+    SET_VertexAttrib2fNV(disp, glVertexAttrib2fNV)
+    SET_VertexAttrib2fvNV(disp, glVertexAttrib2fvNV)
+    SET_VertexAttrib2sNV(disp, glVertexAttrib2sNV)
+    SET_VertexAttrib2svNV(disp, glVertexAttrib2svNV)
+    SET_VertexAttrib3dNV(disp, glVertexAttrib3dNV)
+    SET_VertexAttrib3dvNV(disp, glVertexAttrib3dvNV)
+    SET_VertexAttrib3fNV(disp, glVertexAttrib3fNV)
+    SET_VertexAttrib3fvNV(disp, glVertexAttrib3fvNV)
+    SET_VertexAttrib3sNV(disp, glVertexAttrib3sNV)
+    SET_VertexAttrib3svNV(disp, glVertexAttrib3svNV)
+    SET_VertexAttrib4dNV(disp, glVertexAttrib4dNV)
+    SET_VertexAttrib4dvNV(disp, glVertexAttrib4dvNV)
+    SET_VertexAttrib4fNV(disp, glVertexAttrib4fNV)
+    SET_VertexAttrib4fvNV(disp, glVertexAttrib4fvNV)
+    SET_VertexAttrib4sNV(disp, glVertexAttrib4sNV)
+    SET_VertexAttrib4svNV(disp, glVertexAttrib4svNV)
+    SET_VertexAttrib4ubNV(disp, glVertexAttrib4ubNV)
+    SET_VertexAttrib4ubvNV(disp, glVertexAttrib4ubvNV)
+    SET_VertexAttribPointerNV(disp, glVertexAttribPointerNV)
+    SET_VertexAttribs1dvNV(disp, glVertexAttribs1dvNV)
+    SET_VertexAttribs1fvNV(disp, glVertexAttribs1fvNV)
+    SET_VertexAttribs1svNV(disp, glVertexAttribs1svNV)
+    SET_VertexAttribs2dvNV(disp, glVertexAttribs2dvNV)
+    SET_VertexAttribs2fvNV(disp, glVertexAttribs2fvNV)
+    SET_VertexAttribs2svNV(disp, glVertexAttribs2svNV)
+    SET_VertexAttribs3dvNV(disp, glVertexAttribs3dvNV)
+    SET_VertexAttribs3fvNV(disp, glVertexAttribs3fvNV)
+    SET_VertexAttribs3svNV(disp, glVertexAttribs3svNV)
+    SET_VertexAttribs4dvNV(disp, glVertexAttribs4dvNV)
+    SET_VertexAttribs4fvNV(disp, glVertexAttribs4fvNV)
+    SET_VertexAttribs4svNV(disp, glVertexAttribs4svNV)
+    SET_VertexAttribs4ubvNV(disp, glVertexAttribs4ubvNV)
+#endif
+
+#if GL_SGIS_multisample
+    SET_SampleMaskSGIS(disp, glSampleMaskSGIS);
+    SET_SamplePatternSGIS(disp, glSamplePatternSGIS);
+#endif
+
+#if GL_SGIS_pixel_texture
+    SET_GetPixelTexGenParameterfvSGIS(disp, glGetPixelTexGenParameterfvSGIS);
+    SET_GetPixelTexGenParameterivSGIS(disp, glGetPixelTexGenParameterivSGIS);
+    SET_PixelTexGenParameterfSGIS(disp, glPixelTexGenParameterfSGIS);
+    SET_PixelTexGenParameterfvSGIS(disp, glPixelTexGenParameterfvSGIS);
+    SET_PixelTexGenParameteriSGIS(disp, glPixelTexGenParameteriSGIS);
+    SET_PixelTexGenParameterivSGIS(disp, glPixelTexGenParameterivSGIS);
+    SET_PixelTexGenSGIX(disp, glPixelTexGenSGIX);
+#endif
+}
diff --git a/xorg-server/include/list.h b/xorg-server/include/list.h
index a126a652d..3a07a0b77 100644
--- a/xorg-server/include/list.h
+++ b/xorg-server/include/list.h
@@ -1,97 +1,103 @@
-/*
- * Copyright © 2010 Intel Corporation
- * Copyright © 2010 Francisco Jerez <currojerez@riseup.net>
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- *
- */
-
-#ifndef _LIST_H_
-#define _LIST_H_
-
-/* classic doubly-link circular list */
-struct list {
-    struct list *next, *prev;
-};
-
-static void
-list_init(struct list *list)
-{
-    list->next = list->prev = list;
-}
-
-static inline void
-__list_add(struct list *entry,
-	    struct list *prev,
-	    struct list *next)
-{
-    next->prev = entry;
-    entry->next = next;
-    entry->prev = prev;
-    prev->next = entry;
-}
-
-static inline void
-list_add(struct list *entry, struct list *head)
-{
-    __list_add(entry, head, head->next);
-}
-
-static inline void
-__list_del(struct list *prev, struct list *next)
-{
-    next->prev = prev;
-    prev->next = next;
-}
-
-static inline void
-list_del(struct list *entry)
-{
-    __list_del(entry->prev, entry->next);
-    list_init(entry);
-}
-
-static inline Bool
-list_is_empty(struct list *head)
-{
-    return head->next == head;
-}
-
-#ifndef container_of
-#define container_of(ptr, type, member) \
-    (type *)((char *)(ptr) - (char *) &((type *)0)->member)
-#endif
-
-#define list_entry(ptr, type, member) \
-    container_of(ptr, type, member)
-
-#define list_first_entry(ptr, type, member) \
-    list_entry((ptr)->next, type, member)
-
-#define __container_of(ptr, sample, member)				\
-    (void *)((char *)(ptr)						\
-	     - ((char *)&(sample)->member - (char *)(sample)))
-
-#define list_for_each_entry(pos, head, member)				\
-    for (pos = __container_of((head)->next, pos, member);		\
-	 &pos->member != (head);					\
-	 pos = __container_of(pos->member.next, pos, member))
-
-#endif
+/*
+ * Copyright © 2010 Intel Corporation
+ * Copyright © 2010 Francisco Jerez <currojerez@riseup.net>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ *
+ */
+
+#ifndef _LIST_H_
+#define _LIST_H_
+
+/* classic doubly-link circular list */
+struct list {
+    struct list *next, *prev;
+};
+
+static void
+list_init(struct list *list)
+{
+    list->next = list->prev = list;
+}
+
+static inline void
+__list_add(struct list *entry,
+	    struct list *prev,
+	    struct list *next)
+{
+    next->prev = entry;
+    entry->next = next;
+    entry->prev = prev;
+    prev->next = entry;
+}
+
+static inline void
+list_add(struct list *entry, struct list *head)
+{
+    __list_add(entry, head, head->next);
+}
+
+static inline void
+__list_del(struct list *prev, struct list *next)
+{
+    next->prev = prev;
+    prev->next = next;
+}
+
+static inline void
+list_del(struct list *entry)
+{
+    __list_del(entry->prev, entry->next);
+    list_init(entry);
+}
+
+static inline Bool
+list_is_empty(struct list *head)
+{
+    return head->next == head;
+}
+
+#ifndef container_of
+#define container_of(ptr, type, member) \
+    (type *)((char *)(ptr) - (char *) &((type *)0)->member)
+#endif
+
+#define list_entry(ptr, type, member) \
+    container_of(ptr, type, member)
+
+#define list_first_entry(ptr, type, member) \
+    list_entry((ptr)->next, type, member)
+
+#define __container_of(ptr, sample, member)				\
+    (void *)((char *)(ptr)						\
+	     - ((char *)&(sample)->member - (char *)(sample)))
+
+#define list_for_each_entry(pos, head, member)				\
+    for (pos = __container_of((head)->next, pos, member);		\
+	 &pos->member != (head);					\
+	 pos = __container_of(pos->member.next, pos, member))
+
+#define list_for_each_entry_safe(pos, next, head, member)		\
+    for (pos = __container_of((head)->next, pos, member),		\
+	 next = __container_of(pos->member.next, pos, member);		\
+	 &pos->member != (head);					\
+	 pos = next, next = __container_of(next->member.next, next, member))
+
+#endif
-- 
cgit v1.2.3