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 <topi.pohjolainen@intel.com>
This commit is contained in:
Jason Ekstrand 2017-05-30 09:42:25 -07:00
parent b178762d05
commit d065a9540c
3 changed files with 64 additions and 9 deletions

View file

@ -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 =

View file

@ -2145,6 +2145,45 @@ isl_surf_get_image_offset_el(const struct isl_surf *surf,
*y_offset_el = y_offset_sa / fmtl->bh;
}
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,

View file

@ -1589,6 +1589,27 @@ isl_surf_get_image_offset_el(const struct isl_surf *surf,
uint32_t *x_offset_el,
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.
*