[Intel-gfx] [PATCH 1/3] Submit any existing batchbuffer before potentially handing off a BO to TFP.

Eric Anholt eric at anholt.net
Tue Apr 20 22:08:09 CEST 2010


Otherwise, a GL compositing manager could get the results of rendering
not synced with the X command stream as of the TFP call.
---

This is untested for actually fixing any particular bugs, but I was
wondering how things were supposed to work given the recent flurry of
bug reports about compositing and damage.

 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 321faf6..f30142c 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.4




More information about the Intel-gfx mailing list