diff options
-rw-r--r-- | src/intel/isl/isl.c | 24 | ||||
-rw-r--r-- | src/intel/isl/isl.h | 48 |
2 files changed, 60 insertions, 12 deletions
diff --git a/src/intel/isl/isl.c b/src/intel/isl/isl.c index a713eeb37ad..f65f9c89fc7 100644 --- a/src/intel/isl/isl.c +++ b/src/intel/isl/isl.c @@ -1475,13 +1475,13 @@ get_image_offset_sa_gen9_1d(const struct isl_surf *surf, * @invariant logical_array_layer < logical array length of surface * @invariant logical_z_offset_px < logical depth of surface at level */ -static void -get_image_offset_sa(const struct isl_surf *surf, - uint32_t level, - uint32_t logical_array_layer, - uint32_t logical_z_offset_px, - uint32_t *x_offset_sa, - uint32_t *y_offset_sa) +void +isl_surf_get_image_offset_sa(const struct isl_surf *surf, + uint32_t level, + uint32_t logical_array_layer, + uint32_t logical_z_offset_px, + uint32_t *x_offset_sa, + uint32_t *y_offset_sa) { assert(level < surf->levels); assert(logical_array_layer < surf->logical_level0_px.array_len); @@ -1524,11 +1524,11 @@ isl_surf_get_image_offset_el(const struct isl_surf *surf, < isl_minify(surf->logical_level0_px.depth, level)); uint32_t x_offset_sa, y_offset_sa; - get_image_offset_sa(surf, level, - logical_array_layer, - logical_z_offset_px, - &x_offset_sa, - &y_offset_sa); + isl_surf_get_image_offset_sa(surf, level, + logical_array_layer, + logical_z_offset_px, + &x_offset_sa, + &y_offset_sa); *x_offset_el = x_offset_sa / fmtl->bw; *y_offset_el = y_offset_sa / fmtl->bh; diff --git a/src/intel/isl/isl.h b/src/intel/isl/isl.h index 10f79ee81f1..c28c6c4855a 100644 --- a/src/intel/isl/isl.h +++ b/src/intel/isl/isl.h @@ -1325,6 +1325,22 @@ isl_surf_get_array_pitch(const struct isl_surf *surf) } /** + * Calculate the offset, in units of surface samples, to a subimage in the + * surface. + * + * @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_sa(const struct isl_surf *surf, + uint32_t level, + uint32_t logical_array_layer, + uint32_t logical_z_offset_px, + uint32_t *x_offset_sa, + uint32_t *y_offset_sa); + +/** * Calculate the offset, in units of surface elements, to a subimage in the * surface. * @@ -1361,6 +1377,38 @@ isl_tiling_get_intratile_offset_el(const struct isl_device *dev, uint32_t *x_offset_el, uint32_t *y_offset_el); +static inline void +isl_tiling_get_intratile_offset_sa(const struct isl_device *dev, + enum isl_tiling tiling, + enum isl_format format, + uint32_t row_pitch, + uint32_t total_x_offset_sa, + uint32_t total_y_offset_sa, + uint32_t *base_address_offset, + uint32_t *x_offset_sa, + uint32_t *y_offset_sa) +{ + const struct isl_format_layout *fmtl = isl_format_get_layout(format); + + assert(fmtl->bpb % 8 == 0); + + /* For computing the intratile offsets, we actually want a strange unit + * which is samples for multisampled surfaces but elements for compressed + * surfaces. + */ + assert(total_x_offset_sa % fmtl->bw == 0); + assert(total_y_offset_sa % fmtl->bw == 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; + + isl_tiling_get_intratile_offset_el(dev, tiling, fmtl->bpb / 8, row_pitch, + total_x_offset, total_y_offset, + base_address_offset, + x_offset_sa, y_offset_sa); + *x_offset_sa *= fmtl->bw; + *y_offset_sa *= fmtl->bh; +} + /** * @brief Get value of 3DSTATE_DEPTH_BUFFER.SurfaceFormat * |