r200-maybe-flush-less-3.diff
authorKeith Whitwell <keith@tungstengraphics.com>
Thu, 2 Sep 2004 07:33:41 +0000 (07:33 +0000)
committerKeith Whitwell <keith@tungstengraphics.com>
Thu, 2 Sep 2004 07:33:41 +0000 (07:33 +0000)
src/mesa/drivers/dri/r200/r200_tcl.c

index b613911b06d93dc978de047efefb9d5da96a48f4..a00d4b72250ba00a7a1aca7abb951305fdeb0840 100644 (file)
@@ -140,21 +140,37 @@ static GLboolean discrete_prim[0x10] = {
 
 static GLushort *r200AllocElts( r200ContextPtr rmesa, GLuint nr ) 
 {
-   if (rmesa->dma.flush)
-      rmesa->dma.flush( rmesa );
+   if (rmesa->dma.flush == r200FlushElts &&
+       rmesa->store.cmd_used + nr*2 < R200_CMD_BUF_SZ) {
 
-   r200EnsureCmdBufSpace( rmesa, AOS_BUFSZ(rmesa->tcl.nr_aos_components) +
-                         rmesa->hw.max_state_size + ELTS_BUFSZ(nr) );
-   
-   r200EmitAOS( rmesa,
-               rmesa->tcl.aos_components,
-               rmesa->tcl.nr_aos_components, 0 );
+      GLushort *dest = (GLushort *)(rmesa->store.cmd_buf +
+                                   rmesa->store.cmd_used);
+
+      rmesa->store.cmd_used += nr*2;
+
+      return dest;
+   }
+   else {
+      if (rmesa->dma.flush)
+        rmesa->dma.flush( rmesa );
+
+      r200EnsureCmdBufSpace( rmesa, AOS_BUFSZ(rmesa->tcl.nr_aos_components) +
+                            rmesa->hw.max_state_size + ELTS_BUFSZ(nr) );
 
-   return r200AllocEltsOpenEnded( rmesa, rmesa->tcl.hw_primitive, nr );
+      r200EmitAOS( rmesa,
+                  rmesa->tcl.aos_components,
+                  rmesa->tcl.nr_aos_components, 0 );
+
+      return r200AllocEltsOpenEnded( rmesa, rmesa->tcl.hw_primitive, nr );
+   }
 }
 
 
-#define CLOSE_ELTS()  R200_NEWPRIM( rmesa )
+#define CLOSE_ELTS()                           \
+do {                                           \
+   if (0) R200_NEWPRIM( rmesa );               \
+}                                              \
+while (0)
 
 
 /* TODO: Try to extend existing primitive if both are identical,