1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/gfx/cairo/libpixman/src/pixman-arm-simd.c Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,257 @@ 1.4 +/* 1.5 + * Copyright © 2008 Mozilla Corporation 1.6 + * 1.7 + * Permission to use, copy, modify, distribute, and sell this software and its 1.8 + * documentation for any purpose is hereby granted without fee, provided that 1.9 + * the above copyright notice appear in all copies and that both that 1.10 + * copyright notice and this permission notice appear in supporting 1.11 + * documentation, and that the name of Mozilla Corporation not be used in 1.12 + * advertising or publicity pertaining to distribution of the software without 1.13 + * specific, written prior permission. Mozilla Corporation makes no 1.14 + * representations about the suitability of this software for any purpose. It 1.15 + * is provided "as is" without express or implied warranty. 1.16 + * 1.17 + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS 1.18 + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND 1.19 + * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY 1.20 + * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 1.21 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN 1.22 + * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING 1.23 + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 1.24 + * SOFTWARE. 1.25 + * 1.26 + * Author: Jeff Muizelaar (jeff@infidigm.net) 1.27 + * 1.28 + */ 1.29 +#ifdef HAVE_CONFIG_H 1.30 +#include <config.h> 1.31 +#endif 1.32 + 1.33 +#include "pixman-private.h" 1.34 +#include "pixman-arm-common.h" 1.35 +#include "pixman-inlines.h" 1.36 + 1.37 +PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (armv6, src_8888_8888, 1.38 + uint32_t, 1, uint32_t, 1) 1.39 +PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (armv6, src_x888_8888, 1.40 + uint32_t, 1, uint32_t, 1) 1.41 +PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (armv6, src_0565_0565, 1.42 + uint16_t, 1, uint16_t, 1) 1.43 +PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (armv6, src_8_8, 1.44 + uint8_t, 1, uint8_t, 1) 1.45 +PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (armv6, src_0565_8888, 1.46 + uint16_t, 1, uint32_t, 1) 1.47 + 1.48 +PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (armv6, add_8_8, 1.49 + uint8_t, 1, uint8_t, 1) 1.50 +PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (armv6, over_8888_8888, 1.51 + uint32_t, 1, uint32_t, 1) 1.52 + 1.53 +PIXMAN_ARM_BIND_FAST_PATH_SRC_N_DST (SKIP_ZERO_MASK, armv6, over_8888_n_8888, 1.54 + uint32_t, 1, uint32_t, 1) 1.55 + 1.56 +PIXMAN_ARM_BIND_FAST_PATH_N_MASK_DST (SKIP_ZERO_SRC, armv6, over_n_8_8888, 1.57 + uint8_t, 1, uint32_t, 1) 1.58 + 1.59 +PIXMAN_ARM_BIND_SCALED_NEAREST_SRC_DST (armv6, 0565_0565, SRC, 1.60 + uint16_t, uint16_t) 1.61 +PIXMAN_ARM_BIND_SCALED_NEAREST_SRC_DST (armv6, 8888_8888, SRC, 1.62 + uint32_t, uint32_t) 1.63 + 1.64 +void 1.65 +pixman_composite_src_n_8888_asm_armv6 (int32_t w, 1.66 + int32_t h, 1.67 + uint32_t *dst, 1.68 + int32_t dst_stride, 1.69 + uint32_t src); 1.70 + 1.71 +void 1.72 +pixman_composite_src_n_0565_asm_armv6 (int32_t w, 1.73 + int32_t h, 1.74 + uint16_t *dst, 1.75 + int32_t dst_stride, 1.76 + uint16_t src); 1.77 + 1.78 +void 1.79 +pixman_composite_src_n_8_asm_armv6 (int32_t w, 1.80 + int32_t h, 1.81 + uint8_t *dst, 1.82 + int32_t dst_stride, 1.83 + uint8_t src); 1.84 + 1.85 +static pixman_bool_t 1.86 +arm_simd_fill (pixman_implementation_t *imp, 1.87 + uint32_t * bits, 1.88 + int stride, /* in 32-bit words */ 1.89 + int bpp, 1.90 + int x, 1.91 + int y, 1.92 + int width, 1.93 + int height, 1.94 + uint32_t _xor) 1.95 +{ 1.96 + /* stride is always multiple of 32bit units in pixman */ 1.97 + uint32_t byte_stride = stride * sizeof(uint32_t); 1.98 + 1.99 + switch (bpp) 1.100 + { 1.101 + case 8: 1.102 + pixman_composite_src_n_8_asm_armv6 ( 1.103 + width, 1.104 + height, 1.105 + (uint8_t *)(((char *) bits) + y * byte_stride + x), 1.106 + byte_stride, 1.107 + _xor & 0xff); 1.108 + return TRUE; 1.109 + case 16: 1.110 + pixman_composite_src_n_0565_asm_armv6 ( 1.111 + width, 1.112 + height, 1.113 + (uint16_t *)(((char *) bits) + y * byte_stride + x * 2), 1.114 + byte_stride / 2, 1.115 + _xor & 0xffff); 1.116 + return TRUE; 1.117 + case 32: 1.118 + pixman_composite_src_n_8888_asm_armv6 ( 1.119 + width, 1.120 + height, 1.121 + (uint32_t *)(((char *) bits) + y * byte_stride + x * 4), 1.122 + byte_stride / 4, 1.123 + _xor); 1.124 + return TRUE; 1.125 + default: 1.126 + return FALSE; 1.127 + } 1.128 +} 1.129 + 1.130 +static pixman_bool_t 1.131 +arm_simd_blt (pixman_implementation_t *imp, 1.132 + uint32_t * src_bits, 1.133 + uint32_t * dst_bits, 1.134 + int src_stride, /* in 32-bit words */ 1.135 + int dst_stride, /* in 32-bit words */ 1.136 + int src_bpp, 1.137 + int dst_bpp, 1.138 + int src_x, 1.139 + int src_y, 1.140 + int dest_x, 1.141 + int dest_y, 1.142 + int width, 1.143 + int height) 1.144 +{ 1.145 + if (src_bpp != dst_bpp) 1.146 + return FALSE; 1.147 + 1.148 + switch (src_bpp) 1.149 + { 1.150 + case 8: 1.151 + pixman_composite_src_8_8_asm_armv6 ( 1.152 + width, height, 1.153 + (uint8_t *)(((char *) dst_bits) + 1.154 + dest_y * dst_stride * 4 + dest_x * 1), dst_stride * 4, 1.155 + (uint8_t *)(((char *) src_bits) + 1.156 + src_y * src_stride * 4 + src_x * 1), src_stride * 4); 1.157 + return TRUE; 1.158 + case 16: 1.159 + pixman_composite_src_0565_0565_asm_armv6 ( 1.160 + width, height, 1.161 + (uint16_t *)(((char *) dst_bits) + 1.162 + dest_y * dst_stride * 4 + dest_x * 2), dst_stride * 2, 1.163 + (uint16_t *)(((char *) src_bits) + 1.164 + src_y * src_stride * 4 + src_x * 2), src_stride * 2); 1.165 + return TRUE; 1.166 + case 32: 1.167 + pixman_composite_src_8888_8888_asm_armv6 ( 1.168 + width, height, 1.169 + (uint32_t *)(((char *) dst_bits) + 1.170 + dest_y * dst_stride * 4 + dest_x * 4), dst_stride, 1.171 + (uint32_t *)(((char *) src_bits) + 1.172 + src_y * src_stride * 4 + src_x * 4), src_stride); 1.173 + return TRUE; 1.174 + default: 1.175 + return FALSE; 1.176 + } 1.177 +} 1.178 + 1.179 +static const pixman_fast_path_t arm_simd_fast_paths[] = 1.180 +{ 1.181 + PIXMAN_STD_FAST_PATH (SRC, a8r8g8b8, null, a8r8g8b8, armv6_composite_src_8888_8888), 1.182 + PIXMAN_STD_FAST_PATH (SRC, a8b8g8r8, null, a8b8g8r8, armv6_composite_src_8888_8888), 1.183 + PIXMAN_STD_FAST_PATH (SRC, a8r8g8b8, null, x8r8g8b8, armv6_composite_src_8888_8888), 1.184 + PIXMAN_STD_FAST_PATH (SRC, a8b8g8r8, null, x8b8g8r8, armv6_composite_src_8888_8888), 1.185 + PIXMAN_STD_FAST_PATH (SRC, x8r8g8b8, null, x8r8g8b8, armv6_composite_src_8888_8888), 1.186 + PIXMAN_STD_FAST_PATH (SRC, x8b8g8r8, null, x8b8g8r8, armv6_composite_src_8888_8888), 1.187 + 1.188 + PIXMAN_STD_FAST_PATH (SRC, x8b8g8r8, null, a8b8g8r8, armv6_composite_src_x888_8888), 1.189 + PIXMAN_STD_FAST_PATH (SRC, x8r8g8b8, null, a8r8g8b8, armv6_composite_src_x888_8888), 1.190 + 1.191 + PIXMAN_STD_FAST_PATH (SRC, r5g6b5, null, r5g6b5, armv6_composite_src_0565_0565), 1.192 + PIXMAN_STD_FAST_PATH (SRC, b5g6r5, null, b5g6r5, armv6_composite_src_0565_0565), 1.193 + PIXMAN_STD_FAST_PATH (SRC, a1r5g5b5, null, a1r5g5b5, armv6_composite_src_0565_0565), 1.194 + PIXMAN_STD_FAST_PATH (SRC, a1b5g5r5, null, a1b5g5r5, armv6_composite_src_0565_0565), 1.195 + PIXMAN_STD_FAST_PATH (SRC, a1r5g5b5, null, x1r5g5b5, armv6_composite_src_0565_0565), 1.196 + PIXMAN_STD_FAST_PATH (SRC, a1b5g5r5, null, x1b5g5r5, armv6_composite_src_0565_0565), 1.197 + PIXMAN_STD_FAST_PATH (SRC, x1r5g5b5, null, x1r5g5b5, armv6_composite_src_0565_0565), 1.198 + PIXMAN_STD_FAST_PATH (SRC, x1b5g5r5, null, x1b5g5r5, armv6_composite_src_0565_0565), 1.199 + PIXMAN_STD_FAST_PATH (SRC, a4r4g4b4, null, a4r4g4b4, armv6_composite_src_0565_0565), 1.200 + PIXMAN_STD_FAST_PATH (SRC, a4b4g4r4, null, a4b4g4r4, armv6_composite_src_0565_0565), 1.201 + PIXMAN_STD_FAST_PATH (SRC, a4r4g4b4, null, x4r4g4b4, armv6_composite_src_0565_0565), 1.202 + PIXMAN_STD_FAST_PATH (SRC, a4b4g4r4, null, x4b4g4r4, armv6_composite_src_0565_0565), 1.203 + PIXMAN_STD_FAST_PATH (SRC, x4r4g4b4, null, x4r4g4b4, armv6_composite_src_0565_0565), 1.204 + PIXMAN_STD_FAST_PATH (SRC, x4b4g4r4, null, x4b4g4r4, armv6_composite_src_0565_0565), 1.205 + 1.206 + PIXMAN_STD_FAST_PATH (SRC, a8, null, a8, armv6_composite_src_8_8), 1.207 + PIXMAN_STD_FAST_PATH (SRC, r3g3b2, null, r3g3b2, armv6_composite_src_8_8), 1.208 + PIXMAN_STD_FAST_PATH (SRC, b2g3r3, null, b2g3r3, armv6_composite_src_8_8), 1.209 + PIXMAN_STD_FAST_PATH (SRC, a2r2g2b2, null, a2r2g2b2, armv6_composite_src_8_8), 1.210 + PIXMAN_STD_FAST_PATH (SRC, a2b2g2r2, null, a2b2g2r2, armv6_composite_src_8_8), 1.211 + PIXMAN_STD_FAST_PATH (SRC, c8, null, c8, armv6_composite_src_8_8), 1.212 + PIXMAN_STD_FAST_PATH (SRC, g8, null, g8, armv6_composite_src_8_8), 1.213 + PIXMAN_STD_FAST_PATH (SRC, x4a4, null, x4a4, armv6_composite_src_8_8), 1.214 + PIXMAN_STD_FAST_PATH (SRC, x4c4, null, x4c4, armv6_composite_src_8_8), 1.215 + PIXMAN_STD_FAST_PATH (SRC, x4g4, null, x4g4, armv6_composite_src_8_8), 1.216 + 1.217 + PIXMAN_STD_FAST_PATH (SRC, r5g6b5, null, a8r8g8b8, armv6_composite_src_0565_8888), 1.218 + PIXMAN_STD_FAST_PATH (SRC, r5g6b5, null, x8r8g8b8, armv6_composite_src_0565_8888), 1.219 + PIXMAN_STD_FAST_PATH (SRC, b5g6r5, null, a8b8g8r8, armv6_composite_src_0565_8888), 1.220 + PIXMAN_STD_FAST_PATH (SRC, b5g6r5, null, x8b8g8r8, armv6_composite_src_0565_8888), 1.221 + 1.222 + PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, null, a8r8g8b8, armv6_composite_over_8888_8888), 1.223 + PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, null, x8r8g8b8, armv6_composite_over_8888_8888), 1.224 + PIXMAN_STD_FAST_PATH (OVER, a8b8g8r8, null, a8b8g8r8, armv6_composite_over_8888_8888), 1.225 + PIXMAN_STD_FAST_PATH (OVER, a8b8g8r8, null, x8b8g8r8, armv6_composite_over_8888_8888), 1.226 + PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, solid, a8r8g8b8, armv6_composite_over_8888_n_8888), 1.227 + PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, solid, x8r8g8b8, armv6_composite_over_8888_n_8888), 1.228 + PIXMAN_STD_FAST_PATH (OVER, a8b8g8r8, solid, a8b8g8r8, armv6_composite_over_8888_n_8888), 1.229 + PIXMAN_STD_FAST_PATH (OVER, a8b8g8r8, solid, x8b8g8r8, armv6_composite_over_8888_n_8888), 1.230 + 1.231 + PIXMAN_STD_FAST_PATH (ADD, a8, null, a8, armv6_composite_add_8_8), 1.232 + 1.233 + PIXMAN_STD_FAST_PATH (OVER, solid, a8, a8r8g8b8, armv6_composite_over_n_8_8888), 1.234 + PIXMAN_STD_FAST_PATH (OVER, solid, a8, x8r8g8b8, armv6_composite_over_n_8_8888), 1.235 + PIXMAN_STD_FAST_PATH (OVER, solid, a8, a8b8g8r8, armv6_composite_over_n_8_8888), 1.236 + PIXMAN_STD_FAST_PATH (OVER, solid, a8, x8b8g8r8, armv6_composite_over_n_8_8888), 1.237 + 1.238 + PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (SRC, r5g6b5, r5g6b5, armv6_0565_0565), 1.239 + PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (SRC, b5g6r5, b5g6r5, armv6_0565_0565), 1.240 + 1.241 + PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (SRC, a8r8g8b8, a8r8g8b8, armv6_8888_8888), 1.242 + PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (SRC, a8r8g8b8, x8r8g8b8, armv6_8888_8888), 1.243 + PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (SRC, x8r8g8b8, x8r8g8b8, armv6_8888_8888), 1.244 + PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (SRC, a8b8g8r8, a8b8g8r8, armv6_8888_8888), 1.245 + PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (SRC, a8b8g8r8, x8b8g8r8, armv6_8888_8888), 1.246 + PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (SRC, x8b8g8r8, x8b8g8r8, armv6_8888_8888), 1.247 + 1.248 + { PIXMAN_OP_NONE }, 1.249 +}; 1.250 + 1.251 +pixman_implementation_t * 1.252 +_pixman_implementation_create_arm_simd (pixman_implementation_t *fallback) 1.253 +{ 1.254 + pixman_implementation_t *imp = _pixman_implementation_create (fallback, arm_simd_fast_paths); 1.255 + 1.256 + imp->blt = arm_simd_blt; 1.257 + imp->fill = arm_simd_fill; 1.258 + 1.259 + return imp; 1.260 +}