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