diff --git a/src/asahi/layout/layout.c b/src/asahi/layout/layout.c index 56b6edb43f9..929ddc75ffb 100644 --- a/src/asahi/layout/layout.c +++ b/src/asahi/layout/layout.c @@ -171,6 +171,10 @@ ail_initialize_twiddled(struct ail_layout *layout) poth_el = u_minify(poth_el, 1); } + /* Add the end offset so we can easily recover the size of a level */ + assert(layout->levels < ARRAY_SIZE(layout->level_offsets_B)); + layout->level_offsets_B[layout->levels] = offset_B; + /* Align layer size if we have mipmaps and one miptree is larger than one * page */ layout->page_aligned_layers = layout->levels != 1 && offset_B > AIL_PAGESIZE; diff --git a/src/asahi/layout/layout.h b/src/asahi/layout/layout.h index 3abbfddeedc..bf468a32179 100644 --- a/src/asahi/layout/layout.h +++ b/src/asahi/layout/layout.h @@ -185,6 +185,19 @@ ail_get_layer_level_B(const struct ail_layout *layout, unsigned z_px, ail_get_level_offset_B(layout, level); } +static inline uint32_t +ail_get_level_size_B(const struct ail_layout *layout, unsigned level) +{ + if (layout->tiling == AIL_TILING_LINEAR) { + assert(level == 0); + return layout->layer_stride_B; + } else { + assert(level + 1 < ARRAY_SIZE(layout->level_offsets_B)); + return layout->level_offsets_B[level + 1] - + layout->level_offsets_B[level]; + } +} + static inline uint32_t ail_get_linear_pixel_B(const struct ail_layout *layout, ASSERTED unsigned level, uint32_t x_px, uint32_t y_px, uint32_t z_px)