isl: Add functions for computing surface offsets in samples
Reviewed-by: Topi Pohjolainen <topi.pohjolainen@intel.com>
This commit is contained in:
@@ -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_array_layer < logical array length of surface
|
||||||
* @invariant logical_z_offset_px < logical depth of surface at level
|
* @invariant logical_z_offset_px < logical depth of surface at level
|
||||||
*/
|
*/
|
||||||
static void
|
void
|
||||||
get_image_offset_sa(const struct isl_surf *surf,
|
isl_surf_get_image_offset_sa(const struct isl_surf *surf,
|
||||||
uint32_t level,
|
uint32_t level,
|
||||||
uint32_t logical_array_layer,
|
uint32_t logical_array_layer,
|
||||||
uint32_t logical_z_offset_px,
|
uint32_t logical_z_offset_px,
|
||||||
uint32_t *x_offset_sa,
|
uint32_t *x_offset_sa,
|
||||||
uint32_t *y_offset_sa)
|
uint32_t *y_offset_sa)
|
||||||
{
|
{
|
||||||
assert(level < surf->levels);
|
assert(level < surf->levels);
|
||||||
assert(logical_array_layer < surf->logical_level0_px.array_len);
|
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));
|
< isl_minify(surf->logical_level0_px.depth, level));
|
||||||
|
|
||||||
uint32_t x_offset_sa, y_offset_sa;
|
uint32_t x_offset_sa, y_offset_sa;
|
||||||
get_image_offset_sa(surf, level,
|
isl_surf_get_image_offset_sa(surf, level,
|
||||||
logical_array_layer,
|
logical_array_layer,
|
||||||
logical_z_offset_px,
|
logical_z_offset_px,
|
||||||
&x_offset_sa,
|
&x_offset_sa,
|
||||||
&y_offset_sa);
|
&y_offset_sa);
|
||||||
|
|
||||||
*x_offset_el = x_offset_sa / fmtl->bw;
|
*x_offset_el = x_offset_sa / fmtl->bw;
|
||||||
*y_offset_el = y_offset_sa / fmtl->bh;
|
*y_offset_el = y_offset_sa / fmtl->bh;
|
||||||
|
@@ -1324,6 +1324,22 @@ isl_surf_get_array_pitch(const struct isl_surf *surf)
|
|||||||
return isl_surf_get_array_pitch_sa_rows(surf) * surf->row_pitch;
|
return isl_surf_get_array_pitch_sa_rows(surf) * surf->row_pitch;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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
|
* Calculate the offset, in units of surface elements, to a subimage in the
|
||||||
* surface.
|
* surface.
|
||||||
@@ -1361,6 +1377,38 @@ isl_tiling_get_intratile_offset_el(const struct isl_device *dev,
|
|||||||
uint32_t *x_offset_el,
|
uint32_t *x_offset_el,
|
||||||
uint32_t *y_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
|
* @brief Get value of 3DSTATE_DEPTH_BUFFER.SurfaceFormat
|
||||||
*
|
*
|
||||||
|
Reference in New Issue
Block a user