blob: b4e4a17aa7564d24825213b369208c8f2a0522ae [file] [log] [blame]
Leandro Ribeiro859e3f22021-03-15 17:48:45 -03001/*
2 * Copyright © 2021 Collabora, Ltd.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining
5 * a copy of this software and associated documentation files (the
6 * "Software"), to deal in the Software without restriction, including
7 * without limitation the rights to use, copy, modify, merge, publish,
8 * distribute, sublicense, and/or sell copies of the Software, and to
9 * permit persons to whom the Software is furnished to do so, subject to
10 * the following conditions:
11 *
12 * The above copyright notice and this permission notice (including the
13 * next paragraph) shall be included in all copies or substantial
14 * portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
20 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
21 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23 * SOFTWARE.
24 */
25
26#include "config.h"
27
28#include <assert.h>
29
30#include <libweston/libweston.h>
31#include <libweston-internal.h>
32#include "shared/weston-drm-fourcc.h"
33
34#include "weston-test-client-helper.h"
35#include "weston-test-fixture-compositor.h"
36
37/* Add multiple formats to weston_drm_format_array and add the same set of
38 * modifiers to each format. */
39#define ADD_FORMATS_AND_MODS(dest, formats, mods) \
40do { \
41 unsigned int i; \
42 for (i = 0; i < ARRAY_LENGTH(formats); i++) \
43 format_array_add_format_and_modifiers(dest, (formats)[i], \
44 mods, ARRAY_LENGTH(mods)); \
45} while (0)
46
47/* Same as ADD_FORMATS_AND_MODS, but add the formats in reverse order. */
48#define ADD_FORMATS_AND_MODS_REVERSE(dest, formats, mods) \
49do { \
50 int i; \
51 for (i = ARRAY_LENGTH(formats) - 1; i >= 0; i--) \
52 format_array_add_format_and_modifiers(dest, (formats)[i], \
53 mods, ARRAY_LENGTH(mods)); \
54} while (0)
55
56static void
57format_array_add_format_and_modifiers(struct weston_drm_format_array *formats,
58 uint32_t format, uint64_t *modifiers,
59 unsigned int num_modifiers)
60{
61 struct weston_drm_format *fmt;
62 unsigned int i;
63 int ret;
64
65 fmt = weston_drm_format_array_add_format(formats, format);
66 assert(fmt);
67
68 for (i = 0; i < num_modifiers; i++) {
69 ret = weston_drm_format_add_modifier(fmt, modifiers[i]);
70 assert(ret == 0);
71 }
72}
73
74TEST(basic_operations)
75{
Leandro Ribeiro0750cea2021-08-30 16:32:03 -030076 struct weston_drm_format_array format_array;
Leandro Ribeiro859e3f22021-03-15 17:48:45 -030077 struct weston_drm_format *fmt;
78 uint32_t formats[] = {1, 2, 3, 4, 5};
79 uint64_t modifiers[] = {11, 12, 13, 14, 15};
80 unsigned int i, j;
81
Leandro Ribeiro0750cea2021-08-30 16:32:03 -030082 weston_drm_format_array_init(&format_array);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -030083
Leandro Ribeiro60c7fee2021-10-06 12:05:40 -030084 assert(weston_drm_format_array_count_pairs(&format_array) == 0);
85
Leandro Ribeiro0750cea2021-08-30 16:32:03 -030086 ADD_FORMATS_AND_MODS(&format_array, formats, modifiers);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -030087
88 for (i = 0; i < ARRAY_LENGTH(formats); i++) {
Leandro Ribeiro0750cea2021-08-30 16:32:03 -030089 fmt = weston_drm_format_array_find_format(&format_array, formats[i]);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -030090 assert(fmt && fmt->format == formats[i]);
91 for (j = 0; j < ARRAY_LENGTH(modifiers); j++)
92 assert(weston_drm_format_has_modifier(fmt, modifiers[j]));
93 }
94
Leandro Ribeiro60c7fee2021-10-06 12:05:40 -030095 assert(weston_drm_format_array_count_pairs(&format_array) ==
96 ARRAY_LENGTH(formats) * ARRAY_LENGTH(modifiers));
97
Leandro Ribeiro0750cea2021-08-30 16:32:03 -030098 weston_drm_format_array_fini(&format_array);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -030099}
100
101TEST(compare_arrays_same_content)
102{
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300103 struct weston_drm_format_array format_array_A, format_array_B;
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300104 uint32_t formats[] = {1, 2, 3, 4, 5};
105 uint64_t modifiers[] = {11, 12, 13, 14, 15};
106
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300107 weston_drm_format_array_init(&format_array_A);
108 weston_drm_format_array_init(&format_array_B);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300109
110 /* Both are empty arrays, so they have the same content. */
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300111 assert(weston_drm_format_array_equal(&format_array_A, &format_array_B));
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300112
113 /* Test non-empty arrays with same content. */
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300114 ADD_FORMATS_AND_MODS(&format_array_A, formats, modifiers);
115 ADD_FORMATS_AND_MODS(&format_array_B, formats, modifiers);
116 assert(weston_drm_format_array_equal(&format_array_A, &format_array_B));
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300117
118 /* Test non-empty arrays with same content, but add elements to B in
119 * reverse order. This is important as in the future we may keep
120 * DRM-format arrays ordered to improve performance. */
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300121 weston_drm_format_array_fini(&format_array_B);
122 weston_drm_format_array_init(&format_array_B);
123 ADD_FORMATS_AND_MODS_REVERSE(&format_array_B, formats, modifiers);
124 assert(weston_drm_format_array_equal(&format_array_A, &format_array_B));
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300125
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300126 weston_drm_format_array_fini(&format_array_A);
127 weston_drm_format_array_fini(&format_array_B);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300128}
129
130TEST(compare_arrays_exclusive_content)
131{
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300132 struct weston_drm_format_array format_array_A, format_array_B;
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300133 uint32_t formats_A[] = {1, 2, 3, 4, 5};
134 uint32_t formats_B[] = {6, 7, 8, 9, 10};
135 uint64_t modifiers_A[] = {11, 12, 13, 14, 15};
136 uint64_t modifiers_B[] = {16, 17, 18, 19, 20};
137
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300138 weston_drm_format_array_init(&format_array_A);
139 weston_drm_format_array_init(&format_array_B);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300140
141 /* Arrays with formats that are mutually exclusive. */
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300142 ADD_FORMATS_AND_MODS(&format_array_A, formats_A, modifiers_A);
143 ADD_FORMATS_AND_MODS(&format_array_B, formats_B, modifiers_B);
144 assert(!weston_drm_format_array_equal(&format_array_A, &format_array_B));
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300145
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300146 weston_drm_format_array_fini(&format_array_A);
147 weston_drm_format_array_fini(&format_array_B);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300148}
149
150TEST(replace_array)
151{
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300152 struct weston_drm_format_array format_array_A, format_array_B;
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300153 uint32_t formats[] = {1, 2, 3, 4, 5};
154 uint64_t modifiers[] = {11, 12, 13, 14, 15};
155 int ret;
156
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300157 weston_drm_format_array_init(&format_array_A);
158 weston_drm_format_array_init(&format_array_B);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300159
160 /* Replace content of B with the content of A, so they should
161 * have the same content. */
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300162 ADD_FORMATS_AND_MODS(&format_array_A, formats, modifiers);
163 ret = weston_drm_format_array_replace(&format_array_B, &format_array_A);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300164 assert(ret == 0);
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300165 assert(weston_drm_format_array_equal(&format_array_A, &format_array_B));
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300166
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300167 weston_drm_format_array_fini(&format_array_A);
168 weston_drm_format_array_fini(&format_array_B);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300169}
170
171TEST(remove_from_array)
172{
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300173 struct weston_drm_format_array format_array_A, format_array_B, format_array_C;
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300174 uint32_t formats_A[] = {1, 2, 3, 4, 5};
175 uint32_t formats_B[] = {1, 2, 3, 4};
176 uint32_t formats_C[] = {1, 2, 3, 4, 6};
177 uint64_t modifiers[] = {11, 12, 13, 14, 15};
178
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300179 weston_drm_format_array_init(&format_array_A);
180 weston_drm_format_array_init(&format_array_B);
181 weston_drm_format_array_init(&format_array_C);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300182
183 /* After removing latest added format from array A, it should
184 * be equal to B. */
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300185 ADD_FORMATS_AND_MODS(&format_array_A, formats_A, modifiers);
186 ADD_FORMATS_AND_MODS(&format_array_B, formats_B, modifiers);
187 weston_drm_format_array_remove_latest_format(&format_array_A);
188 assert(weston_drm_format_array_equal(&format_array_A, &format_array_B));
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300189
190 /* Add 6 to the format array A, so it should be equal to C. */
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300191 ADD_FORMATS_AND_MODS(&format_array_A, (uint32_t[]){6}, modifiers);
192 ADD_FORMATS_AND_MODS(&format_array_C, formats_C, modifiers);
193 assert(weston_drm_format_array_equal(&format_array_A, &format_array_C));
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300194
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300195 weston_drm_format_array_fini(&format_array_A);
196 weston_drm_format_array_fini(&format_array_B);
197 weston_drm_format_array_fini(&format_array_C);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300198}
199
200TEST(join_arrays)
201{
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300202 struct weston_drm_format_array format_array_A, format_array_B;
203 struct weston_drm_format_array format_array_C;
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300204 uint32_t formats_A[] = {1, 2, 6, 9, 10};
205 uint32_t formats_B[] = {2, 5, 7, 9, 10};
206 uint64_t modifiers_A[] = {1, 2, 3, 4, 7};
207 uint64_t modifiers_B[] = {0, 2, 3, 5, 6};
208 uint64_t modifiers_join[] = {0, 1, 2, 3, 4, 5, 6, 7};
209 int ret;
210
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300211 weston_drm_format_array_init(&format_array_A);
212 weston_drm_format_array_init(&format_array_B);
213 weston_drm_format_array_init(&format_array_C);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300214
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300215 ADD_FORMATS_AND_MODS(&format_array_A, formats_A, modifiers_A);
216 ADD_FORMATS_AND_MODS(&format_array_B, formats_B, modifiers_B);
217 ret = weston_drm_format_array_join(&format_array_A, &format_array_B);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300218 assert(ret == 0);
219
220 /* The result of the joint (which is saved in A) should have
221 * the same content as C. */
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300222 ADD_FORMATS_AND_MODS(&format_array_C, (uint32_t[]){1}, modifiers_A);
223 ADD_FORMATS_AND_MODS(&format_array_C, (uint32_t[]){2}, modifiers_join);
224 ADD_FORMATS_AND_MODS(&format_array_C, (uint32_t[]){5}, modifiers_B);
225 ADD_FORMATS_AND_MODS(&format_array_C, (uint32_t[]){6}, modifiers_A);
226 ADD_FORMATS_AND_MODS(&format_array_C, (uint32_t[]){7}, modifiers_B);
227 ADD_FORMATS_AND_MODS(&format_array_C, (uint32_t[]){9}, modifiers_join);
228 ADD_FORMATS_AND_MODS(&format_array_C, (uint32_t[]){10}, modifiers_join);
229 assert(weston_drm_format_array_equal(&format_array_A, &format_array_C));
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300230
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300231 weston_drm_format_array_fini(&format_array_A);
232 weston_drm_format_array_fini(&format_array_B);
233 weston_drm_format_array_fini(&format_array_C);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300234}
235
236TEST(join_arrays_same_content)
237{
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300238 struct weston_drm_format_array format_array_A, format_array_B;
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300239 uint32_t formats[] = {1, 2, 3, 4, 5};
240 uint64_t modifiers[] = {11, 12, 13, 14, 15};
241 int ret;
242
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300243 weston_drm_format_array_init(&format_array_A);
244 weston_drm_format_array_init(&format_array_B);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300245
246 /* Joint of empty arrays must be empty. */
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300247 ret = weston_drm_format_array_join(&format_array_A, &format_array_B);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300248 assert(ret == 0);
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300249 assert(format_array_A.arr.size == 0);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300250
251 /* Join B, which is empty, with A, which is non-empty. The joint (which
252 * is saved in B) should have the same content as A. */
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300253 ADD_FORMATS_AND_MODS(&format_array_A, formats, modifiers);
254 ret = weston_drm_format_array_join(&format_array_B, &format_array_A);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300255 assert(ret == 0);
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300256 assert(weston_drm_format_array_equal(&format_array_A, &format_array_B));
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300257
258 /* Now A and B are non-empty and have the same content. The joint (which
259 * is saved in A) should not change its content. */
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300260 ret = weston_drm_format_array_join(&format_array_A, &format_array_B);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300261 assert(ret == 0);
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300262 assert(weston_drm_format_array_equal(&format_array_A, &format_array_B));
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300263
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300264 weston_drm_format_array_fini(&format_array_A);
265 weston_drm_format_array_fini(&format_array_B);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300266}
267
268TEST(join_arrays_exclusive_content)
269{
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300270 struct weston_drm_format_array format_array_A, format_array_B;
271 struct weston_drm_format_array format_array_C;
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300272 uint32_t formats_A[] = {1, 2, 3, 4, 5};
273 uint32_t formats_B[] = {6, 7, 8, 9, 10};
274 uint32_t formats_C[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
275 uint64_t modifiers[] = {11, 12, 13, 14, 15};
276 int ret;
277
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300278 weston_drm_format_array_init(&format_array_A);
279 weston_drm_format_array_init(&format_array_B);
280 weston_drm_format_array_init(&format_array_C);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300281
282 /* The joint of DRM-format arrays A and B should be equal to C. */
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300283 ADD_FORMATS_AND_MODS(&format_array_A, formats_A, modifiers);
284 ADD_FORMATS_AND_MODS(&format_array_B, formats_B, modifiers);
285 ADD_FORMATS_AND_MODS(&format_array_C, formats_C, modifiers);
286 ret = weston_drm_format_array_join(&format_array_A, &format_array_B);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300287 assert(ret == 0);
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300288 assert(weston_drm_format_array_equal(&format_array_A, &format_array_C));
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300289
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300290 weston_drm_format_array_fini(&format_array_A);
291 weston_drm_format_array_fini(&format_array_B);
292 weston_drm_format_array_fini(&format_array_C);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300293}
294
295TEST(join_arrays_modifier_invalid)
296{
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300297 struct weston_drm_format_array format_array_A, format_array_B;
298 struct weston_drm_format_array format_array_C;
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300299 uint64_t regular_modifiers[] = {1, 2, 3, 4, 5};
300 uint64_t modifier_invalid[] = {DRM_FORMAT_MOD_INVALID};
301 uint64_t regular_modifiers_plus_invalid[] = {1, 2, 3, 4, 5, DRM_FORMAT_MOD_INVALID};
302 int ret;
303
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300304 weston_drm_format_array_init(&format_array_A);
305 weston_drm_format_array_init(&format_array_B);
306 weston_drm_format_array_init(&format_array_C);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300307
308 /* DRM-format array A has only one format with MOD_INVALID, and B has
309 * the same format but with a regular set of formats. The joint should
310 * contain both MOD_INVALID and the regular modifiers. */
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300311 ADD_FORMATS_AND_MODS(&format_array_A, (uint32_t[]){1}, modifier_invalid);
312 ADD_FORMATS_AND_MODS(&format_array_B, (uint32_t[]){1}, regular_modifiers);
313 ADD_FORMATS_AND_MODS(&format_array_C, (uint32_t[]){1}, regular_modifiers_plus_invalid);
314 ret = weston_drm_format_array_join(&format_array_A, &format_array_B);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300315 assert(ret == 0);
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300316 assert(weston_drm_format_array_equal(&format_array_A, &format_array_C));
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300317
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300318 weston_drm_format_array_fini(&format_array_A);
319 weston_drm_format_array_fini(&format_array_B);
320 weston_drm_format_array_fini(&format_array_C);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300321}
322
323TEST(intersect_arrays)
324{
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300325 struct weston_drm_format_array format_array_A, format_array_B;
326 struct weston_drm_format_array format_array_C;
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300327 uint32_t formats_A[] = {1, 2, 6, 9, 10};
328 uint32_t formats_B[] = {2, 5, 7, 9, 10};
329 uint64_t modifiers_A[] = {1, 2, 3, 4, 7};
330 uint64_t modifiers_B[] = {0, 2, 3, 5, 6};
331 uint64_t modifiers_intersect[] = {2, 3};
Leandro Ribeiroc51d4ad2021-08-30 12:52:26 -0300332 int ret;
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300333
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300334 weston_drm_format_array_init(&format_array_A);
335 weston_drm_format_array_init(&format_array_B);
336 weston_drm_format_array_init(&format_array_C);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300337
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300338 ADD_FORMATS_AND_MODS(&format_array_A, formats_A, modifiers_A);
339 ADD_FORMATS_AND_MODS(&format_array_B, formats_B, modifiers_B);
340 ret = weston_drm_format_array_intersect(&format_array_A, &format_array_B);
Leandro Ribeiroc51d4ad2021-08-30 12:52:26 -0300341 assert(ret == 0);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300342
Leandro Ribeiroc51d4ad2021-08-30 12:52:26 -0300343 /* The result of the intersection (stored in A) should have the same
344 * content as C. */
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300345 ADD_FORMATS_AND_MODS(&format_array_C, (uint32_t[]){2}, modifiers_intersect);
346 ADD_FORMATS_AND_MODS(&format_array_C, (uint32_t[]){9}, modifiers_intersect);
347 ADD_FORMATS_AND_MODS(&format_array_C, (uint32_t[]){10}, modifiers_intersect);
348 assert(weston_drm_format_array_equal(&format_array_A, &format_array_C));
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300349
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300350 weston_drm_format_array_fini(&format_array_A);
351 weston_drm_format_array_fini(&format_array_B);
352 weston_drm_format_array_fini(&format_array_C);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300353}
354
355TEST(intersect_arrays_same_content)
356{
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300357 struct weston_drm_format_array format_array_A, format_array_B;
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300358 uint32_t formats[] = {1, 2, 3, 4, 5};
359 uint64_t modifiers[] = {11, 12, 13, 14, 15};
360 int ret;
361
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300362 weston_drm_format_array_init(&format_array_A);
363 weston_drm_format_array_init(&format_array_B);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300364
365 /* The intersection between two empty arrays must be an
366 * empty array. */
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300367 ret = weston_drm_format_array_intersect(&format_array_A, &format_array_B);
Leandro Ribeiroc51d4ad2021-08-30 12:52:26 -0300368 assert(ret == 0);
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300369 assert(format_array_A.arr.size == 0);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300370
371 /* DRM-format arrays A and B have the same content, so the intersection
Leandro Ribeiroc51d4ad2021-08-30 12:52:26 -0300372 * should be equal to them. A keeps the result of the intersection, and B
373 * does not change. So we compare them. */
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300374 ADD_FORMATS_AND_MODS(&format_array_A, formats, modifiers);
375 ret = weston_drm_format_array_replace(&format_array_B, &format_array_A);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300376 assert(ret == 0);
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300377 ret = weston_drm_format_array_intersect(&format_array_A, &format_array_B);
Leandro Ribeiroc51d4ad2021-08-30 12:52:26 -0300378 assert(ret == 0);
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300379 assert(weston_drm_format_array_equal(&format_array_A, &format_array_B));
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300380
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300381 weston_drm_format_array_fini(&format_array_A);
382 weston_drm_format_array_fini(&format_array_B);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300383}
384
385TEST(intersect_arrays_exclusive_formats)
386{
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300387 struct weston_drm_format_array format_array_A, format_array_B;
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300388 uint64_t formats_A[] = {1, 2, 3, 4, 5};
389 uint64_t formats_B[] = {6, 7, 8, 9, 10};
390 uint64_t modifiers[] = {11, 12, 13, 14, 15};
Leandro Ribeiroc51d4ad2021-08-30 12:52:26 -0300391 int ret;
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300392
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300393 weston_drm_format_array_init(&format_array_A);
394 weston_drm_format_array_init(&format_array_B);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300395
396 /* DRM-format arrays A and B have formats that are mutually exclusive,
Leandro Ribeiroc51d4ad2021-08-30 12:52:26 -0300397 * so the intersection (which is stored in A) must be empty. */
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300398 ADD_FORMATS_AND_MODS(&format_array_A, formats_A, modifiers);
399 ADD_FORMATS_AND_MODS(&format_array_B, formats_B, modifiers);
400 ret = weston_drm_format_array_intersect(&format_array_A, &format_array_B);
Leandro Ribeiroc51d4ad2021-08-30 12:52:26 -0300401 assert(ret == 0);
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300402 assert(format_array_A.arr.size == 0);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300403
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300404 weston_drm_format_array_fini(&format_array_A);
405 weston_drm_format_array_fini(&format_array_B);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300406}
407
408TEST(intersect_arrays_exclusive_modifiers)
409{
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300410 struct weston_drm_format_array format_array_A, format_array_B;
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300411 uint64_t modifiers_A[] = {1, 2, 3, 4, 5};
412 uint64_t modifiers_B[] = {6, 7, 8, 9, 10};
Leandro Ribeiroc51d4ad2021-08-30 12:52:26 -0300413 int ret;
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300414
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300415 weston_drm_format_array_init(&format_array_A);
416 weston_drm_format_array_init(&format_array_B);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300417
418 /* Both DRM-format arrays A and B have the same format but with modifier
Leandro Ribeiroc51d4ad2021-08-30 12:52:26 -0300419 * sets that are mutually exclusive. The intersection (which is stored
420 * in A) between mutually exclusive modifier must be empty, and so the
421 * format should not be added to the array. So the array must also be
422 * empty. */
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300423 ADD_FORMATS_AND_MODS(&format_array_A, (uint32_t[]){1}, modifiers_A);
424 ADD_FORMATS_AND_MODS(&format_array_B, (uint32_t[]){1}, modifiers_B);
425 ret = weston_drm_format_array_intersect(&format_array_A, &format_array_B);
Leandro Ribeiroc51d4ad2021-08-30 12:52:26 -0300426 assert(ret == 0);
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300427 assert(format_array_A.arr.size == 0);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300428
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300429 weston_drm_format_array_fini(&format_array_A);
430 weston_drm_format_array_fini(&format_array_B);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300431}
432
433TEST(subtract_arrays)
434{
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300435 struct weston_drm_format_array format_array_A, format_array_B;
436 struct weston_drm_format_array format_array_C;
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300437 uint32_t formats_A[] = {1, 2, 6, 9, 10};
438 uint32_t formats_B[] = {2, 5, 7, 9, 10};
439 uint64_t modifiers_A[] = {1, 2, 3, 4, 7};
440 uint64_t modifiers_B[] = {0, 2, 3, 5, 6};
441 uint64_t modifiers_subtract[] = {1, 4, 7};
442 int ret;
443
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300444 weston_drm_format_array_init(&format_array_A);
445 weston_drm_format_array_init(&format_array_B);
446 weston_drm_format_array_init(&format_array_C);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300447
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300448 ADD_FORMATS_AND_MODS(&format_array_A, formats_A, modifiers_A);
449 ADD_FORMATS_AND_MODS(&format_array_B, formats_B, modifiers_B);
450 ret = weston_drm_format_array_subtract(&format_array_A, &format_array_B);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300451 assert(ret == 0);
452
453 /* The result of the subtraction (which is saved in A) should have
454 * the same content as C. */
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300455 ADD_FORMATS_AND_MODS(&format_array_C, (uint32_t[]){1}, modifiers_A);
456 ADD_FORMATS_AND_MODS(&format_array_C, (uint32_t[]){2}, modifiers_subtract);
457 ADD_FORMATS_AND_MODS(&format_array_C, (uint32_t[]){6}, modifiers_A);
458 ADD_FORMATS_AND_MODS(&format_array_C, (uint32_t[]){9}, modifiers_subtract);
459 ADD_FORMATS_AND_MODS(&format_array_C, (uint32_t[]){10}, modifiers_subtract);
460 assert(weston_drm_format_array_equal(&format_array_A, &format_array_C));
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300461
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300462 weston_drm_format_array_fini(&format_array_A);
463 weston_drm_format_array_fini(&format_array_B);
464 weston_drm_format_array_fini(&format_array_C);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300465}
466
467TEST(subtract_arrays_same_content)
468{
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300469 struct weston_drm_format_array format_array_A, format_array_B;
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300470 uint32_t formats[] = {1, 2, 3, 4, 5};
471 uint64_t modifiers[] = {11, 12, 13, 14, 15};
472 int ret;
473
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300474 weston_drm_format_array_init(&format_array_A);
475 weston_drm_format_array_init(&format_array_B);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300476
477 /* Minuend and subtrahend have the same content. The subtraction
478 * (which is saved in A) should be an empty array. */
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300479 ADD_FORMATS_AND_MODS(&format_array_A, formats, modifiers);
480 ret = weston_drm_format_array_replace(&format_array_B, &format_array_A);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300481 assert(ret == 0);
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300482 ret = weston_drm_format_array_subtract(&format_array_A, &format_array_B);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300483 assert(ret == 0);
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300484 assert(format_array_A.arr.size == 0);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300485
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300486 weston_drm_format_array_fini(&format_array_A);
487 weston_drm_format_array_fini(&format_array_B);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300488}
489
490TEST(subtract_arrays_exclusive_formats)
491{
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300492 struct weston_drm_format_array format_array_A, format_array_B;
493 struct weston_drm_format_array format_array_C;
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300494 uint32_t formats_A[] = {1, 2, 3, 4, 5};
495 uint32_t formats_B[] = {6, 7, 8, 9, 10};
496 uint64_t modifiers[] = {11, 12, 13, 14, 15};
497 int ret;
498
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300499 weston_drm_format_array_init(&format_array_A);
500 weston_drm_format_array_init(&format_array_B);
501 weston_drm_format_array_init(&format_array_C);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300502
503 /* Minuend and subtrahend have mutually exclusive formats. The
504 * subtraction (which is saved in A) should be equal the minuend. */
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300505 ADD_FORMATS_AND_MODS(&format_array_A, formats_A, modifiers);
506 ADD_FORMATS_AND_MODS(&format_array_B, formats_B, modifiers);
507 ret = weston_drm_format_array_replace(&format_array_C, &format_array_A);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300508 assert(ret == 0);
509
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300510 ret = weston_drm_format_array_subtract(&format_array_A, &format_array_B);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300511 assert(ret == 0);
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300512 assert(weston_drm_format_array_equal(&format_array_A, &format_array_C));
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300513
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300514 weston_drm_format_array_fini(&format_array_A);
515 weston_drm_format_array_fini(&format_array_B);
516 weston_drm_format_array_fini(&format_array_C);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300517}
518
519TEST(subtract_arrays_exclusive_modifiers)
520{
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300521 struct weston_drm_format_array format_array_A, format_array_B;
522 struct weston_drm_format_array format_array_C;
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300523 uint64_t modifiers_A[] = {1, 2, 3, 4, 5};
524 uint64_t modifiers_B[] = {6, 7, 8, 9, 10};
525 int ret;
526
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300527 weston_drm_format_array_init(&format_array_A);
528 weston_drm_format_array_init(&format_array_B);
529 weston_drm_format_array_init(&format_array_C);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300530
531 /* Minuend and subtrahend have the same format but with modifiers that
532 * are mutually exclusive. The subtraction (which is saved in A) should
533 * contain the format and the modifier set of the minuend. */
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300534 ADD_FORMATS_AND_MODS(&format_array_A, (uint32_t[]){1}, modifiers_A);
535 ADD_FORMATS_AND_MODS(&format_array_B, (uint32_t[]){1}, modifiers_B);
536 ret = weston_drm_format_array_replace(&format_array_C, &format_array_A);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300537 assert(ret == 0);
538
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300539 ret = weston_drm_format_array_subtract(&format_array_A, &format_array_B);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300540 assert(ret == 0);
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300541 assert(weston_drm_format_array_equal(&format_array_A, &format_array_C));
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300542
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300543 weston_drm_format_array_fini(&format_array_A);
544 weston_drm_format_array_fini(&format_array_B);
545 weston_drm_format_array_fini(&format_array_C);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300546}
547
548TEST(subtract_arrays_modifier_invalid)
549{
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300550 struct weston_drm_format_array format_array_A, format_array_B;
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300551 uint64_t modifier_invalid[] = {DRM_FORMAT_MOD_INVALID};
552 uint64_t regular_modifiers_plus_invalid[] = {1, 2, 3, 4, 5, DRM_FORMAT_MOD_INVALID};
553 int ret;
554
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300555 weston_drm_format_array_init(&format_array_A);
556 weston_drm_format_array_init(&format_array_B);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300557
558 /* The minuend has a format with modifier set that contains MOD_INVALID
559 * and the subtrahend contains the same format but with a regular set of
560 * modifiers + MOD_INVALID. So the subtraction between the modifiers
561 * sets results in empty, and so the format should not be included to
562 * the result. As it is the only format in the minuend, the resulting
563 * array must be empty. */
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300564 ADD_FORMATS_AND_MODS(&format_array_A, (uint32_t[]){1}, modifier_invalid);
565 ADD_FORMATS_AND_MODS(&format_array_B, (uint32_t[]){1}, regular_modifiers_plus_invalid);
566 ret = weston_drm_format_array_subtract(&format_array_A, &format_array_B);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300567 assert(ret == 0);
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300568 assert(format_array_A.arr.size == 0);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300569
Leandro Ribeiro0750cea2021-08-30 16:32:03 -0300570 weston_drm_format_array_fini(&format_array_A);
571 weston_drm_format_array_fini(&format_array_B);
Leandro Ribeiro859e3f22021-03-15 17:48:45 -0300572}