From 26c533f16783aa7f01ea6f3b6f040de9c483cac7 Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Tue, 4 Jan 2022 16:16:06 -0500 Subject: [PATCH] gallium/util: Add pixel->blocks box helper There is a lot of unit confusion in Gallium due to pixels versus blocks matching only with uncompressed textures. Add a helper to do a common pixels->blocks unit conversion required in multiple drivers. v2: Rename dst->blocks, src->pixels to avoid confusion about the units to casual readers (Mike). Note to mesa-stable maintainers: this is marked as Cc: mesa-stable so the next patch (a set of bug fixes for Lima and Panfrost) can be backported. It's not a bug fix in its own right, of course. Signed-off-by: Alyssa Rosenzweig Reviewed-by: Emma Anholt [v1] Cc: mesa-stable Part-of: --- src/gallium/auxiliary/util/u_box.h | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/gallium/auxiliary/util/u_box.h b/src/gallium/auxiliary/util/u_box.h index 764bf5037a5..c39e139646a 100644 --- a/src/gallium/auxiliary/util/u_box.h +++ b/src/gallium/auxiliary/util/u_box.h @@ -3,6 +3,7 @@ #include "pipe/p_state.h" #include "util/u_math.h" +#include "util/format/u_format.h" static inline void u_box_1d(unsigned x, unsigned w, struct pipe_box *box) @@ -239,4 +240,22 @@ u_box_minify_3d(struct pipe_box *dst, dst->depth = MAX2(src->depth >> l, 1); } +/* Converts a box specified in pixels to an equivalent box specified + * in blocks, where the boxes represent a region-of-interest of an image with + * the given format. This is trivial (a copy) for uncompressed formats. + */ +static inline void +u_box_pixels_to_blocks(struct pipe_box *blocks, + const struct pipe_box *pixels, enum pipe_format format) +{ + u_box_3d( + pixels->x / util_format_get_blockwidth(format), + pixels->y / util_format_get_blockheight(format), + pixels->z, + DIV_ROUND_UP(pixels->width, util_format_get_blockwidth(format)), + DIV_ROUND_UP(pixels->height, util_format_get_blockheight(format)), + pixels->depth, + blocks); +} + #endif