Mesa (mesa_7_5_branch): softpipe: Fix softpipe_is_texture_referenced.

Jose Fonseca jrfonseca at kemper.freedesktop.org
Mon Jun 15 19:28:22 UTC 2009


Module: Mesa
Branch: mesa_7_5_branch
Commit: 5d0cf9ebb41c05b0c6fa6914ccbb1e1871e27099
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=5d0cf9ebb41c05b0c6fa6914ccbb1e1871e27099

Author: José Fonseca <jfonseca at vmware.com>
Date:   Mon Jun 15 18:42:13 2009 +0100

softpipe: Fix softpipe_is_texture_referenced.

Render results are only visible when the render cache is flushed.
softpipe_is_texture_referenced must reflect that or transfers to/from the
textures bound in the framebuffer won't be proceeded of the necessary
flush, causing transfer data to be outdated/clobbered.

This fixes conform drawpix test with softpipe.

---

 src/gallium/drivers/softpipe/sp_context.c     |   16 ++++++++++++++++
 src/gallium/drivers/softpipe/sp_context.h     |    2 ++
 src/gallium/drivers/softpipe/sp_draw_arrays.c |    2 ++
 src/gallium/drivers/softpipe/sp_flush.c       |    2 ++
 4 files changed, 22 insertions(+), 0 deletions(-)

diff --git a/src/gallium/drivers/softpipe/sp_context.c b/src/gallium/drivers/softpipe/sp_context.c
index 62e8d99..86df320 100644
--- a/src/gallium/drivers/softpipe/sp_context.c
+++ b/src/gallium/drivers/softpipe/sp_context.c
@@ -126,6 +126,22 @@ softpipe_is_texture_referenced( struct pipe_context *pipe,
 				struct pipe_texture *texture,
 				unsigned face, unsigned level)
 {
+   struct softpipe_context *softpipe = softpipe_context( pipe );
+   unsigned i;
+
+   if(softpipe->dirty_render_cache) {
+      for (i = 0; i < softpipe->framebuffer.nr_cbufs; i++) {
+         if(softpipe->framebuffer.cbufs[i] && 
+            softpipe->framebuffer.cbufs[i]->texture == texture)
+            return PIPE_REFERENCED_FOR_WRITE;
+      }
+      if(softpipe->framebuffer.zsbuf && 
+         softpipe->framebuffer.zsbuf->texture == texture)
+         return PIPE_REFERENCED_FOR_WRITE;
+   }
+   
+   /* FIXME: we also need to do the same for the texture cache */
+   
    return PIPE_UNREFERENCED;
 }
 
diff --git a/src/gallium/drivers/softpipe/sp_context.h b/src/gallium/drivers/softpipe/sp_context.h
index 59d6df8..dffc15a 100644
--- a/src/gallium/drivers/softpipe/sp_context.h
+++ b/src/gallium/drivers/softpipe/sp_context.h
@@ -144,6 +144,8 @@ struct softpipe_context {
    struct draw_stage *vbuf;
    struct softpipe_vbuf_render *vbuf_render;
 
+   boolean dirty_render_cache;
+   
    struct softpipe_tile_cache *cbuf_cache[PIPE_MAX_COLOR_BUFS];
    struct softpipe_tile_cache *zsbuf_cache;
 
diff --git a/src/gallium/drivers/softpipe/sp_draw_arrays.c b/src/gallium/drivers/softpipe/sp_draw_arrays.c
index f117096..ba2766f 100644
--- a/src/gallium/drivers/softpipe/sp_draw_arrays.c
+++ b/src/gallium/drivers/softpipe/sp_draw_arrays.c
@@ -182,6 +182,8 @@ softpipe_draw_range_elements(struct pipe_context *pipe,
    /* Note: leave drawing surfaces mapped */
    softpipe_unmap_constant_buffers(sp);
 
+   sp->dirty_render_cache = TRUE;
+   
    return TRUE;
 }
 
diff --git a/src/gallium/drivers/softpipe/sp_flush.c b/src/gallium/drivers/softpipe/sp_flush.c
index 035f4b9..4a14d49 100644
--- a/src/gallium/drivers/softpipe/sp_flush.c
+++ b/src/gallium/drivers/softpipe/sp_flush.c
@@ -71,6 +71,8 @@ softpipe_flush( struct pipe_context *pipe,
        * to unmap surfaces when flushing.
        */
       softpipe_unmap_transfers(softpipe);
+      
+      softpipe->dirty_render_cache = FALSE;
    }
 
    /* Enable to dump BMPs of the color/depth buffers each frame */




More information about the mesa-commit mailing list