[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