mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-06 02:58:05 +02:00
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:
parent
b178762d05
commit
d065a9540c
3 changed files with 64 additions and 9 deletions
|
|
@ -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 =
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
*
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue