Oh yeah, haven't dealt with versioning at all. :)  It would be pretty easy to
keep existing drivers (w/o SwapBuffers hooks) working by just calling
CopyRegion, but the new protocol request probably wants a version bump.

diff --git a/glx/glxdri2.c b/glx/glxdri2.c
index 4e76c71..892d07f 100644
--- a/glx/glxdri2.c
+++ b/glx/glxdri2.c
@@ -131,10 +131,27 @@ __glXDRIdrawableCopySubBuffer(__GLXdrawable *drawable,
 static GLboolean
 __glXDRIdrawableSwapBuffers(__GLXdrawable *drawable)
 {
-    __GLXDRIdrawable *private = (__GLXDRIdrawable *) drawable;
+    __GLXDRIdrawable *priv = (__GLXDRIdrawable *) drawable;
+    DRI2BufferPtr buffers;
+    int i, j;
+
+    buffers = DRI2SwapBuffers(drawable->pDraw);
+    if (!buffers)
+       return FALSE;
+
+    /* Update the front & back buffer objects */
+    for (j = 0; j < 2; j++) {
+           for (i = 0; i < priv->count; i++) {
+                   if (priv->buffers[i].attachment == buffers[j].attachment) {
+                           priv->buffers[i].name = buffers[j].name;
+                           priv->buffers[i].pitch = buffers[j].pitch;
+                           priv->buffers[i].cpp = buffers[j].cpp;
+                           priv->buffers[i].flags = buffers[j].flags;
+                   }
+           }
+    }
 
-    __glXDRIdrawableCopySubBuffer(drawable, 0, 0,
-                                 private->width, private->height);
+    xfree(buffers);
 
     return TRUE;
 }
diff --git a/hw/xfree86/dri2/dri2.c b/hw/xfree86/dri2/dri2.c
index 0f2e24b..52dc8c7 100644
--- a/hw/xfree86/dri2/dri2.c
+++ b/hw/xfree86/dri2/dri2.c
@@ -49,15 +49,6 @@ static DevPrivateKey dri2WindowPrivateKey = 
&dri2WindowPrivateKeyIndex;
 static int dri2PixmapPrivateKeyIndex;
 static DevPrivateKey dri2PixmapPrivateKey = &dri2PixmapPrivateKeyIndex;
 
-typedef struct _DRI2Drawable {
-    unsigned int        refCount;
-    int                         width;
-    int                         height;
-    DRI2BufferPtr       buffers;
-    int                         bufferCount;
-    unsigned int        pendingSequence;
-} DRI2DrawableRec, *DRI2DrawablePtr;
-
 typedef struct _DRI2Screen {
     const char                 *driverName;
     const char                 *deviceName;
@@ -66,6 +57,7 @@ typedef struct _DRI2Screen {
     DRI2CreateBuffersProcPtr    CreateBuffers;
     DRI2DestroyBuffersProcPtr   DestroyBuffers;
     DRI2CopyRegionProcPtr       CopyRegion;
+    DRI2SwapBuffersProcPtr      SwapBuffers;
 
     HandleExposuresProcPtr       HandleExposures;
 } DRI2ScreenRec, *DRI2ScreenPtr;
@@ -76,7 +68,7 @@ DRI2GetScreen(ScreenPtr pScreen)
     return dixLookupPrivate(&pScreen->devPrivates, dri2ScreenPrivateKey);
 }
 
-static DRI2DrawablePtr
+DRI2DrawablePtr
 DRI2GetDrawable(DrawablePtr pDraw)
 {
     WindowPtr            pWin;
@@ -188,6 +180,20 @@ DRI2CopyRegion(DrawablePtr pDraw, RegionPtr pRegion,
     return Success;
 }
 
+DRI2BufferPtr
+DRI2SwapBuffers(DrawablePtr pDraw)
+{
+    DRI2ScreenPtr   ds = DRI2GetScreen(pDraw->pScreen);
+    DRI2DrawablePtr pPriv;
+
+    /* FIXME: make sure drawable is double buffered */
+    pPriv = DRI2GetDrawable(pDraw);
+    if (pPriv == NULL)
+       return BadDrawable;
+
+    return (*ds->SwapBuffers)(pDraw);
+}
+
 void
 DRI2DestroyDrawable(DrawablePtr pDraw)
 {
@@ -264,6 +270,7 @@ DRI2ScreenInit(ScreenPtr pScreen, DRI2InfoPtr info)
     ds->CreateBuffers  = info->CreateBuffers;
     ds->DestroyBuffers = info->DestroyBuffers;
     ds->CopyRegion     = info->CopyRegion;
+    ds->SwapBuffers    = info->SwapBuffers;
 
     dixSetPrivate(&pScreen->devPrivates, dri2ScreenPrivateKey, ds);
 
diff --git a/hw/xfree86/dri2/dri2.h b/hw/xfree86/dri2/dri2.h
index 5e7fd65..a075ddc 100644
--- a/hw/xfree86/dri2/dri2.h
+++ b/hw/xfree86/dri2/dri2.h
@@ -44,6 +44,15 @@ typedef struct {
     void *driverPrivate;
 } DRI2BufferRec, *DRI2BufferPtr;
 
+typedef struct _DRI2Drawable {
+    unsigned int        refCount;
+    int                         width;
+    int                         height;
+    DRI2BufferPtr       buffers;
+    int                         bufferCount;
+    unsigned int        pendingSequence;
+} DRI2DrawableRec, *DRI2DrawablePtr;
+
 typedef DRI2BufferPtr  (*DRI2CreateBuffersProcPtr)(DrawablePtr pDraw,
                                                    unsigned int *attachments,
                                                    int count);
@@ -54,6 +63,7 @@ typedef void          (*DRI2CopyRegionProcPtr)(DrawablePtr 
pDraw,
                                                 RegionPtr pRegion,
                                                 DRI2BufferPtr pDestBuffer,
                                                 DRI2BufferPtr pSrcBuffer);
+typedef DRI2BufferPtr  (*DRI2SwapBuffersProcPtr)(DrawablePtr pDraw);
 
 typedef void           (*DRI2WaitProcPtr)(WindowPtr pWin,
                                           unsigned int sequence);
@@ -67,10 +77,13 @@ typedef struct {
     DRI2CreateBuffersProcPtr   CreateBuffers;
     DRI2DestroyBuffersProcPtr  DestroyBuffers;
     DRI2CopyRegionProcPtr      CopyRegion;
+    DRI2SwapBuffersProcPtr      SwapBuffers;
     DRI2WaitProcPtr            Wait;
 
 }  DRI2InfoRec, *DRI2InfoPtr;
 
+DRI2DrawablePtr DRI2GetDrawable(DrawablePtr pDraw);
+
 Bool DRI2ScreenInit(ScreenPtr  pScreen,
                    DRI2InfoPtr info);
 
@@ -100,4 +113,6 @@ int DRI2CopyRegion(DrawablePtr pDraw,
                   unsigned int dest,
                   unsigned int src);
 
+DRI2BufferPtr DRI2SwapBuffers(DrawablePtr pDraw);
+
 #endif
diff --git a/hw/xfree86/dri2/dri2ext.c b/hw/xfree86/dri2/dri2ext.c
index 0a1dce4..d571525 100644
--- a/hw/xfree86/dri2/dri2ext.c
+++ b/hw/xfree86/dri2/dri2ext.c
@@ -269,6 +269,43 @@ ProcDRI2CopyRegion(ClientPtr client)
 }
 
 static int
+ProcDRI2SwapBuffers(ClientPtr client)
+{
+    REQUEST(xDRI2SwapBuffersReq);
+    xDRI2SwapBuffersReply rep;
+    DrawablePtr pDrawable;
+    DRI2BufferPtr buffers;
+    xDRI2Buffer buffer;
+    int status;
+    int i;
+
+    REQUEST_SIZE_MATCH(xDRI2SwapBuffersReq);
+
+    if (!validDrawable(client, stuff->drawable, &pDrawable, &status))
+       return status;
+
+    buffers = DRI2SwapBuffers(pDrawable);
+    if (status != Success)
+       return status;
+
+    rep.type = X_Reply;
+    rep.length = 2 * sizeof(xDRI2Buffer) / 4;
+    rep.sequenceNumber = client->sequence;
+    WriteToClient(client, sizeof(xDRI2GetBuffersReply), &rep);
+
+    for (i = 0; i < 2; i++) {
+       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);
+    }
+
+    return client->noClientException;
+}
+
+static int
 ProcDRI2Dispatch (ClientPtr client)
 {
     REQUEST(xReq);
@@ -294,6 +331,8 @@ ProcDRI2Dispatch (ClientPtr client)
        return ProcDRI2GetBuffers(client);
     case X_DRI2CopyRegion:
        return ProcDRI2CopyRegion(client);
+    case X_DRI2SwapBuffers:
+       return ProcDRI2SwapBuffers(client);
     default:
        return BadRequest;
     }

------------------------------------------------------------------------------
Create and Deploy Rich Internet Apps outside the browser with Adobe(R)AIR(TM)
software. With Adobe AIR, Ajax developers can use existing skills and code to
build responsive, highly engaging applications that combine the power of local
resources and data with the reach of the web. Download the Adobe AIR SDK and
Ajax docs to start building applications today-http://p.sf.net/sfu/adobe-com
--
_______________________________________________
Dri-devel mailing list
Dri-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/dri-devel

Reply via email to