1*61046927SAndroid Build Coastguard Worker #ifndef UTIL_BOX_H
2*61046927SAndroid Build Coastguard Worker #define UTIL_BOX_H
3*61046927SAndroid Build Coastguard Worker
4*61046927SAndroid Build Coastguard Worker #include "util/u_math.h"
5*61046927SAndroid Build Coastguard Worker #include "util/format/u_format.h"
6*61046927SAndroid Build Coastguard Worker
7*61046927SAndroid Build Coastguard Worker /**
8*61046927SAndroid Build Coastguard Worker * Subregion of 1D/2D/3D image resource.
9*61046927SAndroid Build Coastguard Worker */
10*61046927SAndroid Build Coastguard Worker struct pipe_box
11*61046927SAndroid Build Coastguard Worker {
12*61046927SAndroid Build Coastguard Worker /* Only "x" and "width" are used to represent buffer ranges.
13*61046927SAndroid Build Coastguard Worker * The maximum representable texture size is ANY x ANY x 16K.
14*61046927SAndroid Build Coastguard Worker */
15*61046927SAndroid Build Coastguard Worker int32_t x;
16*61046927SAndroid Build Coastguard Worker int32_t width;
17*61046927SAndroid Build Coastguard Worker int32_t y;
18*61046927SAndroid Build Coastguard Worker int32_t height;
19*61046927SAndroid Build Coastguard Worker int16_t z;
20*61046927SAndroid Build Coastguard Worker int16_t depth;
21*61046927SAndroid Build Coastguard Worker };
22*61046927SAndroid Build Coastguard Worker
23*61046927SAndroid Build Coastguard Worker static inline void
u_box_1d(unsigned x,unsigned w,struct pipe_box * box)24*61046927SAndroid Build Coastguard Worker u_box_1d(unsigned x, unsigned w, struct pipe_box *box)
25*61046927SAndroid Build Coastguard Worker {
26*61046927SAndroid Build Coastguard Worker box->x = x;
27*61046927SAndroid Build Coastguard Worker box->y = 0;
28*61046927SAndroid Build Coastguard Worker box->z = 0;
29*61046927SAndroid Build Coastguard Worker box->width = w;
30*61046927SAndroid Build Coastguard Worker box->height = 1;
31*61046927SAndroid Build Coastguard Worker box->depth = 1;
32*61046927SAndroid Build Coastguard Worker }
33*61046927SAndroid Build Coastguard Worker
34*61046927SAndroid Build Coastguard Worker static inline void
u_box_2d(unsigned x,unsigned y,unsigned w,unsigned h,struct pipe_box * box)35*61046927SAndroid Build Coastguard Worker u_box_2d(unsigned x,unsigned y, unsigned w, unsigned h, struct pipe_box *box)
36*61046927SAndroid Build Coastguard Worker {
37*61046927SAndroid Build Coastguard Worker box->x = x;
38*61046927SAndroid Build Coastguard Worker box->y = y;
39*61046927SAndroid Build Coastguard Worker box->z = 0;
40*61046927SAndroid Build Coastguard Worker box->width = w;
41*61046927SAndroid Build Coastguard Worker box->height = h;
42*61046927SAndroid Build Coastguard Worker box->depth = 1;
43*61046927SAndroid Build Coastguard Worker }
44*61046927SAndroid Build Coastguard Worker
45*61046927SAndroid Build Coastguard Worker static inline void
u_box_origin_2d(unsigned w,unsigned h,struct pipe_box * box)46*61046927SAndroid Build Coastguard Worker u_box_origin_2d(unsigned w, unsigned h, struct pipe_box *box)
47*61046927SAndroid Build Coastguard Worker {
48*61046927SAndroid Build Coastguard Worker box->x = 0;
49*61046927SAndroid Build Coastguard Worker box->y = 0;
50*61046927SAndroid Build Coastguard Worker box->z = 0;
51*61046927SAndroid Build Coastguard Worker box->width = w;
52*61046927SAndroid Build Coastguard Worker box->height = h;
53*61046927SAndroid Build Coastguard Worker box->depth = 1;
54*61046927SAndroid Build Coastguard Worker }
55*61046927SAndroid Build Coastguard Worker
56*61046927SAndroid Build Coastguard Worker static inline void
u_box_2d_zslice(unsigned x,unsigned y,unsigned z,unsigned w,unsigned h,struct pipe_box * box)57*61046927SAndroid Build Coastguard Worker u_box_2d_zslice(unsigned x, unsigned y, unsigned z,
58*61046927SAndroid Build Coastguard Worker unsigned w, unsigned h, struct pipe_box *box)
59*61046927SAndroid Build Coastguard Worker {
60*61046927SAndroid Build Coastguard Worker box->x = x;
61*61046927SAndroid Build Coastguard Worker box->y = y;
62*61046927SAndroid Build Coastguard Worker box->z = z;
63*61046927SAndroid Build Coastguard Worker box->width = w;
64*61046927SAndroid Build Coastguard Worker box->height = h;
65*61046927SAndroid Build Coastguard Worker box->depth = 1;
66*61046927SAndroid Build Coastguard Worker }
67*61046927SAndroid Build Coastguard Worker
68*61046927SAndroid Build Coastguard Worker static inline void
u_box_3d(unsigned x,unsigned y,unsigned z,unsigned w,unsigned h,unsigned d,struct pipe_box * box)69*61046927SAndroid Build Coastguard Worker u_box_3d(unsigned x, unsigned y, unsigned z,
70*61046927SAndroid Build Coastguard Worker unsigned w, unsigned h, unsigned d,
71*61046927SAndroid Build Coastguard Worker struct pipe_box *box)
72*61046927SAndroid Build Coastguard Worker {
73*61046927SAndroid Build Coastguard Worker box->x = x;
74*61046927SAndroid Build Coastguard Worker box->y = y;
75*61046927SAndroid Build Coastguard Worker box->z = z;
76*61046927SAndroid Build Coastguard Worker box->width = w;
77*61046927SAndroid Build Coastguard Worker box->height = h;
78*61046927SAndroid Build Coastguard Worker box->depth = d;
79*61046927SAndroid Build Coastguard Worker }
80*61046927SAndroid Build Coastguard Worker
81*61046927SAndroid Build Coastguard Worker /* Clips @dst to width @w and height @h.
82*61046927SAndroid Build Coastguard Worker * Returns -1 if the resulting box would be empty (then @dst is left unchanged).
83*61046927SAndroid Build Coastguard Worker * 0 if nothing has been reduced.
84*61046927SAndroid Build Coastguard Worker * 1 if width has been reduced.
85*61046927SAndroid Build Coastguard Worker * 2 if height has been reduced.
86*61046927SAndroid Build Coastguard Worker * 3 if both width and height have been reduced.
87*61046927SAndroid Build Coastguard Worker * Aliasing permitted.
88*61046927SAndroid Build Coastguard Worker */
89*61046927SAndroid Build Coastguard Worker static inline int
u_box_clip_2d(struct pipe_box * dst,const struct pipe_box * box,int w,int h)90*61046927SAndroid Build Coastguard Worker u_box_clip_2d(struct pipe_box *dst,
91*61046927SAndroid Build Coastguard Worker const struct pipe_box *box, int w, int h)
92*61046927SAndroid Build Coastguard Worker {
93*61046927SAndroid Build Coastguard Worker unsigned i;
94*61046927SAndroid Build Coastguard Worker int a[2], b[2], dim[2];
95*61046927SAndroid Build Coastguard Worker int *start, *end;
96*61046927SAndroid Build Coastguard Worker int res = 0;
97*61046927SAndroid Build Coastguard Worker
98*61046927SAndroid Build Coastguard Worker if (!box->width || !box->height)
99*61046927SAndroid Build Coastguard Worker return -1;
100*61046927SAndroid Build Coastguard Worker dim[0] = w;
101*61046927SAndroid Build Coastguard Worker dim[1] = h;
102*61046927SAndroid Build Coastguard Worker a[0] = box->x;
103*61046927SAndroid Build Coastguard Worker a[1] = box->y;
104*61046927SAndroid Build Coastguard Worker b[0] = box->x + box->width;
105*61046927SAndroid Build Coastguard Worker b[1] = box->y + box->height;
106*61046927SAndroid Build Coastguard Worker
107*61046927SAndroid Build Coastguard Worker for (i = 0; i < 2; ++i) {
108*61046927SAndroid Build Coastguard Worker start = (a[i] <= b[i]) ? &a[i] : &b[i];
109*61046927SAndroid Build Coastguard Worker end = (a[i] <= b[i]) ? &b[i] : &a[i];
110*61046927SAndroid Build Coastguard Worker
111*61046927SAndroid Build Coastguard Worker if (*end < 0 || *start >= dim[i])
112*61046927SAndroid Build Coastguard Worker return -1;
113*61046927SAndroid Build Coastguard Worker if (*start < 0) {
114*61046927SAndroid Build Coastguard Worker *start = 0;
115*61046927SAndroid Build Coastguard Worker res |= (1 << i);
116*61046927SAndroid Build Coastguard Worker }
117*61046927SAndroid Build Coastguard Worker if (*end > dim[i]) {
118*61046927SAndroid Build Coastguard Worker *end = dim[i];
119*61046927SAndroid Build Coastguard Worker res |= (1 << i);
120*61046927SAndroid Build Coastguard Worker }
121*61046927SAndroid Build Coastguard Worker }
122*61046927SAndroid Build Coastguard Worker
123*61046927SAndroid Build Coastguard Worker if (res) {
124*61046927SAndroid Build Coastguard Worker dst->x = a[0];
125*61046927SAndroid Build Coastguard Worker dst->y = a[1];
126*61046927SAndroid Build Coastguard Worker dst->width = b[0] - a[0];
127*61046927SAndroid Build Coastguard Worker dst->height = b[1] - a[1];
128*61046927SAndroid Build Coastguard Worker }
129*61046927SAndroid Build Coastguard Worker return res;
130*61046927SAndroid Build Coastguard Worker }
131*61046927SAndroid Build Coastguard Worker
132*61046927SAndroid Build Coastguard Worker static inline int64_t
u_box_volume_3d(const struct pipe_box * box)133*61046927SAndroid Build Coastguard Worker u_box_volume_3d(const struct pipe_box *box)
134*61046927SAndroid Build Coastguard Worker {
135*61046927SAndroid Build Coastguard Worker return (int64_t)box->width * box->height * box->depth;
136*61046927SAndroid Build Coastguard Worker }
137*61046927SAndroid Build Coastguard Worker
138*61046927SAndroid Build Coastguard Worker /* Aliasing of @dst permitted. Supports empty width */
139*61046927SAndroid Build Coastguard Worker static inline void
u_box_union_1d(struct pipe_box * dst,const struct pipe_box * a,const struct pipe_box * b)140*61046927SAndroid Build Coastguard Worker u_box_union_1d(struct pipe_box *dst,
141*61046927SAndroid Build Coastguard Worker const struct pipe_box *a, const struct pipe_box *b)
142*61046927SAndroid Build Coastguard Worker {
143*61046927SAndroid Build Coastguard Worker int x, width;
144*61046927SAndroid Build Coastguard Worker
145*61046927SAndroid Build Coastguard Worker if (a->width == 0) {
146*61046927SAndroid Build Coastguard Worker x = b->x;
147*61046927SAndroid Build Coastguard Worker width = b->width;
148*61046927SAndroid Build Coastguard Worker } else if (b->width == 0) {
149*61046927SAndroid Build Coastguard Worker x = a->x;
150*61046927SAndroid Build Coastguard Worker width = a->width;
151*61046927SAndroid Build Coastguard Worker } else {
152*61046927SAndroid Build Coastguard Worker x = MIN2(a->x, b->x);
153*61046927SAndroid Build Coastguard Worker width = MAX2(a->x + a->width, b->x + b->width) - x;
154*61046927SAndroid Build Coastguard Worker }
155*61046927SAndroid Build Coastguard Worker
156*61046927SAndroid Build Coastguard Worker dst->x = x;
157*61046927SAndroid Build Coastguard Worker dst->width = width;
158*61046927SAndroid Build Coastguard Worker }
159*61046927SAndroid Build Coastguard Worker
160*61046927SAndroid Build Coastguard Worker /* Aliasing of @dst permitted. */
161*61046927SAndroid Build Coastguard Worker static inline void
u_box_intersect_1d(struct pipe_box * dst,const struct pipe_box * a,const struct pipe_box * b)162*61046927SAndroid Build Coastguard Worker u_box_intersect_1d(struct pipe_box *dst,
163*61046927SAndroid Build Coastguard Worker const struct pipe_box *a, const struct pipe_box *b)
164*61046927SAndroid Build Coastguard Worker {
165*61046927SAndroid Build Coastguard Worker int x;
166*61046927SAndroid Build Coastguard Worker
167*61046927SAndroid Build Coastguard Worker x = MAX2(a->x, b->x);
168*61046927SAndroid Build Coastguard Worker
169*61046927SAndroid Build Coastguard Worker dst->width = MIN2(a->x + a->width, b->x + b->width) - x;
170*61046927SAndroid Build Coastguard Worker dst->x = x;
171*61046927SAndroid Build Coastguard Worker if (dst->width <= 0) {
172*61046927SAndroid Build Coastguard Worker dst->x = 0;
173*61046927SAndroid Build Coastguard Worker dst->width = 0;
174*61046927SAndroid Build Coastguard Worker }
175*61046927SAndroid Build Coastguard Worker }
176*61046927SAndroid Build Coastguard Worker
177*61046927SAndroid Build Coastguard Worker /* Aliasing of @dst permitted. */
178*61046927SAndroid Build Coastguard Worker static inline void
u_box_union_2d(struct pipe_box * dst,const struct pipe_box * a,const struct pipe_box * b)179*61046927SAndroid Build Coastguard Worker u_box_union_2d(struct pipe_box *dst,
180*61046927SAndroid Build Coastguard Worker const struct pipe_box *a, const struct pipe_box *b)
181*61046927SAndroid Build Coastguard Worker {
182*61046927SAndroid Build Coastguard Worker int x, y;
183*61046927SAndroid Build Coastguard Worker
184*61046927SAndroid Build Coastguard Worker x = MIN2(a->x, b->x);
185*61046927SAndroid Build Coastguard Worker y = MIN2(a->y, b->y);
186*61046927SAndroid Build Coastguard Worker
187*61046927SAndroid Build Coastguard Worker dst->width = MAX2(a->x + a->width, b->x + b->width) - x;
188*61046927SAndroid Build Coastguard Worker dst->height = MAX2(a->y + a->height, b->y + b->height) - y;
189*61046927SAndroid Build Coastguard Worker dst->x = x;
190*61046927SAndroid Build Coastguard Worker dst->y = y;
191*61046927SAndroid Build Coastguard Worker }
192*61046927SAndroid Build Coastguard Worker
193*61046927SAndroid Build Coastguard Worker /* Aliasing of @dst permitted. */
194*61046927SAndroid Build Coastguard Worker static inline void
u_box_union_3d(struct pipe_box * dst,const struct pipe_box * a,const struct pipe_box * b)195*61046927SAndroid Build Coastguard Worker u_box_union_3d(struct pipe_box *dst,
196*61046927SAndroid Build Coastguard Worker const struct pipe_box *a, const struct pipe_box *b)
197*61046927SAndroid Build Coastguard Worker {
198*61046927SAndroid Build Coastguard Worker int x, y, z;
199*61046927SAndroid Build Coastguard Worker
200*61046927SAndroid Build Coastguard Worker x = MIN2(a->x, b->x);
201*61046927SAndroid Build Coastguard Worker y = MIN2(a->y, b->y);
202*61046927SAndroid Build Coastguard Worker z = MIN2(a->z, b->z);
203*61046927SAndroid Build Coastguard Worker
204*61046927SAndroid Build Coastguard Worker dst->width = MAX2(a->x + a->width, b->x + b->width) - x;
205*61046927SAndroid Build Coastguard Worker dst->height = MAX2(a->y + a->height, b->y + b->height) - y;
206*61046927SAndroid Build Coastguard Worker dst->depth = MAX2(a->z + a->depth, b->z + b->depth) - z;
207*61046927SAndroid Build Coastguard Worker dst->x = x;
208*61046927SAndroid Build Coastguard Worker dst->y = y;
209*61046927SAndroid Build Coastguard Worker dst->z = z;
210*61046927SAndroid Build Coastguard Worker }
211*61046927SAndroid Build Coastguard Worker
212*61046927SAndroid Build Coastguard Worker static inline bool
u_box_test_intersection_1d(const struct pipe_box * a,const struct pipe_box * b)213*61046927SAndroid Build Coastguard Worker u_box_test_intersection_1d(const struct pipe_box *a,
214*61046927SAndroid Build Coastguard Worker const struct pipe_box *b)
215*61046927SAndroid Build Coastguard Worker {
216*61046927SAndroid Build Coastguard Worker int ax[2], bx[2];
217*61046927SAndroid Build Coastguard Worker
218*61046927SAndroid Build Coastguard Worker ax[0] = MIN2(a->x, a->x + a->width);
219*61046927SAndroid Build Coastguard Worker ax[1] = MAX2(a->x, a->x + a->width - 1);
220*61046927SAndroid Build Coastguard Worker
221*61046927SAndroid Build Coastguard Worker bx[0] = MIN2(b->x, b->x + b->width);
222*61046927SAndroid Build Coastguard Worker bx[1] = MAX2(b->x, b->x + b->width - 1);
223*61046927SAndroid Build Coastguard Worker
224*61046927SAndroid Build Coastguard Worker return ax[1] >= bx[0] && bx[1] >= ax[0];
225*61046927SAndroid Build Coastguard Worker }
226*61046927SAndroid Build Coastguard Worker
227*61046927SAndroid Build Coastguard Worker static inline bool
u_box_test_intersection_2d(const struct pipe_box * a,const struct pipe_box * b)228*61046927SAndroid Build Coastguard Worker u_box_test_intersection_2d(const struct pipe_box *a,
229*61046927SAndroid Build Coastguard Worker const struct pipe_box *b)
230*61046927SAndroid Build Coastguard Worker {
231*61046927SAndroid Build Coastguard Worker unsigned i;
232*61046927SAndroid Build Coastguard Worker int a_l[2], a_r[2], b_l[2], b_r[2];
233*61046927SAndroid Build Coastguard Worker
234*61046927SAndroid Build Coastguard Worker a_l[0] = MIN2(a->x, a->x + a->width);
235*61046927SAndroid Build Coastguard Worker a_r[0] = MAX2(a->x, a->x + a->width);
236*61046927SAndroid Build Coastguard Worker a_l[1] = MIN2(a->y, a->y + a->height);
237*61046927SAndroid Build Coastguard Worker a_r[1] = MAX2(a->y, a->y + a->height);
238*61046927SAndroid Build Coastguard Worker
239*61046927SAndroid Build Coastguard Worker b_l[0] = MIN2(b->x, b->x + b->width);
240*61046927SAndroid Build Coastguard Worker b_r[0] = MAX2(b->x, b->x + b->width);
241*61046927SAndroid Build Coastguard Worker b_l[1] = MIN2(b->y, b->y + b->height);
242*61046927SAndroid Build Coastguard Worker b_r[1] = MAX2(b->y, b->y + b->height);
243*61046927SAndroid Build Coastguard Worker
244*61046927SAndroid Build Coastguard Worker for (i = 0; i < 2; ++i) {
245*61046927SAndroid Build Coastguard Worker if (a_l[i] > b_r[i] || a_r[i] < b_l[i])
246*61046927SAndroid Build Coastguard Worker return false;
247*61046927SAndroid Build Coastguard Worker }
248*61046927SAndroid Build Coastguard Worker return true;
249*61046927SAndroid Build Coastguard Worker }
250*61046927SAndroid Build Coastguard Worker
251*61046927SAndroid Build Coastguard Worker static inline bool
u_box_test_intersection_3d(const struct pipe_box * a,const struct pipe_box * b)252*61046927SAndroid Build Coastguard Worker u_box_test_intersection_3d(const struct pipe_box *a,
253*61046927SAndroid Build Coastguard Worker const struct pipe_box *b)
254*61046927SAndroid Build Coastguard Worker {
255*61046927SAndroid Build Coastguard Worker int ax[2], ay[2], ad[2], bx[2], by[2], bd[2];
256*61046927SAndroid Build Coastguard Worker
257*61046927SAndroid Build Coastguard Worker ax[0] = MIN2(a->x, a->x + a->width);
258*61046927SAndroid Build Coastguard Worker ax[1] = MAX2(a->x, a->x + a->width - 1);
259*61046927SAndroid Build Coastguard Worker ay[0] = MIN2(a->y, a->y + a->height);
260*61046927SAndroid Build Coastguard Worker ay[1] = MAX2(a->y, a->y + a->height - 1);
261*61046927SAndroid Build Coastguard Worker ad[0] = MIN2(a->z, a->z + a->depth);
262*61046927SAndroid Build Coastguard Worker ad[1] = MAX2(a->z, a->z + a->depth - 1);
263*61046927SAndroid Build Coastguard Worker
264*61046927SAndroid Build Coastguard Worker bx[0] = MIN2(b->x, b->x + b->width);
265*61046927SAndroid Build Coastguard Worker bx[1] = MAX2(b->x, b->x + b->width - 1);
266*61046927SAndroid Build Coastguard Worker by[0] = MIN2(b->y, b->y + b->height);
267*61046927SAndroid Build Coastguard Worker by[1] = MAX2(b->y, b->y + b->height - 1);
268*61046927SAndroid Build Coastguard Worker bd[0] = MIN2(b->z, b->z + b->depth);
269*61046927SAndroid Build Coastguard Worker bd[1] = MAX2(b->z, b->z + b->depth - 1);
270*61046927SAndroid Build Coastguard Worker
271*61046927SAndroid Build Coastguard Worker return ax[1] >= bx[0] && bx[1] >= ax[0] &&
272*61046927SAndroid Build Coastguard Worker ay[1] >= by[0] && by[1] >= ay[0] &&
273*61046927SAndroid Build Coastguard Worker ad[1] >= bd[0] && bd[1] >= ad[0];
274*61046927SAndroid Build Coastguard Worker }
275*61046927SAndroid Build Coastguard Worker
276*61046927SAndroid Build Coastguard Worker static inline void
u_box_minify_2d(struct pipe_box * dst,const struct pipe_box * src,unsigned l)277*61046927SAndroid Build Coastguard Worker u_box_minify_2d(struct pipe_box *dst,
278*61046927SAndroid Build Coastguard Worker const struct pipe_box *src, unsigned l)
279*61046927SAndroid Build Coastguard Worker {
280*61046927SAndroid Build Coastguard Worker dst->x = src->x >> l;
281*61046927SAndroid Build Coastguard Worker dst->y = src->y >> l;
282*61046927SAndroid Build Coastguard Worker dst->width = MAX2(src->width >> l, 1);
283*61046927SAndroid Build Coastguard Worker dst->height = MAX2(src->height >> l, 1);
284*61046927SAndroid Build Coastguard Worker }
285*61046927SAndroid Build Coastguard Worker
286*61046927SAndroid Build Coastguard Worker static inline void
u_box_minify_3d(struct pipe_box * dst,const struct pipe_box * src,unsigned l)287*61046927SAndroid Build Coastguard Worker u_box_minify_3d(struct pipe_box *dst,
288*61046927SAndroid Build Coastguard Worker const struct pipe_box *src, unsigned l)
289*61046927SAndroid Build Coastguard Worker {
290*61046927SAndroid Build Coastguard Worker dst->x = src->x >> l;
291*61046927SAndroid Build Coastguard Worker dst->y = src->y >> l;
292*61046927SAndroid Build Coastguard Worker dst->z = src->z >> l;
293*61046927SAndroid Build Coastguard Worker dst->width = MAX2(src->width >> l, 1);
294*61046927SAndroid Build Coastguard Worker dst->height = MAX2(src->height >> l, 1);
295*61046927SAndroid Build Coastguard Worker dst->depth = MAX2(src->depth >> l, 1);
296*61046927SAndroid Build Coastguard Worker }
297*61046927SAndroid Build Coastguard Worker
298*61046927SAndroid Build Coastguard Worker /* Converts a box specified in pixels to an equivalent box specified
299*61046927SAndroid Build Coastguard Worker * in blocks, where the boxes represent a region-of-interest of an image with
300*61046927SAndroid Build Coastguard Worker * the given format. This is trivial (a copy) for uncompressed formats.
301*61046927SAndroid Build Coastguard Worker */
302*61046927SAndroid Build Coastguard Worker static inline void
u_box_pixels_to_blocks(struct pipe_box * blocks,const struct pipe_box * pixels,enum pipe_format format)303*61046927SAndroid Build Coastguard Worker u_box_pixels_to_blocks(struct pipe_box *blocks,
304*61046927SAndroid Build Coastguard Worker const struct pipe_box *pixels, enum pipe_format format)
305*61046927SAndroid Build Coastguard Worker {
306*61046927SAndroid Build Coastguard Worker u_box_3d(
307*61046927SAndroid Build Coastguard Worker pixels->x / util_format_get_blockwidth(format),
308*61046927SAndroid Build Coastguard Worker pixels->y / util_format_get_blockheight(format),
309*61046927SAndroid Build Coastguard Worker pixels->z,
310*61046927SAndroid Build Coastguard Worker DIV_ROUND_UP(pixels->width, util_format_get_blockwidth(format)),
311*61046927SAndroid Build Coastguard Worker DIV_ROUND_UP(pixels->height, util_format_get_blockheight(format)),
312*61046927SAndroid Build Coastguard Worker pixels->depth,
313*61046927SAndroid Build Coastguard Worker blocks);
314*61046927SAndroid Build Coastguard Worker }
315*61046927SAndroid Build Coastguard Worker
316*61046927SAndroid Build Coastguard Worker static inline bool
util_is_box_sint16(const struct pipe_box * box)317*61046927SAndroid Build Coastguard Worker util_is_box_sint16(const struct pipe_box *box)
318*61046927SAndroid Build Coastguard Worker {
319*61046927SAndroid Build Coastguard Worker return util_is_sint16(box->x) && util_is_sint16(box->y) &&
320*61046927SAndroid Build Coastguard Worker util_is_sint16(box->z) && util_is_sint16(box->width) &&
321*61046927SAndroid Build Coastguard Worker util_is_sint16(box->height) && util_is_sint16(box->depth) &&
322*61046927SAndroid Build Coastguard Worker util_is_sint16(box->x + box->width) &&
323*61046927SAndroid Build Coastguard Worker util_is_sint16(box->y + box->height) &&
324*61046927SAndroid Build Coastguard Worker util_is_sint16(box->z + box->depth);
325*61046927SAndroid Build Coastguard Worker }
326*61046927SAndroid Build Coastguard Worker
327*61046927SAndroid Build Coastguard Worker 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)328*61046927SAndroid Build Coastguard Worker util_is_box_out_of_bounds(const struct pipe_box *src_box, unsigned coord_mask,
329*61046927SAndroid Build Coastguard Worker unsigned width, unsigned height, unsigned mip_level)
330*61046927SAndroid Build Coastguard Worker {
331*61046927SAndroid Build Coastguard Worker int src_width = u_minify(width, mip_level);
332*61046927SAndroid Build Coastguard Worker int src_height = u_minify(height, mip_level);
333*61046927SAndroid Build Coastguard Worker struct pipe_box box = *src_box;
334*61046927SAndroid Build Coastguard Worker
335*61046927SAndroid Build Coastguard Worker /* Eliminate negative width/height/depth. */
336*61046927SAndroid Build Coastguard Worker if (box.width < 0) {
337*61046927SAndroid Build Coastguard Worker box.x += box.width;
338*61046927SAndroid Build Coastguard Worker box.width *= -1;
339*61046927SAndroid Build Coastguard Worker }
340*61046927SAndroid Build Coastguard Worker if (box.height < 0) {
341*61046927SAndroid Build Coastguard Worker box.y += box.height;
342*61046927SAndroid Build Coastguard Worker box.height *= -1;
343*61046927SAndroid Build Coastguard Worker }
344*61046927SAndroid Build Coastguard Worker
345*61046927SAndroid Build Coastguard Worker bool x_in_bounds = box.x >= 0 && box.x < src_width &&
346*61046927SAndroid Build Coastguard Worker box.x + box.width > 0 && box.x + box.width <= src_width;
347*61046927SAndroid Build Coastguard Worker bool y_in_bounds = box.y >= 0 && box.y < src_height &&
348*61046927SAndroid Build Coastguard Worker box.y + box.height > 0 && box.y + box.height <= src_height;
349*61046927SAndroid Build Coastguard Worker
350*61046927SAndroid Build Coastguard Worker /* Return if the box is not in bounds. */
351*61046927SAndroid Build Coastguard Worker if (coord_mask & BITFIELD_BIT(0) && !x_in_bounds)
352*61046927SAndroid Build Coastguard Worker return true;
353*61046927SAndroid Build Coastguard Worker if (coord_mask & BITFIELD_BIT(1) && !y_in_bounds)
354*61046927SAndroid Build Coastguard Worker return true;
355*61046927SAndroid Build Coastguard Worker
356*61046927SAndroid Build Coastguard Worker return false;
357*61046927SAndroid Build Coastguard Worker }
358*61046927SAndroid Build Coastguard Worker
359*61046927SAndroid Build Coastguard Worker #endif
360