diff options
author | José Fonseca <[email protected]> | 2010-06-28 16:33:52 +0100 |
---|---|---|
committer | José Fonseca <[email protected]> | 2010-06-28 16:33:52 +0100 |
commit | 250b92f3bb4fc4a53f3150b0e8ff1e121a5adbc7 (patch) | |
tree | 9f43cd0cdcd7c36b2c0c207ce0b50c32c8be6d1d | |
parent | a9e0fda070f3d8cb656e6891b1be56aaa8ed705a (diff) |
llvmpipe: set WRITE_ALL only a per-tile basis in lp_resource_copy().
-rw-r--r-- | src/gallium/drivers/llvmpipe/lp_surface.c | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/src/gallium/drivers/llvmpipe/lp_surface.c b/src/gallium/drivers/llvmpipe/lp_surface.c index e8f4d19395a..f0cbbe8c560 100644 --- a/src/gallium/drivers/llvmpipe/lp_surface.c +++ b/src/gallium/drivers/llvmpipe/lp_surface.c @@ -106,19 +106,27 @@ lp_resource_copy(struct pipe_context *pipe, unsigned x, y; enum lp_texture_usage usage; - /* XXX for the tiles which are completely contained by the - * dest rectangle, we could set the usage mode to WRITE_ALL. - * Just test for the case of replacing the whole dest region for now. - */ - if (width == dst_tex->base.width0 && height == dst_tex->base.height0) - usage = LP_TEX_USAGE_WRITE_ALL; - else - usage = LP_TEX_USAGE_READ_WRITE; - adjust_to_tile_bounds(dstx, dsty, width, height, &tx, &ty, &tw, &th); for (y = 0; y < th; y += TILE_SIZE) { + boolean contained_y = ty + y >= dsty && + ty + y + TILE_SIZE <= dsty + height ? + TRUE : FALSE; + for (x = 0; x < tw; x += TILE_SIZE) { + boolean contained_x = tx + x >= dstx && + tx + x + TILE_SIZE <= dstx + width ? + TRUE : FALSE; + + /* + * Set the usage mode to WRITE_ALL for the tiles which are + * completely contained by the dest rectangle. + */ + if (contained_y && contained_x) + usage = LP_TEX_USAGE_WRITE_ALL; + else + usage = LP_TEX_USAGE_READ_WRITE; + (void) llvmpipe_get_texture_tile_linear(dst_tex, subdst.face, subdst.level, usage, |