1/* 2 * Copyright © 2009 ARM Ltd, Movial Creative Technologies Oy 3 * 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 ARM Ltd not be used in 9 * advertising or publicity pertaining to distribution of the software without 10 * specific, written prior permission. ARM Ltd makes no 11 * representations about the suitability of this software for any purpose. It 12 * is provided "as is" without express or implied warranty. 13 * 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 21 * SOFTWARE. 22 * 23 * Author: Ian Rickards (ian.rickards@arm.com) 24 * Author: Jonathan Morton (jonathan.morton@movial.com) 25 * Author: Markku Vire (markku.vire@movial.com) 26 * 27 */ 28 29#ifdef HAVE_CONFIG_H 30#include <config.h> 31#endif 32 33#include <string.h> 34#include "pixman-private.h" 35#include "pixman-arm-common.h" 36 37PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (neon, src_8888_8888, 38 uint32_t, 1, uint32_t, 1) 39PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (neon, src_x888_8888, 40 uint32_t, 1, uint32_t, 1) 41PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (neon, src_0565_0565, 42 uint16_t, 1, uint16_t, 1) 43PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (neon, src_0888_0888, 44 uint8_t, 3, uint8_t, 3) 45PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (neon, src_8888_0565, 46 uint32_t, 1, uint16_t, 1) 47PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (neon, src_0565_8888, 48 uint16_t, 1, uint32_t, 1) 49PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (neon, src_0888_8888_rev, 50 uint8_t, 3, uint32_t, 1) 51PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (neon, src_0888_0565_rev, 52 uint8_t, 3, uint16_t, 1) 53PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (neon, src_pixbuf_8888, 54 uint32_t, 1, uint32_t, 1) 55PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (neon, src_rpixbuf_8888, 56 uint32_t, 1, uint32_t, 1) 57PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (neon, add_8_8, 58 uint8_t, 1, uint8_t, 1) 59PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (neon, add_8888_8888, 60 uint32_t, 1, uint32_t, 1) 61PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (neon, over_8888_0565, 62 uint32_t, 1, uint16_t, 1) 63PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (neon, over_8888_8888, 64 uint32_t, 1, uint32_t, 1) 65PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (neon, out_reverse_8_0565, 66 uint8_t, 1, uint16_t, 1) 67PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (neon, out_reverse_8_8888, 68 uint8_t, 1, uint32_t, 1) 69 70PIXMAN_ARM_BIND_FAST_PATH_N_DST (SKIP_ZERO_SRC, neon, over_n_0565, 71 uint16_t, 1) 72PIXMAN_ARM_BIND_FAST_PATH_N_DST (SKIP_ZERO_SRC, neon, over_n_8888, 73 uint32_t, 1) 74PIXMAN_ARM_BIND_FAST_PATH_N_DST (SKIP_ZERO_SRC, neon, over_reverse_n_8888, 75 uint32_t, 1) 76PIXMAN_ARM_BIND_FAST_PATH_N_DST (0, neon, in_n_8, 77 uint8_t, 1) 78 79PIXMAN_ARM_BIND_FAST_PATH_N_MASK_DST (SKIP_ZERO_SRC, neon, over_n_8_0565, 80 uint8_t, 1, uint16_t, 1) 81PIXMAN_ARM_BIND_FAST_PATH_N_MASK_DST (SKIP_ZERO_SRC, neon, over_n_8_8888, 82 uint8_t, 1, uint32_t, 1) 83PIXMAN_ARM_BIND_FAST_PATH_N_MASK_DST (SKIP_ZERO_SRC, neon, over_n_8888_8888_ca, 84 uint32_t, 1, uint32_t, 1) 85PIXMAN_ARM_BIND_FAST_PATH_N_MASK_DST (SKIP_ZERO_SRC, neon, over_n_8888_0565_ca, 86 uint32_t, 1, uint16_t, 1) 87PIXMAN_ARM_BIND_FAST_PATH_N_MASK_DST (SKIP_ZERO_SRC, neon, over_n_8_8, 88 uint8_t, 1, uint8_t, 1) 89PIXMAN_ARM_BIND_FAST_PATH_N_MASK_DST (SKIP_ZERO_SRC, neon, add_n_8_8, 90 uint8_t, 1, uint8_t, 1) 91PIXMAN_ARM_BIND_FAST_PATH_N_MASK_DST (SKIP_ZERO_SRC, neon, add_n_8_8888, 92 uint8_t, 1, uint32_t, 1) 93PIXMAN_ARM_BIND_FAST_PATH_N_MASK_DST (0, neon, src_n_8_8888, 94 uint8_t, 1, uint32_t, 1) 95PIXMAN_ARM_BIND_FAST_PATH_N_MASK_DST (0, neon, src_n_8_8, 96 uint8_t, 1, uint8_t, 1) 97 98PIXMAN_ARM_BIND_FAST_PATH_SRC_N_DST (SKIP_ZERO_MASK, neon, over_8888_n_8888, 99 uint32_t, 1, uint32_t, 1) 100PIXMAN_ARM_BIND_FAST_PATH_SRC_N_DST (SKIP_ZERO_MASK, neon, over_8888_n_0565, 101 uint32_t, 1, uint16_t, 1) 102PIXMAN_ARM_BIND_FAST_PATH_SRC_N_DST (SKIP_ZERO_MASK, neon, over_0565_n_0565, 103 uint16_t, 1, uint16_t, 1) 104PIXMAN_ARM_BIND_FAST_PATH_SRC_N_DST (SKIP_ZERO_MASK, neon, add_8888_n_8888, 105 uint32_t, 1, uint32_t, 1) 106 107PIXMAN_ARM_BIND_FAST_PATH_SRC_MASK_DST (neon, add_8_8_8, 108 uint8_t, 1, uint8_t, 1, uint8_t, 1) 109PIXMAN_ARM_BIND_FAST_PATH_SRC_MASK_DST (neon, add_0565_8_0565, 110 uint16_t, 1, uint8_t, 1, uint16_t, 1) 111PIXMAN_ARM_BIND_FAST_PATH_SRC_MASK_DST (neon, add_8888_8_8888, 112 uint32_t, 1, uint8_t, 1, uint32_t, 1) 113PIXMAN_ARM_BIND_FAST_PATH_SRC_MASK_DST (neon, add_8888_8888_8888, 114 uint32_t, 1, uint32_t, 1, uint32_t, 1) 115PIXMAN_ARM_BIND_FAST_PATH_SRC_MASK_DST (neon, over_8888_8_8888, 116 uint32_t, 1, uint8_t, 1, uint32_t, 1) 117PIXMAN_ARM_BIND_FAST_PATH_SRC_MASK_DST (neon, over_8888_8888_8888, 118 uint32_t, 1, uint32_t, 1, uint32_t, 1) 119PIXMAN_ARM_BIND_FAST_PATH_SRC_MASK_DST (neon, over_8888_8_0565, 120 uint32_t, 1, uint8_t, 1, uint16_t, 1) 121PIXMAN_ARM_BIND_FAST_PATH_SRC_MASK_DST (neon, over_0565_8_0565, 122 uint16_t, 1, uint8_t, 1, uint16_t, 1) 123 124PIXMAN_ARM_BIND_SCALED_NEAREST_SRC_DST (neon, 8888_8888, OVER, 125 uint32_t, uint32_t) 126PIXMAN_ARM_BIND_SCALED_NEAREST_SRC_DST (neon, 8888_0565, OVER, 127 uint32_t, uint16_t) 128PIXMAN_ARM_BIND_SCALED_NEAREST_SRC_DST (neon, 8888_0565, SRC, 129 uint32_t, uint16_t) 130PIXMAN_ARM_BIND_SCALED_NEAREST_SRC_DST (neon, 0565_8888, SRC, 131 uint16_t, uint32_t) 132 133PIXMAN_ARM_BIND_SCALED_NEAREST_SRC_A8_DST (SKIP_ZERO_SRC, neon, 8888_8_0565, 134 OVER, uint32_t, uint16_t) 135PIXMAN_ARM_BIND_SCALED_NEAREST_SRC_A8_DST (SKIP_ZERO_SRC, neon, 0565_8_0565, 136 OVER, uint16_t, uint16_t) 137 138PIXMAN_ARM_BIND_SCALED_BILINEAR_SRC_DST (0, neon, 8888_8888, SRC, 139 uint32_t, uint32_t) 140PIXMAN_ARM_BIND_SCALED_BILINEAR_SRC_DST (0, neon, 8888_0565, SRC, 141 uint32_t, uint16_t) 142PIXMAN_ARM_BIND_SCALED_BILINEAR_SRC_DST (0, neon, 0565_x888, SRC, 143 uint16_t, uint32_t) 144PIXMAN_ARM_BIND_SCALED_BILINEAR_SRC_DST (0, neon, 0565_0565, SRC, 145 uint16_t, uint16_t) 146PIXMAN_ARM_BIND_SCALED_BILINEAR_SRC_DST (SKIP_ZERO_SRC, neon, 8888_8888, OVER, 147 uint32_t, uint32_t) 148PIXMAN_ARM_BIND_SCALED_BILINEAR_SRC_DST (SKIP_ZERO_SRC, neon, 8888_8888, ADD, 149 uint32_t, uint32_t) 150 151PIXMAN_ARM_BIND_SCALED_BILINEAR_SRC_A8_DST (0, neon, 8888_8_8888, SRC, 152 uint32_t, uint32_t) 153PIXMAN_ARM_BIND_SCALED_BILINEAR_SRC_A8_DST (0, neon, 8888_8_0565, SRC, 154 uint32_t, uint16_t) 155PIXMAN_ARM_BIND_SCALED_BILINEAR_SRC_A8_DST (0, neon, 0565_8_x888, SRC, 156 uint16_t, uint32_t) 157PIXMAN_ARM_BIND_SCALED_BILINEAR_SRC_A8_DST (0, neon, 0565_8_0565, SRC, 158 uint16_t, uint16_t) 159PIXMAN_ARM_BIND_SCALED_BILINEAR_SRC_A8_DST (SKIP_ZERO_SRC, neon, 8888_8_8888, OVER, 160 uint32_t, uint32_t) 161PIXMAN_ARM_BIND_SCALED_BILINEAR_SRC_A8_DST (SKIP_ZERO_SRC, neon, 8888_8_8888, ADD, 162 uint32_t, uint32_t) 163 164void 165pixman_composite_src_n_8_asm_neon (int32_t w, 166 int32_t h, 167 uint8_t *dst, 168 int32_t dst_stride, 169 uint8_t src); 170 171void 172pixman_composite_src_n_0565_asm_neon (int32_t w, 173 int32_t h, 174 uint16_t *dst, 175 int32_t dst_stride, 176 uint16_t src); 177 178void 179pixman_composite_src_n_8888_asm_neon (int32_t w, 180 int32_t h, 181 uint32_t *dst, 182 int32_t dst_stride, 183 uint32_t src); 184 185static pixman_bool_t 186arm_neon_fill (pixman_implementation_t *imp, 187 uint32_t * bits, 188 int stride, 189 int bpp, 190 int x, 191 int y, 192 int width, 193 int height, 194 uint32_t _xor) 195{ 196 /* stride is always multiple of 32bit units in pixman */ 197 uint32_t byte_stride = stride * sizeof(uint32_t); 198 199 switch (bpp) 200 { 201 case 8: 202 pixman_composite_src_n_8_asm_neon ( 203 width, 204 height, 205 (uint8_t *)(((char *) bits) + y * byte_stride + x), 206 byte_stride, 207 _xor & 0xff); 208 return TRUE; 209 case 16: 210 pixman_composite_src_n_0565_asm_neon ( 211 width, 212 height, 213 (uint16_t *)(((char *) bits) + y * byte_stride + x * 2), 214 byte_stride / 2, 215 _xor & 0xffff); 216 return TRUE; 217 case 32: 218 pixman_composite_src_n_8888_asm_neon ( 219 width, 220 height, 221 (uint32_t *)(((char *) bits) + y * byte_stride + x * 4), 222 byte_stride / 4, 223 _xor); 224 return TRUE; 225 default: 226 return FALSE; 227 } 228} 229 230static pixman_bool_t 231arm_neon_blt (pixman_implementation_t *imp, 232 uint32_t * src_bits, 233 uint32_t * dst_bits, 234 int src_stride, 235 int dst_stride, 236 int src_bpp, 237 int dst_bpp, 238 int src_x, 239 int src_y, 240 int dest_x, 241 int dest_y, 242 int width, 243 int height) 244{ 245 if (src_bpp != dst_bpp) 246 return FALSE; 247 248 switch (src_bpp) 249 { 250 case 16: 251 pixman_composite_src_0565_0565_asm_neon ( 252 width, height, 253 (uint16_t *)(((char *) dst_bits) + 254 dest_y * dst_stride * 4 + dest_x * 2), dst_stride * 2, 255 (uint16_t *)(((char *) src_bits) + 256 src_y * src_stride * 4 + src_x * 2), src_stride * 2); 257 return TRUE; 258 case 32: 259 pixman_composite_src_8888_8888_asm_neon ( 260 width, height, 261 (uint32_t *)(((char *) dst_bits) + 262 dest_y * dst_stride * 4 + dest_x * 4), dst_stride, 263 (uint32_t *)(((char *) src_bits) + 264 src_y * src_stride * 4 + src_x * 4), src_stride); 265 return TRUE; 266 default: 267 return FALSE; 268 } 269} 270 271static const pixman_fast_path_t arm_neon_fast_paths[] = 272{ 273 PIXMAN_STD_FAST_PATH (SRC, r5g6b5, null, r5g6b5, neon_composite_src_0565_0565), 274 PIXMAN_STD_FAST_PATH (SRC, b5g6r5, null, b5g6r5, neon_composite_src_0565_0565), 275 PIXMAN_STD_FAST_PATH (SRC, a8r8g8b8, null, r5g6b5, neon_composite_src_8888_0565), 276 PIXMAN_STD_FAST_PATH (SRC, x8r8g8b8, null, r5g6b5, neon_composite_src_8888_0565), 277 PIXMAN_STD_FAST_PATH (SRC, a8b8g8r8, null, b5g6r5, neon_composite_src_8888_0565), 278 PIXMAN_STD_FAST_PATH (SRC, x8b8g8r8, null, b5g6r5, neon_composite_src_8888_0565), 279 PIXMAN_STD_FAST_PATH (SRC, r5g6b5, null, a8r8g8b8, neon_composite_src_0565_8888), 280 PIXMAN_STD_FAST_PATH (SRC, r5g6b5, null, x8r8g8b8, neon_composite_src_0565_8888), 281 PIXMAN_STD_FAST_PATH (SRC, b5g6r5, null, a8b8g8r8, neon_composite_src_0565_8888), 282 PIXMAN_STD_FAST_PATH (SRC, b5g6r5, null, x8b8g8r8, neon_composite_src_0565_8888), 283 PIXMAN_STD_FAST_PATH (SRC, a8r8g8b8, null, x8r8g8b8, neon_composite_src_8888_8888), 284 PIXMAN_STD_FAST_PATH (SRC, x8r8g8b8, null, x8r8g8b8, neon_composite_src_8888_8888), 285 PIXMAN_STD_FAST_PATH (SRC, a8b8g8r8, null, x8b8g8r8, neon_composite_src_8888_8888), 286 PIXMAN_STD_FAST_PATH (SRC, x8b8g8r8, null, x8b8g8r8, neon_composite_src_8888_8888), 287 PIXMAN_STD_FAST_PATH (SRC, a8r8g8b8, null, a8r8g8b8, neon_composite_src_8888_8888), 288 PIXMAN_STD_FAST_PATH (SRC, a8b8g8r8, null, a8b8g8r8, neon_composite_src_8888_8888), 289 PIXMAN_STD_FAST_PATH (SRC, x8r8g8b8, null, a8r8g8b8, neon_composite_src_x888_8888), 290 PIXMAN_STD_FAST_PATH (SRC, x8b8g8r8, null, a8b8g8r8, neon_composite_src_x888_8888), 291 PIXMAN_STD_FAST_PATH (SRC, r8g8b8, null, r8g8b8, neon_composite_src_0888_0888), 292 PIXMAN_STD_FAST_PATH (SRC, b8g8r8, null, x8r8g8b8, neon_composite_src_0888_8888_rev), 293 PIXMAN_STD_FAST_PATH (SRC, b8g8r8, null, r5g6b5, neon_composite_src_0888_0565_rev), 294 PIXMAN_STD_FAST_PATH (SRC, pixbuf, pixbuf, a8r8g8b8, neon_composite_src_pixbuf_8888), 295 PIXMAN_STD_FAST_PATH (SRC, pixbuf, pixbuf, a8b8g8r8, neon_composite_src_rpixbuf_8888), 296 PIXMAN_STD_FAST_PATH (SRC, rpixbuf, rpixbuf, a8r8g8b8, neon_composite_src_rpixbuf_8888), 297 PIXMAN_STD_FAST_PATH (SRC, rpixbuf, rpixbuf, a8b8g8r8, neon_composite_src_pixbuf_8888), 298 PIXMAN_STD_FAST_PATH (SRC, solid, a8, a8r8g8b8, neon_composite_src_n_8_8888), 299 PIXMAN_STD_FAST_PATH (SRC, solid, a8, x8r8g8b8, neon_composite_src_n_8_8888), 300 PIXMAN_STD_FAST_PATH (SRC, solid, a8, a8b8g8r8, neon_composite_src_n_8_8888), 301 PIXMAN_STD_FAST_PATH (SRC, solid, a8, x8b8g8r8, neon_composite_src_n_8_8888), 302 PIXMAN_STD_FAST_PATH (SRC, solid, a8, a8, neon_composite_src_n_8_8), 303 304 PIXMAN_STD_FAST_PATH (OVER, solid, a8, a8, neon_composite_over_n_8_8), 305 PIXMAN_STD_FAST_PATH (OVER, solid, a8, r5g6b5, neon_composite_over_n_8_0565), 306 PIXMAN_STD_FAST_PATH (OVER, solid, a8, b5g6r5, neon_composite_over_n_8_0565), 307 PIXMAN_STD_FAST_PATH (OVER, solid, a8, a8r8g8b8, neon_composite_over_n_8_8888), 308 PIXMAN_STD_FAST_PATH (OVER, solid, a8, x8r8g8b8, neon_composite_over_n_8_8888), 309 PIXMAN_STD_FAST_PATH (OVER, solid, a8, a8b8g8r8, neon_composite_over_n_8_8888), 310 PIXMAN_STD_FAST_PATH (OVER, solid, a8, x8b8g8r8, neon_composite_over_n_8_8888), 311 PIXMAN_STD_FAST_PATH (OVER, solid, null, r5g6b5, neon_composite_over_n_0565), 312 PIXMAN_STD_FAST_PATH (OVER, solid, null, a8r8g8b8, neon_composite_over_n_8888), 313 PIXMAN_STD_FAST_PATH (OVER, solid, null, x8r8g8b8, neon_composite_over_n_8888), 314 PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8r8g8b8, a8r8g8b8, neon_composite_over_n_8888_8888_ca), 315 PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8r8g8b8, x8r8g8b8, neon_composite_over_n_8888_8888_ca), 316 PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8b8g8r8, a8b8g8r8, neon_composite_over_n_8888_8888_ca), 317 PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8b8g8r8, x8b8g8r8, neon_composite_over_n_8888_8888_ca), 318 PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8r8g8b8, r5g6b5, neon_composite_over_n_8888_0565_ca), 319 PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8b8g8r8, b5g6r5, neon_composite_over_n_8888_0565_ca), 320 PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, solid, a8r8g8b8, neon_composite_over_8888_n_8888), 321 PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, solid, x8r8g8b8, neon_composite_over_8888_n_8888), 322 PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, solid, r5g6b5, neon_composite_over_8888_n_0565), 323 PIXMAN_STD_FAST_PATH (OVER, a8b8g8r8, solid, b5g6r5, neon_composite_over_8888_n_0565), 324 PIXMAN_STD_FAST_PATH (OVER, r5g6b5, solid, r5g6b5, neon_composite_over_0565_n_0565), 325 PIXMAN_STD_FAST_PATH (OVER, b5g6r5, solid, b5g6r5, neon_composite_over_0565_n_0565), 326 PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, a8, a8r8g8b8, neon_composite_over_8888_8_8888), 327 PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, a8, x8r8g8b8, neon_composite_over_8888_8_8888), 328 PIXMAN_STD_FAST_PATH (OVER, a8b8g8r8, a8, a8b8g8r8, neon_composite_over_8888_8_8888), 329 PIXMAN_STD_FAST_PATH (OVER, a8b8g8r8, a8, x8b8g8r8, neon_composite_over_8888_8_8888), 330 PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, a8, r5g6b5, neon_composite_over_8888_8_0565), 331 PIXMAN_STD_FAST_PATH (OVER, a8b8g8r8, a8, b5g6r5, neon_composite_over_8888_8_0565), 332 PIXMAN_STD_FAST_PATH (OVER, r5g6b5, a8, r5g6b5, neon_composite_over_0565_8_0565), 333 PIXMAN_STD_FAST_PATH (OVER, b5g6r5, a8, b5g6r5, neon_composite_over_0565_8_0565), 334 PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, a8r8g8b8, a8r8g8b8, neon_composite_over_8888_8888_8888), 335 PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, null, r5g6b5, neon_composite_over_8888_0565), 336 PIXMAN_STD_FAST_PATH (OVER, a8b8g8r8, null, b5g6r5, neon_composite_over_8888_0565), 337 PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, null, a8r8g8b8, neon_composite_over_8888_8888), 338 PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, null, x8r8g8b8, neon_composite_over_8888_8888), 339 PIXMAN_STD_FAST_PATH (OVER, a8b8g8r8, null, a8b8g8r8, neon_composite_over_8888_8888), 340 PIXMAN_STD_FAST_PATH (OVER, a8b8g8r8, null, x8b8g8r8, neon_composite_over_8888_8888), 341 PIXMAN_STD_FAST_PATH (OVER, x8r8g8b8, null, a8r8g8b8, neon_composite_src_x888_8888), 342 PIXMAN_STD_FAST_PATH (OVER, x8b8g8r8, null, a8b8g8r8, neon_composite_src_x888_8888), 343 PIXMAN_STD_FAST_PATH (ADD, solid, a8, a8, neon_composite_add_n_8_8), 344 PIXMAN_STD_FAST_PATH (ADD, solid, a8, a8r8g8b8, neon_composite_add_n_8_8888), 345 PIXMAN_STD_FAST_PATH (ADD, solid, a8, a8b8g8r8, neon_composite_add_n_8_8888), 346 PIXMAN_STD_FAST_PATH (ADD, a8, a8, a8, neon_composite_add_8_8_8), 347 PIXMAN_STD_FAST_PATH (ADD, r5g6b5, a8, r5g6b5, neon_composite_add_0565_8_0565), 348 PIXMAN_STD_FAST_PATH (ADD, b5g6r5, a8, b5g6r5, neon_composite_add_0565_8_0565), 349 PIXMAN_STD_FAST_PATH (ADD, a8r8g8b8, a8, a8r8g8b8, neon_composite_add_8888_8_8888), 350 PIXMAN_STD_FAST_PATH (ADD, a8b8g8r8, a8, a8b8g8r8, neon_composite_add_8888_8_8888), 351 PIXMAN_STD_FAST_PATH (ADD, a8r8g8b8, a8r8g8b8, a8r8g8b8, neon_composite_add_8888_8888_8888), 352 PIXMAN_STD_FAST_PATH (ADD, a8r8g8b8, solid, a8r8g8b8, neon_composite_add_8888_n_8888), 353 PIXMAN_STD_FAST_PATH (ADD, a8b8g8r8, solid, a8b8g8r8, neon_composite_add_8888_n_8888), 354 PIXMAN_STD_FAST_PATH (ADD, a8, null, a8, neon_composite_add_8_8), 355 PIXMAN_STD_FAST_PATH (ADD, a8r8g8b8, null, a8r8g8b8, neon_composite_add_8888_8888), 356 PIXMAN_STD_FAST_PATH (ADD, a8b8g8r8, null, a8b8g8r8, neon_composite_add_8888_8888), 357 PIXMAN_STD_FAST_PATH (IN, solid, null, a8, neon_composite_in_n_8), 358 PIXMAN_STD_FAST_PATH (OVER_REVERSE, solid, null, a8r8g8b8, neon_composite_over_reverse_n_8888), 359 PIXMAN_STD_FAST_PATH (OVER_REVERSE, solid, null, a8b8g8r8, neon_composite_over_reverse_n_8888), 360 PIXMAN_STD_FAST_PATH (OUT_REVERSE, a8, null, r5g6b5, neon_composite_out_reverse_8_0565), 361 PIXMAN_STD_FAST_PATH (OUT_REVERSE, a8, null, b5g6r5, neon_composite_out_reverse_8_0565), 362 PIXMAN_STD_FAST_PATH (OUT_REVERSE, a8, null, a8r8g8b8, neon_composite_out_reverse_8_8888), 363 PIXMAN_STD_FAST_PATH (OUT_REVERSE, a8, null, a8b8g8r8, neon_composite_out_reverse_8_8888), 364 365 PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (OVER, a8r8g8b8, a8r8g8b8, neon_8888_8888), 366 PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (OVER, a8b8g8r8, a8b8g8r8, neon_8888_8888), 367 PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (OVER, a8r8g8b8, x8r8g8b8, neon_8888_8888), 368 PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (OVER, a8b8g8r8, x8b8g8r8, neon_8888_8888), 369 370 PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (OVER, a8r8g8b8, r5g6b5, neon_8888_0565), 371 PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (OVER, a8b8g8r8, b5g6r5, neon_8888_0565), 372 373 PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (SRC, a8r8g8b8, r5g6b5, neon_8888_0565), 374 PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (SRC, x8r8g8b8, r5g6b5, neon_8888_0565), 375 PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (SRC, a8b8g8r8, b5g6r5, neon_8888_0565), 376 PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (SRC, x8b8g8r8, b5g6r5, neon_8888_0565), 377 378 PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (SRC, b5g6r5, x8b8g8r8, neon_0565_8888), 379 PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (SRC, r5g6b5, x8r8g8b8, neon_0565_8888), 380 /* Note: NONE repeat is not supported yet */ 381 SIMPLE_NEAREST_FAST_PATH_COVER (SRC, r5g6b5, a8r8g8b8, neon_0565_8888), 382 SIMPLE_NEAREST_FAST_PATH_COVER (SRC, b5g6r5, a8b8g8r8, neon_0565_8888), 383 SIMPLE_NEAREST_FAST_PATH_PAD (SRC, r5g6b5, a8r8g8b8, neon_0565_8888), 384 SIMPLE_NEAREST_FAST_PATH_PAD (SRC, b5g6r5, a8b8g8r8, neon_0565_8888), 385 386 PIXMAN_ARM_SIMPLE_NEAREST_A8_MASK_FAST_PATH (OVER, a8r8g8b8, r5g6b5, neon_8888_8_0565), 387 PIXMAN_ARM_SIMPLE_NEAREST_A8_MASK_FAST_PATH (OVER, a8b8g8r8, b5g6r5, neon_8888_8_0565), 388 389 PIXMAN_ARM_SIMPLE_NEAREST_A8_MASK_FAST_PATH (OVER, r5g6b5, r5g6b5, neon_0565_8_0565), 390 PIXMAN_ARM_SIMPLE_NEAREST_A8_MASK_FAST_PATH (OVER, b5g6r5, b5g6r5, neon_0565_8_0565), 391 392 SIMPLE_BILINEAR_FAST_PATH (SRC, a8r8g8b8, a8r8g8b8, neon_8888_8888), 393 SIMPLE_BILINEAR_FAST_PATH (SRC, a8r8g8b8, x8r8g8b8, neon_8888_8888), 394 SIMPLE_BILINEAR_FAST_PATH (SRC, x8r8g8b8, x8r8g8b8, neon_8888_8888), 395 396 SIMPLE_BILINEAR_FAST_PATH (SRC, a8r8g8b8, r5g6b5, neon_8888_0565), 397 SIMPLE_BILINEAR_FAST_PATH (SRC, x8r8g8b8, r5g6b5, neon_8888_0565), 398 399 SIMPLE_BILINEAR_FAST_PATH (SRC, r5g6b5, x8r8g8b8, neon_0565_x888), 400 SIMPLE_BILINEAR_FAST_PATH (SRC, r5g6b5, r5g6b5, neon_0565_0565), 401 402 SIMPLE_BILINEAR_FAST_PATH (OVER, a8r8g8b8, a8r8g8b8, neon_8888_8888), 403 SIMPLE_BILINEAR_FAST_PATH (OVER, a8r8g8b8, x8r8g8b8, neon_8888_8888), 404 405 SIMPLE_BILINEAR_FAST_PATH (ADD, a8r8g8b8, a8r8g8b8, neon_8888_8888), 406 SIMPLE_BILINEAR_FAST_PATH (ADD, a8r8g8b8, x8r8g8b8, neon_8888_8888), 407 408 SIMPLE_BILINEAR_A8_MASK_FAST_PATH (SRC, a8r8g8b8, a8r8g8b8, neon_8888_8_8888), 409 SIMPLE_BILINEAR_A8_MASK_FAST_PATH (SRC, a8r8g8b8, x8r8g8b8, neon_8888_8_8888), 410 SIMPLE_BILINEAR_A8_MASK_FAST_PATH (SRC, x8r8g8b8, x8r8g8b8, neon_8888_8_8888), 411 412 SIMPLE_BILINEAR_A8_MASK_FAST_PATH (SRC, a8r8g8b8, r5g6b5, neon_8888_8_0565), 413 SIMPLE_BILINEAR_A8_MASK_FAST_PATH (SRC, x8r8g8b8, r5g6b5, neon_8888_8_0565), 414 415 SIMPLE_BILINEAR_A8_MASK_FAST_PATH (SRC, r5g6b5, x8r8g8b8, neon_0565_8_x888), 416 SIMPLE_BILINEAR_A8_MASK_FAST_PATH (SRC, r5g6b5, r5g6b5, neon_0565_8_0565), 417 418 SIMPLE_BILINEAR_A8_MASK_FAST_PATH (OVER, a8r8g8b8, a8r8g8b8, neon_8888_8_8888), 419 SIMPLE_BILINEAR_A8_MASK_FAST_PATH (OVER, a8r8g8b8, x8r8g8b8, neon_8888_8_8888), 420 421 SIMPLE_BILINEAR_A8_MASK_FAST_PATH (ADD, a8r8g8b8, a8r8g8b8, neon_8888_8_8888), 422 SIMPLE_BILINEAR_A8_MASK_FAST_PATH (ADD, a8r8g8b8, x8r8g8b8, neon_8888_8_8888), 423 424 { PIXMAN_OP_NONE }, 425}; 426 427#define BIND_COMBINE_U(name) \ 428void \ 429pixman_composite_scanline_##name##_mask_asm_neon (int32_t w, \ 430 const uint32_t *dst, \ 431 const uint32_t *src, \ 432 const uint32_t *mask); \ 433 \ 434void \ 435pixman_composite_scanline_##name##_asm_neon (int32_t w, \ 436 const uint32_t *dst, \ 437 const uint32_t *src); \ 438 \ 439static void \ 440neon_combine_##name##_u (pixman_implementation_t *imp, \ 441 pixman_op_t op, \ 442 uint32_t * dest, \ 443 const uint32_t * src, \ 444 const uint32_t * mask, \ 445 int width) \ 446{ \ 447 if (mask) \ 448 pixman_composite_scanline_##name##_mask_asm_neon (width, dest, \ 449 src, mask); \ 450 else \ 451 pixman_composite_scanline_##name##_asm_neon (width, dest, src); \ 452} 453 454BIND_COMBINE_U (over) 455BIND_COMBINE_U (add) 456BIND_COMBINE_U (out_reverse) 457 458pixman_implementation_t * 459_pixman_implementation_create_arm_neon (pixman_implementation_t *fallback) 460{ 461 pixman_implementation_t *imp = 462 _pixman_implementation_create (fallback, arm_neon_fast_paths); 463 464 imp->combine_32[PIXMAN_OP_OVER] = neon_combine_over_u; 465 imp->combine_32[PIXMAN_OP_ADD] = neon_combine_add_u; 466 imp->combine_32[PIXMAN_OP_OUT_REVERSE] = neon_combine_out_reverse_u; 467 468 imp->blt = arm_neon_blt; 469 imp->fill = arm_neon_fill; 470 471 return imp; 472} 473