diff --git a/src/gallium/drivers/iris/iris_resource.c b/src/gallium/drivers/iris/iris_resource.c index 374b47595aa..f4bdc59d25a 100644 --- a/src/gallium/drivers/iris/iris_resource.c +++ b/src/gallium/drivers/iris/iris_resource.c @@ -1654,11 +1654,15 @@ static void get_image_offset_el(const struct isl_surf *surf, unsigned level, unsigned z, unsigned *out_x0_el, unsigned *out_y0_el) { + ASSERTED uint32_t z0_el, a0_el; if (surf->dim == ISL_SURF_DIM_3D) { - isl_surf_get_image_offset_el(surf, level, 0, z, out_x0_el, out_y0_el); + isl_surf_get_image_offset_el(surf, level, 0, z, + out_x0_el, out_y0_el, &z0_el, &a0_el); } else { - isl_surf_get_image_offset_el(surf, level, z, 0, out_x0_el, out_y0_el); + isl_surf_get_image_offset_el(surf, level, z, 0, + out_x0_el, out_y0_el, &z0_el, &a0_el); } + assert(z0_el == 0 && a0_el == 0); } /** diff --git a/src/intel/blorp/blorp_blit.c b/src/intel/blorp/blorp_blit.c index 1e55aab6df0..281803a190b 100644 --- a/src/intel/blorp/blorp_blit.c +++ b/src/intel/blorp/blorp_blit.c @@ -2194,11 +2194,15 @@ shrink_surface_params(const struct isl_device *dev, */ x_offset_sa = (uint32_t)*x0 * px_size_sa.w + info->tile_x_sa; y_offset_sa = (uint32_t)*y0 * px_size_sa.h + info->tile_y_sa; + uint32_t tile_z_sa, tile_a; isl_tiling_get_intratile_offset_sa(info->surf.tiling, info->surf.format, info->surf.row_pitch_B, - x_offset_sa, y_offset_sa, + info->surf.array_pitch_el_rows, + x_offset_sa, y_offset_sa, 0, 0, &byte_offset, - &info->tile_x_sa, &info->tile_y_sa); + &info->tile_x_sa, &info->tile_y_sa, + &tile_z_sa, &tile_a); + assert(tile_z_sa == 0 && tile_a == 0); info->addr.offset += byte_offset; diff --git a/src/intel/blorp/blorp_clear.c b/src/intel/blorp/blorp_clear.c index ad3fa3c352d..9ae60d3e0dd 100644 --- a/src/intel/blorp/blorp_clear.c +++ b/src/intel/blorp/blorp_clear.c @@ -832,11 +832,12 @@ blorp_can_hiz_clear_depth(const struct intel_device_info *devinfo, * HIZ), we have to make sure that the x0 and y0 are at least 16x8 * aligned in the context of the entire surface. */ - uint32_t slice_x0, slice_y0; + uint32_t slice_x0, slice_y0, slice_z0, slice_a0; isl_surf_get_image_offset_el(surf, level, surf->dim == ISL_SURF_DIM_3D ? 0 : layer, surf->dim == ISL_SURF_DIM_3D ? layer: 0, - &slice_x0, &slice_y0); + &slice_x0, &slice_y0, &slice_z0, &slice_a0); + assert(slice_z0 == 0 && slice_a0 == 0); const bool max_x1_y1 = x1 == minify(surf->logical_level0_px.width, level) && y1 == minify(surf->logical_level0_px.height, level); diff --git a/src/intel/isl/isl.c b/src/intel/isl/isl.c index 8e502be963e..dfc302e1eb6 100644 --- a/src/intel/isl/isl.c +++ b/src/intel/isl/isl.c @@ -2523,7 +2523,9 @@ isl_surf_get_image_offset_sa(const struct isl_surf *surf, uint32_t logical_array_layer, uint32_t logical_z_offset_px, uint32_t *x_offset_sa, - uint32_t *y_offset_sa) + uint32_t *y_offset_sa, + uint32_t *z_offset_sa, + uint32_t *array_offset) { assert(level < surf->levels); assert(logical_array_layer < surf->logical_level0_px.array_len); @@ -2534,21 +2536,29 @@ isl_surf_get_image_offset_sa(const struct isl_surf *surf, case ISL_DIM_LAYOUT_GFX9_1D: get_image_offset_sa_gfx9_1d(surf, level, logical_array_layer, x_offset_sa, y_offset_sa); + *z_offset_sa = 0; + *array_offset = 0; break; case ISL_DIM_LAYOUT_GFX4_2D: get_image_offset_sa_gfx4_2d(surf, level, logical_array_layer + logical_z_offset_px, x_offset_sa, y_offset_sa); + *z_offset_sa = 0; + *array_offset = 0; break; case ISL_DIM_LAYOUT_GFX4_3D: get_image_offset_sa_gfx4_3d(surf, level, logical_array_layer + logical_z_offset_px, x_offset_sa, y_offset_sa); + *z_offset_sa = 0; + *array_offset = 0; break; case ISL_DIM_LAYOUT_GFX6_STENCIL_HIZ: get_image_offset_sa_gfx6_stencil_hiz(surf, level, logical_array_layer + logical_z_offset_px, x_offset_sa, y_offset_sa); + *z_offset_sa = 0; + *array_offset = 0; break; default: @@ -2562,7 +2572,9 @@ isl_surf_get_image_offset_el(const struct isl_surf *surf, uint32_t logical_array_layer, uint32_t logical_z_offset_px, uint32_t *x_offset_el, - uint32_t *y_offset_el) + uint32_t *y_offset_el, + uint32_t *z_offset_el, + uint32_t *array_offset) { const struct isl_format_layout *fmtl = isl_format_get_layout(surf->format); @@ -2571,15 +2583,18 @@ isl_surf_get_image_offset_el(const struct isl_surf *surf, assert(logical_z_offset_px < isl_minify(surf->logical_level0_px.depth, level)); - uint32_t x_offset_sa, y_offset_sa; + uint32_t x_offset_sa, y_offset_sa, z_offset_sa; isl_surf_get_image_offset_sa(surf, level, logical_array_layer, logical_z_offset_px, &x_offset_sa, - &y_offset_sa); + &y_offset_sa, + &z_offset_sa, + array_offset); *x_offset_el = x_offset_sa / fmtl->bw; *y_offset_el = y_offset_sa / fmtl->bh; + *z_offset_el = z_offset_sa / fmtl->bd; } void @@ -2626,18 +2641,29 @@ isl_surf_get_image_offset_B_tile_el(const struct isl_surf *surf, const struct isl_format_layout *fmtl = isl_format_get_layout(surf->format); uint32_t total_x_offset_el, total_y_offset_el; + uint32_t total_z_offset_el, total_array_offset; isl_surf_get_image_offset_el(surf, level, logical_array_layer, logical_z_offset_px, &total_x_offset_el, - &total_y_offset_el); + &total_y_offset_el, + &total_z_offset_el, + &total_array_offset); + uint32_t z_offset_el, array_offset; isl_tiling_get_intratile_offset_el(surf->tiling, fmtl->bpb, surf->row_pitch_B, + surf->array_pitch_el_rows, total_x_offset_el, total_y_offset_el, + total_z_offset_el, + total_array_offset, offset_B, x_offset_el, - y_offset_el); + y_offset_el, + &z_offset_el, + &array_offset); + assert(z_offset_el == 0); + assert(array_offset == 0); } void @@ -2649,10 +2675,13 @@ isl_surf_get_image_range_B_tile(const struct isl_surf *surf, uint32_t *end_tile_B) { uint32_t start_x_offset_el, start_y_offset_el; + uint32_t start_z_offset_el, start_array_slice; isl_surf_get_image_offset_el(surf, level, logical_array_layer, logical_z_offset_px, &start_x_offset_el, - &start_y_offset_el); + &start_y_offset_el, + &start_z_offset_el, + &start_array_slice); /* Compute the size of the subimage in surface elements */ const uint32_t subimage_w_sa = isl_minify(surf->phys_level0_sa.w, level); @@ -2665,22 +2694,36 @@ isl_surf_get_image_range_B_tile(const struct isl_surf *surf, uint32_t end_x_offset_el = start_x_offset_el + subimage_w_el - 1; uint32_t end_y_offset_el = start_y_offset_el + subimage_h_el - 1; - UNUSED uint32_t x_offset_el, y_offset_el; + /* We only consider one Z or array slice */ + const uint32_t end_z_offset_el = start_z_offset_el; + const uint32_t end_array_slice = start_array_slice; + + UNUSED uint32_t x_offset_el, y_offset_el, z_offset_el, array_slice; isl_tiling_get_intratile_offset_el(surf->tiling, fmtl->bpb, surf->row_pitch_B, + surf->array_pitch_el_rows, start_x_offset_el, start_y_offset_el, + start_z_offset_el, + start_array_slice, start_tile_B, &x_offset_el, - &y_offset_el); + &y_offset_el, + &z_offset_el, + &array_slice); isl_tiling_get_intratile_offset_el(surf->tiling, fmtl->bpb, surf->row_pitch_B, + surf->array_pitch_el_rows, end_x_offset_el, end_y_offset_el, + end_z_offset_el, + end_array_slice, end_tile_B, &x_offset_el, - &y_offset_el); + &y_offset_el, + &z_offset_el, + &array_slice); /* We want the range we return to be exclusive but the tile containing the * last pixel (what we just calculated) is inclusive. Add one. @@ -2735,18 +2778,26 @@ void isl_tiling_get_intratile_offset_el(enum isl_tiling tiling, uint32_t bpb, uint32_t row_pitch_B, + uint32_t array_pitch_el_rows, uint32_t total_x_offset_el, uint32_t total_y_offset_el, + uint32_t total_z_offset_el, + uint32_t total_array_offset, uint32_t *base_address_offset, uint32_t *x_offset_el, - uint32_t *y_offset_el) + uint32_t *y_offset_el, + uint32_t *z_offset_el, + uint32_t *array_offset) { if (tiling == ISL_TILING_LINEAR) { assert(bpb % 8 == 0); + assert(total_z_offset_el == 0 && total_array_offset == 0); *base_address_offset = total_y_offset_el * row_pitch_B + total_x_offset_el * (bpb / 8); *x_offset_el = 0; *y_offset_el = 0; + *z_offset_el = 0; + *array_offset = 0; return; } @@ -2770,6 +2821,10 @@ isl_tiling_get_intratile_offset_el(enum isl_tiling tiling, /* Compute the offset into the tile */ *x_offset_el = total_x_offset_el % tile_info.logical_extent_el.w; *y_offset_el = total_y_offset_el % tile_info.logical_extent_el.h; + assert(total_z_offset_el == 0); + assert(total_array_offset == 0); + *z_offset_el = 0; + *array_offset = 0; /* Compute the offset of the tile in units of whole tiles */ uint32_t x_offset_tl = total_x_offset_el / tile_info.logical_extent_el.w; diff --git a/src/intel/isl/isl.h b/src/intel/isl/isl.h index 937ea553733..9a16f6bca7e 100644 --- a/src/intel/isl/isl.h +++ b/src/intel/isl/isl.h @@ -2249,7 +2249,9 @@ isl_surf_get_image_offset_sa(const struct isl_surf *surf, uint32_t logical_array_layer, uint32_t logical_z_offset_px, uint32_t *x_offset_sa, - uint32_t *y_offset_sa); + uint32_t *y_offset_sa, + uint32_t *z_offset_sa, + uint32_t *array_offset); /** * Calculate the offset, in units of surface elements, to a subimage in the @@ -2265,7 +2267,9 @@ isl_surf_get_image_offset_el(const struct isl_surf *surf, uint32_t logical_array_layer, uint32_t logical_z_offset_px, uint32_t *x_offset_el, - uint32_t *y_offset_el); + uint32_t *y_offset_el, + uint32_t *z_offset_el, + uint32_t *array_offset); /** * Calculate the offset, in bytes and intratile surface samples, to a @@ -2366,21 +2370,31 @@ void isl_tiling_get_intratile_offset_el(enum isl_tiling tiling, uint32_t bpb, uint32_t row_pitch_B, + uint32_t array_pitch_el_rows, uint32_t total_x_offset_el, uint32_t total_y_offset_el, + uint32_t total_z_offset_el, + uint32_t total_array_offset, uint32_t *base_address_offset, uint32_t *x_offset_el, - uint32_t *y_offset_el); + uint32_t *y_offset_el, + uint32_t *z_offset_el, + uint32_t *array_offset); static inline void isl_tiling_get_intratile_offset_sa(enum isl_tiling tiling, enum isl_format format, uint32_t row_pitch_B, + uint32_t array_pitch_el_rows, uint32_t total_x_offset_sa, uint32_t total_y_offset_sa, + uint32_t total_z_offset_sa, + uint32_t total_array_offset, uint32_t *base_address_offset, uint32_t *x_offset_sa, - uint32_t *y_offset_sa) + uint32_t *y_offset_sa, + uint32_t *z_offset_sa, + uint32_t *array_offset) { const struct isl_format_layout *fmtl = isl_format_get_layout(format); @@ -2390,15 +2404,22 @@ isl_tiling_get_intratile_offset_sa(enum isl_tiling tiling, */ assert(total_x_offset_sa % fmtl->bw == 0); assert(total_y_offset_sa % fmtl->bh == 0); - const uint32_t total_x_offset = total_x_offset_sa / fmtl->bw; - const uint32_t total_y_offset = total_y_offset_sa / fmtl->bh; + const uint32_t total_x_offset_el = total_x_offset_sa / fmtl->bw; + const uint32_t total_y_offset_el = total_y_offset_sa / fmtl->bh; + const uint32_t total_z_offset_el = total_z_offset_sa / fmtl->bd; isl_tiling_get_intratile_offset_el(tiling, fmtl->bpb, row_pitch_B, - total_x_offset, total_y_offset, + array_pitch_el_rows, + total_x_offset_el, + total_y_offset_el, + total_z_offset_el, + total_array_offset, base_address_offset, - x_offset_sa, y_offset_sa); + x_offset_sa, y_offset_sa, + z_offset_sa, array_offset); *x_offset_sa *= fmtl->bw; *y_offset_sa *= fmtl->bh; + *z_offset_sa *= fmtl->bd; } /** diff --git a/src/intel/isl/isl_storage_image.c b/src/intel/isl/isl_storage_image.c index 3021211b49b..356a5ae8f19 100644 --- a/src/intel/isl/isl_storage_image.c +++ b/src/intel/isl/isl_storage_image.c @@ -240,12 +240,16 @@ isl_surf_fill_image_param(const struct isl_device *dev, view->array_len : isl_minify(surf->logical_level0_px.d, view->base_level); + uint32_t tile_z_el, phys_array_layer; isl_surf_get_image_offset_el(surf, view->base_level, surf->dim == ISL_SURF_DIM_3D ? 0 : view->base_array_layer, surf->dim == ISL_SURF_DIM_3D ? view->base_array_layer : 0, - ¶m->offset[0], ¶m->offset[1]); + ¶m->offset[0], ¶m->offset[1], + &tile_z_el, &phys_array_layer); + assert(tile_z_el == 0); + assert(phys_array_layer == 0); const int cpp = isl_format_get_layout(surf->format)->bpb / 8; param->stride[0] = cpp; diff --git a/src/intel/isl/tests/isl_surf_get_image_offset_test.c b/src/intel/isl/tests/isl_surf_get_image_offset_test.c index a03e6d74498..973ea940913 100644 --- a/src/intel/isl/tests/isl_surf_get_image_offset_test.c +++ b/src/intel/isl/tests/isl_surf_get_image_offset_test.c @@ -85,9 +85,9 @@ t_assert_offset_el(const struct isl_surf *surf, uint32_t expected_x_offset_el, uint32_t expected_y_offset_el) { - uint32_t x, y; + uint32_t x, y, z, a; isl_surf_get_image_offset_el(surf, level, logical_array_layer, - logical_z_offset_px, &x, &y); + logical_z_offset_px, &x, &y, &z, &a); t_assert(x == expected_x_offset_el); t_assert(y == expected_y_offset_el); diff --git a/src/mesa/drivers/dri/i965/brw_blit.c b/src/mesa/drivers/dri/i965/brw_blit.c index ff689941603..0539b72ef93 100644 --- a/src/mesa/drivers/dri/i965/brw_blit.c +++ b/src/mesa/drivers/dri/i965/brw_blit.c @@ -168,11 +168,17 @@ get_blit_intratile_offset_el(const struct brw_context *brw, uint32_t *x_offset_el, uint32_t *y_offset_el) { + ASSERTED uint32_t z_offset_el, array_offset; isl_tiling_get_intratile_offset_el(mt->surf.tiling, mt->cpp * 8, mt->surf.row_pitch_B, - total_x_offset_el, total_y_offset_el, + mt->surf.array_pitch_el_rows, + total_x_offset_el, total_y_offset_el, 0, 0, base_address_offset, - x_offset_el, y_offset_el); + x_offset_el, y_offset_el, + &z_offset_el, &array_offset); + assert(z_offset_el == 0); + assert(array_offset == 0); + if (mt->surf.tiling == ISL_TILING_LINEAR) { /* From the Broadwell PRM docs for XY_SRC_COPY_BLT::SourceBaseAddress: * diff --git a/src/mesa/drivers/dri/i965/brw_mipmap_tree.c b/src/mesa/drivers/dri/i965/brw_mipmap_tree.c index c2983854f8f..31949e41a2a 100644 --- a/src/mesa/drivers/dri/i965/brw_mipmap_tree.c +++ b/src/mesa/drivers/dri/i965/brw_mipmap_tree.c @@ -1132,7 +1132,7 @@ brw_miptree_get_image_offset(const struct brw_mipmap_tree *mt, return; } - uint32_t x_offset_sa, y_offset_sa; + uint32_t x_offset_sa, y_offset_sa, z_offset_sa, array_offset; /* Miptree itself can have an offset only if it represents a single * slice in an imported buffer object. @@ -1150,10 +1150,13 @@ brw_miptree_get_image_offset(const struct brw_mipmap_tree *mt, const unsigned z = mt->surf.dim == ISL_SURF_DIM_3D ? slice : 0; slice = mt->surf.dim == ISL_SURF_DIM_3D ? 0 : slice; isl_surf_get_image_offset_el(&mt->surf, level, slice, z, - &x_offset_sa, &y_offset_sa); + &x_offset_sa, &y_offset_sa, + &z_offset_sa, &array_offset); *x = x_offset_sa; *y = y_offset_sa; + assert(z_offset_sa == 0); + assert(array_offset == 0); } /**