[Mesa-dev] [PATCH] llvmpipe: get rid of unused tiled/linear logic

Jose Fonseca jfonseca at vmware.com
Fri May 17 08:10:12 PDT 2013


Thanks for doing this Roland.

----- Original Message -----
> From: Roland Scheidegger <sroland at vmware.com>
> 
> We do rendering to linear color buffers for quite some time, and since
> switching to linear depth buffers all the tiled/linear logic was unused.
> So get rid of (most) of it - there's still some LAYOUT_NONE things and
> late allocation of resources which probably could be simplified.

Yeah, we should remove llvmpipe_resource::layout too.  But maybe in a follow on change.

Jose


> ---
>  src/gallium/drivers/llvmpipe/Makefile.am     |    3 +-
>  src/gallium/drivers/llvmpipe/SConscript      |    3 +-
>  src/gallium/drivers/llvmpipe/lp_rast_priv.h  |    4 +-
>  src/gallium/drivers/llvmpipe/lp_texture.c    |  388
>  +++-----------------------
>  src/gallium/drivers/llvmpipe/lp_texture.h    |   10 -
>  src/gallium/drivers/llvmpipe/lp_tile_image.c |  294 -------------------
>  src/gallium/drivers/llvmpipe/lp_tile_image.h |   61 ----
>  7 files changed, 50 insertions(+), 713 deletions(-)
>  delete mode 100644 src/gallium/drivers/llvmpipe/lp_tile_image.c
>  delete mode 100644 src/gallium/drivers/llvmpipe/lp_tile_image.h
> 
> diff --git a/src/gallium/drivers/llvmpipe/Makefile.am
> b/src/gallium/drivers/llvmpipe/Makefile.am
> index f1ba5d1..9059053 100644
> --- a/src/gallium/drivers/llvmpipe/Makefile.am
> +++ b/src/gallium/drivers/llvmpipe/Makefile.am
> @@ -72,8 +72,7 @@ libllvmpipe_la_SOURCES = \
>  	lp_state_vs.c \
>  	lp_surface.c \
>  	lp_tex_sample.c \
> -	lp_texture.c \
> -	lp_tile_image.c
> +	lp_texture.c
>  
>  libllvmpipe_la_LDFLAGS = $(LLVM_LDFLAGS)
>  
> diff --git a/src/gallium/drivers/llvmpipe/SConscript
> b/src/gallium/drivers/llvmpipe/SConscript
> index a81cf23..22314c2 100644
> --- a/src/gallium/drivers/llvmpipe/SConscript
> +++ b/src/gallium/drivers/llvmpipe/SConscript
> @@ -52,8 +52,7 @@ llvmpipe = env.ConvenienceLibrary(
>  		'lp_state_vs.c',
>  		'lp_surface.c',
>  		'lp_tex_sample.c',
> -		'lp_texture.c',
> -		'lp_tile_image.c',
> +		'lp_texture.c'
>  	])
>  
>  env.Alias('llvmpipe', llvmpipe)
> diff --git a/src/gallium/drivers/llvmpipe/lp_rast_priv.h
> b/src/gallium/drivers/llvmpipe/lp_rast_priv.h
> index 7d01da1..85febff 100644
> --- a/src/gallium/drivers/llvmpipe/lp_rast_priv.h
> +++ b/src/gallium/drivers/llvmpipe/lp_rast_priv.h
> @@ -36,10 +36,12 @@
>  #include "lp_scene.h"
>  #include "lp_state.h"
>  #include "lp_texture.h"
> -#include "lp_tile_image.h"
>  #include "lp_limits.h"
>  
>  
> +#define TILE_VECTOR_HEIGHT 4
> +#define TILE_VECTOR_WIDTH 4
> +
>  /* If we crash in a jitted function, we can examine jit_line and jit_state
>   * to get some info.  This is not thread-safe, however.
>   */
> diff --git a/src/gallium/drivers/llvmpipe/lp_texture.c
> b/src/gallium/drivers/llvmpipe/lp_texture.c
> index 0804619..d10a4ce 100644
> --- a/src/gallium/drivers/llvmpipe/lp_texture.c
> +++ b/src/gallium/drivers/llvmpipe/lp_texture.c
> @@ -46,7 +46,6 @@
>  #include "lp_context.h"
>  #include "lp_flush.h"
>  #include "lp_screen.h"
> -#include "lp_tile_image.h"
>  #include "lp_texture.h"
>  #include "lp_setup.h"
>  #include "lp_state.h"
> @@ -334,11 +333,6 @@ llvmpipe_resource_destroy(struct pipe_screen *pscreen,
>        struct sw_winsys *winsys = screen->winsys;
>        winsys->displaytarget_destroy(winsys, lpr->dt);
>  
> -      if (lpr->tiled_img.data) {
> -         align_free(lpr->tiled_img.data);
> -         lpr->tiled_img.data = NULL;
> -      }
> -
>        FREE(lpr->layout[0]);
>     }
>     else if (llvmpipe_resource_is_texture(pt)) {
> @@ -351,12 +345,6 @@ llvmpipe_resource_destroy(struct pipe_screen *pscreen,
>           lpr->linear_img.data = NULL;
>        }
>  
> -      /* free tiled image data */
> -      if (lpr->tiled_img.data) {
> -         align_free(lpr->tiled_img.data);
> -         lpr->tiled_img.data = NULL;
> -      }
> -
>        /* free layout flag arrays */
>        for (level = 0; level < Elements(lpr->layout); level++) {
>           FREE(lpr->layout[level]);
> @@ -398,7 +386,6 @@ llvmpipe_resource_map(struct pipe_resource *resource,
>            tex_usage == LP_TEX_USAGE_WRITE_ALL);
>  
>     assert(layout == LP_TEX_LAYOUT_NONE ||
> -          layout == LP_TEX_LAYOUT_TILED ||
>            layout == LP_TEX_LAYOUT_LINEAR);
>  
>     if (lpr->dt) {
> @@ -850,27 +837,10 @@ static unsigned
>  tex_image_face_size(const struct llvmpipe_resource *lpr, unsigned level,
>                      enum lp_texture_layout layout)
>  {
> -   const unsigned width = u_minify(lpr->base.width0, level);
> -   const unsigned height = u_minify(lpr->base.height0, level);
> -
> -   assert(layout == LP_TEX_LAYOUT_TILED ||
> -          layout == LP_TEX_LAYOUT_LINEAR);
> +   assert(layout == LP_TEX_LAYOUT_LINEAR);
>  
> -   if (layout == LP_TEX_LAYOUT_TILED) {
> -      /* for tiled layout, force a 32bpp format */
> -      const enum pipe_format format = PIPE_FORMAT_B8G8R8A8_UNORM;
> -      const unsigned block_size = util_format_get_blocksize(format);
> -      const unsigned nblocksy =
> -         util_format_get_nblocksy(format, align(height, TILE_SIZE));
> -      const unsigned nblocksx =
> -         util_format_get_nblocksx(format, align(width, TILE_SIZE));
> -      const unsigned buffer_size = block_size * nblocksy * nblocksx;
> -      return buffer_size;
> -   }
> -   else {
> -      /* we already computed this */
> -      return lpr->img_stride[level];
> -   }
> +   /* we already computed this */
> +   return lpr->img_stride[level];
>  }
>  
>  
> @@ -888,65 +858,6 @@ tex_image_size(const struct llvmpipe_resource *lpr,
> unsigned level,
>  
>  
>  /**
> - * This function encapsulates some complicated logic for determining
> - * how to convert a tile of image data from linear layout to tiled
> - * layout, or vice versa.
> - * \param cur_layout  the current tile layout
> - * \param target_layout  the desired tile layout
> - * \param usage  how the tile will be accessed (R/W vs. read-only, etc)
> - * \param new_layout_return  returns the new layout mode
> - * \param convert_return  returns TRUE if image conversion is needed
> - */
> -static void
> -layout_logic(enum lp_texture_layout cur_layout,
> -             enum lp_texture_layout target_layout,
> -             enum lp_texture_usage usage,
> -             enum lp_texture_layout *new_layout_return,
> -             boolean *convert)
> -{
> -   enum lp_texture_layout other_layout, new_layout;
> -
> -   *convert = FALSE;
> -
> -   new_layout = 99; /* debug check */
> -
> -   if (target_layout == LP_TEX_LAYOUT_LINEAR) {
> -      other_layout = LP_TEX_LAYOUT_TILED;
> -   }
> -   else {
> -      assert(target_layout == LP_TEX_LAYOUT_TILED);
> -      other_layout = LP_TEX_LAYOUT_LINEAR;
> -   }
> -
> -   new_layout = target_layout;  /* may get changed below */
> -
> -   if (cur_layout == LP_TEX_LAYOUT_BOTH) {
> -      if (usage == LP_TEX_USAGE_READ) {
> -         new_layout = LP_TEX_LAYOUT_BOTH;
> -      }
> -   }
> -   else if (cur_layout == other_layout) {
> -      if (usage != LP_TEX_USAGE_WRITE_ALL) {
> -         /* need to convert tiled data to linear or vice versa */
> -         *convert = TRUE;
> -
> -         if (usage == LP_TEX_USAGE_READ)
> -            new_layout = LP_TEX_LAYOUT_BOTH;
> -      }
> -   }
> -   else {
> -      assert(cur_layout == LP_TEX_LAYOUT_NONE ||
> -             cur_layout == target_layout);
> -   }
> -
> -   assert(new_layout == LP_TEX_LAYOUT_BOTH ||
> -          new_layout == target_layout);
> -
> -   *new_layout_return = new_layout;
> -}
> -
> -
> -/**
>   * Return pointer to a 2D texture image/face/slice.
>   * No tiled/linear conversion is done.
>   */
> @@ -958,15 +869,10 @@ llvmpipe_get_texture_image_address(struct
> llvmpipe_resource *lpr,
>     struct llvmpipe_texture_image *img;
>     unsigned offset;
>  
> -   if (layout == LP_TEX_LAYOUT_LINEAR) {
> -      img = &lpr->linear_img;
> -      offset = lpr->linear_mip_offsets[level];
> -   }
> -   else {
> -      assert (layout == LP_TEX_LAYOUT_TILED);
> -      img = &lpr->tiled_img;
> -      offset = lpr->tiled_mip_offsets[level];
> -   }
> +   assert (layout == LP_TEX_LAYOUT_LINEAR);
> +
> +   img = &lpr->linear_img;
> +   offset = lpr->linear_mip_offsets[level];
>  
>     if (face_slice > 0)
>        offset += face_slice * tex_image_face_size(lpr, level, layout);
> @@ -975,35 +881,6 @@ llvmpipe_get_texture_image_address(struct
> llvmpipe_resource *lpr,
>  }
>  
>  
> -static INLINE enum lp_texture_layout
> -llvmpipe_get_texture_tile_layout(const struct llvmpipe_resource *lpr,
> -                                 unsigned face_slice, unsigned level,
> -                                 unsigned x, unsigned y)
> -{
> -   uint i;
> -   assert(llvmpipe_resource_is_texture(&lpr->base));
> -   assert(x < lpr->tiles_per_row[level]);
> -   i = face_slice * lpr->tiles_per_image[level]
> -      + y * lpr->tiles_per_row[level] + x;
> -   return lpr->layout[level][i];
> -}
> -
> -
> -static INLINE void
> -llvmpipe_set_texture_tile_layout(struct llvmpipe_resource *lpr,
> -                                 unsigned face_slice, unsigned level,
> -                                 unsigned x, unsigned y,
> -                                 enum lp_texture_layout layout)
> -{
> -   uint i;
> -   assert(llvmpipe_resource_is_texture(&lpr->base));
> -   assert(x < lpr->tiles_per_row[level]);
> -   i = face_slice * lpr->tiles_per_image[level]
> -      + y * lpr->tiles_per_row[level] + x;
> -   lpr->layout[level][i] = layout;
> -}
> -
> -
>  /**
>   * Set the layout mode for all tiles in a particular image.
>   */
> @@ -1034,49 +911,36 @@ alloc_image_data(struct llvmpipe_resource *lpr,
>     uint level;
>     uint offset = 0;
>  
> -   if (lpr->dt)
> +   assert(layout == LP_TEX_LAYOUT_LINEAR);
> +
> +
> +   if (lpr->dt) {
> +      /* we get the linear memory from the winsys, and it has
> +       * already been zeroed
> +       */
> +      struct llvmpipe_screen *screen = llvmpipe_screen(lpr->base.screen);
> +      struct sw_winsys *winsys = screen->winsys;
> +
>        assert(lpr->base.last_level == 0);
>  
> -   if (layout == LP_TEX_LAYOUT_TILED) {
> -      /* tiled data is stored in regular memory */
> -      for (level = 0; level <= lpr->base.last_level; level++) {
> -         uint buffer_size = tex_image_size(lpr, level, layout);
> -         lpr->tiled_mip_offsets[level] = offset;
> -         offset += align(buffer_size, alignment);
> -      }
> -      lpr->tiled_img.data = align_malloc(offset, alignment);
> -      if (lpr->tiled_img.data) {
> -         memset(lpr->tiled_img.data, 0, offset);
> -      }
> +      lpr->linear_img.data =
> +         winsys->displaytarget_map(winsys, lpr->dt,
> +                                   PIPE_TRANSFER_READ_WRITE);
>     }
>     else {
> -      assert(layout == LP_TEX_LAYOUT_LINEAR);
> -      if (lpr->dt) {
> -         /* we get the linear memory from the winsys, and it has
> -          * already been zeroed
> -          */
> -         struct llvmpipe_screen *screen = llvmpipe_screen(lpr->base.screen);
> -         struct sw_winsys *winsys = screen->winsys;
> -
> -         lpr->linear_img.data =
> -            winsys->displaytarget_map(winsys, lpr->dt,
> -                                      PIPE_TRANSFER_READ_WRITE);
> +      /* not a display target - allocate regular memory */
> +      /*
> +       * Offset calculation for start of a specific mip/layer is always
> +       * offset = lpr->linear_mip_offsets[level] + lpr->img_stride[level] *
> layer
> +       */
> +      for (level = 0; level <= lpr->base.last_level; level++) {
> +         uint buffer_size = tex_image_size(lpr, level,
> LP_TEX_LAYOUT_LINEAR);
> +         lpr->linear_mip_offsets[level] = offset;
> +         offset += align(buffer_size, alignment);
>        }
> -      else {
> -         /* not a display target - allocate regular memory */
> -         /*
> -          * Offset calculation for start of a specific mip/layer is always
> -          * offset = lpr->linear_mip_offsets[level] + lpr->img_stride[level]
> * layer
> -          */
> -         for (level = 0; level <= lpr->base.last_level; level++) {
> -            uint buffer_size = tex_image_size(lpr, level,
> LP_TEX_LAYOUT_LINEAR);
> -            lpr->linear_mip_offsets[level] = offset;
> -            offset += align(buffer_size, alignment);
> -         }
> -         lpr->linear_img.data = align_malloc(offset, alignment);
> -         if (lpr->linear_img.data) {
> -            memset(lpr->linear_img.data, 0, offset);
> -         }
> +      lpr->linear_img.data = align_malloc(offset, alignment);
> +      if (lpr->linear_img.data) {
> +         memset(lpr->linear_img.data, 0, offset);
>        }
>     }
>  }
> @@ -1084,12 +948,12 @@ alloc_image_data(struct llvmpipe_resource *lpr,
>  
>  
>  /**
> - * Return pointer to texture image data (either linear or tiled layout)
> + * Return pointer to texture image data
>   * for a particular cube face or 3D texture slice.
>   *
>   * \param face_slice  the cube face or 3D slice of interest
>   * \param usage  one of LP_TEX_USAGE_READ/WRITE_ALL/READ_WRITE
> - * \param layout  either LP_TEX_LAYOUT_LINEAR or _TILED or _NONE
> + * \param layout  should be LP_TEX_LAYOUT_LINEAR
>   */
>  void *
>  llvmpipe_get_texture_image(struct llvmpipe_resource *lpr,
> @@ -1097,27 +961,16 @@ llvmpipe_get_texture_image(struct llvmpipe_resource
> *lpr,
>                             enum lp_texture_usage usage,
>                             enum lp_texture_layout layout)
>  {
> -   /*
> -    * 'target' refers to the image which we're retrieving (either in
> -    * tiled or linear layout).
> -    * 'other' refers to the same image but in the other layout. (it may
> -    *  or may not exist.
> -    */
>     struct llvmpipe_texture_image *target_img;
> -   struct llvmpipe_texture_image *other_img;
>     void *target_data;
> -   void *other_data;
>     const unsigned width = u_minify(lpr->base.width0, level);
>     const unsigned height = u_minify(lpr->base.height0, level);
>     const unsigned width_t = align(width, TILE_SIZE) / TILE_SIZE;
>     const unsigned height_t = align(height, TILE_SIZE) / TILE_SIZE;
> -   unsigned target_offset, other_offset;
> -   unsigned *target_off_ptr, *other_off_ptr;
> -   enum lp_texture_layout other_layout;
> -   boolean only_allocate;
> +   unsigned target_offset;
> +   unsigned *target_off_ptr;
>  
>     assert(layout == LP_TEX_LAYOUT_NONE ||
> -          layout == LP_TEX_LAYOUT_TILED ||
>            layout == LP_TEX_LAYOUT_LINEAR);
>  
>     assert(usage == LP_TEX_USAGE_READ ||
> @@ -1126,35 +979,17 @@ llvmpipe_get_texture_image(struct llvmpipe_resource
> *lpr,
>  
>     /* check for the special case of layout == LP_TEX_LAYOUT_NONE */
>     if (layout == LP_TEX_LAYOUT_NONE) {
> -      only_allocate = TRUE;
> -      layout = LP_TEX_LAYOUT_TILED;
> -   }
> -   else {
> -      only_allocate = FALSE;
> +      /* XXX can still get LAYOUT_NONE ? */
> +      layout = LP_TEX_LAYOUT_LINEAR;
>     }
>  
>     if (lpr->dt) {
>        assert(lpr->linear_img.data);
>     }
>  
> -   /* which is target?  which is other? */
> -   if (layout == LP_TEX_LAYOUT_LINEAR) {
> -      target_img = &lpr->linear_img;
> -      target_off_ptr = lpr->linear_mip_offsets;
> -      other_img = &lpr->tiled_img;
> -      other_off_ptr = lpr->tiled_mip_offsets;
> -      other_layout = LP_TEX_LAYOUT_TILED;
> -   }
> -   else {
> -      target_img = &lpr->tiled_img;
> -      target_off_ptr = lpr->tiled_mip_offsets;
> -      other_img = &lpr->linear_img;
> -      other_off_ptr = lpr->linear_mip_offsets;
> -      other_layout = LP_TEX_LAYOUT_LINEAR;
> -   }
> -
> +   target_img = &lpr->linear_img;
> +   target_off_ptr = lpr->linear_mip_offsets;
>     target_data = target_img->data;
> -   other_data = other_img->data;
>  
>     if (!target_data) {
>        /* allocate memory for the target image now */
> @@ -1163,72 +998,17 @@ llvmpipe_get_texture_image(struct llvmpipe_resource
> *lpr,
>     }
>  
>     target_offset = target_off_ptr[level];
> -   other_offset = other_off_ptr[level];
>  
>     if (face_slice > 0) {
>        target_offset += face_slice * tex_image_face_size(lpr, level, layout);
> -      other_offset += face_slice * tex_image_face_size(lpr, level,
> other_layout);
>     }
>  
>     if (target_data) {
>        target_data = (uint8_t *) target_data + target_offset;
>     }
> -   if (other_data) {
> -      other_data = (uint8_t *) other_data + other_offset;
> -   }
>  
> -   if (only_allocate) {
> -      /* Just allocating tiled memory.  Don't initialize it from the
> -       * linear data if it exists.
> -       */
> -      return target_data;
> -   }
> -
> -   if (other_data) {
> -      /* may need to convert other data to the requested layout */
> -      enum lp_texture_layout new_layout;
> -      unsigned x, y;
> -
> -      /* loop over all image tiles, doing layout conversion where needed */
> -      for (y = 0; y < height_t; y++) {
> -         for (x = 0; x < width_t; x++) {
> -            enum lp_texture_layout cur_layout =
> -               llvmpipe_get_texture_tile_layout(lpr, face_slice, level, x,
> y);
> -            boolean convert;
> -
> -            layout_logic(cur_layout, layout, usage, &new_layout, &convert);
> -
> -            if (convert && other_data && target_data) {
> -               if (layout == LP_TEX_LAYOUT_TILED) {
> -                  lp_linear_to_tiled(other_data, target_data,
> -                                     x * TILE_SIZE, y * TILE_SIZE,
> -                                     TILE_SIZE, TILE_SIZE,
> -                                     lpr->base.format,
> -                                     lpr->row_stride[level],
> -                                     lpr->tiles_per_row[level]);
> -               }
> -               else {
> -                  assert(layout == LP_TEX_LAYOUT_LINEAR);
> -                  lp_tiled_to_linear(other_data, target_data,
> -                                     x * TILE_SIZE, y * TILE_SIZE,
> -                                     TILE_SIZE, TILE_SIZE,
> -                                     lpr->base.format,
> -                                     lpr->row_stride[level],
> -                                     lpr->tiles_per_row[level]);
> -               }
> -            }
> -
> -            if (new_layout != cur_layout)
> -               llvmpipe_set_texture_tile_layout(lpr, face_slice, level, x,
> y,
> -                                                new_layout);
> -         }
> -      }
> -   }
> -   else {
> -      /* no other data */
> -      llvmpipe_set_texture_image_layout(lpr, face_slice, level,
> -                                        width_t, height_t, layout);
> -   }
> +   llvmpipe_set_texture_image_layout(lpr, face_slice, level,
> +                                     width_t, height_t, layout);
>  
>     return target_data;
>  }
> @@ -1273,10 +1053,7 @@ llvmpipe_get_texture_tile_linear(struct
> llvmpipe_resource *lpr,
>                                   unsigned x, unsigned y)
>  {
>     struct llvmpipe_texture_image *linear_img = &lpr->linear_img;
> -   enum lp_texture_layout cur_layout, new_layout;
> -   const unsigned tx = x / TILE_SIZE, ty = y / TILE_SIZE;
> -   boolean convert;
> -   uint8_t *tiled_image, *linear_image;
> +   uint8_t *linear_image;
>  
>     assert(llvmpipe_resource_is_texture(&lpr->base));
>     assert(x % TILE_SIZE == 0);
> @@ -1284,92 +1061,20 @@ llvmpipe_get_texture_tile_linear(struct
> llvmpipe_resource *lpr,
>  
>     if (!linear_img->data) {
>        /* allocate memory for the linear image now */
> +      /* XXX should probably not do that here? */
>        alloc_image_data(lpr, LP_TEX_LAYOUT_LINEAR);
>     }
> +   assert(linear_img->data);
>  
>     /* compute address of the slice/face of the image that contains the tile
>     */
> -   tiled_image = llvmpipe_get_texture_image_address(lpr, face_slice, level,
> -                                                    LP_TEX_LAYOUT_TILED);
>     linear_image = llvmpipe_get_texture_image_address(lpr, face_slice, level,
>                                                       LP_TEX_LAYOUT_LINEAR);
>  
> -   /* get current tile layout and determine if data conversion is needed */
> -   cur_layout = llvmpipe_get_texture_tile_layout(lpr, face_slice, level, tx,
> ty);
> -
> -   layout_logic(cur_layout, LP_TEX_LAYOUT_LINEAR, usage,
> -                &new_layout, &convert);
> -
> -   if (convert && tiled_image && linear_image) {
> -      lp_tiled_to_linear(tiled_image, linear_image,
> -                         x, y, TILE_SIZE, TILE_SIZE, lpr->base.format,
> -                         lpr->row_stride[level],
> -                         lpr->tiles_per_row[level]);
> -   }
> -
> -   if (new_layout != cur_layout)
> -      llvmpipe_set_texture_tile_layout(lpr, face_slice, level, tx, ty,
> new_layout);
> -
>     return linear_image;
>  }
>  
>  
>  /**
> - * Get pointer to tiled data for rendering.
> - * \return pointer to the tiled data at the given tile position
> - */
> -ubyte *
> -llvmpipe_get_texture_tile(struct llvmpipe_resource *lpr,
> -                          unsigned face_slice, unsigned level,
> -                          enum lp_texture_usage usage,
> -                          unsigned x, unsigned y)
> -{
> -   struct llvmpipe_texture_image *tiled_img = &lpr->tiled_img;
> -   enum lp_texture_layout cur_layout, new_layout;
> -   const unsigned tx = x / TILE_SIZE, ty = y / TILE_SIZE;
> -   boolean convert;
> -   uint8_t *tiled_image, *linear_image;
> -   unsigned tile_offset;
> -
> -   assert(x % TILE_SIZE == 0);
> -   assert(y % TILE_SIZE == 0);
> -
> -   if (!tiled_img->data) {
> -      /* allocate memory for the tiled image now */
> -      alloc_image_data(lpr, LP_TEX_LAYOUT_TILED);
> -   }
> -
> -   /* compute address of the slice/face of the image that contains the tile
> */
> -   tiled_image = llvmpipe_get_texture_image_address(lpr, face_slice, level,
> -                                                    LP_TEX_LAYOUT_TILED);
> -   linear_image = llvmpipe_get_texture_image_address(lpr, face_slice, level,
> -                                                     LP_TEX_LAYOUT_LINEAR);
> -
> -   /* get current tile layout and see if we need to convert the data */
> -   cur_layout = llvmpipe_get_texture_tile_layout(lpr, face_slice, level, tx,
> ty);
> -
> -   layout_logic(cur_layout, LP_TEX_LAYOUT_TILED, usage, &new_layout,
> &convert);
> -   if (convert && linear_image && tiled_image) {
> -      lp_linear_to_tiled(linear_image, tiled_image,
> -                         x, y, TILE_SIZE, TILE_SIZE, lpr->base.format,
> -                         lpr->row_stride[level],
> -                         lpr->tiles_per_row[level]);
> -   }
> -
> -   if (!tiled_image)
> -      return NULL;
> -
> -   if (new_layout != cur_layout)
> -      llvmpipe_set_texture_tile_layout(lpr, face_slice, level, tx, ty,
> new_layout);
> -
> -   /* compute, return address of the 64x64 tile */
> -   tile_offset = (ty * lpr->tiles_per_row[level] + tx)
> -         * TILE_SIZE * TILE_SIZE * 4;
> -
> -   return (ubyte *) tiled_image + tile_offset;
> -}
> -
> -
> -/**
>   * Return size of resource in bytes
>   */
>  unsigned
> @@ -1382,9 +1087,6 @@ llvmpipe_resource_size(const struct pipe_resource
> *resource)
>        for (lvl = 0; lvl <= lpr->base.last_level; lvl++) {
>           if (lpr->linear_img.data)
>              size += tex_image_size(lpr, lvl, LP_TEX_LAYOUT_LINEAR);
> -
> -         if (lpr->tiled_img.data)
> -            size += tex_image_size(lpr, lvl, LP_TEX_LAYOUT_TILED);
>        }
>     }
>     else {
> diff --git a/src/gallium/drivers/llvmpipe/lp_texture.h
> b/src/gallium/drivers/llvmpipe/lp_texture.h
> index c046902..4ab6903 100644
> --- a/src/gallium/drivers/llvmpipe/lp_texture.h
> +++ b/src/gallium/drivers/llvmpipe/lp_texture.h
> @@ -46,9 +46,7 @@ enum lp_texture_usage
>  enum lp_texture_layout
>  {
>     LP_TEX_LAYOUT_NONE = 0,  /**< no layout for the tile data yet */
> -   LP_TEX_LAYOUT_TILED,     /**< the tile data is in tiled layout */
>     LP_TEX_LAYOUT_LINEAR,    /**< the tile data is in linear layout */
> -   LP_TEX_LAYOUT_BOTH       /**< the tile data is in both modes */
>  };
>  
>  
> @@ -95,7 +93,6 @@ struct llvmpipe_resource
>     /** Number of 3D slices or cube faces per level */
>     unsigned num_slices_faces[LP_MAX_TEXTURE_LEVELS];
>     /** Offset to start of mipmap level, in bytes */
> -   unsigned tiled_mip_offsets[LP_MAX_TEXTURE_LEVELS];
>     unsigned linear_mip_offsets[LP_MAX_TEXTURE_LEVELS];
>  
>     /**
> @@ -107,7 +104,6 @@ struct llvmpipe_resource
>     /**
>      * Malloc'ed data for regular textures, or a mapping to dt above.
>      */
> -   struct llvmpipe_texture_image tiled_img;
>     struct llvmpipe_texture_image linear_img;
>  
>     /**
> @@ -239,12 +235,6 @@ llvmpipe_get_texture_tile_linear(struct
> llvmpipe_resource *lpr,
>                                    enum lp_texture_usage usage,
>                                    unsigned x, unsigned y);
>  
> -ubyte *
> -llvmpipe_get_texture_tile(struct llvmpipe_resource *lpr,
> -                           unsigned face_slice, unsigned level,
> -                           enum lp_texture_usage usage,
> -                           unsigned x, unsigned y);
> -
>  
>  extern void
>  llvmpipe_print_resources(void);
> diff --git a/src/gallium/drivers/llvmpipe/lp_tile_image.c
> b/src/gallium/drivers/llvmpipe/lp_tile_image.c
> deleted file mode 100644
> index 3faf018..0000000
> --- a/src/gallium/drivers/llvmpipe/lp_tile_image.c
> +++ /dev/null
> @@ -1,294 +0,0 @@
> -/**************************************************************************
> - *
> - * Copyright 2010 VMware, Inc.  All Rights Reserved.
> - *
> - * Permission is hereby granted, free of charge, to any person obtaining a
> - * copy of this software and associated documentation files (the
> - * "Software"), to deal in the Software without restriction, including
> - * without limitation the rights to use, copy, modify, merge, publish,
> - * distribute, sub license, and/or sell copies of the Software, and to
> - * permit persons to whom the Software is furnished to do so, subject to
> - * the following conditions:
> - *
> - * The above copyright notice and this permission notice (including the
> - * next paragraph) shall be included in all copies or substantial portions
> - * of the Software.
> - *
> - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
> - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
> - * IN NO EVENT SHALL THE AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR
> - * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
> - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
> - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
> - *
> - **************************************************************************/
> -
> -
> -/**
> - * Code to convert images from tiled to linear and back.
> - * XXX there are quite a few assumptions about color and z/stencil being
> - * 32bpp.
> - */
> -
> -
> -#include "util/u_format.h"
> -#include "util/u_memory.h"
> -#include "lp_limits.h"
> -#include "lp_tile_image.h"
> -
> -
> -#define BYTES_PER_TILE (TILE_SIZE * TILE_SIZE * 4)
> -
> -
> -/**
> - * Untile a 4x4 block of 32-bit words (all contiguous) to linear layout
> - * at dst, with dst_stride words between rows.
> - */
> -static void
> -untile_4_4_uint32(const uint32_t *src, uint32_t *dst, unsigned dst_stride)
> -{
> -   uint32_t *d0 = dst;
> -   uint32_t *d1 = d0 + dst_stride;
> -   uint32_t *d2 = d1 + dst_stride;
> -   uint32_t *d3 = d2 + dst_stride;
> -
> -   d0[0] = src[0];   d0[1] = src[1];   d0[2] = src[4];   d0[3] = src[5];
> -   d1[0] = src[2];   d1[1] = src[3];   d1[2] = src[6];   d1[3] = src[7];
> -   d2[0] = src[8];   d2[1] = src[9];   d2[2] = src[12];  d2[3] = src[13];
> -   d3[0] = src[10];  d3[1] = src[11];  d3[2] = src[14];  d3[3] = src[15];
> -}
> -
> -
> -
> -/**
> - * Untile a 4x4 block of 16-bit words (all contiguous) to linear layout
> - * at dst, with dst_stride words between rows.
> - */
> -static void
> -untile_4_4_uint16(const uint16_t *src, uint16_t *dst, unsigned dst_stride)
> -{
> -   uint16_t *d0 = dst;
> -   uint16_t *d1 = d0 + dst_stride;
> -   uint16_t *d2 = d1 + dst_stride;
> -   uint16_t *d3 = d2 + dst_stride;
> -
> -   d0[0] = src[0];   d0[1] = src[1];   d0[2] = src[4];   d0[3] = src[5];
> -   d1[0] = src[2];   d1[1] = src[3];   d1[2] = src[6];   d1[3] = src[7];
> -   d2[0] = src[8];   d2[1] = src[9];   d2[2] = src[12];  d2[3] = src[13];
> -   d3[0] = src[10];  d3[1] = src[11];  d3[2] = src[14];  d3[3] = src[15];
> -}
> -
> -
> -
> -/**
> - * Convert a 4x4 rect of 32-bit words from a linear layout into tiled
> - * layout (in which all 16 words are contiguous).
> - */
> -static void
> -tile_4_4_uint32(const uint32_t *src, uint32_t *dst, unsigned src_stride)
> -{
> -   const uint32_t *s0 = src;
> -   const uint32_t *s1 = s0 + src_stride;
> -   const uint32_t *s2 = s1 + src_stride;
> -   const uint32_t *s3 = s2 + src_stride;
> -
> -   dst[0] = s0[0];   dst[1] = s0[1];   dst[4] = s0[2];   dst[5] = s0[3];
> -   dst[2] = s1[0];   dst[3] = s1[1];   dst[6] = s1[2];   dst[7] = s1[3];
> -   dst[8] = s2[0];   dst[9] = s2[1];   dst[12] = s2[2];  dst[13] = s2[3];
> -   dst[10] = s3[0];  dst[11] = s3[1];  dst[14] = s3[2];  dst[15] = s3[3];
> -}
> -
> -
> -
> -/**
> - * Convert a 4x4 rect of 16-bit words from a linear layout into tiled
> - * layout (in which all 16 words are contiguous).
> - */
> -static void
> -tile_4_4_uint16(const uint16_t *src, uint16_t *dst, unsigned src_stride)
> -{
> -   const uint16_t *s0 = src;
> -   const uint16_t *s1 = s0 + src_stride;
> -   const uint16_t *s2 = s1 + src_stride;
> -   const uint16_t *s3 = s2 + src_stride;
> -
> -   dst[0] = s0[0];   dst[1] = s0[1];   dst[4] = s0[2];   dst[5] = s0[3];
> -   dst[2] = s1[0];   dst[3] = s1[1];   dst[6] = s1[2];   dst[7] = s1[3];
> -   dst[8] = s2[0];   dst[9] = s2[1];   dst[12] = s2[2];  dst[13] = s2[3];
> -   dst[10] = s3[0];  dst[11] = s3[1];  dst[14] = s3[2];  dst[15] = s3[3];
> -}
> -
> -
> -
> -/**
> - * Convert a tiled image into a linear image.
> - * \param dst_stride  dest row stride in bytes
> - */
> -void
> -lp_tiled_to_linear(const void *src, void *dst,
> -                   unsigned x, unsigned y,
> -                   unsigned width, unsigned height,
> -                   enum pipe_format format,
> -                   unsigned dst_stride,
> -                   unsigned tiles_per_row)
> -{
> -   assert(x % TILE_SIZE == 0);
> -   assert(y % TILE_SIZE == 0);
> -   /*assert(width % TILE_SIZE == 0);
> -     assert(height % TILE_SIZE == 0);*/
> -
> -   /* Note that Z/stencil surfaces use a different tiling size than
> -    * color surfaces.
> -    */
> -   if (util_format_is_depth_or_stencil(format)) {
> -      const uint bpp = util_format_get_blocksize(format);
> -      const uint src_stride = dst_stride * TILE_VECTOR_WIDTH;
> -      const uint tile_w = TILE_VECTOR_WIDTH, tile_h = TILE_VECTOR_HEIGHT;
> -      const uint tiles_per_row = src_stride / (tile_w * tile_h * bpp);
> -
> -      dst_stride /= bpp;   /* convert from bytes to words */
> -
> -      if (bpp == 4) {
> -         const uint32_t *src32 = (const uint32_t *) src;
> -         uint32_t *dst32 = (uint32_t *) dst;
> -         uint i, j;
> -
> -         for (j = 0; j < height; j += tile_h) {
> -            for (i = 0; i < width; i += tile_w) {
> -               /* compute offsets in 32-bit words */
> -               uint ii = i + x, jj = j + y;
> -               uint src_offset = (jj / tile_h * tiles_per_row + ii / tile_w)
> -                  * (tile_w * tile_h);
> -               uint dst_offset = jj * dst_stride + ii;
> -               untile_4_4_uint32(src32 + src_offset,
> -                                 dst32 + dst_offset,
> -                                 dst_stride);
> -            }
> -         }
> -      }
> -      else {
> -         const uint16_t *src16 = (const uint16_t *) src;
> -         uint16_t *dst16 = (uint16_t *) dst;
> -         uint i, j;
> -
> -         assert(bpp == 2);
> -
> -         for (j = 0; j < height; j += tile_h) {
> -            for (i = 0; i < width; i += tile_w) {
> -               /* compute offsets in 16-bit words */
> -               uint ii = i + x, jj = j + y;
> -               uint src_offset = (jj / tile_h * tiles_per_row + ii / tile_w)
> -                  * (tile_w * tile_h);
> -               uint dst_offset = jj * dst_stride + ii;
> -               untile_4_4_uint16(src16 + src_offset,
> -                                 dst16 + dst_offset,
> -                                 dst_stride);
> -            }
> -         }
> -      }
> -   }
> -   else {
> -      assert(0);
> -   }
> -}
> -
> -
> -/**
> - * Convert a linear image into a tiled image.
> - * \param src_stride  source row stride in bytes
> - */
> -void
> -lp_linear_to_tiled(const void *src, void *dst,
> -                   unsigned x, unsigned y,
> -                   unsigned width, unsigned height,
> -                   enum pipe_format format,
> -                   unsigned src_stride,
> -                   unsigned tiles_per_row)
> -{
> -   assert(x % TILE_SIZE == 0);
> -   assert(y % TILE_SIZE == 0);
> -   /*
> -   assert(width % TILE_SIZE == 0);
> -   assert(height % TILE_SIZE == 0);
> -   */
> -
> -   if (util_format_is_depth_or_stencil(format)) {
> -      const uint bpp = util_format_get_blocksize(format);
> -      const uint dst_stride = src_stride * TILE_VECTOR_WIDTH;
> -      const uint tile_w = TILE_VECTOR_WIDTH, tile_h = TILE_VECTOR_HEIGHT;
> -      const uint tiles_per_row = dst_stride / (tile_w * tile_h * bpp);
> -
> -      src_stride /= bpp;   /* convert from bytes to words */
> -
> -      if (bpp == 4) {
> -         const uint32_t *src32 = (const uint32_t *) src;
> -         uint32_t *dst32 = (uint32_t *) dst;
> -         uint i, j;
> -
> -         for (j = 0; j < height; j += tile_h) {
> -            for (i = 0; i < width; i += tile_w) {
> -               /* compute offsets in 32-bit words */
> -               uint ii = i + x, jj = j + y;
> -               uint src_offset = jj * src_stride + ii;
> -               uint dst_offset = (jj / tile_h * tiles_per_row + ii / tile_w)
> -                  * (tile_w * tile_h);
> -               tile_4_4_uint32(src32 + src_offset,
> -                               dst32 + dst_offset,
> -                               src_stride);
> -            }
> -         }
> -      }
> -      else {
> -         const uint16_t *src16 = (const uint16_t *) src;
> -         uint16_t *dst16 = (uint16_t *) dst;
> -         uint i, j;
> -
> -         assert(bpp == 2);
> -
> -         for (j = 0; j < height; j += tile_h) {
> -            for (i = 0; i < width; i += tile_w) {
> -               /* compute offsets in 16-bit words */
> -               uint ii = i + x, jj = j + y;
> -               uint src_offset = jj * src_stride + ii;
> -               uint dst_offset = (jj / tile_h * tiles_per_row + ii / tile_w)
> -                  * (tile_w * tile_h);
> -               tile_4_4_uint16(src16 + src_offset,
> -                               dst16 + dst_offset,
> -                               src_stride);
> -            }
> -         }
> -      }
> -   }
> -   else {
> -      assert(0);
> -   }
> -}
> -
> -
> -/**
> - * For testing only.
> - */
> -void
> -test_tiled_linear_conversion(void *data,
> -                             enum pipe_format format,
> -                             unsigned width, unsigned height,
> -                             unsigned stride)
> -{
> -   /* size in tiles */
> -   unsigned wt = (width + TILE_SIZE - 1) / TILE_SIZE;
> -   unsigned ht = (height + TILE_SIZE - 1) / TILE_SIZE;
> -
> -   uint8_t *tiled = MALLOC(wt * ht * TILE_SIZE * TILE_SIZE * 4);
> -
> -   /*unsigned tiled_stride = wt * TILE_SIZE * TILE_SIZE * 4;*/
> -
> -   lp_linear_to_tiled(data, tiled, 0, 0, width, height, format,
> -                      stride, wt);
> -
> -   lp_tiled_to_linear(tiled, data, 0, 0, width, height, format,
> -                      stride, wt);
> -
> -   FREE(tiled);
> -}
> -
> diff --git a/src/gallium/drivers/llvmpipe/lp_tile_image.h
> b/src/gallium/drivers/llvmpipe/lp_tile_image.h
> deleted file mode 100644
> index 07d367c..0000000
> --- a/src/gallium/drivers/llvmpipe/lp_tile_image.h
> +++ /dev/null
> @@ -1,61 +0,0 @@
> -/**************************************************************************
> - *
> - * Copyright 2010 VMware, Inc.  All Rights Reserved.
> - *
> - * Permission is hereby granted, free of charge, to any person obtaining a
> - * copy of this software and associated documentation files (the
> - * "Software"), to deal in the Software without restriction, including
> - * without limitation the rights to use, copy, modify, merge, publish,
> - * distribute, sub license, and/or sell copies of the Software, and to
> - * permit persons to whom the Software is furnished to do so, subject to
> - * the following conditions:
> - *
> - * The above copyright notice and this permission notice (including the
> - * next paragraph) shall be included in all copies or substantial portions
> - * of the Software.
> - *
> - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
> - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
> - * IN NO EVENT SHALL THE AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR
> - * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
> - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
> - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
> - *
> - **************************************************************************/
> -
> -
> -#ifndef LP_TILE_IMAGE_H
> -#define LP_TILE_IMAGE_H
> -
> -
> -#define TILE_VECTOR_HEIGHT 4
> -#define TILE_VECTOR_WIDTH 4
> -
> -
> -void
> -lp_tiled_to_linear(const void *src, void *dst,
> -                   unsigned x, unsigned y,
> -                   unsigned width, unsigned height,
> -                   enum pipe_format format,
> -                   unsigned dst_stride,
> -                   unsigned tiles_per_row);
> -
> -
> -void
> -lp_linear_to_tiled(const void *src, void *dst,
> -                   unsigned x, unsigned y,
> -                   unsigned width, unsigned height,
> -                   enum pipe_format format,
> -                   unsigned src_stride,
> -                   unsigned tiles_per_row);
> -
> -
> -void
> -test_tiled_linear_conversion(void *data,
> -                             enum pipe_format format,
> -                             unsigned width, unsigned height,
> -                             unsigned stride);
> -
> -
> -#endif /* LP_TILE_IMAGE_H */
> --
> 1.7.9.5
> 


More information about the mesa-dev mailing list