diff options
author | Marek Olšák <marek.olsak@amd.com> | 2024-04-13 22:29:54 -0400 |
---|---|---|
committer | Marge Bot <emma+marge@anholt.net> | 2024-04-22 01:42:52 +0000 |
commit | e5f133ccc426a197c48a4e88f5377f943f078180 (patch) | |
tree | 94ed1f400d46899e3e322d106958333a662953ae /src | |
parent | 959891e33f61ab8d0590e736198bf48e48d2105c (diff) |
util: import pipe_box and its helpers
We'll use them. There are also new helpers that we'll use.
Reviewed-by: Yonggang Luo <luoyonggang@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/28733>
Diffstat (limited to 'src')
25 files changed, 90 insertions, 41 deletions
diff --git a/src/broadcom/common/v3d_tiling.c b/src/broadcom/common/v3d_tiling.c index 5c3e67340f0..5c6413f0db1 100644 --- a/src/broadcom/common/v3d_tiling.c +++ b/src/broadcom/common/v3d_tiling.c @@ -28,7 +28,7 @@ */ #include <stdint.h> -#include "util/u_box.h" /* FIXME: avoid include this */ +#include "util/box.h" /* FIXME: avoid include this */ #include "v3d_tiling.h" #include "broadcom/common/v3d_cpu_tiling.h" diff --git a/src/gallium/auxiliary/meson.build b/src/gallium/auxiliary/meson.build index 96b0272c69b..cc9f592894b 100644 --- a/src/gallium/auxiliary/meson.build +++ b/src/gallium/auxiliary/meson.build @@ -211,7 +211,6 @@ files_libgallium = files( 'util/u_blend.h', 'util/u_blitter.c', 'util/u_blitter.h', - 'util/u_box.h', 'util/u_cache.c', 'util/u_cache.h', 'util/u_compute.c', diff --git a/src/gallium/auxiliary/postprocess/pp_mlaa.c b/src/gallium/auxiliary/postprocess/pp_mlaa.c index 8b13efe9dbb..c7f163779e4 100644 --- a/src/gallium/auxiliary/postprocess/pp_mlaa.c +++ b/src/gallium/auxiliary/postprocess/pp_mlaa.c @@ -45,7 +45,7 @@ #include "postprocess/pp_filters.h" #include "postprocess/pp_private.h" -#include "util/u_box.h" +#include "util/box.h" #include "util/u_sampler.h" #include "util/u_inlines.h" #include "util/u_memory.h" diff --git a/src/gallium/auxiliary/util/u_inlines.h b/src/gallium/auxiliary/util/u_inlines.h index 7e855e498db..48af214e553 100644 --- a/src/gallium/auxiliary/util/u_inlines.h +++ b/src/gallium/auxiliary/util/u_inlines.h @@ -39,7 +39,7 @@ #include "util/u_debug_describe.h" #include "util/u_debug_refcnt.h" #include "util/u_atomic.h" -#include "util/u_box.h" +#include "util/box.h" #include "util/u_math.h" diff --git a/src/gallium/auxiliary/util/u_surface_test.cpp b/src/gallium/auxiliary/util/u_surface_test.cpp index d647e7fbad9..e0a22315675 100644 --- a/src/gallium/auxiliary/util/u_surface_test.cpp +++ b/src/gallium/auxiliary/util/u_surface_test.cpp @@ -1,6 +1,6 @@ /* SPDX-License-Identifier: MIT */ -#include "u_box.h" +#include "util/box.h" #include "u_surface.h" #include <gtest/gtest.h> diff --git a/src/gallium/auxiliary/util/u_transfer_helper.c b/src/gallium/auxiliary/util/u_transfer_helper.c index 9d5b7c4b1df..db580e6f513 100644 --- a/src/gallium/auxiliary/util/u_transfer_helper.c +++ b/src/gallium/auxiliary/util/u_transfer_helper.c @@ -23,7 +23,7 @@ #include "pipe/p_screen.h" -#include "util/u_box.h" +#include "util/box.h" #include "util/format/u_format.h" #include "util/format/u_format_zs.h" #include "util/u_inlines.h" diff --git a/src/gallium/drivers/lima/lima_util.c b/src/gallium/drivers/lima/lima_util.c index c88d8393de2..1587ac18f5c 100644 --- a/src/gallium/drivers/lima/lima_util.c +++ b/src/gallium/drivers/lima/lima_util.c @@ -29,7 +29,8 @@ #include "util/u_debug.h" #include "util/u_memory.h" -#include "util/u_box.h" +#include "util/box.h" +#include "pipe/p_state.h" #include "lima_util.h" #include "lima_parser.h" diff --git a/src/gallium/drivers/r300/r300_transfer.c b/src/gallium/drivers/r300/r300_transfer.c index cf72f9ff727..7ff89303f20 100644 --- a/src/gallium/drivers/r300/r300_transfer.c +++ b/src/gallium/drivers/r300/r300_transfer.c @@ -10,7 +10,7 @@ #include "util/u_memory.h" #include "util/format/u_format.h" -#include "util/u_box.h" +#include "util/box.h" struct r300_transfer { /* Parent class */ diff --git a/src/gallium/drivers/virgl/virgl_transfer_queue.c b/src/gallium/drivers/virgl/virgl_transfer_queue.c index da8255377a8..0adfa07aa90 100644 --- a/src/gallium/drivers/virgl/virgl_transfer_queue.c +++ b/src/gallium/drivers/virgl/virgl_transfer_queue.c @@ -21,7 +21,7 @@ * USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#include "util/u_box.h" +#include "util/box.h" #include "util/u_inlines.h" #include "virtio-gpu/virgl_protocol.h" diff --git a/src/gallium/frontends/dri/drisw.c b/src/gallium/frontends/dri/drisw.c index 7c2aae06213..509231a57bd 100644 --- a/src/gallium/frontends/dri/drisw.c +++ b/src/gallium/frontends/dri/drisw.c @@ -31,7 +31,7 @@ #include "util/format/u_format.h" #include "util/u_memory.h" #include "util/u_inlines.h" -#include "util/u_box.h" +#include "util/box.h" #include "pipe/p_context.h" #include "pipe-loader/pipe_loader.h" #include "frontend/drisw_api.h" diff --git a/src/gallium/frontends/dri/kopper.c b/src/gallium/frontends/dri/kopper.c index 3189ccad00a..2ec55b7897c 100644 --- a/src/gallium/frontends/dri/kopper.c +++ b/src/gallium/frontends/dri/kopper.c @@ -26,7 +26,7 @@ #include "util/format/u_format.h" #include "util/u_memory.h" #include "util/u_inlines.h" -#include "util/u_box.h" +#include "util/box.h" #include "util/log.h" #include "pipe/p_context.h" #include "pipe-loader/pipe_loader.h" diff --git a/src/gallium/frontends/lavapipe/lvp_execute.c b/src/gallium/frontends/lavapipe/lvp_execute.c index c02b6745a5e..9a9e187f122 100644 --- a/src/gallium/frontends/lavapipe/lvp_execute.c +++ b/src/gallium/frontends/lavapipe/lvp_execute.c @@ -36,7 +36,7 @@ #include "util/format/u_format.h" #include "util/u_surface.h" #include "util/u_sampler.h" -#include "util/u_box.h" +#include "util/box.h" #include "util/u_inlines.h" #include "util/u_math.h" #include "util/u_memory.h" diff --git a/src/gallium/frontends/nine/buffer9.c b/src/gallium/frontends/nine/buffer9.c index 94d40e89d9e..965f29dbb38 100644 --- a/src/gallium/frontends/nine/buffer9.c +++ b/src/gallium/frontends/nine/buffer9.c @@ -16,7 +16,7 @@ #include "pipe/p_state.h" #include "pipe/p_defines.h" #include "util/format/u_formats.h" -#include "util/u_box.h" +#include "util/box.h" #include "util/u_inlines.h" #define DBG_CHANNEL (DBG_INDEXBUFFER|DBG_VERTEXBUFFER) diff --git a/src/gallium/frontends/nine/buffer9.h b/src/gallium/frontends/nine/buffer9.h index a0ebdb7d73b..a78355019aa 100644 --- a/src/gallium/frontends/nine/buffer9.h +++ b/src/gallium/frontends/nine/buffer9.h @@ -15,7 +15,7 @@ #include "pipe/p_defines.h" #include "pipe/p_state.h" #include "util/list.h" -#include "util/u_box.h" +#include "util/box.h" #include "util/u_upload_mgr.h" struct pipe_screen; diff --git a/src/gallium/frontends/nine/indexbuffer9.c b/src/gallium/frontends/nine/indexbuffer9.c index bb7744f8026..e4c50052b04 100644 --- a/src/gallium/frontends/nine/indexbuffer9.c +++ b/src/gallium/frontends/nine/indexbuffer9.c @@ -14,7 +14,7 @@ #include "pipe/p_state.h" #include "pipe/p_defines.h" #include "util/format/u_formats.h" -#include "util/u_box.h" +#include "util/box.h" #define DBG_CHANNEL DBG_INDEXBUFFER diff --git a/src/gallium/frontends/nine/nine_ff.c b/src/gallium/frontends/nine/nine_ff.c index 735406f468c..bd6231eaab3 100644 --- a/src/gallium/frontends/nine/nine_ff.c +++ b/src/gallium/frontends/nine/nine_ff.c @@ -19,7 +19,7 @@ #include "tgsi/tgsi_ureg.h" #include "tgsi/tgsi_dump.h" #include "util/bitscan.h" -#include "util/u_box.h" +#include "util/box.h" #include "util/u_hash_table.h" #include "util/u_upload_mgr.h" diff --git a/src/gallium/frontends/nine/nine_state.c b/src/gallium/frontends/nine/nine_state.c index 4acb9ee3010..3aaff661eb3 100644 --- a/src/gallium/frontends/nine/nine_state.c +++ b/src/gallium/frontends/nine/nine_state.c @@ -25,7 +25,7 @@ #include "util/u_atomic.h" #include "util/u_upload_mgr.h" #include "util/u_math.h" -#include "util/u_box.h" +#include "util/box.h" #include "util/u_simple_shaders.h" #include "util/u_gen_mipmap.h" diff --git a/src/gallium/frontends/nine/vertexbuffer9.c b/src/gallium/frontends/nine/vertexbuffer9.c index b600bd9fc1c..036fce0d38d 100644 --- a/src/gallium/frontends/nine/vertexbuffer9.c +++ b/src/gallium/frontends/nine/vertexbuffer9.c @@ -13,7 +13,7 @@ #include "pipe/p_state.h" #include "pipe/p_defines.h" #include "util/format/u_formats.h" -#include "util/u_box.h" +#include "util/box.h" #define DBG_CHANNEL DBG_VERTEXBUFFER diff --git a/src/gallium/frontends/osmesa/osmesa.c b/src/gallium/frontends/osmesa/osmesa.c index 5bf4c5baab9..a25bd800fdc 100644 --- a/src/gallium/frontends/osmesa/osmesa.c +++ b/src/gallium/frontends/osmesa/osmesa.c @@ -70,7 +70,7 @@ #include "pipe/p_state.h" #include "util/u_atomic.h" -#include "util/u_box.h" +#include "util/box.h" #include "util/u_debug.h" #include "util/format/u_format.h" #include "util/u_inlines.h" diff --git a/src/gallium/include/pipe/p_state.h b/src/gallium/include/pipe/p_state.h index c20550e8c3b..7e4a57d3c27 100644 --- a/src/gallium/include/pipe/p_state.h +++ b/src/gallium/include/pipe/p_state.h @@ -49,6 +49,7 @@ #include "util/compiler.h" #include "p_defines.h" #include "util/format/u_formats.h" +#include "util/box.h" #ifdef __cplusplus @@ -548,23 +549,6 @@ struct pipe_image_view /** - * Subregion of 1D/2D/3D image resource. - */ -struct pipe_box -{ - /* Only "x" and "width" are used to represent buffer ranges. - * The maximum representable texture size is ANY x ANY x 16K. - */ - int32_t x; - int32_t width; - int32_t y; - int32_t height; - int16_t z; - int16_t depth; -}; - - -/** * A memory object/resource such as a vertex buffer or texture. */ struct pipe_resource diff --git a/src/mesa/state_tracker/st_cb_copyimage.c b/src/mesa/state_tracker/st_cb_copyimage.c index f3ab37fcbdc..bd973b521a8 100644 --- a/src/mesa/state_tracker/st_cb_copyimage.c +++ b/src/mesa/state_tracker/st_cb_copyimage.c @@ -29,7 +29,7 @@ #include "state_tracker/st_texture.h" #include "state_tracker/st_util.h" -#include "util/u_box.h" +#include "util/box.h" #include "util/format/u_format.h" #include "util/u_inlines.h" diff --git a/src/mesa/state_tracker/st_cb_texture.c b/src/mesa/state_tracker/st_cb_texture.c index 406f12e1d6a..907efa3acf6 100644 --- a/src/mesa/state_tracker/st_cb_texture.c +++ b/src/mesa/state_tracker/st_cb_texture.c @@ -80,7 +80,7 @@ #include "util/u_surface.h" #include "util/u_sampler.h" #include "util/u_math.h" -#include "util/u_box.h" +#include "util/box.h" #include "util/u_memory.h" #include "util/u_simple_shaders.h" #include "cso_cache/cso_context.h" diff --git a/src/gallium/auxiliary/util/u_box.h b/src/util/box.h index 25a91adfdf3..c073101118d 100644 --- a/src/gallium/auxiliary/util/u_box.h +++ b/src/util/box.h @@ -1,10 +1,25 @@ -#ifndef UTIL_BOX_INLINES_H -#define UTIL_BOX_INLINES_H +#ifndef UTIL_BOX_H +#define UTIL_BOX_H -#include "pipe/p_state.h" #include "util/u_math.h" #include "util/format/u_format.h" +/** + * Subregion of 1D/2D/3D image resource. + */ +struct pipe_box +{ + /* Only "x" and "width" are used to represent buffer ranges. + * The maximum representable texture size is ANY x ANY x 16K. + */ + int32_t x; + int32_t width; + int32_t y; + int32_t height; + int16_t z; + int16_t depth; +}; + static inline void u_box_1d(unsigned x, unsigned w, struct pipe_box *box) { @@ -298,4 +313,47 @@ u_box_pixels_to_blocks(struct pipe_box *blocks, blocks); } +static inline bool +util_is_box_sint16(const struct pipe_box *box) +{ + return util_is_sint16(box->x) && util_is_sint16(box->y) && + util_is_sint16(box->z) && util_is_sint16(box->width) && + util_is_sint16(box->height) && util_is_sint16(box->depth) && + util_is_sint16(box->x + box->width) && + util_is_sint16(box->y + box->height) && + util_is_sint16(box->z + box->depth); +} + +static inline bool +util_is_box_out_of_bounds(const struct pipe_box *src_box, unsigned coord_mask, + unsigned width, unsigned height, unsigned mip_level) +{ + int src_width = u_minify(width, mip_level); + int src_height = u_minify(height, mip_level); + struct pipe_box box = *src_box; + + /* Eliminate negative width/height/depth. */ + if (box.width < 0) { + box.x += box.width; + box.width *= -1; + } + if (box.height < 0) { + box.y += box.height; + box.height *= -1; + } + + bool x_in_bounds = box.x >= 0 && box.x < src_width && + box.x + box.width > 0 && box.x + box.width <= src_width; + bool y_in_bounds = box.y >= 0 && box.y < src_height && + box.y + box.height > 0 && box.y + box.height <= src_height; + + /* Return if the box is not in bounds. */ + if (coord_mask & BITFIELD_BIT(0) && !x_in_bounds) + return true; + if (coord_mask & BITFIELD_BIT(1) && !y_in_bounds) + return true; + + return false; +} + #endif diff --git a/src/util/meson.build b/src/util/meson.build index 1370213ad45..9f40c44c4e3 100644 --- a/src/util/meson.build +++ b/src/util/meson.build @@ -39,6 +39,7 @@ files_mesa_util = files( 'blend.h', 'blob.c', 'blob.h', + 'box.h', 'build_id.c', 'build_id.h', 'cnd_monotonic.h', diff --git a/src/util/u_math.h b/src/util/u_math.h index 7afe136278f..620e3ec7d21 100644 --- a/src/util/u_math.h +++ b/src/util/u_math.h @@ -819,6 +819,12 @@ util_is_aligned(uintmax_t n, uintmax_t a) return (n & (a - 1)) == 0; } +static inline bool +util_is_sint16(int x) +{ + return x >= INT16_MIN && x <= INT16_MAX; +} + #ifdef __cplusplus } #endif |