diff options
| author | José Fonseca <jfonseca@vmware.com> | 2010-06-28 16:33:52 +0100 | 
|---|---|---|
| committer | José Fonseca <jfonseca@vmware.com> | 2010-06-28 16:33:52 +0100 | 
| commit | 250b92f3bb4fc4a53f3150b0e8ff1e121a5adbc7 (patch) | |
| tree | 9f43cd0cdcd7c36b2c0c207ce0b50c32c8be6d1d /src/gallium | |
| parent | a9e0fda070f3d8cb656e6891b1be56aaa8ed705a (diff) | |
llvmpipe: set WRITE_ALL only a per-tile basis in lp_resource_copy().
Diffstat (limited to 'src/gallium')
| -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 e8f4d19395..f0cbbe8c56 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, | 
