stress-test.c revision f4f78bb6
16ba797d6Smrg#include <stdio.h> 29ad247e8Sjmcneill#include <stdlib.h> 3953d7d37Smrg#include "utils.h" 46ba797d6Smrg#include <sys/types.h> 5953d7d37Smrg 6953d7d37Smrg#if 0 7953d7d37Smrg#define fence_malloc malloc 8953d7d37Smrg#define fence_free free 9953d7d37Smrg#define make_random_bytes malloc 10953d7d37Smrg#endif 11953d7d37Smrg 12953d7d37Smrgstatic const pixman_format_code_t image_formats[] = 13953d7d37Smrg{ 14953d7d37Smrg PIXMAN_a8r8g8b8, 15953d7d37Smrg PIXMAN_x8r8g8b8, 16953d7d37Smrg PIXMAN_r5g6b5, 17953d7d37Smrg PIXMAN_r3g3b2, 18953d7d37Smrg PIXMAN_a8, 19953d7d37Smrg PIXMAN_a8b8g8r8, 20953d7d37Smrg PIXMAN_x8b8g8r8, 21953d7d37Smrg PIXMAN_b8g8r8a8, 22953d7d37Smrg PIXMAN_b8g8r8x8, 236ba797d6Smrg PIXMAN_r8g8b8a8, 246ba797d6Smrg PIXMAN_r8g8b8x8, 25953d7d37Smrg PIXMAN_x14r6g6b6, 26953d7d37Smrg PIXMAN_r8g8b8, 27953d7d37Smrg PIXMAN_b8g8r8, 289ad247e8Sjmcneill PIXMAN_a8r8g8b8_sRGB, 29953d7d37Smrg PIXMAN_r5g6b5, 30953d7d37Smrg PIXMAN_b5g6r5, 31953d7d37Smrg PIXMAN_x2r10g10b10, 32953d7d37Smrg PIXMAN_a2r10g10b10, 33953d7d37Smrg PIXMAN_x2b10g10r10, 34953d7d37Smrg PIXMAN_a2b10g10r10, 35953d7d37Smrg PIXMAN_a1r5g5b5, 36953d7d37Smrg PIXMAN_x1r5g5b5, 37953d7d37Smrg PIXMAN_a1b5g5r5, 38953d7d37Smrg PIXMAN_x1b5g5r5, 39953d7d37Smrg PIXMAN_a4r4g4b4, 40953d7d37Smrg PIXMAN_x4r4g4b4, 41953d7d37Smrg PIXMAN_a4b4g4r4, 42953d7d37Smrg PIXMAN_x4b4g4r4, 43953d7d37Smrg PIXMAN_a8, 44953d7d37Smrg PIXMAN_r3g3b2, 45953d7d37Smrg PIXMAN_b2g3r3, 46953d7d37Smrg PIXMAN_a2r2g2b2, 47953d7d37Smrg PIXMAN_a2b2g2r2, 48953d7d37Smrg PIXMAN_c8, 49953d7d37Smrg PIXMAN_g8, 50953d7d37Smrg PIXMAN_x4c4, 51953d7d37Smrg PIXMAN_x4g4, 52953d7d37Smrg PIXMAN_c4, 53953d7d37Smrg PIXMAN_g4, 54953d7d37Smrg PIXMAN_g1, 55953d7d37Smrg PIXMAN_x4a4, 56953d7d37Smrg PIXMAN_a4, 57953d7d37Smrg PIXMAN_r1g2b1, 58953d7d37Smrg PIXMAN_b1g2r1, 59953d7d37Smrg PIXMAN_a1r1g1b1, 60953d7d37Smrg PIXMAN_a1b1g1r1, 61953d7d37Smrg PIXMAN_a1 62953d7d37Smrg}; 63953d7d37Smrg 64953d7d37Smrgstatic pixman_filter_t filters[] = 65953d7d37Smrg{ 66953d7d37Smrg PIXMAN_FILTER_NEAREST, 67953d7d37Smrg PIXMAN_FILTER_BILINEAR, 68953d7d37Smrg PIXMAN_FILTER_FAST, 69953d7d37Smrg PIXMAN_FILTER_GOOD, 70953d7d37Smrg PIXMAN_FILTER_BEST, 71953d7d37Smrg PIXMAN_FILTER_CONVOLUTION 72953d7d37Smrg}; 73953d7d37Smrg 74953d7d37Smrgstatic int 75953d7d37Smrgget_size (void) 76953d7d37Smrg{ 77f4f78bb6Smrg switch (prng_rand_n (28)) 78953d7d37Smrg { 79953d7d37Smrg case 0: 80953d7d37Smrg return 1; 81953d7d37Smrg 82953d7d37Smrg case 1: 83953d7d37Smrg return 2; 84953d7d37Smrg 85953d7d37Smrg default: 86953d7d37Smrg case 2: 87f4f78bb6Smrg return prng_rand_n (100); 88953d7d37Smrg 89953d7d37Smrg case 4: 90f4f78bb6Smrg return prng_rand_n (2000) + 1000; 91953d7d37Smrg 92953d7d37Smrg case 5: 93953d7d37Smrg return 65535; 94953d7d37Smrg 95953d7d37Smrg case 6: 96953d7d37Smrg return 65536; 97953d7d37Smrg 98953d7d37Smrg case 7: 99f4f78bb6Smrg return prng_rand_n (64000) + 63000; 100953d7d37Smrg } 101953d7d37Smrg} 102953d7d37Smrg 103953d7d37Smrgstatic void 104953d7d37Smrgdestroy (pixman_image_t *image, void *data) 105953d7d37Smrg{ 106953d7d37Smrg if (image->type == BITS && image->bits.free_me != image->bits.bits) 107953d7d37Smrg { 108953d7d37Smrg uint32_t *bits; 109953d7d37Smrg 110953d7d37Smrg if (image->bits.bits != (void *)0x01) 111953d7d37Smrg { 112953d7d37Smrg bits = image->bits.bits; 113953d7d37Smrg 114953d7d37Smrg if (image->bits.rowstride < 0) 115953d7d37Smrg bits -= (- image->bits.rowstride * (image->bits.height - 1)); 116953d7d37Smrg 117953d7d37Smrg fence_free (bits); 118953d7d37Smrg } 119953d7d37Smrg } 120953d7d37Smrg 121953d7d37Smrg free (data); 122953d7d37Smrg} 123953d7d37Smrg 124953d7d37Smrgstatic uint32_t 125953d7d37Smrgreal_reader (const void *src, int size) 126953d7d37Smrg{ 127953d7d37Smrg switch (size) 128953d7d37Smrg { 129953d7d37Smrg case 1: 130953d7d37Smrg return *(uint8_t *)src; 131953d7d37Smrg case 2: 132953d7d37Smrg return *(uint16_t *)src; 133953d7d37Smrg case 4: 134953d7d37Smrg return *(uint32_t *)src; 135953d7d37Smrg default: 136953d7d37Smrg assert (0); 1376ba797d6Smrg return 0; /* silence MSVC */ 138953d7d37Smrg } 139953d7d37Smrg} 140953d7d37Smrg 141953d7d37Smrgstatic void 142953d7d37Smrgreal_writer (void *src, uint32_t value, int size) 143953d7d37Smrg{ 144953d7d37Smrg switch (size) 145953d7d37Smrg { 146953d7d37Smrg case 1: 147953d7d37Smrg *(uint8_t *)src = value; 148953d7d37Smrg break; 149953d7d37Smrg 150953d7d37Smrg case 2: 151953d7d37Smrg *(uint16_t *)src = value; 152953d7d37Smrg break; 153953d7d37Smrg 154953d7d37Smrg case 4: 155953d7d37Smrg *(uint32_t *)src = value; 156953d7d37Smrg break; 157953d7d37Smrg 158953d7d37Smrg default: 159953d7d37Smrg assert (0); 160953d7d37Smrg break; 161953d7d37Smrg } 162953d7d37Smrg} 163953d7d37Smrg 164953d7d37Smrgstatic uint32_t 165953d7d37Smrgfake_reader (const void *src, int size) 166953d7d37Smrg{ 167f4f78bb6Smrg uint32_t r = prng_rand (); 168953d7d37Smrg 169953d7d37Smrg assert (size == 1 || size == 2 || size == 4); 1709ad247e8Sjmcneill 1719ad247e8Sjmcneill return r >> (32 - (size * 8)); 172953d7d37Smrg} 173953d7d37Smrg 174953d7d37Smrgstatic void 175953d7d37Smrgfake_writer (void *src, uint32_t value, int size) 176953d7d37Smrg{ 177953d7d37Smrg assert (size == 1 || size == 2 || size == 4); 178953d7d37Smrg} 179953d7d37Smrg 180953d7d37Smrgstatic int32_t 181953d7d37Smrglog_rand (void) 182953d7d37Smrg{ 183953d7d37Smrg uint32_t mask; 184953d7d37Smrg 185f4f78bb6Smrg mask = (1 << prng_rand_n (10)) - 1; 1869ad247e8Sjmcneill 187f4f78bb6Smrg return (prng_rand () & mask) - (mask >> 1); 1889ad247e8Sjmcneill} 189953d7d37Smrg 1909ad247e8Sjmcneillstatic int32_t 1919ad247e8Sjmcneillrand_x (pixman_image_t *image) 1929ad247e8Sjmcneill{ 1939ad247e8Sjmcneill if (image->type == BITS) 194f4f78bb6Smrg return prng_rand_n (image->bits.width); 1959ad247e8Sjmcneill else 1969ad247e8Sjmcneill return log_rand (); 1979ad247e8Sjmcneill} 1989ad247e8Sjmcneill 1999ad247e8Sjmcneillstatic int32_t 2009ad247e8Sjmcneillrand_y (pixman_image_t *image) 2019ad247e8Sjmcneill{ 2029ad247e8Sjmcneill if (image->type == BITS) 203f4f78bb6Smrg return prng_rand_n (image->bits.height); 2049ad247e8Sjmcneill else 2059ad247e8Sjmcneill return log_rand (); 206953d7d37Smrg} 207953d7d37Smrg 208f4f78bb6Smrgtypedef enum 209f4f78bb6Smrg{ 210f4f78bb6Smrg DONT_CARE, 211f4f78bb6Smrg PREFER_ALPHA, 212f4f78bb6Smrg REQUIRE_ALPHA 213f4f78bb6Smrg} alpha_preference_t; 214f4f78bb6Smrg 215f4f78bb6Smrgstatic pixman_format_code_t 216f4f78bb6Smrgrandom_format (alpha_preference_t alpha) 217f4f78bb6Smrg{ 218f4f78bb6Smrg pixman_format_code_t format; 219f4f78bb6Smrg int n = prng_rand_n (ARRAY_LENGTH (image_formats)); 220f4f78bb6Smrg 221f4f78bb6Smrg if (alpha >= PREFER_ALPHA && 222f4f78bb6Smrg (alpha == REQUIRE_ALPHA || prng_rand_n (4) != 0)) 223f4f78bb6Smrg { 224f4f78bb6Smrg do 225f4f78bb6Smrg { 226f4f78bb6Smrg format = image_formats[n++ % ARRAY_LENGTH (image_formats)]; 227f4f78bb6Smrg } while (PIXMAN_FORMAT_TYPE (format) != PIXMAN_TYPE_A); 228f4f78bb6Smrg } 229f4f78bb6Smrg else 230f4f78bb6Smrg { 231f4f78bb6Smrg format = image_formats[n]; 232f4f78bb6Smrg } 233f4f78bb6Smrg 234f4f78bb6Smrg return format; 235f4f78bb6Smrg} 236f4f78bb6Smrg 237953d7d37Smrgstatic pixman_image_t * 238f4f78bb6Smrgcreate_random_bits_image (alpha_preference_t alpha_preference) 239953d7d37Smrg{ 240953d7d37Smrg pixman_format_code_t format; 241953d7d37Smrg pixman_indexed_t *indexed; 242953d7d37Smrg pixman_image_t *image; 243953d7d37Smrg int width, height, stride; 244953d7d37Smrg uint32_t *bits; 245953d7d37Smrg pixman_read_memory_func_t read_func = NULL; 246953d7d37Smrg pixman_write_memory_func_t write_func = NULL; 247953d7d37Smrg pixman_filter_t filter; 248953d7d37Smrg pixman_fixed_t *coefficients = NULL; 249953d7d37Smrg int n_coefficients = 0; 250953d7d37Smrg 251953d7d37Smrg /* format */ 252f4f78bb6Smrg format = random_format (alpha_preference); 253953d7d37Smrg 254953d7d37Smrg indexed = NULL; 255953d7d37Smrg if (PIXMAN_FORMAT_TYPE (format) == PIXMAN_TYPE_COLOR) 256953d7d37Smrg { 257953d7d37Smrg indexed = malloc (sizeof (pixman_indexed_t)); 258953d7d37Smrg 259953d7d37Smrg initialize_palette (indexed, PIXMAN_FORMAT_BPP (format), TRUE); 260953d7d37Smrg } 261953d7d37Smrg else if (PIXMAN_FORMAT_TYPE (format) == PIXMAN_TYPE_GRAY) 262953d7d37Smrg { 263953d7d37Smrg indexed = malloc (sizeof (pixman_indexed_t)); 264953d7d37Smrg 265953d7d37Smrg initialize_palette (indexed, PIXMAN_FORMAT_BPP (format), FALSE); 266953d7d37Smrg } 267953d7d37Smrg else 268953d7d37Smrg { 269953d7d37Smrg indexed = NULL; 270953d7d37Smrg } 271953d7d37Smrg 272953d7d37Smrg /* size */ 273953d7d37Smrg width = get_size (); 274953d7d37Smrg height = get_size (); 275953d7d37Smrg 2769ad247e8Sjmcneill while ((uint64_t)width * height > 200000) 277953d7d37Smrg { 278f4f78bb6Smrg if (prng_rand_n(2) == 0) 279953d7d37Smrg height = 200000 / width; 280953d7d37Smrg else 281953d7d37Smrg width = 200000 / height; 282953d7d37Smrg } 283953d7d37Smrg 284953d7d37Smrg if (height == 0) 285953d7d37Smrg height = 1; 286953d7d37Smrg if (width == 0) 287953d7d37Smrg width = 1; 288953d7d37Smrg 289953d7d37Smrg /* bits */ 290f4f78bb6Smrg switch (prng_rand_n (7)) 291953d7d37Smrg { 292953d7d37Smrg default: 293953d7d37Smrg case 0: 294f4f78bb6Smrg stride = width * PIXMAN_FORMAT_BPP (format) + prng_rand_n (17); 295953d7d37Smrg stride = (stride + 3) & (~3); 296953d7d37Smrg bits = (uint32_t *)make_random_bytes (height * stride); 297953d7d37Smrg break; 298953d7d37Smrg 299953d7d37Smrg case 1: 300953d7d37Smrg stride = 0; 301953d7d37Smrg bits = NULL; 302953d7d37Smrg break; 303953d7d37Smrg 304953d7d37Smrg case 2: /* Zero-filled */ 305f4f78bb6Smrg stride = width * PIXMAN_FORMAT_BPP (format) + prng_rand_n (17); 306953d7d37Smrg stride = (stride + 3) & (~3); 307953d7d37Smrg bits = fence_malloc (height * stride); 308953d7d37Smrg if (!bits) 309953d7d37Smrg return NULL; 310953d7d37Smrg memset (bits, 0, height * stride); 311953d7d37Smrg break; 312953d7d37Smrg 313953d7d37Smrg case 3: /* Filled with 0xFF */ 314f4f78bb6Smrg stride = width * PIXMAN_FORMAT_BPP (format) + prng_rand_n (17); 315953d7d37Smrg stride = (stride + 3) & (~3); 316953d7d37Smrg bits = fence_malloc (height * stride); 317953d7d37Smrg if (!bits) 318953d7d37Smrg return NULL; 319953d7d37Smrg memset (bits, 0xff, height * stride); 320953d7d37Smrg break; 321953d7d37Smrg 322953d7d37Smrg case 4: /* bits is a bad pointer, has read/write functions */ 323953d7d37Smrg stride = 232; 324953d7d37Smrg bits = (void *)0x01; 325953d7d37Smrg read_func = fake_reader; 326953d7d37Smrg write_func = fake_writer; 327953d7d37Smrg break; 328953d7d37Smrg 329953d7d37Smrg case 5: /* bits is a real pointer, has read/write functions */ 330f4f78bb6Smrg stride = width * PIXMAN_FORMAT_BPP (format) + prng_rand_n (17); 331953d7d37Smrg stride = (stride + 3) & (~3); 332953d7d37Smrg bits = fence_malloc (height * stride); 333953d7d37Smrg if (!bits) 334953d7d37Smrg return NULL; 335953d7d37Smrg memset (bits, 0xff, height * stride); 336953d7d37Smrg read_func = real_reader; 337953d7d37Smrg write_func = real_writer; 338953d7d37Smrg break; 339953d7d37Smrg 340953d7d37Smrg case 6: /* bits is a real pointer, stride is negative */ 341f4f78bb6Smrg stride = (width * PIXMAN_FORMAT_BPP (format) + prng_rand_n (17)); 342953d7d37Smrg stride = (stride + 3) & (~3); 343953d7d37Smrg bits = (uint32_t *)make_random_bytes (height * stride); 344953d7d37Smrg if (!bits) 345953d7d37Smrg return NULL; 346953d7d37Smrg bits += ((height - 1) * stride) / 4; 347953d7d37Smrg stride = - stride; 348953d7d37Smrg break; 349953d7d37Smrg } 350953d7d37Smrg 351953d7d37Smrg /* Filter */ 352f4f78bb6Smrg filter = filters[prng_rand_n (ARRAY_LENGTH (filters))]; 353953d7d37Smrg if (filter == PIXMAN_FILTER_CONVOLUTION) 354953d7d37Smrg { 355f4f78bb6Smrg int width = prng_rand_n (3); 356f4f78bb6Smrg int height = prng_rand_n (4); 357953d7d37Smrg 358953d7d37Smrg n_coefficients = width * height + 2; 359953d7d37Smrg coefficients = malloc (n_coefficients * sizeof (pixman_fixed_t)); 360953d7d37Smrg 361953d7d37Smrg if (coefficients) 362953d7d37Smrg { 363953d7d37Smrg int i; 364953d7d37Smrg 365953d7d37Smrg for (i = 0; i < width * height; ++i) 366f4f78bb6Smrg coefficients[i + 2] = prng_rand(); 367953d7d37Smrg 368953d7d37Smrg coefficients[0] = width << 16; 369953d7d37Smrg coefficients[1] = height << 16; 370953d7d37Smrg } 371953d7d37Smrg else 372953d7d37Smrg { 373953d7d37Smrg filter = PIXMAN_FILTER_BEST; 374953d7d37Smrg } 375953d7d37Smrg } 376953d7d37Smrg 377953d7d37Smrg /* Finally create the image */ 378953d7d37Smrg image = pixman_image_create_bits (format, width, height, bits, stride); 379953d7d37Smrg if (!image) 380953d7d37Smrg return NULL; 381953d7d37Smrg 382953d7d37Smrg pixman_image_set_indexed (image, indexed); 383953d7d37Smrg pixman_image_set_destroy_function (image, destroy, indexed); 384953d7d37Smrg pixman_image_set_accessors (image, read_func, write_func); 385953d7d37Smrg pixman_image_set_filter (image, filter, coefficients, n_coefficients); 386953d7d37Smrg 387953d7d37Smrg return image; 388953d7d37Smrg} 389953d7d37Smrg 390953d7d37Smrgstatic pixman_repeat_t repeats[] = 391953d7d37Smrg{ 392953d7d37Smrg PIXMAN_REPEAT_NONE, 393953d7d37Smrg PIXMAN_REPEAT_NORMAL, 394953d7d37Smrg PIXMAN_REPEAT_REFLECT, 395953d7d37Smrg PIXMAN_REPEAT_PAD 396953d7d37Smrg}; 397953d7d37Smrg 398953d7d37Smrgstatic uint32_t 399953d7d37Smrgabsolute (int32_t i) 400953d7d37Smrg{ 401953d7d37Smrg return i < 0? -i : i; 402953d7d37Smrg} 403953d7d37Smrg 404953d7d37Smrgstatic void 405953d7d37Smrgset_general_properties (pixman_image_t *image, pixman_bool_t allow_alpha_map) 406953d7d37Smrg{ 407953d7d37Smrg pixman_repeat_t repeat; 408953d7d37Smrg 409953d7d37Smrg /* Set properties that are generic to all images */ 410953d7d37Smrg 411953d7d37Smrg /* Repeat */ 412f4f78bb6Smrg repeat = repeats[prng_rand_n (ARRAY_LENGTH (repeats))]; 413953d7d37Smrg pixman_image_set_repeat (image, repeat); 414953d7d37Smrg 415953d7d37Smrg /* Alpha map */ 416f4f78bb6Smrg if (allow_alpha_map && prng_rand_n (4) == 0) 417953d7d37Smrg { 418953d7d37Smrg pixman_image_t *alpha_map; 419953d7d37Smrg int16_t x, y; 420953d7d37Smrg 421f4f78bb6Smrg alpha_map = create_random_bits_image (DONT_CARE); 422953d7d37Smrg 423953d7d37Smrg if (alpha_map) 424953d7d37Smrg { 425953d7d37Smrg set_general_properties (alpha_map, FALSE); 426953d7d37Smrg 4279ad247e8Sjmcneill x = rand_x (image) - image->bits.width / 2; 4289ad247e8Sjmcneill y = rand_y (image) - image->bits.height / 2; 429953d7d37Smrg 430953d7d37Smrg pixman_image_set_alpha_map (image, alpha_map, x, y); 431953d7d37Smrg 432953d7d37Smrg pixman_image_unref (alpha_map); 433953d7d37Smrg } 434953d7d37Smrg } 435953d7d37Smrg 436953d7d37Smrg /* Component alpha */ 437f4f78bb6Smrg pixman_image_set_component_alpha (image, prng_rand_n (3) == 0); 438953d7d37Smrg 439953d7d37Smrg /* Clip region */ 440f4f78bb6Smrg if (prng_rand_n (8) < 2) 441953d7d37Smrg { 442953d7d37Smrg pixman_region32_t region; 443953d7d37Smrg int i, n_rects; 444953d7d37Smrg 445953d7d37Smrg pixman_region32_init (®ion); 446953d7d37Smrg 447f4f78bb6Smrg switch (prng_rand_n (12)) 448953d7d37Smrg { 449953d7d37Smrg case 0: 450953d7d37Smrg n_rects = 0; 451953d7d37Smrg break; 452953d7d37Smrg 453953d7d37Smrg case 1: case 2: case 3: 454953d7d37Smrg n_rects = 1; 455953d7d37Smrg break; 456953d7d37Smrg 457953d7d37Smrg case 4: case 5: 458953d7d37Smrg n_rects = 2; 459953d7d37Smrg break; 460953d7d37Smrg 461953d7d37Smrg case 6: case 7: 462953d7d37Smrg n_rects = 3; 4639ad247e8Sjmcneill break; 464953d7d37Smrg 465953d7d37Smrg default: 466f4f78bb6Smrg n_rects = prng_rand_n (100); 467953d7d37Smrg break; 468953d7d37Smrg } 469953d7d37Smrg 470953d7d37Smrg for (i = 0; i < n_rects; ++i) 471953d7d37Smrg { 472953d7d37Smrg uint32_t width, height; 473953d7d37Smrg int x, y; 474953d7d37Smrg 475953d7d37Smrg x = log_rand(); 476953d7d37Smrg y = log_rand(); 477953d7d37Smrg width = absolute (log_rand ()) + 1; 478953d7d37Smrg height = absolute (log_rand ()) + 1; 479953d7d37Smrg 480953d7d37Smrg pixman_region32_union_rect ( 481953d7d37Smrg ®ion, ®ion, x, y, width, height); 482953d7d37Smrg } 483953d7d37Smrg 484f4f78bb6Smrg if (image->type == BITS && prng_rand_n (8) != 0) 4859ad247e8Sjmcneill { 4869ad247e8Sjmcneill uint32_t width, height; 4879ad247e8Sjmcneill int x, y; 4889ad247e8Sjmcneill int i; 4899ad247e8Sjmcneill 4909ad247e8Sjmcneill /* Also add a couple of clip rectangles inside the image 4919ad247e8Sjmcneill * so that compositing will actually take place. 4929ad247e8Sjmcneill */ 4939ad247e8Sjmcneill for (i = 0; i < 5; ++i) 4949ad247e8Sjmcneill { 495f4f78bb6Smrg x = prng_rand_n (2 * image->bits.width) - image->bits.width; 496f4f78bb6Smrg y = prng_rand_n (2 * image->bits.height) - image->bits.height; 497f4f78bb6Smrg width = prng_rand_n (image->bits.width) - x + 10; 498f4f78bb6Smrg height = prng_rand_n (image->bits.height) - y + 10; 4999ad247e8Sjmcneill 5009ad247e8Sjmcneill if (width + x < x) 5019ad247e8Sjmcneill width = INT32_MAX - x; 5029ad247e8Sjmcneill if (height + y < y) 5039ad247e8Sjmcneill height = INT32_MAX - y; 504f4f78bb6Smrg 5059ad247e8Sjmcneill pixman_region32_union_rect ( 5069ad247e8Sjmcneill ®ion, ®ion, x, y, width, height); 5079ad247e8Sjmcneill } 5089ad247e8Sjmcneill } 5099ad247e8Sjmcneill 510953d7d37Smrg pixman_image_set_clip_region32 (image, ®ion); 511953d7d37Smrg 512953d7d37Smrg pixman_region32_fini (®ion); 513953d7d37Smrg } 514953d7d37Smrg 515953d7d37Smrg /* Whether source clipping is enabled */ 516f4f78bb6Smrg pixman_image_set_source_clipping (image, !!prng_rand_n (2)); 517953d7d37Smrg 518953d7d37Smrg /* Client clip */ 519f4f78bb6Smrg pixman_image_set_has_client_clip (image, !!prng_rand_n (2)); 520953d7d37Smrg 521953d7d37Smrg /* Transform */ 522f4f78bb6Smrg if (prng_rand_n (5) < 2) 523953d7d37Smrg { 524953d7d37Smrg pixman_transform_t xform; 525953d7d37Smrg int i, j, k; 526953d7d37Smrg uint32_t tx, ty, sx, sy; 527953d7d37Smrg uint32_t c, s; 528953d7d37Smrg 529953d7d37Smrg memset (&xform, 0, sizeof xform); 530953d7d37Smrg xform.matrix[0][0] = pixman_fixed_1; 531953d7d37Smrg xform.matrix[1][1] = pixman_fixed_1; 532953d7d37Smrg xform.matrix[2][2] = pixman_fixed_1; 533953d7d37Smrg 534953d7d37Smrg for (k = 0; k < 3; ++k) 535953d7d37Smrg { 536f4f78bb6Smrg switch (prng_rand_n (4)) 537953d7d37Smrg { 538953d7d37Smrg case 0: 539953d7d37Smrg /* rotation */ 540f4f78bb6Smrg c = prng_rand_n (2 * 65536) - 65536; 541f4f78bb6Smrg s = prng_rand_n (2 * 65536) - 65536; 542953d7d37Smrg pixman_transform_rotate (&xform, NULL, c, s); 543953d7d37Smrg break; 544953d7d37Smrg 545953d7d37Smrg case 1: 546953d7d37Smrg /* translation */ 547f4f78bb6Smrg tx = prng_rand(); 548f4f78bb6Smrg ty = prng_rand(); 549953d7d37Smrg pixman_transform_translate (&xform, NULL, tx, ty); 550953d7d37Smrg break; 551953d7d37Smrg 552953d7d37Smrg case 2: 553953d7d37Smrg /* scale */ 554f4f78bb6Smrg sx = prng_rand(); 555f4f78bb6Smrg sy = prng_rand(); 556953d7d37Smrg pixman_transform_scale (&xform, NULL, sx, sy); 557953d7d37Smrg break; 558953d7d37Smrg 559953d7d37Smrg case 3: 560f4f78bb6Smrg if (prng_rand_n (16) == 0) 561953d7d37Smrg { 562953d7d37Smrg /* random */ 563953d7d37Smrg for (i = 0; i < 3; ++i) 564953d7d37Smrg for (j = 0; j < 3; ++j) 565f4f78bb6Smrg xform.matrix[i][j] = prng_rand(); 566953d7d37Smrg break; 567953d7d37Smrg } 568f4f78bb6Smrg else if (prng_rand_n (16) == 0) 569953d7d37Smrg { 570953d7d37Smrg /* zero */ 571953d7d37Smrg memset (&xform, 0, sizeof xform); 572953d7d37Smrg } 573953d7d37Smrg break; 574953d7d37Smrg } 575953d7d37Smrg } 576953d7d37Smrg 577953d7d37Smrg pixman_image_set_transform (image, &xform); 578953d7d37Smrg } 579953d7d37Smrg} 580953d7d37Smrg 581953d7d37Smrgstatic pixman_color_t 582953d7d37Smrgrandom_color (void) 583953d7d37Smrg{ 584953d7d37Smrg pixman_color_t color = 585953d7d37Smrg { 586f4f78bb6Smrg prng_rand() & 0xffff, 587f4f78bb6Smrg prng_rand() & 0xffff, 588f4f78bb6Smrg prng_rand() & 0xffff, 589f4f78bb6Smrg prng_rand() & 0xffff, 590953d7d37Smrg }; 591953d7d37Smrg 592953d7d37Smrg return color; 593953d7d37Smrg} 594953d7d37Smrg 595953d7d37Smrg 596953d7d37Smrgstatic pixman_image_t * 597953d7d37Smrgcreate_random_solid_image (void) 598953d7d37Smrg{ 599953d7d37Smrg pixman_color_t color = random_color(); 600953d7d37Smrg pixman_image_t *image = pixman_image_create_solid_fill (&color); 601953d7d37Smrg 602953d7d37Smrg return image; 603953d7d37Smrg} 604953d7d37Smrg 605953d7d37Smrgstatic pixman_gradient_stop_t * 606953d7d37Smrgcreate_random_stops (int *n_stops) 607953d7d37Smrg{ 608953d7d37Smrg pixman_fixed_t step; 609953d7d37Smrg pixman_fixed_t s; 610953d7d37Smrg int i; 611953d7d37Smrg pixman_gradient_stop_t *stops; 612953d7d37Smrg 613f4f78bb6Smrg *n_stops = prng_rand_n (50) + 1; 614953d7d37Smrg 615953d7d37Smrg step = pixman_fixed_1 / *n_stops; 616953d7d37Smrg 617953d7d37Smrg stops = malloc (*n_stops * sizeof (pixman_gradient_stop_t)); 618953d7d37Smrg 619953d7d37Smrg s = 0; 620953d7d37Smrg for (i = 0; i < (*n_stops) - 1; ++i) 621953d7d37Smrg { 622953d7d37Smrg stops[i].x = s; 623953d7d37Smrg stops[i].color = random_color(); 624953d7d37Smrg 625953d7d37Smrg s += step; 626953d7d37Smrg } 627953d7d37Smrg 628953d7d37Smrg stops[*n_stops - 1].x = pixman_fixed_1; 629953d7d37Smrg stops[*n_stops - 1].color = random_color(); 630953d7d37Smrg 631953d7d37Smrg return stops; 632953d7d37Smrg} 633953d7d37Smrg 634953d7d37Smrgstatic pixman_point_fixed_t 635953d7d37Smrgcreate_random_point (void) 636953d7d37Smrg{ 637953d7d37Smrg pixman_point_fixed_t p; 638953d7d37Smrg 639953d7d37Smrg p.x = log_rand (); 640953d7d37Smrg p.y = log_rand (); 641953d7d37Smrg 642953d7d37Smrg return p; 643953d7d37Smrg} 644953d7d37Smrg 645953d7d37Smrgstatic pixman_image_t * 646953d7d37Smrgcreate_random_linear_image (void) 647953d7d37Smrg{ 648953d7d37Smrg int n_stops; 649953d7d37Smrg pixman_gradient_stop_t *stops; 650953d7d37Smrg pixman_point_fixed_t p1, p2; 651953d7d37Smrg pixman_image_t *result; 652953d7d37Smrg 653953d7d37Smrg stops = create_random_stops (&n_stops); 654953d7d37Smrg if (!stops) 655953d7d37Smrg return NULL; 656953d7d37Smrg 657953d7d37Smrg p1 = create_random_point (); 658953d7d37Smrg p2 = create_random_point (); 659953d7d37Smrg 660953d7d37Smrg result = pixman_image_create_linear_gradient (&p1, &p2, stops, n_stops); 661953d7d37Smrg 662953d7d37Smrg free (stops); 663953d7d37Smrg 664953d7d37Smrg return result; 665953d7d37Smrg} 666953d7d37Smrg 667953d7d37Smrgstatic pixman_image_t * 668953d7d37Smrgcreate_random_radial_image (void) 669953d7d37Smrg{ 670953d7d37Smrg int n_stops; 671953d7d37Smrg pixman_gradient_stop_t *stops; 672953d7d37Smrg pixman_point_fixed_t inner_c, outer_c; 673953d7d37Smrg pixman_fixed_t inner_r, outer_r; 674953d7d37Smrg pixman_image_t *result; 675953d7d37Smrg 676953d7d37Smrg inner_c = create_random_point(); 677953d7d37Smrg outer_c = create_random_point(); 678f4f78bb6Smrg inner_r = prng_rand(); 679f4f78bb6Smrg outer_r = prng_rand(); 680953d7d37Smrg 681953d7d37Smrg stops = create_random_stops (&n_stops); 682953d7d37Smrg 683953d7d37Smrg if (!stops) 684953d7d37Smrg return NULL; 685953d7d37Smrg 686953d7d37Smrg result = pixman_image_create_radial_gradient ( 687953d7d37Smrg &inner_c, &outer_c, inner_r, outer_r, stops, n_stops); 688953d7d37Smrg 689953d7d37Smrg free (stops); 690953d7d37Smrg 691953d7d37Smrg return result; 692953d7d37Smrg} 693953d7d37Smrg 694953d7d37Smrgstatic pixman_image_t * 695953d7d37Smrgcreate_random_conical_image (void) 696953d7d37Smrg{ 697953d7d37Smrg pixman_gradient_stop_t *stops; 698953d7d37Smrg int n_stops; 699953d7d37Smrg pixman_point_fixed_t c; 700953d7d37Smrg pixman_fixed_t angle; 701953d7d37Smrg pixman_image_t *result; 702953d7d37Smrg 703953d7d37Smrg c = create_random_point(); 704f4f78bb6Smrg angle = prng_rand(); 705953d7d37Smrg 706953d7d37Smrg stops = create_random_stops (&n_stops); 707953d7d37Smrg 708953d7d37Smrg if (!stops) 709953d7d37Smrg return NULL; 710953d7d37Smrg 711953d7d37Smrg result = pixman_image_create_conical_gradient (&c, angle, stops, n_stops); 712953d7d37Smrg 713953d7d37Smrg free (stops); 714953d7d37Smrg 715953d7d37Smrg return result; 716953d7d37Smrg} 717953d7d37Smrg 718953d7d37Smrgstatic pixman_image_t * 719953d7d37Smrgcreate_random_image (void) 720953d7d37Smrg{ 721953d7d37Smrg pixman_image_t *result; 722953d7d37Smrg 723f4f78bb6Smrg switch (prng_rand_n (5)) 724953d7d37Smrg { 725953d7d37Smrg default: 726953d7d37Smrg case 0: 727f4f78bb6Smrg result = create_random_bits_image (DONT_CARE); 728953d7d37Smrg break; 729953d7d37Smrg 730953d7d37Smrg case 1: 731953d7d37Smrg result = create_random_solid_image (); 732953d7d37Smrg break; 733953d7d37Smrg 734953d7d37Smrg case 2: 735953d7d37Smrg result = create_random_linear_image (); 736953d7d37Smrg break; 737953d7d37Smrg 738953d7d37Smrg case 3: 739953d7d37Smrg result = create_random_radial_image (); 740953d7d37Smrg break; 741953d7d37Smrg 742953d7d37Smrg case 4: 743953d7d37Smrg result = create_random_conical_image (); 744953d7d37Smrg break; 745953d7d37Smrg } 746953d7d37Smrg 747953d7d37Smrg if (result) 748953d7d37Smrg set_general_properties (result, TRUE); 749953d7d37Smrg 750953d7d37Smrg return result; 751953d7d37Smrg} 752953d7d37Smrg 753f4f78bb6Smrgstatic void 754f4f78bb6Smrgrandom_line (pixman_line_fixed_t *line, int width, int height) 755f4f78bb6Smrg{ 756f4f78bb6Smrg line->p1.x = prng_rand_n (width) << 16; 757f4f78bb6Smrg line->p1.y = prng_rand_n (height) << 16; 758f4f78bb6Smrg line->p2.x = prng_rand_n (width) << 16; 759f4f78bb6Smrg line->p2.y = prng_rand_n (height) << 16; 760f4f78bb6Smrg} 761f4f78bb6Smrg 762f4f78bb6Smrgstatic pixman_trapezoid_t * 763f4f78bb6Smrgcreate_random_trapezoids (int *n_traps, int height, int width) 764f4f78bb6Smrg{ 765f4f78bb6Smrg pixman_trapezoid_t *trapezoids; 766f4f78bb6Smrg int i; 767f4f78bb6Smrg 768f4f78bb6Smrg *n_traps = prng_rand_n (16) + 1; 769f4f78bb6Smrg 770f4f78bb6Smrg trapezoids = malloc (sizeof (pixman_trapezoid_t) * *n_traps); 771f4f78bb6Smrg 772f4f78bb6Smrg for (i = 0; i < *n_traps; ++i) 773f4f78bb6Smrg { 774f4f78bb6Smrg pixman_trapezoid_t *t = &(trapezoids[i]); 775f4f78bb6Smrg 776f4f78bb6Smrg t->top = prng_rand_n (height) << 16; 777f4f78bb6Smrg t->bottom = prng_rand_n (height) << 16; 778f4f78bb6Smrg 779f4f78bb6Smrg random_line (&t->left, height, width); 780f4f78bb6Smrg random_line (&t->right, height, width); 781f4f78bb6Smrg } 782f4f78bb6Smrg 783f4f78bb6Smrg return trapezoids; 784f4f78bb6Smrg} 785f4f78bb6Smrg 786953d7d37Smrgstatic const pixman_op_t op_list[] = 787953d7d37Smrg{ 788953d7d37Smrg PIXMAN_OP_SRC, 789953d7d37Smrg PIXMAN_OP_OVER, 790953d7d37Smrg PIXMAN_OP_ADD, 791953d7d37Smrg PIXMAN_OP_CLEAR, 792953d7d37Smrg PIXMAN_OP_SRC, 793953d7d37Smrg PIXMAN_OP_DST, 794953d7d37Smrg PIXMAN_OP_OVER, 795953d7d37Smrg PIXMAN_OP_OVER_REVERSE, 796953d7d37Smrg PIXMAN_OP_IN, 797953d7d37Smrg PIXMAN_OP_IN_REVERSE, 798953d7d37Smrg PIXMAN_OP_OUT, 799953d7d37Smrg PIXMAN_OP_OUT_REVERSE, 800953d7d37Smrg PIXMAN_OP_ATOP, 801953d7d37Smrg PIXMAN_OP_ATOP_REVERSE, 802953d7d37Smrg PIXMAN_OP_XOR, 803953d7d37Smrg PIXMAN_OP_ADD, 804953d7d37Smrg PIXMAN_OP_SATURATE, 805953d7d37Smrg PIXMAN_OP_DISJOINT_CLEAR, 806953d7d37Smrg PIXMAN_OP_DISJOINT_SRC, 807953d7d37Smrg PIXMAN_OP_DISJOINT_DST, 808953d7d37Smrg PIXMAN_OP_DISJOINT_OVER, 809953d7d37Smrg PIXMAN_OP_DISJOINT_OVER_REVERSE, 810953d7d37Smrg PIXMAN_OP_DISJOINT_IN, 811953d7d37Smrg PIXMAN_OP_DISJOINT_IN_REVERSE, 812953d7d37Smrg PIXMAN_OP_DISJOINT_OUT, 813953d7d37Smrg PIXMAN_OP_DISJOINT_OUT_REVERSE, 814953d7d37Smrg PIXMAN_OP_DISJOINT_ATOP, 815953d7d37Smrg PIXMAN_OP_DISJOINT_ATOP_REVERSE, 816953d7d37Smrg PIXMAN_OP_DISJOINT_XOR, 817953d7d37Smrg PIXMAN_OP_CONJOINT_CLEAR, 818953d7d37Smrg PIXMAN_OP_CONJOINT_SRC, 819953d7d37Smrg PIXMAN_OP_CONJOINT_DST, 820953d7d37Smrg PIXMAN_OP_CONJOINT_OVER, 821953d7d37Smrg PIXMAN_OP_CONJOINT_OVER_REVERSE, 822953d7d37Smrg PIXMAN_OP_CONJOINT_IN, 823953d7d37Smrg PIXMAN_OP_CONJOINT_IN_REVERSE, 824953d7d37Smrg PIXMAN_OP_CONJOINT_OUT, 825953d7d37Smrg PIXMAN_OP_CONJOINT_OUT_REVERSE, 826953d7d37Smrg PIXMAN_OP_CONJOINT_ATOP, 827953d7d37Smrg PIXMAN_OP_CONJOINT_ATOP_REVERSE, 828953d7d37Smrg PIXMAN_OP_CONJOINT_XOR, 829953d7d37Smrg PIXMAN_OP_MULTIPLY, 830953d7d37Smrg PIXMAN_OP_SCREEN, 831953d7d37Smrg PIXMAN_OP_OVERLAY, 832953d7d37Smrg PIXMAN_OP_DARKEN, 833953d7d37Smrg PIXMAN_OP_LIGHTEN, 834953d7d37Smrg PIXMAN_OP_COLOR_DODGE, 835953d7d37Smrg PIXMAN_OP_COLOR_BURN, 836953d7d37Smrg PIXMAN_OP_HARD_LIGHT, 837953d7d37Smrg PIXMAN_OP_DIFFERENCE, 838953d7d37Smrg PIXMAN_OP_EXCLUSION, 839953d7d37Smrg PIXMAN_OP_SOFT_LIGHT, 840953d7d37Smrg PIXMAN_OP_HSL_HUE, 841953d7d37Smrg PIXMAN_OP_HSL_SATURATION, 842953d7d37Smrg PIXMAN_OP_HSL_COLOR, 843953d7d37Smrg PIXMAN_OP_HSL_LUMINOSITY, 844953d7d37Smrg}; 845953d7d37Smrg 846953d7d37Smrgstatic void 8476ba797d6Smrgrun_test (uint32_t seed, pixman_bool_t verbose, uint32_t mod) 848953d7d37Smrg{ 849953d7d37Smrg pixman_image_t *source, *mask, *dest; 850953d7d37Smrg pixman_op_t op; 851953d7d37Smrg 8526ba797d6Smrg if (verbose) 8536ba797d6Smrg { 8546ba797d6Smrg if (mod == 0 || (seed % mod) == 0) 8556ba797d6Smrg printf ("Seed 0x%08x\n", seed); 8566ba797d6Smrg } 857953d7d37Smrg 858f4f78bb6Smrg source = mask = dest = NULL; 859953d7d37Smrg 860f4f78bb6Smrg prng_srand (seed); 861f4f78bb6Smrg 862f4f78bb6Smrg if (prng_rand_n (8) == 0) 863953d7d37Smrg { 864f4f78bb6Smrg int n_traps; 865f4f78bb6Smrg pixman_trapezoid_t *trapezoids; 866f4f78bb6Smrg int p = prng_rand_n (3); 867f4f78bb6Smrg 868f4f78bb6Smrg if (p == 0) 869f4f78bb6Smrg dest = create_random_bits_image (DONT_CARE); 870f4f78bb6Smrg else 871f4f78bb6Smrg dest = create_random_bits_image (REQUIRE_ALPHA); 872f4f78bb6Smrg 873f4f78bb6Smrg if (!dest) 874f4f78bb6Smrg goto out; 875f4f78bb6Smrg 876953d7d37Smrg set_general_properties (dest, TRUE); 877953d7d37Smrg 878f4f78bb6Smrg if (!(trapezoids = create_random_trapezoids ( 879f4f78bb6Smrg &n_traps, dest->bits.width, dest->bits.height))) 880f4f78bb6Smrg { 881f4f78bb6Smrg goto out; 882f4f78bb6Smrg } 883f4f78bb6Smrg 884f4f78bb6Smrg switch (p) 885f4f78bb6Smrg { 886f4f78bb6Smrg case 0: 887f4f78bb6Smrg source = create_random_image (); 888f4f78bb6Smrg 889f4f78bb6Smrg if (source) 890f4f78bb6Smrg { 891f4f78bb6Smrg op = op_list [prng_rand_n (ARRAY_LENGTH (op_list))]; 892f4f78bb6Smrg 893f4f78bb6Smrg pixman_composite_trapezoids ( 894f4f78bb6Smrg op, source, dest, 895f4f78bb6Smrg random_format (REQUIRE_ALPHA), 896f4f78bb6Smrg rand_x (source), rand_y (source), 897f4f78bb6Smrg rand_x (dest), rand_y (dest), 898f4f78bb6Smrg n_traps, trapezoids); 899f4f78bb6Smrg } 900f4f78bb6Smrg break; 901f4f78bb6Smrg 902f4f78bb6Smrg case 1: 903f4f78bb6Smrg pixman_rasterize_trapezoid ( 904f4f78bb6Smrg dest, &trapezoids[prng_rand_n (n_traps)], 905f4f78bb6Smrg rand_x (dest), rand_y (dest)); 906f4f78bb6Smrg break; 907953d7d37Smrg 908f4f78bb6Smrg case 2: 909f4f78bb6Smrg pixman_add_trapezoids ( 910f4f78bb6Smrg dest, rand_x (dest), rand_y (dest), n_traps, trapezoids); 911f4f78bb6Smrg break; 912f4f78bb6Smrg } 913f4f78bb6Smrg 914f4f78bb6Smrg free (trapezoids); 915f4f78bb6Smrg } 916f4f78bb6Smrg else 917f4f78bb6Smrg { 918f4f78bb6Smrg dest = create_random_bits_image (DONT_CARE); 919f4f78bb6Smrg source = create_random_image (); 920f4f78bb6Smrg mask = create_random_image (); 921f4f78bb6Smrg 922f4f78bb6Smrg if (source && mask && dest) 923f4f78bb6Smrg { 924f4f78bb6Smrg set_general_properties (dest, TRUE); 925f4f78bb6Smrg 926f4f78bb6Smrg op = op_list [prng_rand_n (ARRAY_LENGTH (op_list))]; 927f4f78bb6Smrg 928f4f78bb6Smrg pixman_image_composite32 (op, 929f4f78bb6Smrg source, mask, dest, 930f4f78bb6Smrg rand_x (source), rand_y (source), 931f4f78bb6Smrg rand_x (mask), rand_y (mask), 932f4f78bb6Smrg 0, 0, 933f4f78bb6Smrg dest->bits.width, 934f4f78bb6Smrg dest->bits.height); 935f4f78bb6Smrg } 936953d7d37Smrg } 937f4f78bb6Smrg 938f4f78bb6Smrgout: 939953d7d37Smrg if (source) 940953d7d37Smrg pixman_image_unref (source); 941953d7d37Smrg if (mask) 942953d7d37Smrg pixman_image_unref (mask); 943953d7d37Smrg if (dest) 944953d7d37Smrg pixman_image_unref (dest); 945953d7d37Smrg} 946953d7d37Smrg 947953d7d37Smrgstatic pixman_bool_t 948953d7d37Smrgget_int (char *s, uint32_t *i) 949953d7d37Smrg{ 950953d7d37Smrg char *end; 951953d7d37Smrg int p; 952953d7d37Smrg 953953d7d37Smrg p = strtol (s, &end, 0); 954953d7d37Smrg 955953d7d37Smrg if (end != s && *end == 0) 956953d7d37Smrg { 957953d7d37Smrg *i = p; 958953d7d37Smrg return TRUE; 959953d7d37Smrg } 960953d7d37Smrg 961953d7d37Smrg return FALSE; 962953d7d37Smrg} 963953d7d37Smrg 964953d7d37Smrgint 965953d7d37Smrgmain (int argc, char **argv) 966953d7d37Smrg{ 967953d7d37Smrg int verbose = FALSE; 968953d7d37Smrg uint32_t seed = 1; 9699ad247e8Sjmcneill uint32_t n_tests = 8000; 970953d7d37Smrg uint32_t mod = 0; 9716ba797d6Smrg pixman_bool_t use_threads = TRUE; 9729ad247e8Sjmcneill int32_t i; 973953d7d37Smrg 974953d7d37Smrg pixman_disable_out_of_bounds_workaround (); 975953d7d37Smrg 9769ad247e8Sjmcneill enable_divbyzero_exceptions(); 977953d7d37Smrg 978953d7d37Smrg if (getenv ("VERBOSE") != NULL) 979953d7d37Smrg verbose = TRUE; 980953d7d37Smrg 981953d7d37Smrg for (i = 1; i < argc; ++i) 982953d7d37Smrg { 983953d7d37Smrg if (strcmp (argv[i], "-v") == 0) 984953d7d37Smrg { 985953d7d37Smrg verbose = TRUE; 986953d7d37Smrg 987953d7d37Smrg if (i + 1 < argc) 988953d7d37Smrg { 989953d7d37Smrg get_int (argv[i + 1], &mod); 990953d7d37Smrg i++; 991953d7d37Smrg } 992953d7d37Smrg } 993953d7d37Smrg else if (strcmp (argv[i], "-s") == 0 && i + 1 < argc) 994953d7d37Smrg { 995953d7d37Smrg get_int (argv[i + 1], &seed); 9966ba797d6Smrg use_threads = FALSE; 997953d7d37Smrg i++; 998953d7d37Smrg } 999953d7d37Smrg else if (strcmp (argv[i], "-n") == 0 && i + 1 < argc) 1000953d7d37Smrg { 1001953d7d37Smrg get_int (argv[i + 1], &n_tests); 1002953d7d37Smrg i++; 1003953d7d37Smrg } 1004953d7d37Smrg else 1005953d7d37Smrg { 1006953d7d37Smrg if (strcmp (argv[i], "-h") != 0) 1007953d7d37Smrg printf ("Unknown option '%s'\n\n", argv[i]); 1008953d7d37Smrg 1009953d7d37Smrg printf ("Options:\n\n" 1010953d7d37Smrg "-n <number> Number of tests to run\n" 10116ba797d6Smrg "-s <seed> Seed of first test (ignored if PIXMAN_RANDOMIZE_TESTS is set)\n" 1012953d7d37Smrg "-v Print out seeds\n" 1013953d7d37Smrg "-v <n> Print out every n'th seed\n\n"); 1014953d7d37Smrg 1015953d7d37Smrg exit (-1); 1016953d7d37Smrg } 1017953d7d37Smrg } 1018953d7d37Smrg 10196ba797d6Smrg if (getenv ("PIXMAN_RANDOMIZE_TESTS")) 10206ba797d6Smrg { 10216ba797d6Smrg seed = get_random_seed(); 10226ba797d6Smrg printf ("First seed: 0x%08x\n", seed); 10236ba797d6Smrg } 10246ba797d6Smrg 10256ba797d6Smrg if (use_threads) 10266ba797d6Smrg { 1027953d7d37Smrg#ifdef USE_OPENMP 1028953d7d37Smrg# pragma omp parallel for default(none) shared(verbose, n_tests, mod, seed) 1029953d7d37Smrg#endif 10309ad247e8Sjmcneill for (i = 0; i < (int32_t)n_tests; ++i) 10319ad247e8Sjmcneill run_test (seed + i, verbose, mod); 10326ba797d6Smrg } 10336ba797d6Smrg else 1034953d7d37Smrg { 10359ad247e8Sjmcneill for (i = 0; i < (int32_t)n_tests; ++i) 10369ad247e8Sjmcneill run_test (seed + i, verbose, mod); 1037953d7d37Smrg } 1038953d7d37Smrg 1039953d7d37Smrg return 0; 1040953d7d37Smrg} 1041