llvmpipe: avoid flushing depth buffer cache on swapbuffers
authorKeith Whitwell <keithw@vmware.com>
Thu, 23 Jul 2009 10:14:39 +0000 (11:14 +0100)
committerJosé Fonseca <jfonseca@vmware.com>
Sat, 29 Aug 2009 08:21:17 +0000 (09:21 +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/llvmpipe/lp_context.c
src/gallium/drivers/llvmpipe/lp_flush.c

index 8341cc1bc11cdec356382afecd490c846b554312..aa2159b8d5e150ef1de1cdbc0628a7a12cce98e4 100644 (file)
@@ -72,13 +72,10 @@ llvmpipe_unmap_transfers(struct llvmpipe_context *lp)
 {
    uint i;
 
-   for (i = 0; i < lp->framebuffer.nr_cbufs; i++)
-      lp_flush_tile_cache(lp->cbuf_cache[i]);
-   lp_flush_tile_cache(lp->zsbuf_cache);
-
    for (i = 0; i < lp->framebuffer.nr_cbufs; i++) {
       lp_tile_cache_unmap_transfers(lp->cbuf_cache[i]);
    }
+
    lp_tile_cache_unmap_transfers(lp->zsbuf_cache);
 }
 
index f815e79003c0bed7f75e4909eed8af119e84d0b8..866d4fb0996111e5df6e9aedd4e159c8b7846ed0 100644 (file)
@@ -56,14 +56,16 @@ llvmpipe_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 < llvmpipe->framebuffer.nr_cbufs; i++)
          if (llvmpipe->cbuf_cache[i])
             lp_flush_tile_cache(llvmpipe->cbuf_cache[i]);
 
-      if (llvmpipe->zsbuf_cache)
-         lp_flush_tile_cache(llvmpipe->zsbuf_cache);
-
       /* Need this call for hardware buffers before swapbuffers.
        *
        * there should probably be another/different flush-type function
@@ -71,7 +73,15 @@ llvmpipe_flush( struct pipe_context *pipe,
        * to unmap surfaces when flushing.
        */
       llvmpipe_unmap_transfers(llvmpipe);
-      
+   }
+   else if (flags & PIPE_FLUSH_RENDER_CACHE) {
+      for (i = 0; i < llvmpipe->framebuffer.nr_cbufs; i++)
+         if (llvmpipe->cbuf_cache[i])
+            lp_flush_tile_cache(llvmpipe->cbuf_cache[i]);
+
+      if (llvmpipe->zsbuf_cache)
+         lp_flush_tile_cache(llvmpipe->zsbuf_cache);
+     
       llvmpipe->dirty_render_cache = FALSE;
    }