ilo: simplify ilo_texture_get_slice_offset()
authorChia-I Wu <olvaffe@gmail.com>
Tue, 14 May 2013 10:47:03 +0000 (18:47 +0800)
committerChia-I Wu <olvaffe@gmail.com>
Wed, 15 May 2013 07:08:54 +0000 (15:08 +0800)
Always return a tile-aligned offset.  Also fix for W tiling.

src/gallium/drivers/ilo/ilo_gpe_gen6.c
src/gallium/drivers/ilo/ilo_gpe_gen7.c
src/gallium/drivers/ilo/ilo_resource.c
src/gallium/drivers/ilo/ilo_resource.h

index 42a89f569097e7bfd56e32e9081ae0d7f3015553..1177b06261fe3656cdc9a3534fc3eb0227cb0592 100644 (file)
@@ -2348,7 +2348,7 @@ ilo_gpe_gen6_emit_3DSTATE_DEPTH_BUFFER(const struct ilo_dev_info *dev,
     */
    slice_offset = ilo_texture_get_slice_offset(tex,
          surface->u.tex.level, surface->u.tex.first_layer,
-         true, &x_offset, &y_offset);
+         &x_offset, &y_offset);
 
    /*
     * From the Sandy Bridge PRM, volume 2 part 1, page 326:
@@ -3750,7 +3750,7 @@ gen6_fill_normal_SURFACE_STATE(const struct ilo_dev_info *dev,
       assert(num_levels == 1 && num_layers == 1);
 
       layer_offset = ilo_texture_get_slice_offset(tex,
-            first_level, first_layer, true, &x_offset, &y_offset);
+            first_level, first_layer, &x_offset, &y_offset);
 
       assert(x_offset % 4 == 0);
       assert(y_offset % 2 == 0);
index ba69906271ba86fd1993bc04ce060e0fb37ca1af..03236ecc4672e2a47c70eb1c27f4144b04c75575 100644 (file)
@@ -1496,7 +1496,7 @@ gen7_fill_normal_SURFACE_STATE(const struct ilo_dev_info *dev,
       assert(num_levels == 1 && num_layers == 1);
 
       layer_offset = ilo_texture_get_slice_offset(tex,
-            first_level, first_layer, true, &x_offset, &y_offset);
+            first_level, first_layer, &x_offset, &y_offset);
 
       assert(x_offset % 4 == 0);
       assert(y_offset % 2 == 0);
index b41ff5b621576424bbe39a3912dafcd30e6bb19f..eb0d2538dfb5ac1d32db035f7be06f22d8d802d3 100644 (file)
@@ -1208,27 +1208,32 @@ ilo_texture_alloc_bo(struct ilo_texture *tex)
 /**
  * Return the offset (in bytes) to a slice within the bo.
  *
- * When tile_aligned is true, the offset is to the tile containing the start
- * address of the slice.  x_offset and y_offset are offsets (in pixels) from
- * the tile start to slice start.  x_offset is always a multiple of 4 and
- * y_offset is always a multiple of 2.
+ * The returned offset is aligned to tile size.  Since slices are not
+ * guaranteed to start at tile boundaries, the X and Y offsets (in pixels)
+ * from the tile origin to the slice are also returned.  X offset is always a
+ * multiple of 4 and Y offset is always a multiple of 2.
  */
 unsigned
 ilo_texture_get_slice_offset(const struct ilo_texture *tex,
-                             int level, int slice, bool tile_aligned,
+                             int level, int slice,
                              unsigned *x_offset, unsigned *y_offset)
 {
-   const unsigned x = tex->slice_offsets[level][slice].x / tex->block_width;
-   const unsigned y = tex->slice_offsets[level][slice].y / tex->block_height;
    unsigned tile_w, tile_h, tile_size, row_size;
-   unsigned slice_offset;
+   unsigned x, y, slice_offset;
 
    /* see the Sandy Bridge PRM, volume 1 part 2, page 24 */
 
    switch (tex->tiling) {
    case INTEL_TILING_NONE:
-      tile_w = tex->bo_cpp;
-      tile_h = 1;
+      /* W-tiled */
+      if (tex->bo_format == PIPE_FORMAT_S8_UINT) {
+         tile_w = 64;
+         tile_h = 64;
+      }
+      else {
+         tile_w = 1;
+         tile_h = 1;
+      }
       break;
    case INTEL_TILING_X:
       tile_w = 512;
@@ -1240,7 +1245,7 @@ ilo_texture_get_slice_offset(const struct ilo_texture *tex,
       break;
    default:
       assert(!"unknown tiling");
-      tile_w = tex->bo_cpp;
+      tile_w = 1;
       tile_h = 1;
       break;
    }
@@ -1248,13 +1253,10 @@ ilo_texture_get_slice_offset(const struct ilo_texture *tex,
    tile_size = tile_w * tile_h;
    row_size = tex->bo_stride * tile_h;
 
-   /*
-    * for non-tiled resources, this is equivalent to
-    *
-    *   slice_offset = y * tex->bo_stride + x * tex->bo_cpp;
-    */
-   slice_offset =
-      row_size * (y / tile_h) + tile_size * (x * tex->bo_cpp / tile_w);
+   /* in bytes */
+   x = tex->slice_offsets[level][slice].x / tex->block_width * tex->bo_cpp;
+   y = tex->slice_offsets[level][slice].y / tex->block_height;
+   slice_offset = row_size * (y / tile_h) + tile_size * (x / tile_w);
 
    /*
     * Since tex->bo_stride is a multiple of tile_w, slice_offset should be
@@ -1262,42 +1264,25 @@ ilo_texture_get_slice_offset(const struct ilo_texture *tex,
     */
    assert(slice_offset % tile_size == 0);
 
-   if (tile_aligned) {
-      /*
-       * because of the possible values of align_i and align_j in
-       * layout_tex_init(), x_offset must be a multiple of 4 and y_offset must
-       * be a multiple of 2.
-       */
-      if (x_offset) {
-         assert(tile_w % tex->bo_cpp == 0);
-         *x_offset = (x % (tile_w / tex->bo_cpp)) * tex->block_width;
-         assert(*x_offset % 4 == 0);
-      }
-      if (y_offset) {
-         *y_offset = (y % tile_h) * tex->block_height;
-         assert(*y_offset % 2 == 0);
-      }
+   /*
+    * because of the possible values of align_i and align_j in
+    * tex_layout_init_alignments(), x_offset is guaranteed to be a multiple of
+    * 4 and y_offset is guaranteed to be a multiple of 2.
+    */
+   if (x_offset) {
+      /* in pixels */
+      x = (x % tile_w) / tex->bo_cpp * tex->block_width;
+      assert(x % 4 == 0);
+
+      *x_offset = x;
    }
-   else {
-      const unsigned tx = (x * tex->bo_cpp) % tile_w;
-      const unsigned ty = y % tile_h;
 
-      switch (tex->tiling) {
-      case INTEL_TILING_NONE:
-         assert(tx == 0 && ty == 0);
-         break;
-      case INTEL_TILING_X:
-         slice_offset += tile_w * ty + tx;
-         break;
-      case INTEL_TILING_Y:
-         slice_offset += tile_h * 16 * (tx / 16) + ty * 16 + (tx % 16);
-         break;
-      }
+   if (y_offset) {
+      /* in pixels */
+      y = (y % tile_h) * tex->block_height;
+      assert(y % 2 == 0);
 
-      if (x_offset)
-         *x_offset = 0;
-      if (y_offset)
-         *y_offset = 0;
+      *y_offset = y;
    }
 
    return slice_offset;
index 124603c352356a63b71ab96a1c00f9bfcd5d7770..e22bd7cc9c6d6e4f77e3b92c89ae2ba8dc96a4e5 100644 (file)
@@ -105,7 +105,7 @@ ilo_texture_alloc_bo(struct ilo_texture *tex);
 
 unsigned
 ilo_texture_get_slice_offset(const struct ilo_texture *tex,
-                             int level, int slice, bool tile_aligned,
+                             int level, int slice,
                              unsigned *x_offset, unsigned *y_offset);
 
 #endif /* ILO_RESOURCE_H */