GEM: Don't emit an extra MI_FLUSH in the batch since GEM handles it.
authorEric Anholt <eric@anholt.net>
Tue, 6 May 2008 20:57:08 +0000 (13:57 -0700)
committerEric Anholt <eric@anholt.net>
Tue, 6 May 2008 20:57:08 +0000 (13:57 -0700)
src/mesa/drivers/dri/intel/intel_batchbuffer.c

index a95abd9ec9d7c3f3b9934aa5152c19aeac2bca3e..ef66fd75ac2903de6f500ee851755110754c1b1c 100644 (file)
@@ -195,7 +195,7 @@ _intel_batchbuffer_flush(struct intel_batchbuffer *batch, const char *file,
                         int line)
 {
    struct intel_context *intel = batch->intel;
-   GLuint used = batch->ptr - batch->map;
+   GLuint used;
    GLboolean was_locked = intel->locked;
 
    if (used == 0)
@@ -204,20 +204,20 @@ _intel_batchbuffer_flush(struct intel_batchbuffer *batch, const char *file,
    if (INTEL_DEBUG & DEBUG_BATCH)
       fprintf(stderr, "%s:%d: Batchbuffer flush with %db used\n", file, line,
              used);
-   /* Add the MI_BATCH_BUFFER_END.  Always add an MI_FLUSH - this is a
-    * performance drain that we would like to avoid.
-    */
-   if (used & 4) {
-      ((int *) batch->ptr)[0] = intel->vtbl.flush_cmd();
-      ((int *) batch->ptr)[1] = 0;
-      ((int *) batch->ptr)[2] = MI_BATCH_BUFFER_END;
-      used += 12;
-   }
-   else {
-      ((int *) batch->ptr)[0] = intel->vtbl.flush_cmd();
-      ((int *) batch->ptr)[1] = MI_BATCH_BUFFER_END;
-      used += 8;
-   }
+
+   /* Emit a flush if the bufmgr doesn't do it for us. */
+   if (!intel->ttm)
+      intel_batchbuffer_emit_dword(intel->batch, intel->vtbl.flush_cmd());
+
+   /* Round batchbuffer usage to 2 DWORDs. */
+   used = batch->ptr - batch->map;
+   if ((used & 4) == 0)
+      intel_batchbuffer_emit_dword(intel->batch, 0); /* noop */
+
+   /* Mark the end of the buffer. */
+   intel_batchbuffer_emit_dword(intel->batch, MI_BATCH_BUFFER_END);
+
+   used = batch->ptr - batch->map;
 
    /* Workaround for recursive batchbuffer flushing: If the window is
     * moved, we can get into a case where we try to flush during a