nil: Add a helper for getting 2D views of 3D images
authorFaith Ekstrand <faith.ekstrand@collabora.com>
Tue, 31 Jan 2023 02:12:01 +0000 (20:12 -0600)
committerMarge Bot <emma+marge@anholt.net>
Fri, 4 Aug 2023 21:32:01 +0000 (21:32 +0000)
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24326>

src/nouveau/nil/nil_image.c
src/nouveau/nil/nil_image.h

index ca573d2..fa0b9d0 100644 (file)
@@ -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,
+   };
+}
index e30c3fa..76d27c8 100644 (file)
@@ -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,