summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/ilo
diff options
context:
space:
mode:
authorChia-I Wu <[email protected]>2013-05-14 18:47:03 +0800
committerChia-I Wu <[email protected]>2013-05-15 15:08:54 +0800
commitca349e02171058c47fea610b2d884e4b08b371ac (patch)
tree6605cbe6d1c0521ffd4cb60fbdffdbde07ef9fbb /src/gallium/drivers/ilo
parent013424678e2604a45c420ec403e6f12b82446b24 (diff)
ilo: simplify ilo_texture_get_slice_offset()
Always return a tile-aligned offset. Also fix for W tiling.
Diffstat (limited to 'src/gallium/drivers/ilo')
-rw-r--r--src/gallium/drivers/ilo/ilo_gpe_gen6.c4
-rw-r--r--src/gallium/drivers/ilo/ilo_gpe_gen7.c2
-rw-r--r--src/gallium/drivers/ilo/ilo_resource.c87
-rw-r--r--src/gallium/drivers/ilo/ilo_resource.h2
4 files changed, 40 insertions, 55 deletions
diff --git a/src/gallium/drivers/ilo/ilo_gpe_gen6.c b/src/gallium/drivers/ilo/ilo_gpe_gen6.c
index 42a89f56909..1177b06261f 100644
--- a/src/gallium/drivers/ilo/ilo_gpe_gen6.c
+++ b/src/gallium/drivers/ilo/ilo_gpe_gen6.c
@@ -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);
diff --git a/src/gallium/drivers/ilo/ilo_gpe_gen7.c b/src/gallium/drivers/ilo/ilo_gpe_gen7.c
index ba69906271b..03236ecc467 100644
--- a/src/gallium/drivers/ilo/ilo_gpe_gen7.c
+++ b/src/gallium/drivers/ilo/ilo_gpe_gen7.c
@@ -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);
diff --git a/src/gallium/drivers/ilo/ilo_resource.c b/src/gallium/drivers/ilo/ilo_resource.c
index b41ff5b6215..eb0d2538dfb 100644
--- a/src/gallium/drivers/ilo/ilo_resource.c
+++ b/src/gallium/drivers/ilo/ilo_resource.c
@@ -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;
diff --git a/src/gallium/drivers/ilo/ilo_resource.h b/src/gallium/drivers/ilo/ilo_resource.h
index 124603c3523..e22bd7cc9c6 100644
--- a/src/gallium/drivers/ilo/ilo_resource.h
+++ b/src/gallium/drivers/ilo/ilo_resource.h
@@ -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 */