7 printf ("Skipped thread-test - pthreads not supported\n");
23 static const pixman_op_t operators[] =
32 PIXMAN_OP_OVER_REVERSE,
36 PIXMAN_OP_OUT_REVERSE,
38 PIXMAN_OP_ATOP_REVERSE,
42 PIXMAN_OP_DISJOINT_CLEAR,
43 PIXMAN_OP_DISJOINT_SRC,
44 PIXMAN_OP_DISJOINT_DST,
45 PIXMAN_OP_DISJOINT_OVER,
46 PIXMAN_OP_DISJOINT_OVER_REVERSE,
47 PIXMAN_OP_DISJOINT_IN,
48 PIXMAN_OP_DISJOINT_IN_REVERSE,
49 PIXMAN_OP_DISJOINT_OUT,
50 PIXMAN_OP_DISJOINT_OUT_REVERSE,
51 PIXMAN_OP_DISJOINT_ATOP,
52 PIXMAN_OP_DISJOINT_ATOP_REVERSE,
53 PIXMAN_OP_DISJOINT_XOR,
54 PIXMAN_OP_CONJOINT_CLEAR,
55 PIXMAN_OP_CONJOINT_SRC,
56 PIXMAN_OP_CONJOINT_DST,
57 PIXMAN_OP_CONJOINT_OVER,
58 PIXMAN_OP_CONJOINT_OVER_REVERSE,
59 PIXMAN_OP_CONJOINT_IN,
60 PIXMAN_OP_CONJOINT_IN_REVERSE,
61 PIXMAN_OP_CONJOINT_OUT,
62 PIXMAN_OP_CONJOINT_OUT_REVERSE,
63 PIXMAN_OP_CONJOINT_ATOP,
64 PIXMAN_OP_CONJOINT_ATOP_REVERSE,
65 PIXMAN_OP_CONJOINT_XOR,
71 PIXMAN_OP_COLOR_DODGE,
78 static const pixman_format_code_t formats[] =
92 #define RAND_ELT(arr) \
93 arr[prng_rand_r(&info->prng_state) % ARRAY_LENGTH (arr)]
95 #define DEST_WIDTH (7)
101 uint32_t crc32 = 0x0;
102 uint32_t src_buf[64];
103 pixman_image_t *dst_img, *src_img;
106 prng_srand_r (&info->prng_state, info->thread_no);
108 for (i = 0; i < N_ROUNDS; ++i)
113 prng_randmemset_r (&info->prng_state, info->dst_buf,
114 DEST_WIDTH * sizeof (uint32_t), 0);
115 prng_randmemset_r (&info->prng_state, src_buf,
116 sizeof (src_buf), 0);
118 src_img = pixman_image_create_bits (
119 RAND_ELT (formats), 4, 4, src_buf, 16);
120 dst_img = pixman_image_create_bits (
121 RAND_ELT (formats), DEST_WIDTH, 1, info->dst_buf,
122 DEST_WIDTH * sizeof (uint32_t));
124 image_endian_swap (src_img);
125 image_endian_swap (dst_img);
127 rand2 = prng_rand_r (&info->prng_state) % 4;
128 rand1 = prng_rand_r (&info->prng_state) % 4;
129 op = RAND_ELT (operators);
131 pixman_image_composite32 (
133 src_img, NULL, dst_img,
134 rand1, rand2, 0, 0, 0, 0, DEST_WIDTH, 1);
136 crc32 = compute_crc32_for_image (crc32, dst_img);
138 pixman_image_unref (src_img);
139 pixman_image_unref (dst_img);
142 return (void *)(uintptr_t)crc32;
145 static inline uint32_t
146 byteswap32 (uint32_t x)
148 return ((x & ((uint32_t)0xFF << 24)) >> 24) |
149 ((x & ((uint32_t)0xFF << 16)) >> 8) |
150 ((x & ((uint32_t)0xFF << 8)) << 8) |
151 ((x & ((uint32_t)0xFF << 0)) << 24);
157 uint32_t dest[16 * DEST_WIDTH];
158 info_t info[16] = { { 0 } };
159 pthread_t threads[16];
161 uint32_t crc32s[16], crc32;
164 for (i = 0; i < 16; ++i)
166 info[i].thread_no = i;
167 info[i].dst_buf = &dest[i * DEST_WIDTH];
170 for (i = 0; i < 16; ++i)
171 pthread_create (&threads[i], NULL, thread, &info[i]);
173 for (i = 0; i < 16; ++i)
174 pthread_join (threads[i], &retvals[i]);
176 for (i = 0; i < 16; ++i)
178 crc32s[i] = (uintptr_t)retvals[i];
180 if (is_little_endian())
181 crc32s[i] = byteswap32 (crc32s[i]);
184 crc32 = compute_crc32 (0, crc32s, sizeof crc32s);
186 #define EXPECTED 0xE299B18E
188 if (crc32 != EXPECTED)
190 printf ("thread-test failed. Got checksum 0x%08X, expected 0x%08X\n",