diff --git a/src/broadcom/common/v3d_tiling.c b/src/broadcom/common/v3d_tiling.c index 5c3e67340f071..5c6413f0db1b4 100644 --- a/src/broadcom/common/v3d_tiling.c +++ b/src/broadcom/common/v3d_tiling.c @@ -28,7 +28,7 @@ */ #include -#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 96b0272c69b42..cc9f592894b0e 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 8b13efe9dbbab..c7f163779e4ca 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 7e855e498db4a..48af214e5534d 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 d647e7fbad9ca..e0a223156756e 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 diff --git a/src/gallium/auxiliary/util/u_transfer_helper.c b/src/gallium/auxiliary/util/u_transfer_helper.c index 9d5b7c4b1df12..db580e6f5136f 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 c88d8393de239..1587ac18f5ce1 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 cf72f9ff727dd..7ff89303f205d 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 da8255377a85a..0adfa07aa90ce 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 7c2aae06213c7..509231a57bd13 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 3189ccad00a3c..2ec55b7897cdd 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 c02b6745a5e35..9a9e187f12228 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 94d40e89d9ee4..965f29dbb38a6 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 a0ebdb7d73b60..a78355019aa04 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 bb7744f802680..e4c50052b04f8 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 735406f468cf8..bd6231eaab31e 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 4acb9ee3010e6..3aaff661eb3be 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 b600bd9fc1cba..036fce0d38d1f 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 5bf4c5baab94e..a25bd800fdc9f 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 c20550e8c3b5a..7e4a57d3c27d1 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 @@ -547,23 +548,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. */ diff --git a/src/mesa/state_tracker/st_cb_copyimage.c b/src/mesa/state_tracker/st_cb_copyimage.c index f3ab37fcbdce2..bd973b521a899 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 406f12e1d6a5e..907efa3acf694 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 similarity index 80% rename from src/gallium/auxiliary/util/u_box.h rename to src/util/box.h index 25a91adfdf303..c073101118d1c 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 1370213ad4537..9f40c44c4e356 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 7afe136278f22..620e3ec7d212b 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