softpipe: Fix softpipe_is_texture_referenced.
authorJosé Fonseca <jfonseca@vmware.com>
Mon, 15 Jun 2009 17:42:13 +0000 (18:42 +0100)
committerJosé Fonseca <jfonseca@vmware.com>
Mon, 15 Jun 2009 17:42:13 +0000 (18:42 +0100)
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
src/gallium/drivers/softpipe/sp_context.h
src/gallium/drivers/softpipe/sp_draw_arrays.c
src/gallium/drivers/softpipe/sp_flush.c

index 62e8d99..86df320 100644 (file)
@@ -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;
 }
 
index 59d6df8..dffc15a 100644 (file)
@@ -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;
 
index f117096..ba2766f 100644 (file)
@@ -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;
 }
 
index 035f4b9..4a14d49 100644 (file)
@@ -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 */