From 0d427406cec726dbdca04223d771c927114e6f4c 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: (cherry picked from commit 26c533f16783aa7f01ea6f3b6f040de9c483cac7) --- .pick_status.json | 2 +- src/gallium/auxiliary/util/u_box.h | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/.pick_status.json b/.pick_status.json index 204012057f4..05bea9ff2a0 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -805,7 +805,7 @@ "description": "gallium/util: Add pixel->blocks box helper", "nominated": true, "nomination_type": 0, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null }, 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