[i915] Prevent recursive batchbuffer flushing.
authorKristian Høgsberg <krh@temari.boston.redhat.com>
Tue, 15 Jan 2008 15:23:15 +0000 (10:23 -0500)
committerKristian Høgsberg <krh@temari.boston.redhat.com>
Tue, 15 Jan 2008 15:24:04 +0000 (10:24 -0500)
Workaround for recursive batchbuffer flushing: If the window is
moved, we can get into a case where we try to flush during a
flush.  What happens is that when we try to grab the lock for
the first flush, we detect that the window moved which then
causes another flush (from the intel_draw_buffer() call in
intelUpdatePageFlipping()).  To work around this we reset the
batchbuffer tail pointer before trying to get the lock.  This
prevent the nested buffer flush, but a better fix would be to
avoid that in the first place.

src/mesa/drivers/dri/intel/intel_batchbuffer.c

index cff15d253dedd03693cb00b982bf544d9f6a088e..d6cd4ca6c72e6e50089bf794b6bdaaf08b59e61b 100644 (file)
@@ -216,6 +216,17 @@ _intel_batchbuffer_flush(struct intel_batchbuffer *batch, const char *file,
       used += 8;
    }
 
+   /* Workaround for recursive batchbuffer flushing: If the window is
+    * moved, we can get into a case where we try to flush during a
+    * flush.  What happens is that when we try to grab the lock for
+    * the first flush, we detect that the window moved which then
+    * causes another flush (from the intel_draw_buffer() call in
+    * intelUpdatePageFlipping()).  To work around this we reset the
+    * batchbuffer tail pointer before trying to get the lock.  This
+    * prevent the nested buffer flush, but a better fix would be to
+    * avoid that in the first place. */
+   batch->ptr = batch->map;
+
    /* TODO: Just pass the relocation list and dma buffer up to the
     * kernel.
     */