blitters-test.c revision 1b18d63a
1a450e446Smrg/*
2a450e446Smrg * Test program, which stresses the use of different color formats and
3a450e446Smrg * compositing operations.
4a450e446Smrg *
51b18d63aSmrg * Script 'fuzzer-find-diff.pl' can be used to narrow down the problem in
61b18d63aSmrg * the case of test failure.
7a450e446Smrg */
8a450e446Smrg#include <assert.h>
9a450e446Smrg#include <stdlib.h>
10a450e446Smrg#include <stdio.h>
11a450e446Smrg#include <config.h>
12952204abSmrg#include "utils.h"
13a450e446Smrg
141b18d63aSmrgstatic pixman_indexed_t rgb_palette[9];
151b18d63aSmrgstatic pixman_indexed_t y_palette[9];
16a450e446Smrg
17a450e446Smrg/* Create random image for testing purposes */
18a450e446Smrgstatic pixman_image_t *
19a450e446Smrgcreate_random_image (pixman_format_code_t *allowed_formats,
20a450e446Smrg		     int                   max_width,
21a450e446Smrg		     int                   max_height,
22a450e446Smrg		     int                   max_extra_stride,
23a450e446Smrg		     pixman_format_code_t *used_fmt)
24a450e446Smrg{
25a450e446Smrg    int n = 0, i, width, height, stride;
26a450e446Smrg    pixman_format_code_t fmt;
27a450e446Smrg    uint32_t *buf;
28a450e446Smrg    pixman_image_t *img;
29a450e446Smrg
30a450e446Smrg    while (allowed_formats[n] != -1)
31a450e446Smrg	n++;
32a450e446Smrg    fmt = allowed_formats[lcg_rand_n (n)];
33952204abSmrg
34a450e446Smrg    width = lcg_rand_n (max_width) + 1;
35a450e446Smrg    height = lcg_rand_n (max_height) + 1;
36a450e446Smrg    stride = (width * PIXMAN_FORMAT_BPP (fmt) + 7) / 8 +
37a450e446Smrg	lcg_rand_n (max_extra_stride + 1);
38a450e446Smrg    stride = (stride + 3) & ~3;
39a450e446Smrg
40a450e446Smrg    /* do the allocation */
41a450e446Smrg    buf = aligned_malloc (64, stride * height);
42a450e446Smrg
43a450e446Smrg    /* initialize image with random data */
44a450e446Smrg    for (i = 0; i < stride * height; i++)
45a450e446Smrg    {
46a450e446Smrg	/* generation is biased to having more 0 or 255 bytes as
47a450e446Smrg	 * they are more likely to be special-cased in code
48a450e446Smrg	 */
49a450e446Smrg	*((uint8_t *)buf + i) = lcg_rand_n (4) ? lcg_rand_n (256) :
50a450e446Smrg	    (lcg_rand_n (2) ? 0 : 255);
51a450e446Smrg    }
52a450e446Smrg
53a450e446Smrg    img = pixman_image_create_bits (fmt, width, height, buf, stride);
54a450e446Smrg
551b18d63aSmrg    if (PIXMAN_FORMAT_TYPE (fmt) == PIXMAN_TYPE_COLOR)
561b18d63aSmrg    {
571b18d63aSmrg	pixman_image_set_indexed (img, &(rgb_palette[PIXMAN_FORMAT_BPP (fmt)]));
581b18d63aSmrg    }
591b18d63aSmrg    else if (PIXMAN_FORMAT_TYPE (fmt) == PIXMAN_TYPE_GRAY)
60952204abSmrg    {
611b18d63aSmrg	pixman_image_set_indexed (img, &(y_palette[PIXMAN_FORMAT_BPP (fmt)]));
62952204abSmrg    }
63952204abSmrg
64a450e446Smrg    image_endian_swap (img, PIXMAN_FORMAT_BPP (fmt));
65a450e446Smrg
66a450e446Smrg    if (used_fmt) *used_fmt = fmt;
67a450e446Smrg    return img;
68a450e446Smrg}
69a450e446Smrg
70a450e446Smrg/* Free random image, and optionally update crc32 based on its data */
71a450e446Smrgstatic uint32_t
72a450e446Smrgfree_random_image (uint32_t initcrc,
73a450e446Smrg		   pixman_image_t *img,
74a450e446Smrg		   pixman_format_code_t fmt)
75a450e446Smrg{
76a450e446Smrg    uint32_t crc32 = 0;
77a450e446Smrg    int stride = pixman_image_get_stride (img);
78a450e446Smrg    uint32_t *data = pixman_image_get_data (img);
79952204abSmrg    int height = pixman_image_get_height (img);
80a450e446Smrg
81a450e446Smrg    if (fmt != -1)
82a450e446Smrg    {
83a450e446Smrg	/* mask unused 'x' part */
84a450e446Smrg	if (PIXMAN_FORMAT_BPP (fmt) - PIXMAN_FORMAT_DEPTH (fmt) &&
85a450e446Smrg	    PIXMAN_FORMAT_DEPTH (fmt) != 0)
86a450e446Smrg	{
87a450e446Smrg	    int i;
88a450e446Smrg	    uint32_t *data = pixman_image_get_data (img);
89a450e446Smrg	    uint32_t mask = (1 << PIXMAN_FORMAT_DEPTH (fmt)) - 1;
90a450e446Smrg
91a450e446Smrg	    if (PIXMAN_FORMAT_TYPE (fmt) == PIXMAN_TYPE_BGRA)
92a450e446Smrg		mask <<= (PIXMAN_FORMAT_BPP (fmt) - PIXMAN_FORMAT_DEPTH (fmt));
93a450e446Smrg
94a450e446Smrg	    for (i = 0; i < 32; i++)
95a450e446Smrg		mask |= mask << (i * PIXMAN_FORMAT_BPP (fmt));
96a450e446Smrg
97a450e446Smrg	    for (i = 0; i < stride * height / 4; i++)
98a450e446Smrg		data[i] &= mask;
99a450e446Smrg	}
100a450e446Smrg
101a450e446Smrg	/* swap endiannes in order to provide identical results on both big
102a450e446Smrg	 * and litte endian systems
103a450e446Smrg	 */
104a450e446Smrg	image_endian_swap (img, PIXMAN_FORMAT_BPP (fmt));
105a450e446Smrg	crc32 = compute_crc32 (initcrc, data, stride * height);
106a450e446Smrg    }
107a450e446Smrg
108a450e446Smrg    pixman_image_unref (img);
109a450e446Smrg    free (data);
110a450e446Smrg
111a450e446Smrg    return crc32;
112a450e446Smrg}
113a450e446Smrg
114a450e446Smrgstatic pixman_op_t op_list[] = {
115a450e446Smrg    PIXMAN_OP_SRC,
116a450e446Smrg    PIXMAN_OP_OVER,
117a450e446Smrg    PIXMAN_OP_ADD,
118a450e446Smrg    PIXMAN_OP_CLEAR,
119a450e446Smrg    PIXMAN_OP_SRC,
120a450e446Smrg    PIXMAN_OP_DST,
121a450e446Smrg    PIXMAN_OP_OVER,
122a450e446Smrg    PIXMAN_OP_OVER_REVERSE,
123a450e446Smrg    PIXMAN_OP_IN,
124a450e446Smrg    PIXMAN_OP_IN_REVERSE,
125a450e446Smrg    PIXMAN_OP_OUT,
126a450e446Smrg    PIXMAN_OP_OUT_REVERSE,
127a450e446Smrg    PIXMAN_OP_ATOP,
128a450e446Smrg    PIXMAN_OP_ATOP_REVERSE,
129a450e446Smrg    PIXMAN_OP_XOR,
130a450e446Smrg    PIXMAN_OP_ADD,
131a450e446Smrg    PIXMAN_OP_SATURATE,
132a450e446Smrg    PIXMAN_OP_DISJOINT_CLEAR,
133a450e446Smrg    PIXMAN_OP_DISJOINT_SRC,
134a450e446Smrg    PIXMAN_OP_DISJOINT_DST,
135a450e446Smrg    PIXMAN_OP_DISJOINT_OVER,
136a450e446Smrg    PIXMAN_OP_DISJOINT_OVER_REVERSE,
137a450e446Smrg    PIXMAN_OP_DISJOINT_IN,
138a450e446Smrg    PIXMAN_OP_DISJOINT_IN_REVERSE,
139a450e446Smrg    PIXMAN_OP_DISJOINT_OUT,
140a450e446Smrg    PIXMAN_OP_DISJOINT_OUT_REVERSE,
141a450e446Smrg    PIXMAN_OP_DISJOINT_ATOP,
142a450e446Smrg    PIXMAN_OP_DISJOINT_ATOP_REVERSE,
143a450e446Smrg    PIXMAN_OP_DISJOINT_XOR,
144a450e446Smrg    PIXMAN_OP_CONJOINT_CLEAR,
145a450e446Smrg    PIXMAN_OP_CONJOINT_SRC,
146a450e446Smrg    PIXMAN_OP_CONJOINT_DST,
147a450e446Smrg    PIXMAN_OP_CONJOINT_OVER,
148a450e446Smrg    PIXMAN_OP_CONJOINT_OVER_REVERSE,
149a450e446Smrg    PIXMAN_OP_CONJOINT_IN,
150a450e446Smrg    PIXMAN_OP_CONJOINT_IN_REVERSE,
151a450e446Smrg    PIXMAN_OP_CONJOINT_OUT,
152a450e446Smrg    PIXMAN_OP_CONJOINT_OUT_REVERSE,
153a450e446Smrg    PIXMAN_OP_CONJOINT_ATOP,
154a450e446Smrg    PIXMAN_OP_CONJOINT_ATOP_REVERSE,
155a450e446Smrg    PIXMAN_OP_CONJOINT_XOR,
156a450e446Smrg    PIXMAN_OP_MULTIPLY,
157a450e446Smrg    PIXMAN_OP_SCREEN,
158a450e446Smrg    PIXMAN_OP_OVERLAY,
159a450e446Smrg    PIXMAN_OP_DARKEN,
160a450e446Smrg    PIXMAN_OP_LIGHTEN,
161a450e446Smrg    PIXMAN_OP_COLOR_DODGE,
162a450e446Smrg    PIXMAN_OP_COLOR_BURN,
163a450e446Smrg    PIXMAN_OP_HARD_LIGHT,
164a450e446Smrg    PIXMAN_OP_DIFFERENCE,
165a450e446Smrg    PIXMAN_OP_EXCLUSION,
166a450e446Smrg#if 0 /* these use floating point math and are not always bitexact on different platforms */
167a450e446Smrg    PIXMAN_OP_SOFT_LIGHT,
168a450e446Smrg    PIXMAN_OP_HSL_HUE,
169a450e446Smrg    PIXMAN_OP_HSL_SATURATION,
170a450e446Smrg    PIXMAN_OP_HSL_COLOR,
171a450e446Smrg    PIXMAN_OP_HSL_LUMINOSITY,
172a450e446Smrg#endif
173a450e446Smrg};
174a450e446Smrg
175a450e446Smrgstatic pixman_format_code_t img_fmt_list[] = {
176a450e446Smrg    PIXMAN_a8r8g8b8,
177a450e446Smrg    PIXMAN_x8r8g8b8,
178a450e446Smrg    PIXMAN_r5g6b5,
179a450e446Smrg    PIXMAN_r3g3b2,
180a450e446Smrg    PIXMAN_a8,
181a450e446Smrg    PIXMAN_a8b8g8r8,
182a450e446Smrg    PIXMAN_x8b8g8r8,
183a450e446Smrg    PIXMAN_b8g8r8a8,
184a450e446Smrg    PIXMAN_b8g8r8x8,
1851b18d63aSmrg    PIXMAN_x14r6g6b6,
186a450e446Smrg    PIXMAN_r8g8b8,
187a450e446Smrg    PIXMAN_b8g8r8,
188a450e446Smrg    PIXMAN_r5g6b5,
189a450e446Smrg    PIXMAN_b5g6r5,
190a450e446Smrg    PIXMAN_x2r10g10b10,
191a450e446Smrg    PIXMAN_a2r10g10b10,
192a450e446Smrg    PIXMAN_x2b10g10r10,
193a450e446Smrg    PIXMAN_a2b10g10r10,
194a450e446Smrg    PIXMAN_a1r5g5b5,
195a450e446Smrg    PIXMAN_x1r5g5b5,
196a450e446Smrg    PIXMAN_a1b5g5r5,
197a450e446Smrg    PIXMAN_x1b5g5r5,
198a450e446Smrg    PIXMAN_a4r4g4b4,
199a450e446Smrg    PIXMAN_x4r4g4b4,
200a450e446Smrg    PIXMAN_a4b4g4r4,
201a450e446Smrg    PIXMAN_x4b4g4r4,
202a450e446Smrg    PIXMAN_a8,
203a450e446Smrg    PIXMAN_r3g3b2,
204a450e446Smrg    PIXMAN_b2g3r3,
205a450e446Smrg    PIXMAN_a2r2g2b2,
206a450e446Smrg    PIXMAN_a2b2g2r2,
207a450e446Smrg    PIXMAN_c8,
208a450e446Smrg    PIXMAN_g8,
209a450e446Smrg    PIXMAN_x4c4,
210a450e446Smrg    PIXMAN_x4g4,
211a450e446Smrg    PIXMAN_c4,
212a450e446Smrg    PIXMAN_g4,
213a450e446Smrg    PIXMAN_g1,
214a450e446Smrg    PIXMAN_x4a4,
215a450e446Smrg    PIXMAN_a4,
216a450e446Smrg    PIXMAN_r1g2b1,
217a450e446Smrg    PIXMAN_b1g2r1,
218a450e446Smrg    PIXMAN_a1r1g1b1,
219a450e446Smrg    PIXMAN_a1b1g1r1,
220a450e446Smrg    PIXMAN_a1,
221a450e446Smrg    -1
222a450e446Smrg};
223a450e446Smrg
224a450e446Smrgstatic pixman_format_code_t mask_fmt_list[] = {
225a450e446Smrg    PIXMAN_a8r8g8b8,
226a450e446Smrg    PIXMAN_a8,
227a450e446Smrg    PIXMAN_a4,
228a450e446Smrg    PIXMAN_a1,
229a450e446Smrg    -1
230a450e446Smrg};
231a450e446Smrg
232a450e446Smrg
233a450e446Smrg/*
234a450e446Smrg * Composite operation with pseudorandom images
235a450e446Smrg */
236a450e446Smrguint32_t
2371b18d63aSmrgtest_composite (int testnum, int verbose)
238a450e446Smrg{
239a450e446Smrg    int i;
240a450e446Smrg    pixman_image_t *src_img = NULL;
241a450e446Smrg    pixman_image_t *dst_img = NULL;
242a450e446Smrg    pixman_image_t *mask_img = NULL;
243a450e446Smrg    int src_width, src_height;
244a450e446Smrg    int dst_width, dst_height;
245a450e446Smrg    int src_stride, dst_stride;
246a450e446Smrg    int src_x, src_y;
247a450e446Smrg    int dst_x, dst_y;
248952204abSmrg    int mask_x, mask_y;
249a450e446Smrg    int w, h;
250a450e446Smrg    int op;
251a450e446Smrg    pixman_format_code_t src_fmt, dst_fmt, mask_fmt;
252952204abSmrg    uint32_t *dstbuf, *srcbuf, *maskbuf;
253a450e446Smrg    uint32_t crc32;
254a450e446Smrg    int max_width, max_height, max_extra_stride;
2551b18d63aSmrg    FLOAT_REGS_CORRUPTION_DETECTOR_START ();
256a450e446Smrg
257a450e446Smrg    max_width = max_height = 24 + testnum / 10000;
258a450e446Smrg    max_extra_stride = 4 + testnum / 1000000;
259a450e446Smrg
260a450e446Smrg    if (max_width > 256)
261a450e446Smrg	max_width = 256;
262a450e446Smrg
263a450e446Smrg    if (max_height > 16)
264a450e446Smrg	max_height = 16;
265a450e446Smrg
266a450e446Smrg    if (max_extra_stride > 8)
267a450e446Smrg	max_extra_stride = 8;
268a450e446Smrg
269a450e446Smrg    lcg_srand (testnum);
270a450e446Smrg
271a450e446Smrg    op = op_list[lcg_rand_n (sizeof (op_list) / sizeof (op_list[0]))];
272a450e446Smrg
273a450e446Smrg    if (lcg_rand_n (8))
274a450e446Smrg    {
275a450e446Smrg	/* normal image */
276a450e446Smrg	src_img = create_random_image (img_fmt_list, max_width, max_height,
277a450e446Smrg				       max_extra_stride, &src_fmt);
278a450e446Smrg    }
279a450e446Smrg    else
280a450e446Smrg    {
281a450e446Smrg	/* solid case */
282a450e446Smrg	src_img = create_random_image (img_fmt_list, 1, 1,
283a450e446Smrg				       max_extra_stride, &src_fmt);
284a450e446Smrg
285a450e446Smrg	pixman_image_set_repeat (src_img, PIXMAN_REPEAT_NORMAL);
286a450e446Smrg    }
287a450e446Smrg
288a450e446Smrg    dst_img = create_random_image (img_fmt_list, max_width, max_height,
289a450e446Smrg				   max_extra_stride, &dst_fmt);
290a450e446Smrg
291952204abSmrg    src_width = pixman_image_get_width (src_img);
292952204abSmrg    src_height = pixman_image_get_height (src_img);
293952204abSmrg    src_stride = pixman_image_get_stride (src_img);
294952204abSmrg
295952204abSmrg    dst_width = pixman_image_get_width (dst_img);
296952204abSmrg    dst_height = pixman_image_get_height (dst_img);
297952204abSmrg    dst_stride = pixman_image_get_stride (dst_img);
298952204abSmrg
299952204abSmrg    dstbuf = pixman_image_get_data (dst_img);
300952204abSmrg    srcbuf = pixman_image_get_data (src_img);
301952204abSmrg
302952204abSmrg    src_x = lcg_rand_n (src_width);
303952204abSmrg    src_y = lcg_rand_n (src_height);
304952204abSmrg    dst_x = lcg_rand_n (dst_width);
305952204abSmrg    dst_y = lcg_rand_n (dst_height);
306952204abSmrg
307a450e446Smrg    mask_img = NULL;
308a450e446Smrg    mask_fmt = -1;
309952204abSmrg    mask_x = 0;
310952204abSmrg    mask_y = 0;
311952204abSmrg    maskbuf = NULL;
312a450e446Smrg
313952204abSmrg    if ((src_fmt == PIXMAN_x8r8g8b8 || src_fmt == PIXMAN_x8b8g8r8) &&
314952204abSmrg	(lcg_rand_n (4) == 0))
315952204abSmrg    {
316952204abSmrg	/* PIXBUF */
317952204abSmrg	mask_fmt = lcg_rand_n (2) ? PIXMAN_a8r8g8b8 : PIXMAN_a8b8g8r8;
318952204abSmrg	mask_img = pixman_image_create_bits (mask_fmt,
319952204abSmrg	                                     src_width,
320952204abSmrg	                                     src_height,
321952204abSmrg	                                     srcbuf,
322952204abSmrg	                                     src_stride);
323952204abSmrg	mask_x = src_x;
324952204abSmrg	mask_y = src_y;
325952204abSmrg	maskbuf = srcbuf;
326952204abSmrg    }
327952204abSmrg    else if (lcg_rand_n (2))
328a450e446Smrg    {
329a450e446Smrg	if (lcg_rand_n (2))
330a450e446Smrg	{
331a450e446Smrg	    mask_img = create_random_image (mask_fmt_list, max_width, max_height,
332a450e446Smrg					   max_extra_stride, &mask_fmt);
333a450e446Smrg	}
334a450e446Smrg	else
335a450e446Smrg	{
336a450e446Smrg	    /* solid case */
337a450e446Smrg	    mask_img = create_random_image (mask_fmt_list, 1, 1,
338a450e446Smrg					   max_extra_stride, &mask_fmt);
339a450e446Smrg	    pixman_image_set_repeat (mask_img, PIXMAN_REPEAT_NORMAL);
340a450e446Smrg	}
341a450e446Smrg
342a450e446Smrg	if (lcg_rand_n (2))
343a450e446Smrg	    pixman_image_set_component_alpha (mask_img, 1);
344a450e446Smrg
345952204abSmrg	mask_x = lcg_rand_n (pixman_image_get_width (mask_img));
346952204abSmrg	mask_y = lcg_rand_n (pixman_image_get_height (mask_img));
347952204abSmrg    }
348a450e446Smrg
349a450e446Smrg
350a450e446Smrg    w = lcg_rand_n (dst_width - dst_x + 1);
351a450e446Smrg    h = lcg_rand_n (dst_height - dst_y + 1);
352a450e446Smrg
353a450e446Smrg    if (verbose)
354a450e446Smrg    {
355a450e446Smrg	printf ("op=%d, src_fmt=%08X, dst_fmt=%08X, mask_fmt=%08X\n",
356a450e446Smrg	    op, src_fmt, dst_fmt, mask_fmt);
357a450e446Smrg	printf ("src_width=%d, src_height=%d, dst_width=%d, dst_height=%d\n",
358a450e446Smrg	    src_width, src_height, dst_width, dst_height);
359a450e446Smrg	printf ("src_x=%d, src_y=%d, dst_x=%d, dst_y=%d\n",
360a450e446Smrg	    src_x, src_y, dst_x, dst_y);
361a450e446Smrg	printf ("src_stride=%d, dst_stride=%d\n",
362a450e446Smrg	    src_stride, dst_stride);
363a450e446Smrg	printf ("w=%d, h=%d\n", w, h);
364a450e446Smrg    }
365a450e446Smrg
366a450e446Smrg    pixman_image_composite (op, src_img, mask_img, dst_img,
367952204abSmrg			    src_x, src_y, mask_x, mask_y, dst_x, dst_y, w, h);
368a450e446Smrg
369a450e446Smrg    if (verbose)
370a450e446Smrg    {
371a450e446Smrg	int j;
372a450e446Smrg
373a450e446Smrg	printf ("---\n");
374a450e446Smrg	for (i = 0; i < dst_height; i++)
375a450e446Smrg	{
376a450e446Smrg	    for (j = 0; j < dst_stride; j++)
377a450e446Smrg	    {
378a450e446Smrg		if (j == (dst_width * PIXMAN_FORMAT_BPP (dst_fmt) + 7) / 8)
379a450e446Smrg		    printf ("| ");
380a450e446Smrg
381a450e446Smrg		printf ("%02X ", *((uint8_t *)dstbuf + i * dst_stride + j));
382a450e446Smrg	    }
383a450e446Smrg	    printf ("\n");
384a450e446Smrg	}
385a450e446Smrg	printf ("---\n");
386a450e446Smrg    }
387a450e446Smrg
3881b18d63aSmrg    free_random_image (0, src_img, -1);
3891b18d63aSmrg    crc32 = free_random_image (0, dst_img, dst_fmt);
390a450e446Smrg
391a450e446Smrg    if (mask_img)
392952204abSmrg    {
393952204abSmrg	if (srcbuf == maskbuf)
394952204abSmrg	    pixman_image_unref(mask_img);
395952204abSmrg	else
3961b18d63aSmrg	    free_random_image (0, mask_img, -1);
397952204abSmrg    }
398952204abSmrg
3991b18d63aSmrg    FLOAT_REGS_CORRUPTION_DETECTOR_FINISH ();
400a450e446Smrg    return crc32;
401a450e446Smrg}
402a450e446Smrg
4031b18d63aSmrg#define CONVERT_15(c, is_rgb)						\
4041b18d63aSmrg    (is_rgb?								\
4051b18d63aSmrg     ((((c) >> 3) & 0x001f) |						\
4061b18d63aSmrg      (((c) >> 6) & 0x03e0) |						\
4071b18d63aSmrg      (((c) >> 9) & 0x7c00)) :						\
4081b18d63aSmrg     (((((c) >> 16) & 0xff) * 153 +					\
4091b18d63aSmrg       (((c) >>  8) & 0xff) * 301 +					\
4101b18d63aSmrg       (((c)      ) & 0xff) * 58) >> 2))
4111b18d63aSmrg
412952204abSmrgstatic void
4131b18d63aSmrginitialize_palette (pixman_indexed_t *palette, uint32_t mask, int is_rgb)
414952204abSmrg{
415952204abSmrg    int i;
416952204abSmrg
417952204abSmrg    for (i = 0; i < 32768; ++i)
4181b18d63aSmrg	palette->ent[i] = lcg_rand() & mask;
419a450e446Smrg
4201b18d63aSmrg    for (i = 0; i < mask + 1; ++i)
421a450e446Smrg    {
4221b18d63aSmrg	uint32_t rgba24;
4231b18d63aSmrg 	pixman_bool_t retry;
4241b18d63aSmrg	uint32_t i15;
4251b18d63aSmrg
4261b18d63aSmrg	/* We filled the rgb->index map with random numbers, but we
4271b18d63aSmrg	 * do need the ability to round trip, that is if some indexed
4281b18d63aSmrg	 * color expands to an argb24, then the 15 bit version of that
4291b18d63aSmrg	 * color must map back to the index. Anything else, we don't
4301b18d63aSmrg	 * care about too much.
4311b18d63aSmrg	 */
4321b18d63aSmrg	do
4331b18d63aSmrg	{
4341b18d63aSmrg	    uint32_t old_idx;
4351b18d63aSmrg
4361b18d63aSmrg	    rgba24 = lcg_rand();
4371b18d63aSmrg	    i15 = CONVERT_15 (rgba24, is_rgb);
4381b18d63aSmrg
4391b18d63aSmrg	    old_idx = palette->ent[i15];
4401b18d63aSmrg	    if (CONVERT_15 (palette->rgba[old_idx], is_rgb) == i15)
4411b18d63aSmrg		retry = 1;
4421b18d63aSmrg	    else
4431b18d63aSmrg		retry = 0;
4441b18d63aSmrg	} while (retry);
4451b18d63aSmrg
4461b18d63aSmrg	palette->rgba[i] = rgba24;
4471b18d63aSmrg	palette->ent[i15] = i;
448a450e446Smrg    }
449a450e446Smrg
4501b18d63aSmrg    for (i = 0; i < mask + 1; ++i)
451a450e446Smrg    {
4521b18d63aSmrg	assert (palette->ent[CONVERT_15 (palette->rgba[i], is_rgb)] == i);
453a450e446Smrg    }
4541b18d63aSmrg}
455a450e446Smrg
4561b18d63aSmrgint
4571b18d63aSmrgmain (int argc, const char *argv[])
4581b18d63aSmrg{
4591b18d63aSmrg    int i;
460a450e446Smrg
4611b18d63aSmrg    for (i = 1; i <= 8; i++)
4621b18d63aSmrg    {
4631b18d63aSmrg	initialize_palette (&(rgb_palette[i]), (1 << i) - 1, TRUE);
4641b18d63aSmrg	initialize_palette (&(y_palette[i]), (1 << i) - 1, FALSE);
465a450e446Smrg    }
4661b18d63aSmrg
4671b18d63aSmrg    return fuzzer_test_main("blitters", 2000000,
4681b18d63aSmrg			    0x1DB8BDF8,
4691b18d63aSmrg			    test_composite, argc, argv);
470a450e446Smrg}
471