[PATCH 3/4] dri2: Only re-create the FrontBuffer after the WindowPixmap is updated

Chris Wilson chris at chris-wilson.co.uk
Sun Jun 12 02:47:36 PDT 2011


If the drawable size remained the same, the application can continue to
reuse the same back and auxiliary buffers, but will need the new name
for the Pixmap.

Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
Cc: Ville Syrjälä <ville.syrjala at nokia.com>
Cc: Dave Airlie <airlied at redhat.com>
Cc: Kristian Høgsberg <krh at bitplanet.net>
Cc: Jesse Barnes <jbarnes at virtuousgeek.org>
Cc: Michel Dänzer <michel at daenzer.net>
---
 hw/xfree86/dri2/dri2.c |   35 ++++++++++++++++++++---------------
 1 files changed, 20 insertions(+), 15 deletions(-)

diff --git a/hw/xfree86/dri2/dri2.c b/hw/xfree86/dri2/dri2.c
index d837852..7896a61 100644
--- a/hw/xfree86/dri2/dri2.c
+++ b/hw/xfree86/dri2/dri2.c
@@ -340,13 +340,13 @@ static Bool
 allocate_or_reuse_buffer(DrawablePtr pDraw, DRI2ScreenPtr ds,
 			 DRI2DrawablePtr pPriv,
 			 unsigned int attachment, unsigned int format,
-			 int dimensions_match, DRI2BufferPtr *buffer)
+			 int force, DRI2BufferPtr *buffer)
 {
-    int old_buf = find_attachment(pPriv, attachment);
+    int old_buf;
 
-    if ((old_buf < 0)
-	|| !dimensions_match
-	|| (pPriv->buffers[old_buf]->format != format)) {
+    if (force ||
+	(old_buf = find_attachment(pPriv, attachment)) < 0 ||
+	(pPriv->buffers[old_buf]->format != format)) {
 	*buffer = (*ds->CreateBuffer)(pDraw, attachment, format);
 	pPriv->serialNumber = DRI2DrawableSerial(pDraw);
 	return TRUE;
@@ -395,7 +395,7 @@ do_get_buffers(DrawablePtr pDraw, int *width, int *height,
     int need_fake_front = 0;
     int have_fake_front = 0;
     int front_format = 0;
-    int dimensions_match;
+    int dimensions_mismatch;
     int buffers_changed = 0;
     int i;
 
@@ -406,9 +406,9 @@ do_get_buffers(DrawablePtr pDraw, int *width, int *height,
 	return NULL;
     }
 
-    dimensions_match = (pDraw->width == pPriv->width)
-	&& (pDraw->height == pPriv->height)
-	&& (pPriv->serialNumber == DRI2DrawableSerial(pDraw));
+    dimensions_mismatch =
+	    pDraw->width != pPriv->width ||
+	    pDraw->height != pPriv->height;
 
     buffers = calloc((count + 1), sizeof(buffers[0]));
     if (!buffers)
@@ -417,10 +417,13 @@ do_get_buffers(DrawablePtr pDraw, int *width, int *height,
     for (i = 0; i < count; i++) {
 	const unsigned attachment = *(attachments++);
 	const unsigned format = (has_format) ? *(attachments++) : 0;
+	int force = dimensions_mismatch;
+
+	if (attachment == DRI2BufferFrontLeft)
+		force |= pPriv->serialNumber != DRI2DrawableSerial(pDraw);
 
 	if (allocate_or_reuse_buffer(pDraw, ds, pPriv, attachment,
-				     format, dimensions_match,
-				     &buffers[i]))
+				     format, force, &buffers[i]))
 		buffers_changed = 1;
 
 	if (buffers[i] == NULL)
@@ -455,7 +458,9 @@ do_get_buffers(DrawablePtr pDraw, int *width, int *height,
 
     if (need_real_front > 0) {
 	if (allocate_or_reuse_buffer(pDraw, ds, pPriv, DRI2BufferFrontLeft,
-				     front_format, dimensions_match,
+				     front_format,
+				     dimensions_mismatch ||
+				     pPriv->serialNumber != DRI2DrawableSerial(pDraw),
 				     &buffers[i]))
 	    buffers_changed = 1;
 
@@ -466,7 +471,7 @@ do_get_buffers(DrawablePtr pDraw, int *width, int *height,
 
     if (need_fake_front > 0) {
 	if (allocate_or_reuse_buffer(pDraw, ds, pPriv, DRI2BufferFakeFrontLeft,
-				     front_format, dimensions_match,
+				     front_format, dimensions_mismatch,
 				     &buffers[i]))
 	    buffers_changed = 1;
 
@@ -495,8 +500,8 @@ do_get_buffers(DrawablePtr pDraw, int *width, int *height,
 	box.y2 = pPriv->height;
 	RegionInit(&region, &box, 0);
 
-	DRI2CopyRegion(pDraw, &region, DRI2BufferFakeFrontLeft,
-		       DRI2BufferFrontLeft);
+	DRI2CopyRegion(pDraw, &region,
+		       DRI2BufferFakeFrontLeft, DRI2BufferFrontLeft);
     }
 
     pPriv->needInvalidate = TRUE;
-- 
1.7.5.1



More information about the xorg-devel mailing list