From d065a9540cb4c4f064f695194e35c8c1c3d2b419 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Tue, 30 May 2017 09:42:25 -0700 Subject: [PATCH] intel/isl: Add a helper for getting the byte/tile offset of a subimage Frequently, get_image_offset_sa is combined with get_intratile_offset_sa so it makes sense to have a single helper to do both. If the caller doesn't want the intratile offsets, it can simply pass NULL and ISL will assert that they are 0. Reviewed-by: Topi Pohjolainen --- src/intel/blorp/blorp_blit.c | 13 ++++--------- src/intel/isl/isl.c | 39 +++++++++++++++++++++++++++++++++++++++ src/intel/isl/isl.h | 21 +++++++++++++++++++++ 3 files changed, 64 insertions(+), 9 deletions(-) diff --git a/src/intel/blorp/blorp_blit.c b/src/intel/blorp/blorp_blit.c index 2f7761b..d93cde2 100644 --- a/src/intel/blorp/blorp_blit.c +++ b/src/intel/blorp/blorp_blit.c @@ -1401,16 +1401,11 @@ blorp_surf_convert_to_single_slice(const struct isl_device *isl_dev, else layer = info->view.base_array_layer; - uint32_t x_offset_sa, y_offset_sa; - isl_surf_get_image_offset_sa(&info->surf, info->view.base_level, - layer, z, &x_offset_sa, &y_offset_sa); - uint32_t byte_offset; - isl_tiling_get_intratile_offset_sa(info->surf.tiling, - info->surf.format, info->surf.row_pitch, - x_offset_sa, y_offset_sa, - &byte_offset, - &info->tile_x_sa, &info->tile_y_sa); + isl_surf_get_image_offset_B_tile_sa(&info->surf, + info->view.base_level, layer, z, + &byte_offset, + &info->tile_x_sa, &info->tile_y_sa); info->addr.offset += byte_offset; const uint32_t slice_width_px = diff --git a/src/intel/isl/isl.c b/src/intel/isl/isl.c index fb4e170..60a5943 100644 --- a/src/intel/isl/isl.c +++ b/src/intel/isl/isl.c @@ -2146,6 +2146,45 @@ isl_surf_get_image_offset_el(const struct isl_surf *surf, } void +isl_surf_get_image_offset_B_tile_sa(const struct isl_surf *surf, + uint32_t level, + uint32_t logical_array_layer, + uint32_t logical_z_offset_px, + uint32_t *offset_B, + uint32_t *x_offset_sa, + uint32_t *y_offset_sa) +{ + const struct isl_format_layout *fmtl = isl_format_get_layout(surf->format); + + uint32_t total_x_offset_el, total_y_offset_el; + isl_surf_get_image_offset_el(surf, level, logical_array_layer, + logical_z_offset_px, + &total_x_offset_el, + &total_y_offset_el); + + uint32_t x_offset_el, y_offset_el; + isl_tiling_get_intratile_offset_el(surf->tiling, fmtl->bpb, + surf->row_pitch, + total_x_offset_el, + total_y_offset_el, + offset_B, + &x_offset_el, + &y_offset_el); + + if (x_offset_sa) { + *x_offset_sa = x_offset_el * fmtl->bw; + } else { + assert(x_offset_el == 0); + } + + if (y_offset_sa) { + *y_offset_sa = y_offset_el * fmtl->bh; + } else { + assert(y_offset_el == 0); + } +} + +void isl_tiling_get_intratile_offset_el(enum isl_tiling tiling, uint32_t bpb, uint32_t row_pitch, diff --git a/src/intel/isl/isl.h b/src/intel/isl/isl.h index 8b2d264..658f67e 100644 --- a/src/intel/isl/isl.h +++ b/src/intel/isl/isl.h @@ -1590,6 +1590,27 @@ isl_surf_get_image_offset_el(const struct isl_surf *surf, uint32_t *y_offset_el); /** + * Calculate the offset, in bytes and intratile surface samples, to a + * subimage in the surface. + * + * This is equivalent to calling isl_surf_get_image_offset_el, passing the + * result to isl_tiling_get_intratile_offset_el, and converting the tile + * offsets to samples. + * + * @invariant level < surface levels + * @invariant logical_array_layer < logical array length of surface + * @invariant logical_z_offset_px < logical depth of surface at level + */ +void +isl_surf_get_image_offset_B_tile_sa(const struct isl_surf *surf, + uint32_t level, + uint32_t logical_array_layer, + uint32_t logical_z_offset_px, + uint32_t *offset_B, + uint32_t *x_offset_sa, + uint32_t *y_offset_sa); + +/** * @brief Calculate the intratile offsets to a surface. * * In @a base_address_offset return the offset from the base of the surface to -- 2.7.4