diff options
Diffstat (limited to 'src/gallium')
| -rw-r--r-- | src/gallium/drivers/llvmpipe/lp_surface.c | 126 | 
1 files changed, 58 insertions, 68 deletions
| diff --git a/src/gallium/drivers/llvmpipe/lp_surface.c b/src/gallium/drivers/llvmpipe/lp_surface.c index 381c58ecee..5fcbad48e3 100644 --- a/src/gallium/drivers/llvmpipe/lp_surface.c +++ b/src/gallium/drivers/llvmpipe/lp_surface.c @@ -56,6 +56,10 @@ lp_surface_copy(struct pipe_context *pipe,                  struct pipe_surface *src, unsigned srcx, unsigned srcy,                  unsigned width, unsigned height)  { +   struct llvmpipe_resource *src_tex = llvmpipe_resource(src->texture); +   struct llvmpipe_resource *dst_tex = llvmpipe_resource(dst->texture); +   const enum pipe_format format = src_tex->base.format; +     llvmpipe_flush_texture(pipe,                            dst->texture, dst->face, dst->level,                            0, /* flush_flags */ @@ -70,91 +74,77 @@ lp_surface_copy(struct pipe_context *pipe,                            FALSE, /* cpu_access */                            FALSE); /* do_not_flush */ -   /* Look for special case in which we're copying from a tiled image -    * to a linear image. -    */ -   { -      struct llvmpipe_resource *src_tex = llvmpipe_resource(src->texture); -      struct llvmpipe_resource *dst_tex = llvmpipe_resource(dst->texture); -      enum pipe_format format = src_tex->base.format; - -      /* -      printf("surface copy from %u to %u: %u,%u to %u,%u %u x %u\n", -             src_tex->id, dst_tex->id, -             srcx, srcy, dstx, dsty, width, height); -      */ +   /* +   printf("surface copy from %u to %u: %u,%u to %u,%u %u x %u\n", +          src_tex->id, dst_tex->id, +          srcx, srcy, dstx, dsty, width, height); +   */ -      /* set src tiles to linear layout */ -      { -         unsigned tx, ty, tw, th; -         unsigned x, y; +   /* set src tiles to linear layout */ +   { +      unsigned tx, ty, tw, th; +      unsigned x, y; -         adjust_to_tile_bounds(srcx, srcy, width, height, &tx, &ty, &tw, &th); +      adjust_to_tile_bounds(srcx, srcy, width, height, &tx, &ty, &tw, &th); -         for (y = 0; y < th; y += TILE_SIZE) { -            for (x = 0; x < tw; x += TILE_SIZE) { -               (void) llvmpipe_get_texture_tile_linear(src_tex, -                                                       src->face, src->level, +      for (y = 0; y < th; y += TILE_SIZE) { +         for (x = 0; x < tw; x += TILE_SIZE) { +            (void) llvmpipe_get_texture_tile_linear(src_tex, +                                                    src->face, src->level,                                                         LP_TEX_USAGE_READ, -                                                       tx + x, ty + y); -            } +                                                    tx + x, ty + y);           }        } +   } -      /* set dst tiles to linear layout */ -      { -         unsigned tx, ty, tw, th; -         unsigned x, y; -         enum lp_texture_usage usage; +   /* set dst tiles to linear layout */ +   { +      unsigned tx, ty, tw, th; +      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; +      /* 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); +      adjust_to_tile_bounds(dstx, dsty, width, height, &tx, &ty, &tw, &th); -         for (y = 0; y < th; y += TILE_SIZE) { -            for (x = 0; x < tw; x += TILE_SIZE) { -               (void) llvmpipe_get_texture_tile_linear(dst_tex, -                                                       dst->face, dst->level, -                                                       usage, -                                                       tx + x, ty + y); -            } +      for (y = 0; y < th; y += TILE_SIZE) { +         for (x = 0; x < tw; x += TILE_SIZE) { +            (void) llvmpipe_get_texture_tile_linear(dst_tex, +                                                    dst->face, dst->level, +                                                    usage, +                                                    tx + x, ty + y);           }        } +   } -      /* copy */ -      { -         const ubyte *src_linear_ptr -            = llvmpipe_get_texture_image_address(src_tex, src->face, -                                                 src->level, -                                                 LP_TEX_LAYOUT_LINEAR); -         ubyte *dst_linear_ptr -            = llvmpipe_get_texture_image_address(dst_tex, dst->face, -                                                 dst->level, -                                                 LP_TEX_LAYOUT_LINEAR); +   /* copy */ +   { +      const ubyte *src_linear_ptr +         = llvmpipe_get_texture_image_address(src_tex, src->face, +                                              src->level, +                                              LP_TEX_LAYOUT_LINEAR); +      ubyte *dst_linear_ptr +         = llvmpipe_get_texture_image_address(dst_tex, dst->face, +                                              dst->level, +                                              LP_TEX_LAYOUT_LINEAR); -         util_copy_rect(dst_linear_ptr, format, -                        dst_tex->stride[dst->level], -                        dstx, dsty, -                        width, height, -                        src_linear_ptr, src_tex->stride[src->level], -                        srcx, srcy); -      } -      return; +      util_copy_rect(dst_linear_ptr, format, +                     dst_tex->stride[dst->level], +                     dstx, dsty, +                     width, height, +                     src_linear_ptr, src_tex->stride[src->level], +                     srcx, srcy);     } - -   util_surface_copy(pipe, FALSE, -                     dst, dstx, dsty, -                     src, srcx, srcy, -                     width, height);  } +  void  lp_init_surface_functions(struct llvmpipe_context *lp)  { | 
