2 * Copyright © 2008 Mozilla Corporation
4 * Permission to use, copy, modify, distribute, and sell this software and its
5 * documentation for any purpose is hereby granted without fee, provided that
6 * the above copyright notice appear in all copies and that both that
7 * copyright notice and this permission notice appear in supporting
8 * documentation, and that the name of Mozilla Corporation not be used in
9 * advertising or publicity pertaining to distribution of the software without
10 * specific, written prior permission. Mozilla Corporation makes no
11 * representations about the suitability of this software for any purpose. It
12 * is provided "as is" without express or implied warranty.
14 * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
15 * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
16 * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
17 * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
18 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
19 * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
20 * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
23 * Author: Jeff Muizelaar (jeff@infidigm.net)
30 #include "pixman-private.h"
31 #include "pixman-arm-common.h"
32 #include "pixman-inlines.h"
34 PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (armv6
, src_8888_8888
,
35 uint32_t, 1, uint32_t, 1)
36 PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (armv6
, src_x888_8888
,
37 uint32_t, 1, uint32_t, 1)
38 PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (armv6
, src_0565_0565
,
39 uint16_t, 1, uint16_t, 1)
40 PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (armv6
, src_8_8
,
41 uint8_t, 1, uint8_t, 1)
42 PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (armv6
, src_0565_8888
,
43 uint16_t, 1, uint32_t, 1)
44 PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (armv6
, src_x888_0565
,
45 uint32_t, 1, uint16_t, 1)
47 PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (armv6
, add_8_8
,
48 uint8_t, 1, uint8_t, 1)
49 PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (armv6
, over_8888_8888
,
50 uint32_t, 1, uint32_t, 1)
51 PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (armv6
, in_reverse_8888_8888
,
52 uint32_t, 1, uint32_t, 1)
54 PIXMAN_ARM_BIND_FAST_PATH_N_DST (SKIP_ZERO_SRC
, armv6
, over_n_8888
,
56 PIXMAN_ARM_BIND_FAST_PATH_N_DST (0, armv6
, over_reverse_n_8888
,
59 PIXMAN_ARM_BIND_FAST_PATH_SRC_N_DST (SKIP_ZERO_MASK
, armv6
, over_8888_n_8888
,
60 uint32_t, 1, uint32_t, 1)
62 PIXMAN_ARM_BIND_FAST_PATH_N_MASK_DST (SKIP_ZERO_SRC
, armv6
, over_n_8_8888
,
63 uint8_t, 1, uint32_t, 1)
65 PIXMAN_ARM_BIND_FAST_PATH_N_MASK_DST (SKIP_ZERO_SRC
, armv6
, over_n_8888_8888_ca
,
66 uint32_t, 1, uint32_t, 1)
68 PIXMAN_ARM_BIND_SCALED_NEAREST_SRC_DST (armv6
, 0565_0565
, SRC
,
70 PIXMAN_ARM_BIND_SCALED_NEAREST_SRC_DST (armv6
, 8888_8888
, SRC
,
74 pixman_composite_src_n_8888_asm_armv6 (int32_t w
,
81 pixman_composite_src_n_0565_asm_armv6 (int32_t w
,
88 pixman_composite_src_n_8_asm_armv6 (int32_t w
,
95 arm_simd_fill (pixman_implementation_t
*imp
,
97 int stride
, /* in 32-bit words */
105 /* stride is always multiple of 32bit units in pixman */
106 uint32_t byte_stride
= stride
* sizeof(uint32_t);
111 pixman_composite_src_n_8_asm_armv6 (
114 (uint8_t *)(((char *) bits
) + y
* byte_stride
+ x
),
119 pixman_composite_src_n_0565_asm_armv6 (
122 (uint16_t *)(((char *) bits
) + y
* byte_stride
+ x
* 2),
127 pixman_composite_src_n_8888_asm_armv6 (
130 (uint32_t *)(((char *) bits
) + y
* byte_stride
+ x
* 4),
140 arm_simd_blt (pixman_implementation_t
*imp
,
143 int src_stride
, /* in 32-bit words */
144 int dst_stride
, /* in 32-bit words */
154 if (src_bpp
!= dst_bpp
)
160 pixman_composite_src_8_8_asm_armv6 (
162 (uint8_t *)(((char *) dst_bits
) +
163 dest_y
* dst_stride
* 4 + dest_x
* 1), dst_stride
* 4,
164 (uint8_t *)(((char *) src_bits
) +
165 src_y
* src_stride
* 4 + src_x
* 1), src_stride
* 4);
168 pixman_composite_src_0565_0565_asm_armv6 (
170 (uint16_t *)(((char *) dst_bits
) +
171 dest_y
* dst_stride
* 4 + dest_x
* 2), dst_stride
* 2,
172 (uint16_t *)(((char *) src_bits
) +
173 src_y
* src_stride
* 4 + src_x
* 2), src_stride
* 2);
176 pixman_composite_src_8888_8888_asm_armv6 (
178 (uint32_t *)(((char *) dst_bits
) +
179 dest_y
* dst_stride
* 4 + dest_x
* 4), dst_stride
,
180 (uint32_t *)(((char *) src_bits
) +
181 src_y
* src_stride
* 4 + src_x
* 4), src_stride
);
188 static const pixman_fast_path_t arm_simd_fast_paths
[] =
190 PIXMAN_STD_FAST_PATH (SRC
, a8r8g8b8
, null
, a8r8g8b8
, armv6_composite_src_8888_8888
),
191 PIXMAN_STD_FAST_PATH (SRC
, a8b8g8r8
, null
, a8b8g8r8
, armv6_composite_src_8888_8888
),
192 PIXMAN_STD_FAST_PATH (SRC
, a8r8g8b8
, null
, x8r8g8b8
, armv6_composite_src_8888_8888
),
193 PIXMAN_STD_FAST_PATH (SRC
, a8b8g8r8
, null
, x8b8g8r8
, armv6_composite_src_8888_8888
),
194 PIXMAN_STD_FAST_PATH (SRC
, x8r8g8b8
, null
, x8r8g8b8
, armv6_composite_src_8888_8888
),
195 PIXMAN_STD_FAST_PATH (SRC
, x8b8g8r8
, null
, x8b8g8r8
, armv6_composite_src_8888_8888
),
197 PIXMAN_STD_FAST_PATH (SRC
, x8b8g8r8
, null
, a8b8g8r8
, armv6_composite_src_x888_8888
),
198 PIXMAN_STD_FAST_PATH (SRC
, x8r8g8b8
, null
, a8r8g8b8
, armv6_composite_src_x888_8888
),
200 PIXMAN_STD_FAST_PATH (SRC
, r5g6b5
, null
, r5g6b5
, armv6_composite_src_0565_0565
),
201 PIXMAN_STD_FAST_PATH (SRC
, b5g6r5
, null
, b5g6r5
, armv6_composite_src_0565_0565
),
202 PIXMAN_STD_FAST_PATH (SRC
, a1r5g5b5
, null
, a1r5g5b5
, armv6_composite_src_0565_0565
),
203 PIXMAN_STD_FAST_PATH (SRC
, a1b5g5r5
, null
, a1b5g5r5
, armv6_composite_src_0565_0565
),
204 PIXMAN_STD_FAST_PATH (SRC
, a1r5g5b5
, null
, x1r5g5b5
, armv6_composite_src_0565_0565
),
205 PIXMAN_STD_FAST_PATH (SRC
, a1b5g5r5
, null
, x1b5g5r5
, armv6_composite_src_0565_0565
),
206 PIXMAN_STD_FAST_PATH (SRC
, x1r5g5b5
, null
, x1r5g5b5
, armv6_composite_src_0565_0565
),
207 PIXMAN_STD_FAST_PATH (SRC
, x1b5g5r5
, null
, x1b5g5r5
, armv6_composite_src_0565_0565
),
208 PIXMAN_STD_FAST_PATH (SRC
, a4r4g4b4
, null
, a4r4g4b4
, armv6_composite_src_0565_0565
),
209 PIXMAN_STD_FAST_PATH (SRC
, a4b4g4r4
, null
, a4b4g4r4
, armv6_composite_src_0565_0565
),
210 PIXMAN_STD_FAST_PATH (SRC
, a4r4g4b4
, null
, x4r4g4b4
, armv6_composite_src_0565_0565
),
211 PIXMAN_STD_FAST_PATH (SRC
, a4b4g4r4
, null
, x4b4g4r4
, armv6_composite_src_0565_0565
),
212 PIXMAN_STD_FAST_PATH (SRC
, x4r4g4b4
, null
, x4r4g4b4
, armv6_composite_src_0565_0565
),
213 PIXMAN_STD_FAST_PATH (SRC
, x4b4g4r4
, null
, x4b4g4r4
, armv6_composite_src_0565_0565
),
215 PIXMAN_STD_FAST_PATH (SRC
, a8
, null
, a8
, armv6_composite_src_8_8
),
216 PIXMAN_STD_FAST_PATH (SRC
, r3g3b2
, null
, r3g3b2
, armv6_composite_src_8_8
),
217 PIXMAN_STD_FAST_PATH (SRC
, b2g3r3
, null
, b2g3r3
, armv6_composite_src_8_8
),
218 PIXMAN_STD_FAST_PATH (SRC
, a2r2g2b2
, null
, a2r2g2b2
, armv6_composite_src_8_8
),
219 PIXMAN_STD_FAST_PATH (SRC
, a2b2g2r2
, null
, a2b2g2r2
, armv6_composite_src_8_8
),
220 PIXMAN_STD_FAST_PATH (SRC
, c8
, null
, c8
, armv6_composite_src_8_8
),
221 PIXMAN_STD_FAST_PATH (SRC
, g8
, null
, g8
, armv6_composite_src_8_8
),
222 PIXMAN_STD_FAST_PATH (SRC
, x4a4
, null
, x4a4
, armv6_composite_src_8_8
),
223 PIXMAN_STD_FAST_PATH (SRC
, x4c4
, null
, x4c4
, armv6_composite_src_8_8
),
224 PIXMAN_STD_FAST_PATH (SRC
, x4g4
, null
, x4g4
, armv6_composite_src_8_8
),
226 PIXMAN_STD_FAST_PATH (SRC
, r5g6b5
, null
, a8r8g8b8
, armv6_composite_src_0565_8888
),
227 PIXMAN_STD_FAST_PATH (SRC
, r5g6b5
, null
, x8r8g8b8
, armv6_composite_src_0565_8888
),
228 PIXMAN_STD_FAST_PATH (SRC
, b5g6r5
, null
, a8b8g8r8
, armv6_composite_src_0565_8888
),
229 PIXMAN_STD_FAST_PATH (SRC
, b5g6r5
, null
, x8b8g8r8
, armv6_composite_src_0565_8888
),
231 PIXMAN_STD_FAST_PATH (SRC
, a8r8g8b8
, null
, r5g6b5
, armv6_composite_src_x888_0565
),
232 PIXMAN_STD_FAST_PATH (SRC
, x8r8g8b8
, null
, r5g6b5
, armv6_composite_src_x888_0565
),
233 PIXMAN_STD_FAST_PATH (SRC
, a8b8g8r8
, null
, b5g6r5
, armv6_composite_src_x888_0565
),
234 PIXMAN_STD_FAST_PATH (SRC
, x8b8g8r8
, null
, b5g6r5
, armv6_composite_src_x888_0565
),
236 PIXMAN_STD_FAST_PATH (OVER
, a8r8g8b8
, null
, a8r8g8b8
, armv6_composite_over_8888_8888
),
237 PIXMAN_STD_FAST_PATH (OVER
, a8r8g8b8
, null
, x8r8g8b8
, armv6_composite_over_8888_8888
),
238 PIXMAN_STD_FAST_PATH (OVER
, a8b8g8r8
, null
, a8b8g8r8
, armv6_composite_over_8888_8888
),
239 PIXMAN_STD_FAST_PATH (OVER
, a8b8g8r8
, null
, x8b8g8r8
, armv6_composite_over_8888_8888
),
240 PIXMAN_STD_FAST_PATH (OVER
, a8r8g8b8
, solid
, a8r8g8b8
, armv6_composite_over_8888_n_8888
),
241 PIXMAN_STD_FAST_PATH (OVER
, a8r8g8b8
, solid
, x8r8g8b8
, armv6_composite_over_8888_n_8888
),
242 PIXMAN_STD_FAST_PATH (OVER
, a8b8g8r8
, solid
, a8b8g8r8
, armv6_composite_over_8888_n_8888
),
243 PIXMAN_STD_FAST_PATH (OVER
, a8b8g8r8
, solid
, x8b8g8r8
, armv6_composite_over_8888_n_8888
),
245 PIXMAN_STD_FAST_PATH (OVER
, solid
, null
, a8r8g8b8
, armv6_composite_over_n_8888
),
246 PIXMAN_STD_FAST_PATH (OVER
, solid
, null
, x8r8g8b8
, armv6_composite_over_n_8888
),
247 PIXMAN_STD_FAST_PATH (OVER
, solid
, null
, a8b8g8r8
, armv6_composite_over_n_8888
),
248 PIXMAN_STD_FAST_PATH (OVER
, solid
, null
, x8b8g8r8
, armv6_composite_over_n_8888
),
249 PIXMAN_STD_FAST_PATH (OVER_REVERSE
, solid
, null
, a8r8g8b8
, armv6_composite_over_reverse_n_8888
),
250 PIXMAN_STD_FAST_PATH (OVER_REVERSE
, solid
, null
, a8b8g8r8
, armv6_composite_over_reverse_n_8888
),
252 PIXMAN_STD_FAST_PATH (ADD
, a8
, null
, a8
, armv6_composite_add_8_8
),
254 PIXMAN_STD_FAST_PATH (OVER
, solid
, a8
, a8r8g8b8
, armv6_composite_over_n_8_8888
),
255 PIXMAN_STD_FAST_PATH (OVER
, solid
, a8
, x8r8g8b8
, armv6_composite_over_n_8_8888
),
256 PIXMAN_STD_FAST_PATH (OVER
, solid
, a8
, a8b8g8r8
, armv6_composite_over_n_8_8888
),
257 PIXMAN_STD_FAST_PATH (OVER
, solid
, a8
, x8b8g8r8
, armv6_composite_over_n_8_8888
),
259 PIXMAN_STD_FAST_PATH (IN_REVERSE
, a8r8g8b8
, null
, a8r8g8b8
, armv6_composite_in_reverse_8888_8888
),
260 PIXMAN_STD_FAST_PATH (IN_REVERSE
, a8r8g8b8
, null
, x8r8g8b8
, armv6_composite_in_reverse_8888_8888
),
261 PIXMAN_STD_FAST_PATH (IN_REVERSE
, a8b8g8r8
, null
, a8b8g8r8
, armv6_composite_in_reverse_8888_8888
),
262 PIXMAN_STD_FAST_PATH (IN_REVERSE
, a8b8g8r8
, null
, x8b8g8r8
, armv6_composite_in_reverse_8888_8888
),
264 PIXMAN_STD_FAST_PATH_CA (OVER
, solid
, a8r8g8b8
, a8r8g8b8
, armv6_composite_over_n_8888_8888_ca
),
265 PIXMAN_STD_FAST_PATH_CA (OVER
, solid
, a8r8g8b8
, x8r8g8b8
, armv6_composite_over_n_8888_8888_ca
),
266 PIXMAN_STD_FAST_PATH_CA (OVER
, solid
, a8b8g8r8
, a8b8g8r8
, armv6_composite_over_n_8888_8888_ca
),
267 PIXMAN_STD_FAST_PATH_CA (OVER
, solid
, a8b8g8r8
, x8b8g8r8
, armv6_composite_over_n_8888_8888_ca
),
269 SIMPLE_NEAREST_FAST_PATH (SRC
, r5g6b5
, r5g6b5
, armv6_0565_0565
),
270 SIMPLE_NEAREST_FAST_PATH (SRC
, b5g6r5
, b5g6r5
, armv6_0565_0565
),
272 SIMPLE_NEAREST_FAST_PATH (SRC
, a8r8g8b8
, a8r8g8b8
, armv6_8888_8888
),
273 SIMPLE_NEAREST_FAST_PATH (SRC
, a8r8g8b8
, x8r8g8b8
, armv6_8888_8888
),
274 SIMPLE_NEAREST_FAST_PATH (SRC
, x8r8g8b8
, x8r8g8b8
, armv6_8888_8888
),
275 SIMPLE_NEAREST_FAST_PATH (SRC
, a8b8g8r8
, a8b8g8r8
, armv6_8888_8888
),
276 SIMPLE_NEAREST_FAST_PATH (SRC
, a8b8g8r8
, x8b8g8r8
, armv6_8888_8888
),
277 SIMPLE_NEAREST_FAST_PATH (SRC
, x8b8g8r8
, x8b8g8r8
, armv6_8888_8888
),
282 pixman_implementation_t
*
283 _pixman_implementation_create_arm_simd (pixman_implementation_t
*fallback
)
285 pixman_implementation_t
*imp
= _pixman_implementation_create (fallback
, arm_simd_fast_paths
);
287 imp
->blt
= arm_simd_blt
;
288 imp
->fill
= arm_simd_fill
;