xserver: Branch 'server-1.6-branch' - 5 commits

Keith Packard keithp at kemper.freedesktop.org
Tue Jul 7 16:40:21 PDT 2009


 Xext/panoramiX.c              |    6 
 configure.ac                  |    4 
 glx/glxcmds.c                 |   39 ++++--
 glx/glxdrawable.h             |    2 
 glx/glxdri.c                  |    2 
 glx/glxdri2.c                 |   35 +++++
 hw/xfree86/common/Makefile.am |    2 
 hw/xfree86/dri2/dri2.c        |  253 ++++++++++++++++++++++++++++++------------
 hw/xfree86/dri2/dri2.h        |   21 ++-
 hw/xfree86/dri2/dri2ext.c     |    6 
 hw/xfree86/parser/Makefile.am |    4 
 11 files changed, 278 insertions(+), 96 deletions(-)

New commits:
commit 6f1aff5a2b45bc2985081abc240a8fed37170386
Author: Keith Packard <keithp at keithp.com>
Date:   Mon Jul 6 14:08:31 2009 -0700

    Bump to version 1.6.2
    
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/configure.ac b/configure.ac
index 339172f..71cc30c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -26,12 +26,12 @@ dnl
 dnl Process this file with autoconf to create configure.
 
 AC_PREREQ(2.57)
-AC_INIT([xorg-server], 1.6.1.902, [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], xorg-server)
+AC_INIT([xorg-server], 1.6.2, [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], xorg-server)
 AC_CONFIG_SRCDIR([Makefile.am])
 AM_INIT_AUTOMAKE([dist-bzip2 foreign])
 AM_MAINTAINER_MODE
 
-RELEASE_DATE="2009-6-29"
+RELEASE_DATE="2009-7-7"
 
 dnl this gets generated by autoheader, and thus contains all the defines.  we
 dnl don't ever actually use it, internally.
commit 499f9f62e408510ed4efb6f2321a3f851f535567
Author: Keith Packard <keithp at keithp.com>
Date:   Wed Jul 1 14:01:57 2009 -0700

    dri2: Preserve compatibility with 1.6 DRI2 API/ABI
    
    The old DRI2 buffer allocation API wasn't great, but there's no reason to
    make the server stop working with those drivers. This patch has the
    X server adapting to the API provided by the driver, using the new API where
    available and falling back to the old API as necessary. A warning will be
    placed in the log file when the old API is in use.
    (cherry picked from commit 2e2c5b216cc1c7a9bc26bd2c68226aaed5fc52ca)
    
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/hw/xfree86/dri2/dri2.c b/hw/xfree86/dri2/dri2.c
index 385c5e8..580383d 100644
--- a/hw/xfree86/dri2/dri2.c
+++ b/hw/xfree86/dri2/dri2.c
@@ -53,7 +53,7 @@ typedef struct _DRI2Drawable {
     unsigned int	 refCount;
     int			 width;
     int			 height;
-    DRI2BufferPtr	*buffers;
+    DRI2Buffer2Ptr	*buffers;
     int			 bufferCount;
     unsigned int	 pendingSequence;
 } DRI2DrawableRec, *DRI2DrawablePtr;
@@ -63,6 +63,10 @@ typedef struct _DRI2Screen {
     const char			*deviceName;
     int				 fd;
     unsigned int		 lastSequence;
+
+    DRI2CreateBuffersProcPtr	 CreateBuffers;
+    DRI2DestroyBuffersProcPtr	 DestroyBuffers;
+
     DRI2CreateBufferProcPtr	 CreateBuffer;
     DRI2DestroyBufferProcPtr	 DestroyBuffer;
     DRI2CopyRegionProcPtr	 CopyRegion;
@@ -133,17 +137,17 @@ DRI2CreateDrawable(DrawablePtr pDraw)
 }
 
 static int
-find_attachment(DRI2BufferPtr *buffer_list, int count, unsigned attachment)
+find_attachment(DRI2DrawablePtr pPriv, unsigned attachment)
 {
     int i;
 
-    if (buffer_list == NULL) {
+    if (pPriv->buffers == NULL) {
 	return -1;
     }
 
-    for (i = 0; i < count; i++) {
-	if ((buffer_list[i] != NULL)
-	    && (buffer_list[i]->attachment == attachment)) {
+    for (i = 0; i < pPriv->bufferCount; i++) {
+	if ((pPriv->buffers[i] != NULL)
+	    && (pPriv->buffers[i]->attachment == attachment)) {
 	    return i;
 	}
     }
@@ -151,16 +155,16 @@ find_attachment(DRI2BufferPtr *buffer_list, int count, unsigned attachment)
     return -1;
 }
 
-static DRI2BufferPtr
+static DRI2Buffer2Ptr
 allocate_or_reuse_buffer(DrawablePtr pDraw, DRI2ScreenPtr ds,
 			 DRI2DrawablePtr pPriv,
 			 unsigned int attachment, unsigned int format,
 			 int dimensions_match)
 {
-    DRI2BufferPtr buffer;
+    DRI2Buffer2Ptr buffer;
     int old_buf;
 
-    old_buf = find_attachment(pPriv->buffers, pPriv->bufferCount, attachment);
+    old_buf = find_attachment(pPriv, attachment);
 
     if ((old_buf < 0)
 	|| !dimensions_match
@@ -174,14 +178,14 @@ allocate_or_reuse_buffer(DrawablePtr pDraw, DRI2ScreenPtr ds,
     return buffer;
 }
 
-static DRI2BufferPtr *
+static DRI2Buffer2Ptr *
 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;
+    DRI2Buffer2Ptr  *buffers;
     int need_real_front = 0;
     int need_fake_front = 0;
     int have_fake_front = 0;
@@ -193,68 +197,156 @@ do_get_buffers(DrawablePtr pDraw, int *width, int *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 (ds->CreateBuffer) {
+	/* Version 2 API with CreateBuffer */
+	for (i = 0; i < count; i++) {
+	    const unsigned attachment = *(attachments++);
+	    const unsigned format = (has_format) ? *(attachments++) : 0;
+
+	    buffers[i] = allocate_or_reuse_buffer(pDraw, ds, pPriv, attachment,
+						  format, dimensions_match);
+
+	    /* 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++;
+		}
+	    }
 
-	buffers[i] = allocate_or_reuse_buffer(pDraw, ds, pPriv, attachment,
-					      format, dimensions_match);
+	    if (pDraw->type == DRAWABLE_WINDOW) {
+		if (attachment == DRI2BufferFakeFrontLeft) {
+		    need_fake_front--;
+		    have_fake_front = 1;
+		}
+	    }
+	}
 
+	if (need_real_front > 0) {
+	    buffers[i++] = allocate_or_reuse_buffer(pDraw, ds, pPriv,
+						    DRI2BufferFrontLeft,
+						    front_format, dimensions_match);
+	}
 
-	/* 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 (need_fake_front > 0) {
+	    buffers[i++] = allocate_or_reuse_buffer(pDraw, ds, pPriv,
+						    DRI2BufferFakeFrontLeft,
+						    front_format, dimensions_match);
+	    have_fake_front = 1;
 	}
 
-	if (attachment == DRI2BufferFrontLeft) {
-	    need_real_front--;
-	    front_format = format;
+	*out_count = i;
 
-	    if (pDraw->type == DRAWABLE_WINDOW) {
-		need_fake_front++;
+
+	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);
+	}
+    } else {
+	DRI2BufferPtr	buffers1;
+	unsigned int	temp_buf[32];
+	unsigned int	*temp = temp_buf;
+	int		i;
+	int		buffers_match = 1;
+
+	/* Version 1 API with CreateBuffers */
+
+	if ((count + 1) > 32) {
+	    temp = xalloc((count + 1) * sizeof(temp[0]));
 	}
 
-	if (pDraw->type == DRAWABLE_WINDOW) {
-	    if (attachment == DRI2BufferFakeFrontLeft) {
+	for (i = 0; i < count; i++) {
+	    const unsigned attachment = *(attachments++);
+
+	    /* Version 1 doesn't deal with the format at all */
+	    if (has_format)
+		attachments++;
+
+	    /*
+	     * Make sure the client also gets the front buffer when
+	     * it asks for a back buffer
+	     */
+	    if (attachment == DRI2BufferBackLeft)
+		need_real_front++;
+
+	    /*
+	     * 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 == DRI2BufferFrontLeft) {
+		need_real_front--;
+		if (pDraw->type == DRAWABLE_WINDOW)
+		    need_fake_front++;
+	    }
+	    if (pDraw->type == DRAWABLE_WINDOW &&
+		attachment == DRI2BufferFakeFrontLeft)
+	    {
 		need_fake_front--;
 		have_fake_front = 1;
 	    }
+
+	    temp[i] = attachment;
 	}
-    }
 
-    if (need_real_front > 0) {
-	buffers[i++] = allocate_or_reuse_buffer(pDraw, ds, pPriv,
-						DRI2BufferFrontLeft,
-						front_format, dimensions_match);
-    }
+	if (need_real_front > 0)
+	    temp[count++] = DRI2BufferFrontLeft;
 
-    if (need_fake_front > 0) {
-	buffers[i++] = allocate_or_reuse_buffer(pDraw, ds, pPriv,
-						DRI2BufferFakeFrontLeft,
-						front_format, dimensions_match);
-	have_fake_front = 1;
-    }
+	if (need_fake_front > 0) {
+	    temp[count++] = DRI2BufferFakeFrontLeft;
+	    have_fake_front = 1;
+	}
+
+	if (count != pPriv->bufferCount)
+	    buffers_match = 0;
+	else {
+	    for (i = 0; i < count; i++)
+		if (pPriv->buffers[i]->attachment != temp[i]) {
+		    buffers_match = 0;
+		    break;
+		}
+	}
+	if (pPriv->buffers == NULL || !dimensions_match || !buffers_match)
+	{
+            buffers1 = (*ds->CreateBuffers)(pDraw, temp, count);
+	    if (pPriv->buffers != NULL)
+		(*ds->DestroyBuffers)(pDraw, (DRI2BufferPtr) pPriv->buffers[0],
+				      pPriv->bufferCount);
+	}
+	else
+	    buffers1 = (DRI2BufferPtr) pPriv->buffers[0];
 
-    *out_count = i;
+        for (i = 0; i < count; i++)
+	    buffers[i] = (DRI2Buffer2Ptr) &buffers1[i];
 
+        *out_count = count;
 
-    if (pPriv->buffers != NULL) {
-	for (i = 0; i < pPriv->bufferCount; i++) {
-	    if (pPriv->buffers[i] != NULL) {
-		(*ds->DestroyBuffer)(pDraw, pPriv->buffers[i]);
-	    }
-	}
+	if (pPriv->buffers)
+	    xfree (pPriv->buffers);
 
-	xfree(pPriv->buffers);
+	if (temp != temp_buf) {
+	    xfree(temp);
+	}
     }
 
-
     pPriv->buffers = buffers;
     pPriv->bufferCount = *out_count;
     pPriv->width = pDraw->width;
@@ -284,7 +376,7 @@ do_get_buffers(DrawablePtr pDraw, int *width, int *height,
     return pPriv->buffers;
 }
 
-DRI2BufferPtr *
+DRI2Buffer2Ptr *
 DRI2GetBuffers(DrawablePtr pDraw, int *width, int *height,
 	       unsigned int *attachments, int count, int *out_count)
 {
@@ -292,7 +384,7 @@ DRI2GetBuffers(DrawablePtr pDraw, int *width, int *height,
 			  out_count, FALSE);
 }
 
-DRI2BufferPtr *
+DRI2Buffer2Ptr *
 DRI2GetBuffersWithFormat(DrawablePtr pDraw, int *width, int *height,
 			 unsigned int *attachments, int count, int *out_count)
 {
@@ -318,13 +410,13 @@ DRI2CopyRegion(DrawablePtr pDraw, RegionPtr pRegion,
     for (i = 0; i < pPriv->bufferCount; i++)
     {
 	if (pPriv->buffers[i]->attachment == dest)
-	    pDestBuffer = pPriv->buffers[i];
+	    pDestBuffer = (DRI2BufferPtr) pPriv->buffers[i];
 	if (pPriv->buffers[i]->attachment == src)
-	    pSrcBuffer = pPriv->buffers[i];
+	    pSrcBuffer = (DRI2BufferPtr) pPriv->buffers[i];
     }
     if (pSrcBuffer == NULL || pDestBuffer == NULL)
 	return BadValue;
-		
+
     (*ds->CopyRegion)(pDraw, pRegion, pDestBuffer, pSrcBuffer);
 
     return Success;
@@ -341,7 +433,7 @@ DRI2DestroyDrawable(DrawablePtr pDraw)
     pPriv = DRI2GetDrawable(pDraw);
     if (pPriv == NULL)
 	return;
-    
+
     pPriv->refCount--;
     if (pPriv->refCount > 0)
 	return;
@@ -349,8 +441,13 @@ DRI2DestroyDrawable(DrawablePtr pDraw)
     if (pPriv->buffers != NULL) {
 	int i;
 
-	for (i = 0; i < pPriv->bufferCount; i++) {
-	    (*ds->DestroyBuffer)(pDraw, pPriv->buffers[i]);
+	if (ds->DestroyBuffer) {
+	    for (i = 0; i < pPriv->bufferCount; i++) {
+		(*ds->DestroyBuffer)(pDraw, pPriv->buffers[i]);
+	    }
+	} else {
+	    (*ds->DestroyBuffers)(pDraw, (DRI2BufferPtr) pPriv->buffers[0],
+				  pPriv->bufferCount);
 	}
 
 	xfree(pPriv->buffers);
@@ -409,18 +506,36 @@ DRI2ScreenInit(ScreenPtr pScreen, DRI2InfoPtr info)
     if (!ds)
 	return FALSE;
 
-    if ((info->version < 2)
-	|| (info->CreateBuffer == NULL)
-	|| (info->DestroyBuffer == NULL)) {
-	return FALSE;
-    }
-
-
     ds->fd	       = info->fd;
     ds->driverName     = info->driverName;
     ds->deviceName     = info->deviceName;
-    ds->CreateBuffer   = info->CreateBuffer;
-    ds->DestroyBuffer  = info->DestroyBuffer;
+
+    /* Prefer the new one-at-a-time buffer API */
+    if (info->version >= 2 && info->CreateBuffer && info->DestroyBuffer) {
+	ds->CreateBuffer   = info->CreateBuffer;
+	ds->DestroyBuffer  = info->DestroyBuffer;
+	ds->CreateBuffers  = NULL;
+	ds->DestroyBuffers = NULL;
+    } else if (info->CreateBuffers && info->DestroyBuffers) {
+	xf86DrvMsg(pScreen->myNum, X_WARNING,
+		   "[DRI2] Version 1 API (broken front buffer rendering)\n");
+	ds->CreateBuffer   = NULL;
+	ds->DestroyBuffer  = NULL;
+	ds->CreateBuffers  = info->CreateBuffers;
+	ds->DestroyBuffers = info->DestroyBuffers;
+    } else {
+	xf86DrvMsg(pScreen->myNum, X_ERROR,
+		   "[DRI2] Missing buffer management functions\n");
+	xfree(ds);
+	return FALSE;
+    }
+
+    if (!info->CopyRegion) {
+	xf86DrvMsg(pScreen->myNum, X_ERROR,
+		   "[DRI2] Missing copy region function\n");
+	xfree(ds);
+	return FALSE;
+    }
     ds->CopyRegion     = info->CopyRegion;
 
     dixSetPrivate(&pScreen->devPrivates, dri2ScreenPrivateKey, ds);
diff --git a/hw/xfree86/dri2/dri2.h b/hw/xfree86/dri2/dri2.h
index c9a0d3f..f369267 100644
--- a/hw/xfree86/dri2/dri2.h
+++ b/hw/xfree86/dri2/dri2.h
@@ -35,16 +35,27 @@
 
 #include <X11/extensions/dri2tokens.h>
 
+/* Version 1 structure (for ABI compatibility) */
 typedef struct {
     unsigned int attachment;
     unsigned int name;
     unsigned int pitch;
     unsigned int cpp;
     unsigned int flags;
-    unsigned int format;
     void *driverPrivate;
 } DRI2BufferRec, *DRI2BufferPtr;
 
+/* 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;
+    void *driverPrivate;
+    unsigned int format;
+} DRI2Buffer2Rec, *DRI2Buffer2Ptr;
+
 typedef DRI2BufferPtr	(*DRI2CreateBuffersProcPtr)(DrawablePtr pDraw,
 						    unsigned int *attachments,
 						    int count);
@@ -59,11 +70,11 @@ typedef void		(*DRI2CopyRegionProcPtr)(DrawablePtr pDraw,
 typedef void		(*DRI2WaitProcPtr)(WindowPtr pWin,
 					   unsigned int sequence);
 
-typedef DRI2BufferPtr	(*DRI2CreateBufferProcPtr)(DrawablePtr pDraw,
+typedef DRI2Buffer2Ptr	(*DRI2CreateBufferProcPtr)(DrawablePtr pDraw,
 						   unsigned int attachment,
 						   unsigned int format);
 typedef void		(*DRI2DestroyBufferProcPtr)(DrawablePtr pDraw,
-						    DRI2BufferPtr buffer);
+						    DRI2Buffer2Ptr buffer);
 
 /**
  * Version of the DRI2InfoRec structure defined in this header
@@ -108,7 +119,7 @@ int DRI2CreateDrawable(DrawablePtr pDraw);
 
 void DRI2DestroyDrawable(DrawablePtr pDraw);
 
-DRI2BufferPtr *DRI2GetBuffers(DrawablePtr pDraw,
+DRI2Buffer2Ptr *DRI2GetBuffers(DrawablePtr pDraw,
 			     int *width,
 			     int *height,
 			     unsigned int *attachments,
@@ -138,7 +149,7 @@ int DRI2CopyRegion(DrawablePtr pDraw,
  */
 extern _X_EXPORT void DRI2Version(int *major, int *minor);
 
-extern _X_EXPORT DRI2BufferPtr *DRI2GetBuffersWithFormat(DrawablePtr pDraw,
+extern _X_EXPORT DRI2Buffer2Ptr *DRI2GetBuffersWithFormat(DrawablePtr pDraw,
 	int *width, int *height, unsigned int *attachments, int count,
 	int *out_count);
 
diff --git a/hw/xfree86/dri2/dri2ext.c b/hw/xfree86/dri2/dri2ext.c
index 97b96fa..3c06174 100644
--- a/hw/xfree86/dri2/dri2ext.c
+++ b/hw/xfree86/dri2/dri2ext.c
@@ -196,7 +196,7 @@ ProcDRI2DestroyDrawable(ClientPtr client)
 
 static void
 send_buffers_reply(ClientPtr client, DrawablePtr pDrawable,
-		   DRI2BufferPtr *buffers, int count, int width, int height)
+		   DRI2Buffer2Ptr *buffers, int count, int width, int height)
 {
     xDRI2GetBuffersReply rep;
     int skip = 0;
@@ -246,7 +246,7 @@ ProcDRI2GetBuffers(ClientPtr client)
 {
     REQUEST(xDRI2GetBuffersReq);
     DrawablePtr pDrawable;
-    DRI2BufferPtr *buffers;
+    DRI2Buffer2Ptr *buffers;
     int status, width, height, count;
     unsigned int *attachments;
 
@@ -269,7 +269,7 @@ ProcDRI2GetBuffersWithFormat(ClientPtr client)
 {
     REQUEST(xDRI2GetBuffersReq);
     DrawablePtr pDrawable;
-    DRI2BufferPtr *buffers;
+    DRI2Buffer2Ptr *buffers;
     int status, width, height, count;
     unsigned int *attachments;
 
commit c859b736d1d23c5dc2f53958b1e76660e6d45018
Author: Arkadiusz Miskiewicz <arekm at maven.pl>
Date:   Fri Jul 3 11:03:32 2009 +0200

    xfree86: remove duplicate header entries in Makefile.am
    
    fixes https://bugs.freedesktop.org/show_bug.cgi?id=22547
    
    This bug was fixed in a big clean-up commit in master, which cannot be
    backported (see commit b1dac41fb3853ca8182048ea57b88b6e84ecceb3)
    
    Signed-off-by: Rémi Cardona <remi at gentoo.org>
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/hw/xfree86/common/Makefile.am b/hw/xfree86/common/Makefile.am
index 77ab4c3..b38c14a 100644
--- a/hw/xfree86/common/Makefile.am
+++ b/hw/xfree86/common/Makefile.am
@@ -47,7 +47,7 @@ sdk_HEADERS = compiler.h fourcc.h xf86.h xf86Module.h xf86Opt.h \
               xf86PciInfo.h xf86Priv.h xf86Privstr.h xf86Resources.h \
               xf86cmap.h xf86fbman.h xf86str.h xf86RAC.h xf86Xinput.h xisb.h \
               $(XVSDKINCS) xorgVersion.h \
-              xf86sbusBus.h xf86xv.h xf86xvmc.h xf86xvpriv.h
+              xf86sbusBus.h xf86xvpriv.h
 
 DISTCLEANFILES = xf86Build.h
 CLEANFILES = $(BUILT_SOURCES)
diff --git a/hw/xfree86/parser/Makefile.am b/hw/xfree86/parser/Makefile.am
index 7f599f9..6ed1814 100644
--- a/hw/xfree86/parser/Makefile.am
+++ b/hw/xfree86/parser/Makefile.am
@@ -35,6 +35,4 @@ EXTRA_DIST = \
 	xf86tokens.h
 
 sdk_HEADERS = \
-	$(LIBHEADERS) \
-	xf86Parser.h \
-	xf86Optrec.h
+	$(LIBHEADERS)
commit 6f82ca0f8bfc074474407cb5ffe782c3c128f838
Author: Alan Hourihane <alanh at vmware.com>
Date:   Mon Feb 16 11:39:34 2009 +0000

    dri2: support glXWaitGL & glXWaitX by copying fake front to front and
    vice-versa.
    (cherry picked from commit 2a8b8077d8f6001eb57deba60e1009fc99c28668)
    
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/glx/glxcmds.c b/glx/glxcmds.c
index 71f1544..ff8b126 100644
--- a/glx/glxcmds.c
+++ b/glx/glxcmds.c
@@ -748,29 +748,46 @@ int __glXDisp_QueryVersion(__GLXclientState *cl, GLbyte *pc)
 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;
+	if (!__glXForceCurrent(cl, req->contextTag, &error))
+	    return error;
+
+	CALL_Finish( GET_DISPATCH(), () );
     }
-    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 (!__glXForceCurrent(cl, req->contextTag, &error))
+	    return error;
     }
-    /*
-    ** In a multithreaded server that had separate X and GL threads, we would
-    ** have to wait for the X thread to finish before returning.  As it stands,
-    ** this sample implementation only supports singlethreaded servers, and
-    ** nothing needs to be done here.
-    */
+
+    if (glxc && glxc->drawPriv->waitGL)
+	(*glxc->drawPriv->waitGL)(glxc->drawPriv);
+
     return Success;
 }
 
diff --git a/glx/glxdrawable.h b/glx/glxdrawable.h
index 4f61f8b..f5a0403 100644
--- a/glx/glxdrawable.h
+++ b/glx/glxdrawable.h
@@ -49,6 +49,8 @@ struct __GLXdrawable {
     GLboolean (*swapBuffers)(__GLXdrawable *);
     void      (*copySubBuffer)(__GLXdrawable *drawable,
 			       int x, int y, int w, int h);
+    void      (*waitX)(__GLXdrawable *);
+    void      (*waitGL)(__GLXdrawable *);
 
     DrawablePtr pDraw;
     XID drawId;
diff --git a/glx/glxdri.c b/glx/glxdri.c
index 8d614d0..64606ab 100644
--- a/glx/glxdri.c
+++ b/glx/glxdri.c
@@ -706,6 +706,8 @@ __glXDRIscreenCreateDrawable(__GLXscreen *screen,
     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,
diff --git a/glx/glxdri2.c b/glx/glxdri2.c
index 836fea4..146ea82 100644
--- a/glx/glxdri2.c
+++ b/glx/glxdri2.c
@@ -143,6 +143,39 @@ __glXDRIdrawableSwapBuffers(__GLXdrawable *drawable)
     return TRUE;
 }
 
+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 int
 __glXDRIdrawableSwapInterval(__GLXdrawable *drawable, int interval)
@@ -351,6 +384,8 @@ __glXDRIscreenCreateDrawable(__GLXscreen *screen,
     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);
commit d478bc948838d11b3abcf6d2cdd3a00dccb344c4
Author: Eric Anholt <eric at anholt.net>
Date:   Tue Feb 17 09:59:17 2009 -0800

    xinerama: Put the proto version in the code instead using proto headers.
    
    Proto headers updating resulting in the server advertising new versions is
    broken.  This should be applied to every extension.
    
    This fixes the build against slightly-older xineramaproto.
    (cherry picked from commit b349a764e98f0d8f221190157ffa0904b91beca5)
    
    Signed-off-by: Keith Packard <keithp at keithp.com>

diff --git a/Xext/panoramiX.c b/Xext/panoramiX.c
index bab8c98..a1f4ce0 100644
--- a/Xext/panoramiX.c
+++ b/Xext/panoramiX.c
@@ -58,6 +58,8 @@ Equipment Corporation.
 #endif
 #include "modinit.h"
 
+#define SERVER_PANORAMIX_MAJOR_VERSION	1
+#define SERVER_PANORAMIX_MINOR_VERSION	1
 
 #ifdef GLXPROXY
 extern VisualPtr glxMatchVisual(ScreenPtr pScreen,
@@ -903,8 +905,8 @@ ProcPanoramiXQueryVersion (ClientPtr client)
     rep.type = X_Reply;
     rep.length = 0;
     rep.sequenceNumber = client->sequence;
-    rep.majorVersion = PANORAMIX_MAJOR_VERSION;
-    rep.minorVersion = PANORAMIX_MINOR_VERSION;   
+    rep.majorVersion = SERVER_PANORAMIX_MAJOR_VERSION;
+    rep.minorVersion = SERVER_PANORAMIX_MINOR_VERSION;
     if (client->swapped) { 
         swaps(&rep.sequenceNumber, n);
         swapl(&rep.length, n);     


More information about the xorg-commit mailing list