summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMarek Olšák <marek.olsak@amd.com>2024-04-13 22:29:54 -0400
committerMarge Bot <emma+marge@anholt.net>2024-04-22 01:42:52 +0000
commite5f133ccc426a197c48a4e88f5377f943f078180 (patch)
tree94ed1f400d46899e3e322d106958333a662953ae /src
parent959891e33f61ab8d0590e736198bf48e48d2105c (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')
-rw-r--r--src/broadcom/common/v3d_tiling.c2
-rw-r--r--src/gallium/auxiliary/meson.build1
-rw-r--r--src/gallium/auxiliary/postprocess/pp_mlaa.c2
-rw-r--r--src/gallium/auxiliary/util/u_inlines.h2
-rw-r--r--src/gallium/auxiliary/util/u_surface_test.cpp2
-rw-r--r--src/gallium/auxiliary/util/u_transfer_helper.c2
-rw-r--r--src/gallium/drivers/lima/lima_util.c3
-rw-r--r--src/gallium/drivers/r300/r300_transfer.c2
-rw-r--r--src/gallium/drivers/virgl/virgl_transfer_queue.c2
-rw-r--r--src/gallium/frontends/dri/drisw.c2
-rw-r--r--src/gallium/frontends/dri/kopper.c2
-rw-r--r--src/gallium/frontends/lavapipe/lvp_execute.c2
-rw-r--r--src/gallium/frontends/nine/buffer9.c2
-rw-r--r--src/gallium/frontends/nine/buffer9.h2
-rw-r--r--src/gallium/frontends/nine/indexbuffer9.c2
-rw-r--r--src/gallium/frontends/nine/nine_ff.c2
-rw-r--r--src/gallium/frontends/nine/nine_state.c2
-rw-r--r--src/gallium/frontends/nine/vertexbuffer9.c2
-rw-r--r--src/gallium/frontends/osmesa/osmesa.c2
-rw-r--r--src/gallium/include/pipe/p_state.h18
-rw-r--r--src/mesa/state_tracker/st_cb_copyimage.c2
-rw-r--r--src/mesa/state_tracker/st_cb_texture.c2
-rw-r--r--src/util/box.h (renamed from src/gallium/auxiliary/util/u_box.h)64
-rw-r--r--src/util/meson.build1
-rw-r--r--src/util/u_math.h6
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