From 7a314170f785d4965b6a5c599956fa3f3a3cb60b Mon Sep 17 00:00:00 2001 From: Mohamed Ahmed Date: Sat, 16 Dec 2023 03:03:58 +0200 Subject: [PATCH] nil: Add helpers for conversion from pixel values to tiles Part-of: --- src/nouveau/nil/nil_image.c | 89 ++++++++++++++++++++++++++----------- src/nouveau/nil/nil_image.h | 10 +++++ 2 files changed, 72 insertions(+), 27 deletions(-) diff --git a/src/nouveau/nil/nil_image.c b/src/nouveau/nil/nil_image.c index 71cf4a1be9c..86824d07f3f 100644 --- a/src/nouveau/nil/nil_image.c +++ b/src/nouveau/nil/nil_image.c @@ -142,6 +142,39 @@ nil_extent4d_el_to_B(struct nil_extent4d extent_el, return extent_B; } +static struct nil_offset4d +nil_offset4d_el_to_B(struct nil_offset4d offset_el, + uint32_t B_per_el) +{ + struct nil_offset4d offset_B = offset_el; + offset_B.x *= B_per_el; + return offset_B; +} + +static struct nil_extent4d +nil_extent4d_px_to_B(struct nil_extent4d extent_px, + enum pipe_format format, + enum nil_sample_layout sample_layout) +{ + const struct nil_extent4d extent_el = + nil_extent4d_px_to_el(extent_px, format, sample_layout); + const uint32_t B_per_el = util_format_get_blocksize(format); + + return nil_extent4d_el_to_B(extent_el, B_per_el); +} + +static struct nil_offset4d +nil_offset4d_px_to_B(struct nil_offset4d offset_px, + enum pipe_format format, + enum nil_sample_layout sample_layout) +{ + const struct nil_offset4d offset_el = + nil_offset4d_px_to_el(offset_px, format, sample_layout); + const uint32_t B_per_el = util_format_get_blocksize(format); + + return nil_offset4d_el_to_B(offset_el, B_per_el); +} + static struct nil_extent4d nil_extent4d_B_to_GOB(struct nil_extent4d extent_B, bool gob_height_8) @@ -172,28 +205,6 @@ nil_tiling_extent_B(struct nil_tiling tiling) } } -struct nil_extent4d -nil_tiling_extent_px(struct nil_tiling tiling, enum pipe_format format, - enum nil_sample_layout sample_layout) -{ - const struct nil_extent4d tiling_extent_B = nil_tiling_extent_B(tiling); - const struct nil_extent4d el_extent_sa = nil_el_extent_sa(format); - const uint32_t blocksize_B = util_format_get_blocksize(format); - - const struct nil_extent4d tiling_extent_el = { - .w = tiling_extent_B.w / blocksize_B, - .h = tiling_extent_B.h, - .d = tiling_extent_B.d, - .a = 1, - }; - - struct nil_extent4d tiling_extent_sa = - nil_extent4d_mul(tiling_extent_el, el_extent_sa); - - return nil_extent4d_div_round_up(tiling_extent_sa, - nil_px_extent_sa(sample_layout)); -} - enum nil_sample_layout nil_choose_sample_layout(uint32_t samples) { @@ -249,6 +260,32 @@ nil_extent4d_B_to_tl(struct nil_extent4d extent_B, return nil_extent4d_div_round_up(extent_B, nil_tiling_extent_B(tiling)); } +struct nil_extent4d +nil_extent4d_px_to_tl(struct nil_extent4d extent_px, + struct nil_tiling tiling, enum pipe_format format, + enum nil_sample_layout sample_layout) +{ + const struct nil_extent4d extent_B = + nil_extent4d_px_to_B(extent_px, format, sample_layout); + + const struct nil_extent4d tiling_extent_B = nil_tiling_extent_B(tiling); + + return nil_extent4d_div_round_up(extent_B, tiling_extent_B); +} + +struct nil_offset4d +nil_offset4d_px_to_tl(struct nil_offset4d offset_px, + struct nil_tiling tiling, enum pipe_format format, + enum nil_sample_layout sample_layout) +{ + const struct nil_offset4d offset_B = + nil_offset4d_px_to_B(offset_px, format, sample_layout); + + const struct nil_extent4d tiling_extent_B = nil_tiling_extent_B(tiling); + + return nil_offset4d_div_round_down(offset_B, tiling_extent_B); +} + struct nil_extent4d nil_image_level_extent_px(const struct nil_image *image, uint32_t level) { @@ -271,11 +308,9 @@ image_level_extent_B(const struct nil_image *image, uint32_t level) { const struct nil_extent4d level_extent_px = nil_image_level_extent_px(image, level); - const struct nil_extent4d level_extent_el = - nil_extent4d_px_to_el(level_extent_px, image->format, - image->sample_layout); - const uint32_t B_per_el = util_format_get_blocksize(image->format); - return nil_extent4d_el_to_B(level_extent_el, B_per_el); + + return nil_extent4d_px_to_B(level_extent_px, image->format, + image->sample_layout); } uint64_t diff --git a/src/nouveau/nil/nil_image.h b/src/nouveau/nil/nil_image.h index 102ddd2a7ee..fa9996664cb 100644 --- a/src/nouveau/nil/nil_image.h +++ b/src/nouveau/nil/nil_image.h @@ -204,6 +204,16 @@ nil_image_level_layer_offset_B(const struct nil_image *image, return image->levels[level].offset_B + (layer * image->array_stride_B); } +struct nil_extent4d +nil_extent4d_px_to_tl(struct nil_extent4d extent_px, + struct nil_tiling tiling, enum pipe_format format, + enum nil_sample_layout sample_layout); + +struct nil_offset4d +nil_offset4d_px_to_tl(struct nil_offset4d offset_px, + struct nil_tiling tiling, enum pipe_format format, + enum nil_sample_layout sample_layout); + struct nil_extent4d nil_image_level_extent_px(const struct nil_image *image, uint32_t level); struct nil_extent4d nil_image_level_extent_sa(const struct nil_image *image,