From 0f3d97234e97703e7c8a4b15eacf06b0c63ec4f1 Mon Sep 17 00:00:00 2001
From: Eric Anholt <eric@anholt.net>
Date: Fri, 26 Mar 2010 11:37:13 -0700
Subject: [PATCH] Submit any existing batchbuffer before potentially handing off a BO to TFP.

Otherwise, a GL compositing manager could get the results of rendering
not synced with the X command stream as of the TFP call.
---
 src/i830_dri.c |   17 +++++++++++++++++
 1 files changed, 17 insertions(+), 0 deletions(-)

diff --git a/src/i830_dri.c b/src/i830_dri.c
index 88e9d90..afe3d8f 100644
--- a/src/i830_dri.c
+++ b/src/i830_dri.c
@@ -79,6 +79,21 @@ typedef struct {
 	unsigned int attachment;
 } I830DRI2BufferPrivateRec, *I830DRI2BufferPrivatePtr;
 
+/* If the drawable is one that might have GLX_texture_from_pixmap done
+ * to it, flush rendering before handing a reference to it back to
+ * GLX.
+ */
+static void
+do_tfp_flush(DrawablePtr drawable)
+{
+	if (drawable->type == DRAWABLE_PIXMAP) {
+		ScreenPtr screen = drawable->pScreen;
+		ScrnInfoPtr scrn = xf86Screens[screen->myNum];
+
+		intel_batch_submit(scrn);
+	}
+}
+
 #ifndef USE_DRI2_1_1_0
 static DRI2BufferPtr
 I830DRI2CreateBuffers(DrawablePtr drawable, unsigned int *attachments,
@@ -105,6 +120,7 @@ I830DRI2CreateBuffers(DrawablePtr drawable, unsigned int *attachments,
 	pDepthPixmap = NULL;
 	for (i = 0; i < count; i++) {
 		if (attachments[i] == DRI2BufferFrontLeft) {
+			do_tfp_flush(drawable);
 			pixmap = get_drawable_pixmap(drawable);
 			pixmap->refcnt++;
 		} else if (attachments[i] == DRI2BufferStencil && pDepthPixmap) {
@@ -184,6 +200,7 @@ I830DRI2CreateBuffer(DrawablePtr drawable, unsigned int attachment,
 	}
 
 	if (attachment == DRI2BufferFrontLeft) {
+		do_tfp_flush(drawable);
 		pixmap = get_drawable_pixmap(drawable);
 		pixmap->refcnt++;
 	} else {
-- 
1.7.0.3

