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.
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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 */
|
||||
|
||||
Reference in New Issue
Block a user