softpipe: avoid flushing depth buffer cache on swapbuffers
authorKeith Whitwell <keithw@vmware.com>
Thu, 23 Jul 2009 10:14:39 +0000 (11:14 +0100)
committerKeith Whitwell <keithw@vmware.com>
Thu, 23 Jul 2009 10:14:39 +0000 (11:14 +0100)
There's no need to push out depth buffer contents on swapbuffers.

Note that this change doesn't throw away depth buffer changes, it simply
holds them in the cache over calls to swapbuffers.  The hope is
that swapbuffers will be followed by a clear() which means in that case
we won't have to write the changes out.

src/gallium/drivers/softpipe/sp_context.c
src/gallium/drivers/softpipe/sp_flush.c

index f085889d3a00181226746b8886b413394c62776d..1b2c6aded0ef51748d604fde020c0172f54a74e8 100644 (file)
@@ -72,13 +72,10 @@ softpipe_unmap_transfers(struct softpipe_context *sp)
 {
    uint i;
 
-   for (i = 0; i < sp->framebuffer.nr_cbufs; i++)
-      sp_flush_tile_cache(sp->cbuf_cache[i]);
-   sp_flush_tile_cache(sp->zsbuf_cache);
-
    for (i = 0; i < sp->framebuffer.nr_cbufs; i++) {
       sp_tile_cache_unmap_transfers(sp->cbuf_cache[i]);
    }
+
    sp_tile_cache_unmap_transfers(sp->zsbuf_cache);
 }
 
index 732277a2c58bc4c47a22fca0b6bde85a8b891d17..679ad0cd3d44d1d9108d4d0779c69d3d7930bbcf 100644 (file)
@@ -56,14 +56,16 @@ softpipe_flush( struct pipe_context *pipe,
       }
    }
 
-   if (flags & PIPE_FLUSH_RENDER_CACHE) {
+   if (flags & PIPE_FLUSH_SWAPBUFFERS) {
+      /* If this is a swapbuffers, just flush color buffers.
+       *
+       * The zbuffer changes are not discarded, but held in the cache
+       * in the hope that a later clear will wipe them out.
+       */
       for (i = 0; i < softpipe->framebuffer.nr_cbufs; i++)
          if (softpipe->cbuf_cache[i])
             sp_flush_tile_cache(softpipe->cbuf_cache[i]);
 
-      if (softpipe->zsbuf_cache)
-         sp_flush_tile_cache(softpipe->zsbuf_cache);
-
       /* Need this call for hardware buffers before swapbuffers.
        *
        * there should probably be another/different flush-type function
@@ -71,7 +73,15 @@ softpipe_flush( struct pipe_context *pipe,
        * to unmap surfaces when flushing.
        */
       softpipe_unmap_transfers(softpipe);
-      
+   }
+   else if (flags & PIPE_FLUSH_RENDER_CACHE) {
+      for (i = 0; i < softpipe->framebuffer.nr_cbufs; i++)
+         if (softpipe->cbuf_cache[i])
+            sp_flush_tile_cache(softpipe->cbuf_cache[i]);
+
+      if (softpipe->zsbuf_cache)
+         sp_flush_tile_cache(softpipe->zsbuf_cache);
+     
       softpipe->dirty_render_cache = FALSE;
    }