From 7559d2e93cf69daddac148b8818d5f633b1ced3d Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Mon, 30 Jan 2023 20:12:01 -0600 Subject: [PATCH] nil: Add a helper for getting 2D views of 3D images Part-of: --- src/nouveau/nil/nil_image.c | 41 +++++++++++++++++++++++++++++++++++++++++ src/nouveau/nil/nil_image.h | 5 +++++ 2 files changed, 46 insertions(+) diff --git a/src/nouveau/nil/nil_image.c b/src/nouveau/nil/nil_image.c index ca573d2..fa0b9d0 100644 --- a/src/nouveau/nil/nil_image.c +++ b/src/nouveau/nil/nil_image.c @@ -375,3 +375,44 @@ nil_image_level_depth_stride_B(const struct nil_image *image, uint32_t level) return (uint64_t)lvl_ext_B.w * (uint64_t)lvl_ext_B.h; } + +void +nil_image_3d_level_as_2d_array(const struct nil_image *image_3d, + uint32_t level, + struct nil_image *image_2d_out, + uint64_t *offset_B_out) +{ + assert(image_3d->dim == NIL_IMAGE_DIM_3D); + assert(level <= image_3d->num_levels); + assert(image_3d->num_samples == 1); + assert(!image_3d->levels[level].tiling.is_tiled || + image_3d->levels[level].tiling.z_log2 == 0); + + struct nil_extent4d lvl_ext_px = + nil_minify_extent4d(image_3d->extent_px, level); + struct nil_extent4d lvl_ext_B = image_level_extent_B(image_3d, level); + struct nil_extent4d lvl_tiling_ext_B = + nil_tiling_extent_B(image_3d->levels[level].tiling); + lvl_ext_B = nil_extent4d_align(lvl_ext_B, lvl_tiling_ext_B); + uint64_t z_stride = (uint64_t)lvl_ext_B.w * (uint64_t)lvl_ext_B.h; + + *offset_B_out = image_3d->levels[level].offset_B; + *image_2d_out = (struct nil_image) { + .dim = NIL_IMAGE_DIM_2D, + .format = image_3d->format, + .extent_px = { + .w = lvl_ext_px.w, + .h = lvl_ext_px.h, + .d = 1, + .a = lvl_ext_px.d, + }, + .num_levels = 1, + .num_samples = 1, + .levels[0] = image_3d->levels[level], + .array_stride_B = z_stride, + .align_B = nil_tiling_size_B(image_3d->levels[level].tiling), + .size_B = lvl_ext_B.d * z_stride, + .tile_mode = image_3d->tile_mode, + .pte_kind = image_3d->pte_kind, + }; +} diff --git a/src/nouveau/nil/nil_image.h b/src/nouveau/nil/nil_image.h index e30c3fa..76d27c8 100644 --- a/src/nouveau/nil/nil_image.h +++ b/src/nouveau/nil/nil_image.h @@ -159,6 +159,11 @@ uint64_t nil_image_level_size_B(const struct nil_image *image, uint64_t nil_image_level_depth_stride_B(const struct nil_image *image, uint32_t level); +void nil_image_3d_level_as_2d_array(const struct nil_image *image_3d, + uint32_t level, + struct nil_image *image_2d_out, + uint64_t *offset_B_out); + void nil_image_fill_tic(struct nouveau_ws_device *dev, const struct nil_image *image, const struct nil_view *view, -- 2.7.4