michael@0: /* michael@0: * Copyright © 2009 ARM Ltd, Movial Creative Technologies Oy michael@0: * michael@0: * Permission to use, copy, modify, distribute, and sell this software and its michael@0: * documentation for any purpose is hereby granted without fee, provided that michael@0: * the above copyright notice appear in all copies and that both that michael@0: * copyright notice and this permission notice appear in supporting michael@0: * documentation, and that the name of ARM Ltd not be used in michael@0: * advertising or publicity pertaining to distribution of the software without michael@0: * specific, written prior permission. ARM Ltd makes no michael@0: * representations about the suitability of this software for any purpose. It michael@0: * is provided "as is" without express or implied warranty. michael@0: * michael@0: * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS michael@0: * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND michael@0: * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY michael@0: * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES michael@0: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN michael@0: * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING michael@0: * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS michael@0: * SOFTWARE. michael@0: * michael@0: * Author: Ian Rickards (ian.rickards@arm.com) michael@0: * Author: Jonathan Morton (jonathan.morton@movial.com) michael@0: * Author: Markku Vire (markku.vire@movial.com) michael@0: * michael@0: */ michael@0: michael@0: #ifdef HAVE_CONFIG_H michael@0: #include michael@0: #endif michael@0: michael@0: #include michael@0: #include "pixman-private.h" michael@0: #include "pixman-arm-common.h" michael@0: michael@0: PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (neon, src_8888_8888, michael@0: uint32_t, 1, uint32_t, 1) michael@0: PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (neon, src_x888_8888, michael@0: uint32_t, 1, uint32_t, 1) michael@0: PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (neon, src_0565_0565, michael@0: uint16_t, 1, uint16_t, 1) michael@0: PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (neon, src_0888_0888, michael@0: uint8_t, 3, uint8_t, 3) michael@0: PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (neon, src_8888_0565, michael@0: uint32_t, 1, uint16_t, 1) michael@0: PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (neon, src_0565_8888, michael@0: uint16_t, 1, uint32_t, 1) michael@0: PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (neon, src_0888_8888_rev, michael@0: uint8_t, 3, uint32_t, 1) michael@0: PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (neon, src_0888_0565_rev, michael@0: uint8_t, 3, uint16_t, 1) michael@0: PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (neon, src_pixbuf_8888, michael@0: uint32_t, 1, uint32_t, 1) michael@0: PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (neon, src_rpixbuf_8888, michael@0: uint32_t, 1, uint32_t, 1) michael@0: PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (neon, add_8_8, michael@0: uint8_t, 1, uint8_t, 1) michael@0: PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (neon, add_8888_8888, michael@0: uint32_t, 1, uint32_t, 1) michael@0: PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (neon, over_8888_0565, michael@0: uint32_t, 1, uint16_t, 1) michael@0: PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (neon, over_8888_8888, michael@0: uint32_t, 1, uint32_t, 1) michael@0: PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (neon, out_reverse_8_0565, michael@0: uint8_t, 1, uint16_t, 1) michael@0: PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (neon, out_reverse_8_8888, michael@0: uint8_t, 1, uint32_t, 1) michael@0: michael@0: PIXMAN_ARM_BIND_FAST_PATH_N_DST (SKIP_ZERO_SRC, neon, over_n_0565, michael@0: uint16_t, 1) michael@0: PIXMAN_ARM_BIND_FAST_PATH_N_DST (SKIP_ZERO_SRC, neon, over_n_8888, michael@0: uint32_t, 1) michael@0: PIXMAN_ARM_BIND_FAST_PATH_N_DST (SKIP_ZERO_SRC, neon, over_reverse_n_8888, michael@0: uint32_t, 1) michael@0: PIXMAN_ARM_BIND_FAST_PATH_N_DST (0, neon, in_n_8, michael@0: uint8_t, 1) michael@0: michael@0: PIXMAN_ARM_BIND_FAST_PATH_N_MASK_DST (SKIP_ZERO_SRC, neon, over_n_8_0565, michael@0: uint8_t, 1, uint16_t, 1) michael@0: PIXMAN_ARM_BIND_FAST_PATH_N_MASK_DST (SKIP_ZERO_SRC, neon, over_n_8_8888, michael@0: uint8_t, 1, uint32_t, 1) michael@0: PIXMAN_ARM_BIND_FAST_PATH_N_MASK_DST (SKIP_ZERO_SRC, neon, over_n_8888_8888_ca, michael@0: uint32_t, 1, uint32_t, 1) michael@0: PIXMAN_ARM_BIND_FAST_PATH_N_MASK_DST (SKIP_ZERO_SRC, neon, over_n_8888_0565_ca, michael@0: uint32_t, 1, uint16_t, 1) michael@0: PIXMAN_ARM_BIND_FAST_PATH_N_MASK_DST (SKIP_ZERO_SRC, neon, over_n_8_8, michael@0: uint8_t, 1, uint8_t, 1) michael@0: PIXMAN_ARM_BIND_FAST_PATH_N_MASK_DST (SKIP_ZERO_SRC, neon, add_n_8_8, michael@0: uint8_t, 1, uint8_t, 1) michael@0: PIXMAN_ARM_BIND_FAST_PATH_N_MASK_DST (SKIP_ZERO_SRC, neon, add_n_8_8888, michael@0: uint8_t, 1, uint32_t, 1) michael@0: PIXMAN_ARM_BIND_FAST_PATH_N_MASK_DST (0, neon, src_n_8_8888, michael@0: uint8_t, 1, uint32_t, 1) michael@0: PIXMAN_ARM_BIND_FAST_PATH_N_MASK_DST (0, neon, src_n_8_8, michael@0: uint8_t, 1, uint8_t, 1) michael@0: michael@0: PIXMAN_ARM_BIND_FAST_PATH_SRC_N_DST (SKIP_ZERO_MASK, neon, over_8888_n_8888, michael@0: uint32_t, 1, uint32_t, 1) michael@0: PIXMAN_ARM_BIND_FAST_PATH_SRC_N_DST (SKIP_ZERO_MASK, neon, over_8888_n_0565, michael@0: uint32_t, 1, uint16_t, 1) michael@0: PIXMAN_ARM_BIND_FAST_PATH_SRC_N_DST (SKIP_ZERO_MASK, neon, over_0565_n_0565, michael@0: uint16_t, 1, uint16_t, 1) michael@0: PIXMAN_ARM_BIND_FAST_PATH_SRC_N_DST (SKIP_ZERO_MASK, neon, add_8888_n_8888, michael@0: uint32_t, 1, uint32_t, 1) michael@0: michael@0: PIXMAN_ARM_BIND_FAST_PATH_SRC_MASK_DST (neon, add_8_8_8, michael@0: uint8_t, 1, uint8_t, 1, uint8_t, 1) michael@0: PIXMAN_ARM_BIND_FAST_PATH_SRC_MASK_DST (neon, add_0565_8_0565, michael@0: uint16_t, 1, uint8_t, 1, uint16_t, 1) michael@0: PIXMAN_ARM_BIND_FAST_PATH_SRC_MASK_DST (neon, add_8888_8_8888, michael@0: uint32_t, 1, uint8_t, 1, uint32_t, 1) michael@0: PIXMAN_ARM_BIND_FAST_PATH_SRC_MASK_DST (neon, add_8888_8888_8888, michael@0: uint32_t, 1, uint32_t, 1, uint32_t, 1) michael@0: PIXMAN_ARM_BIND_FAST_PATH_SRC_MASK_DST (neon, over_8888_8_8888, michael@0: uint32_t, 1, uint8_t, 1, uint32_t, 1) michael@0: PIXMAN_ARM_BIND_FAST_PATH_SRC_MASK_DST (neon, over_8888_8888_8888, michael@0: uint32_t, 1, uint32_t, 1, uint32_t, 1) michael@0: PIXMAN_ARM_BIND_FAST_PATH_SRC_MASK_DST (neon, over_8888_8_0565, michael@0: uint32_t, 1, uint8_t, 1, uint16_t, 1) michael@0: PIXMAN_ARM_BIND_FAST_PATH_SRC_MASK_DST (neon, over_0565_8_0565, michael@0: uint16_t, 1, uint8_t, 1, uint16_t, 1) michael@0: michael@0: PIXMAN_ARM_BIND_SCALED_NEAREST_SRC_DST (neon, 8888_8888, OVER, michael@0: uint32_t, uint32_t) michael@0: PIXMAN_ARM_BIND_SCALED_NEAREST_SRC_DST (neon, 8888_0565, OVER, michael@0: uint32_t, uint16_t) michael@0: PIXMAN_ARM_BIND_SCALED_NEAREST_SRC_DST (neon, 8888_0565, SRC, michael@0: uint32_t, uint16_t) michael@0: PIXMAN_ARM_BIND_SCALED_NEAREST_SRC_DST (neon, 0565_8888, SRC, michael@0: uint16_t, uint32_t) michael@0: michael@0: PIXMAN_ARM_BIND_SCALED_NEAREST_SRC_A8_DST (SKIP_ZERO_SRC, neon, 8888_8_0565, michael@0: OVER, uint32_t, uint16_t) michael@0: PIXMAN_ARM_BIND_SCALED_NEAREST_SRC_A8_DST (SKIP_ZERO_SRC, neon, 0565_8_0565, michael@0: OVER, uint16_t, uint16_t) michael@0: michael@0: PIXMAN_ARM_BIND_SCALED_BILINEAR_SRC_DST (0, neon, 8888_8888, SRC, michael@0: uint32_t, uint32_t) michael@0: PIXMAN_ARM_BIND_SCALED_BILINEAR_SRC_DST (0, neon, 8888_0565, SRC, michael@0: uint32_t, uint16_t) michael@0: PIXMAN_ARM_BIND_SCALED_BILINEAR_SRC_DST (0, neon, 0565_x888, SRC, michael@0: uint16_t, uint32_t) michael@0: PIXMAN_ARM_BIND_SCALED_BILINEAR_SRC_DST (0, neon, 0565_0565, SRC, michael@0: uint16_t, uint16_t) michael@0: PIXMAN_ARM_BIND_SCALED_BILINEAR_SRC_DST (SKIP_ZERO_SRC, neon, 8888_8888, OVER, michael@0: uint32_t, uint32_t) michael@0: static force_inline void michael@0: pixman_scaled_bilinear_scanline_8888_8888_SRC ( michael@0: uint32_t * dst, michael@0: const uint32_t * mask, michael@0: const uint32_t * src_top, michael@0: const uint32_t * src_bottom, michael@0: int32_t w, michael@0: int wt, michael@0: int wb, michael@0: pixman_fixed_t vx, michael@0: pixman_fixed_t unit_x, michael@0: pixman_fixed_t max_vx, michael@0: pixman_bool_t zero_src) michael@0: { michael@0: pixman_scaled_bilinear_scanline_8888_8888_SRC_asm_neon (dst, src_top, src_bottom, wt, wb, vx, unit_x, w); michael@0: } michael@0: michael@0: PIXMAN_ARM_BIND_SCALED_BILINEAR_SRC_DST (SKIP_ZERO_SRC, neon, 8888_8888, ADD, michael@0: uint32_t, uint32_t) michael@0: michael@0: PIXMAN_ARM_BIND_SCALED_BILINEAR_SRC_A8_DST (0, neon, 8888_8_8888, SRC, michael@0: uint32_t, uint32_t) michael@0: PIXMAN_ARM_BIND_SCALED_BILINEAR_SRC_A8_DST (0, neon, 8888_8_0565, SRC, michael@0: uint32_t, uint16_t) michael@0: PIXMAN_ARM_BIND_SCALED_BILINEAR_SRC_A8_DST (0, neon, 0565_8_x888, SRC, michael@0: uint16_t, uint32_t) michael@0: PIXMAN_ARM_BIND_SCALED_BILINEAR_SRC_A8_DST (0, neon, 0565_8_0565, SRC, michael@0: uint16_t, uint16_t) michael@0: PIXMAN_ARM_BIND_SCALED_BILINEAR_SRC_A8_DST (SKIP_ZERO_SRC, neon, 8888_8_8888, OVER, michael@0: uint32_t, uint32_t) michael@0: PIXMAN_ARM_BIND_SCALED_BILINEAR_SRC_A8_DST (SKIP_ZERO_SRC, neon, 8888_8_8888, ADD, michael@0: uint32_t, uint32_t) michael@0: michael@0: void michael@0: pixman_composite_src_n_8_asm_neon (int32_t w, michael@0: int32_t h, michael@0: uint8_t *dst, michael@0: int32_t dst_stride, michael@0: uint8_t src); michael@0: michael@0: void michael@0: pixman_composite_src_n_0565_asm_neon (int32_t w, michael@0: int32_t h, michael@0: uint16_t *dst, michael@0: int32_t dst_stride, michael@0: uint16_t src); michael@0: michael@0: void michael@0: pixman_composite_src_n_8888_asm_neon (int32_t w, michael@0: int32_t h, michael@0: uint32_t *dst, michael@0: int32_t dst_stride, michael@0: uint32_t src); michael@0: michael@0: static pixman_bool_t michael@0: arm_neon_fill (pixman_implementation_t *imp, michael@0: uint32_t * bits, michael@0: int stride, michael@0: int bpp, michael@0: int x, michael@0: int y, michael@0: int width, michael@0: int height, michael@0: uint32_t _xor) michael@0: { michael@0: /* stride is always multiple of 32bit units in pixman */ michael@0: uint32_t byte_stride = stride * sizeof(uint32_t); michael@0: michael@0: switch (bpp) michael@0: { michael@0: case 8: michael@0: pixman_composite_src_n_8_asm_neon ( michael@0: width, michael@0: height, michael@0: (uint8_t *)(((char *) bits) + y * byte_stride + x), michael@0: byte_stride, michael@0: _xor & 0xff); michael@0: return TRUE; michael@0: case 16: michael@0: pixman_composite_src_n_0565_asm_neon ( michael@0: width, michael@0: height, michael@0: (uint16_t *)(((char *) bits) + y * byte_stride + x * 2), michael@0: byte_stride / 2, michael@0: _xor & 0xffff); michael@0: return TRUE; michael@0: case 32: michael@0: pixman_composite_src_n_8888_asm_neon ( michael@0: width, michael@0: height, michael@0: (uint32_t *)(((char *) bits) + y * byte_stride + x * 4), michael@0: byte_stride / 4, michael@0: _xor); michael@0: return TRUE; michael@0: default: michael@0: return FALSE; michael@0: } michael@0: } michael@0: michael@0: static pixman_bool_t michael@0: arm_neon_blt (pixman_implementation_t *imp, michael@0: uint32_t * src_bits, michael@0: uint32_t * dst_bits, michael@0: int src_stride, michael@0: int dst_stride, michael@0: int src_bpp, michael@0: int dst_bpp, michael@0: int src_x, michael@0: int src_y, michael@0: int dest_x, michael@0: int dest_y, michael@0: int width, michael@0: int height) michael@0: { michael@0: if (src_bpp != dst_bpp) michael@0: return FALSE; michael@0: michael@0: switch (src_bpp) michael@0: { michael@0: case 16: michael@0: pixman_composite_src_0565_0565_asm_neon ( michael@0: width, height, michael@0: (uint16_t *)(((char *) dst_bits) + michael@0: dest_y * dst_stride * 4 + dest_x * 2), dst_stride * 2, michael@0: (uint16_t *)(((char *) src_bits) + michael@0: src_y * src_stride * 4 + src_x * 2), src_stride * 2); michael@0: return TRUE; michael@0: case 32: michael@0: pixman_composite_src_8888_8888_asm_neon ( michael@0: width, height, michael@0: (uint32_t *)(((char *) dst_bits) + michael@0: dest_y * dst_stride * 4 + dest_x * 4), dst_stride, michael@0: (uint32_t *)(((char *) src_bits) + michael@0: src_y * src_stride * 4 + src_x * 4), src_stride); michael@0: return TRUE; michael@0: default: michael@0: return FALSE; michael@0: } michael@0: } michael@0: michael@0: static inline void op_bilinear_over_8888_0565(uint16_t *dst, const uint32_t *mask, const uint32_t *src, int width) michael@0: { michael@0: pixman_composite_over_8888_0565_asm_neon (width, 1, dst, 0, src, 0); michael@0: } michael@0: michael@0: FAST_BILINEAR_MAINLOOP_COMMON (neon_8888_0565_cover_OVER, michael@0: pixman_scaled_bilinear_scanline_8888_8888_SRC, op_bilinear_over_8888_0565, michael@0: uint32_t, uint32_t, uint16_t, michael@0: COVER, FLAG_NONE) michael@0: FAST_BILINEAR_MAINLOOP_COMMON (neon_8888_0565_pad_OVER, michael@0: pixman_scaled_bilinear_scanline_8888_8888_SRC, op_bilinear_over_8888_0565, michael@0: uint32_t, uint32_t, uint16_t, michael@0: PAD, FLAG_NONE) michael@0: FAST_BILINEAR_MAINLOOP_COMMON (neon_8888_0565_none_OVER, michael@0: pixman_scaled_bilinear_scanline_8888_8888_SRC, op_bilinear_over_8888_0565, michael@0: uint32_t, uint32_t, uint16_t, michael@0: NONE, FLAG_NONE) michael@0: FAST_BILINEAR_MAINLOOP_COMMON (neon_8888_0565_normal_OVER, michael@0: pixman_scaled_bilinear_scanline_8888_8888_SRC, op_bilinear_over_8888_0565, michael@0: uint32_t, uint32_t, uint16_t, michael@0: NORMAL, FLAG_NONE) michael@0: michael@0: static const pixman_fast_path_t arm_neon_fast_paths[] = michael@0: { michael@0: PIXMAN_STD_FAST_PATH (SRC, r5g6b5, null, r5g6b5, neon_composite_src_0565_0565), michael@0: PIXMAN_STD_FAST_PATH (SRC, b5g6r5, null, b5g6r5, neon_composite_src_0565_0565), michael@0: PIXMAN_STD_FAST_PATH (SRC, a8r8g8b8, null, r5g6b5, neon_composite_src_8888_0565), michael@0: PIXMAN_STD_FAST_PATH (SRC, x8r8g8b8, null, r5g6b5, neon_composite_src_8888_0565), michael@0: PIXMAN_STD_FAST_PATH (SRC, a8b8g8r8, null, b5g6r5, neon_composite_src_8888_0565), michael@0: PIXMAN_STD_FAST_PATH (SRC, x8b8g8r8, null, b5g6r5, neon_composite_src_8888_0565), michael@0: PIXMAN_STD_FAST_PATH (SRC, r5g6b5, null, a8r8g8b8, neon_composite_src_0565_8888), michael@0: PIXMAN_STD_FAST_PATH (SRC, r5g6b5, null, x8r8g8b8, neon_composite_src_0565_8888), michael@0: PIXMAN_STD_FAST_PATH (SRC, b5g6r5, null, a8b8g8r8, neon_composite_src_0565_8888), michael@0: PIXMAN_STD_FAST_PATH (SRC, b5g6r5, null, x8b8g8r8, neon_composite_src_0565_8888), michael@0: PIXMAN_STD_FAST_PATH (SRC, a8r8g8b8, null, x8r8g8b8, neon_composite_src_8888_8888), michael@0: PIXMAN_STD_FAST_PATH (SRC, x8r8g8b8, null, x8r8g8b8, neon_composite_src_8888_8888), michael@0: PIXMAN_STD_FAST_PATH (SRC, a8b8g8r8, null, x8b8g8r8, neon_composite_src_8888_8888), michael@0: PIXMAN_STD_FAST_PATH (SRC, x8b8g8r8, null, x8b8g8r8, neon_composite_src_8888_8888), michael@0: PIXMAN_STD_FAST_PATH (SRC, a8r8g8b8, null, a8r8g8b8, neon_composite_src_8888_8888), michael@0: PIXMAN_STD_FAST_PATH (SRC, a8b8g8r8, null, a8b8g8r8, neon_composite_src_8888_8888), michael@0: PIXMAN_STD_FAST_PATH (SRC, x8r8g8b8, null, a8r8g8b8, neon_composite_src_x888_8888), michael@0: PIXMAN_STD_FAST_PATH (SRC, x8b8g8r8, null, a8b8g8r8, neon_composite_src_x888_8888), michael@0: PIXMAN_STD_FAST_PATH (SRC, r8g8b8, null, r8g8b8, neon_composite_src_0888_0888), michael@0: PIXMAN_STD_FAST_PATH (SRC, b8g8r8, null, x8r8g8b8, neon_composite_src_0888_8888_rev), michael@0: PIXMAN_STD_FAST_PATH (SRC, b8g8r8, null, r5g6b5, neon_composite_src_0888_0565_rev), michael@0: PIXMAN_STD_FAST_PATH (SRC, pixbuf, pixbuf, a8r8g8b8, neon_composite_src_pixbuf_8888), michael@0: PIXMAN_STD_FAST_PATH (SRC, pixbuf, pixbuf, a8b8g8r8, neon_composite_src_rpixbuf_8888), michael@0: PIXMAN_STD_FAST_PATH (SRC, rpixbuf, rpixbuf, a8r8g8b8, neon_composite_src_rpixbuf_8888), michael@0: PIXMAN_STD_FAST_PATH (SRC, rpixbuf, rpixbuf, a8b8g8r8, neon_composite_src_pixbuf_8888), michael@0: PIXMAN_STD_FAST_PATH (SRC, solid, a8, a8r8g8b8, neon_composite_src_n_8_8888), michael@0: PIXMAN_STD_FAST_PATH (SRC, solid, a8, x8r8g8b8, neon_composite_src_n_8_8888), michael@0: PIXMAN_STD_FAST_PATH (SRC, solid, a8, a8b8g8r8, neon_composite_src_n_8_8888), michael@0: PIXMAN_STD_FAST_PATH (SRC, solid, a8, x8b8g8r8, neon_composite_src_n_8_8888), michael@0: PIXMAN_STD_FAST_PATH (SRC, solid, a8, a8, neon_composite_src_n_8_8), michael@0: michael@0: PIXMAN_STD_FAST_PATH (OVER, solid, a8, a8, neon_composite_over_n_8_8), michael@0: PIXMAN_STD_FAST_PATH (OVER, solid, a8, r5g6b5, neon_composite_over_n_8_0565), michael@0: PIXMAN_STD_FAST_PATH (OVER, solid, a8, b5g6r5, neon_composite_over_n_8_0565), michael@0: PIXMAN_STD_FAST_PATH (OVER, solid, a8, a8r8g8b8, neon_composite_over_n_8_8888), michael@0: PIXMAN_STD_FAST_PATH (OVER, solid, a8, x8r8g8b8, neon_composite_over_n_8_8888), michael@0: PIXMAN_STD_FAST_PATH (OVER, solid, a8, a8b8g8r8, neon_composite_over_n_8_8888), michael@0: PIXMAN_STD_FAST_PATH (OVER, solid, a8, x8b8g8r8, neon_composite_over_n_8_8888), michael@0: PIXMAN_STD_FAST_PATH (OVER, solid, null, r5g6b5, neon_composite_over_n_0565), michael@0: PIXMAN_STD_FAST_PATH (OVER, solid, null, a8r8g8b8, neon_composite_over_n_8888), michael@0: PIXMAN_STD_FAST_PATH (OVER, solid, null, x8r8g8b8, neon_composite_over_n_8888), michael@0: PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8r8g8b8, a8r8g8b8, neon_composite_over_n_8888_8888_ca), michael@0: PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8r8g8b8, x8r8g8b8, neon_composite_over_n_8888_8888_ca), michael@0: PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8b8g8r8, a8b8g8r8, neon_composite_over_n_8888_8888_ca), michael@0: PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8b8g8r8, x8b8g8r8, neon_composite_over_n_8888_8888_ca), michael@0: PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8r8g8b8, r5g6b5, neon_composite_over_n_8888_0565_ca), michael@0: PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8b8g8r8, b5g6r5, neon_composite_over_n_8888_0565_ca), michael@0: PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, solid, a8r8g8b8, neon_composite_over_8888_n_8888), michael@0: PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, solid, x8r8g8b8, neon_composite_over_8888_n_8888), michael@0: PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, solid, r5g6b5, neon_composite_over_8888_n_0565), michael@0: PIXMAN_STD_FAST_PATH (OVER, a8b8g8r8, solid, b5g6r5, neon_composite_over_8888_n_0565), michael@0: PIXMAN_STD_FAST_PATH (OVER, r5g6b5, solid, r5g6b5, neon_composite_over_0565_n_0565), michael@0: PIXMAN_STD_FAST_PATH (OVER, b5g6r5, solid, b5g6r5, neon_composite_over_0565_n_0565), michael@0: PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, a8, a8r8g8b8, neon_composite_over_8888_8_8888), michael@0: PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, a8, x8r8g8b8, neon_composite_over_8888_8_8888), michael@0: PIXMAN_STD_FAST_PATH (OVER, a8b8g8r8, a8, a8b8g8r8, neon_composite_over_8888_8_8888), michael@0: PIXMAN_STD_FAST_PATH (OVER, a8b8g8r8, a8, x8b8g8r8, neon_composite_over_8888_8_8888), michael@0: PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, a8, r5g6b5, neon_composite_over_8888_8_0565), michael@0: PIXMAN_STD_FAST_PATH (OVER, a8b8g8r8, a8, b5g6r5, neon_composite_over_8888_8_0565), michael@0: PIXMAN_STD_FAST_PATH (OVER, r5g6b5, a8, r5g6b5, neon_composite_over_0565_8_0565), michael@0: PIXMAN_STD_FAST_PATH (OVER, b5g6r5, a8, b5g6r5, neon_composite_over_0565_8_0565), michael@0: PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, a8r8g8b8, a8r8g8b8, neon_composite_over_8888_8888_8888), michael@0: PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, null, r5g6b5, neon_composite_over_8888_0565), michael@0: PIXMAN_STD_FAST_PATH (OVER, a8b8g8r8, null, b5g6r5, neon_composite_over_8888_0565), michael@0: PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, null, a8r8g8b8, neon_composite_over_8888_8888), michael@0: PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, null, x8r8g8b8, neon_composite_over_8888_8888), michael@0: PIXMAN_STD_FAST_PATH (OVER, a8b8g8r8, null, a8b8g8r8, neon_composite_over_8888_8888), michael@0: PIXMAN_STD_FAST_PATH (OVER, a8b8g8r8, null, x8b8g8r8, neon_composite_over_8888_8888), michael@0: PIXMAN_STD_FAST_PATH (OVER, x8r8g8b8, null, a8r8g8b8, neon_composite_src_x888_8888), michael@0: PIXMAN_STD_FAST_PATH (OVER, x8b8g8r8, null, a8b8g8r8, neon_composite_src_x888_8888), michael@0: PIXMAN_STD_FAST_PATH (ADD, solid, a8, a8, neon_composite_add_n_8_8), michael@0: PIXMAN_STD_FAST_PATH (ADD, solid, a8, a8r8g8b8, neon_composite_add_n_8_8888), michael@0: PIXMAN_STD_FAST_PATH (ADD, solid, a8, a8b8g8r8, neon_composite_add_n_8_8888), michael@0: PIXMAN_STD_FAST_PATH (ADD, a8, a8, a8, neon_composite_add_8_8_8), michael@0: PIXMAN_STD_FAST_PATH (ADD, r5g6b5, a8, r5g6b5, neon_composite_add_0565_8_0565), michael@0: PIXMAN_STD_FAST_PATH (ADD, b5g6r5, a8, b5g6r5, neon_composite_add_0565_8_0565), michael@0: PIXMAN_STD_FAST_PATH (ADD, a8r8g8b8, a8, a8r8g8b8, neon_composite_add_8888_8_8888), michael@0: PIXMAN_STD_FAST_PATH (ADD, a8b8g8r8, a8, a8b8g8r8, neon_composite_add_8888_8_8888), michael@0: PIXMAN_STD_FAST_PATH (ADD, a8r8g8b8, a8r8g8b8, a8r8g8b8, neon_composite_add_8888_8888_8888), michael@0: PIXMAN_STD_FAST_PATH (ADD, a8r8g8b8, solid, a8r8g8b8, neon_composite_add_8888_n_8888), michael@0: PIXMAN_STD_FAST_PATH (ADD, a8b8g8r8, solid, a8b8g8r8, neon_composite_add_8888_n_8888), michael@0: PIXMAN_STD_FAST_PATH (ADD, a8, null, a8, neon_composite_add_8_8), michael@0: PIXMAN_STD_FAST_PATH (ADD, a8r8g8b8, null, a8r8g8b8, neon_composite_add_8888_8888), michael@0: PIXMAN_STD_FAST_PATH (ADD, a8b8g8r8, null, a8b8g8r8, neon_composite_add_8888_8888), michael@0: PIXMAN_STD_FAST_PATH (IN, solid, null, a8, neon_composite_in_n_8), michael@0: PIXMAN_STD_FAST_PATH (OVER_REVERSE, solid, null, a8r8g8b8, neon_composite_over_reverse_n_8888), michael@0: PIXMAN_STD_FAST_PATH (OVER_REVERSE, solid, null, a8b8g8r8, neon_composite_over_reverse_n_8888), michael@0: PIXMAN_STD_FAST_PATH (OUT_REVERSE, a8, null, r5g6b5, neon_composite_out_reverse_8_0565), michael@0: PIXMAN_STD_FAST_PATH (OUT_REVERSE, a8, null, b5g6r5, neon_composite_out_reverse_8_0565), michael@0: PIXMAN_STD_FAST_PATH (OUT_REVERSE, a8, null, a8r8g8b8, neon_composite_out_reverse_8_8888), michael@0: PIXMAN_STD_FAST_PATH (OUT_REVERSE, a8, null, a8b8g8r8, neon_composite_out_reverse_8_8888), michael@0: michael@0: PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (OVER, a8r8g8b8, a8r8g8b8, neon_8888_8888), michael@0: PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (OVER, a8b8g8r8, a8b8g8r8, neon_8888_8888), michael@0: PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (OVER, a8r8g8b8, x8r8g8b8, neon_8888_8888), michael@0: PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (OVER, a8b8g8r8, x8b8g8r8, neon_8888_8888), michael@0: michael@0: PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (OVER, a8r8g8b8, r5g6b5, neon_8888_0565), michael@0: PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (OVER, a8b8g8r8, b5g6r5, neon_8888_0565), michael@0: michael@0: PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (SRC, a8r8g8b8, r5g6b5, neon_8888_0565), michael@0: PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (SRC, x8r8g8b8, r5g6b5, neon_8888_0565), michael@0: PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (SRC, a8b8g8r8, b5g6r5, neon_8888_0565), michael@0: PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (SRC, x8b8g8r8, b5g6r5, neon_8888_0565), michael@0: michael@0: PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (SRC, b5g6r5, x8b8g8r8, neon_0565_8888), michael@0: PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (SRC, r5g6b5, x8r8g8b8, neon_0565_8888), michael@0: /* Note: NONE repeat is not supported yet */ michael@0: SIMPLE_NEAREST_FAST_PATH_COVER (SRC, r5g6b5, a8r8g8b8, neon_0565_8888), michael@0: SIMPLE_NEAREST_FAST_PATH_COVER (SRC, b5g6r5, a8b8g8r8, neon_0565_8888), michael@0: SIMPLE_NEAREST_FAST_PATH_PAD (SRC, r5g6b5, a8r8g8b8, neon_0565_8888), michael@0: SIMPLE_NEAREST_FAST_PATH_PAD (SRC, b5g6r5, a8b8g8r8, neon_0565_8888), michael@0: michael@0: PIXMAN_ARM_SIMPLE_NEAREST_A8_MASK_FAST_PATH (OVER, a8r8g8b8, r5g6b5, neon_8888_8_0565), michael@0: PIXMAN_ARM_SIMPLE_NEAREST_A8_MASK_FAST_PATH (OVER, a8b8g8r8, b5g6r5, neon_8888_8_0565), michael@0: michael@0: PIXMAN_ARM_SIMPLE_NEAREST_A8_MASK_FAST_PATH (OVER, r5g6b5, r5g6b5, neon_0565_8_0565), michael@0: PIXMAN_ARM_SIMPLE_NEAREST_A8_MASK_FAST_PATH (OVER, b5g6r5, b5g6r5, neon_0565_8_0565), michael@0: michael@0: SIMPLE_BILINEAR_FAST_PATH (SRC, a8r8g8b8, a8r8g8b8, neon_8888_8888), michael@0: SIMPLE_BILINEAR_FAST_PATH (SRC, a8r8g8b8, x8r8g8b8, neon_8888_8888), michael@0: SIMPLE_BILINEAR_FAST_PATH (SRC, x8r8g8b8, x8r8g8b8, neon_8888_8888), michael@0: michael@0: SIMPLE_BILINEAR_FAST_PATH (SRC, a8r8g8b8, r5g6b5, neon_8888_0565), michael@0: SIMPLE_BILINEAR_FAST_PATH (SRC, x8r8g8b8, r5g6b5, neon_8888_0565), michael@0: michael@0: SIMPLE_BILINEAR_FAST_PATH (SRC, r5g6b5, x8r8g8b8, neon_0565_x888), michael@0: SIMPLE_BILINEAR_FAST_PATH (SRC, r5g6b5, r5g6b5, neon_0565_0565), michael@0: michael@0: SIMPLE_BILINEAR_FAST_PATH (OVER, a8r8g8b8, a8r8g8b8, neon_8888_8888), michael@0: SIMPLE_BILINEAR_FAST_PATH (OVER, a8r8g8b8, x8r8g8b8, neon_8888_8888), michael@0: michael@0: SIMPLE_BILINEAR_FAST_PATH (ADD, a8r8g8b8, a8r8g8b8, neon_8888_8888), michael@0: SIMPLE_BILINEAR_FAST_PATH (ADD, a8r8g8b8, x8r8g8b8, neon_8888_8888), michael@0: michael@0: SIMPLE_BILINEAR_A8_MASK_FAST_PATH (SRC, a8r8g8b8, a8r8g8b8, neon_8888_8_8888), michael@0: SIMPLE_BILINEAR_A8_MASK_FAST_PATH (SRC, a8r8g8b8, x8r8g8b8, neon_8888_8_8888), michael@0: SIMPLE_BILINEAR_A8_MASK_FAST_PATH (SRC, x8r8g8b8, x8r8g8b8, neon_8888_8_8888), michael@0: michael@0: SIMPLE_BILINEAR_A8_MASK_FAST_PATH (SRC, a8r8g8b8, r5g6b5, neon_8888_8_0565), michael@0: SIMPLE_BILINEAR_A8_MASK_FAST_PATH (SRC, x8r8g8b8, r5g6b5, neon_8888_8_0565), michael@0: michael@0: SIMPLE_BILINEAR_A8_MASK_FAST_PATH (SRC, r5g6b5, x8r8g8b8, neon_0565_8_x888), michael@0: SIMPLE_BILINEAR_A8_MASK_FAST_PATH (SRC, r5g6b5, r5g6b5, neon_0565_8_0565), michael@0: michael@0: SIMPLE_BILINEAR_A8_MASK_FAST_PATH (OVER, a8r8g8b8, a8r8g8b8, neon_8888_8_8888), michael@0: SIMPLE_BILINEAR_A8_MASK_FAST_PATH (OVER, a8r8g8b8, x8r8g8b8, neon_8888_8_8888), michael@0: michael@0: SIMPLE_BILINEAR_A8_MASK_FAST_PATH (ADD, a8r8g8b8, a8r8g8b8, neon_8888_8_8888), michael@0: SIMPLE_BILINEAR_A8_MASK_FAST_PATH (ADD, a8r8g8b8, x8r8g8b8, neon_8888_8_8888), michael@0: michael@0: SIMPLE_BILINEAR_FAST_PATH (OVER, a8r8g8b8, r5g6b5, neon_8888_0565), michael@0: michael@0: { PIXMAN_OP_NONE }, michael@0: }; michael@0: michael@0: #define BIND_COMBINE_U(name) \ michael@0: void \ michael@0: pixman_composite_scanline_##name##_mask_asm_neon (int32_t w, \ michael@0: const uint32_t *dst, \ michael@0: const uint32_t *src, \ michael@0: const uint32_t *mask); \ michael@0: \ michael@0: void \ michael@0: pixman_composite_scanline_##name##_asm_neon (int32_t w, \ michael@0: const uint32_t *dst, \ michael@0: const uint32_t *src); \ michael@0: \ michael@0: static void \ michael@0: neon_combine_##name##_u (pixman_implementation_t *imp, \ michael@0: pixman_op_t op, \ michael@0: uint32_t * dest, \ michael@0: const uint32_t * src, \ michael@0: const uint32_t * mask, \ michael@0: int width) \ michael@0: { \ michael@0: if (mask) \ michael@0: pixman_composite_scanline_##name##_mask_asm_neon (width, dest, \ michael@0: src, mask); \ michael@0: else \ michael@0: pixman_composite_scanline_##name##_asm_neon (width, dest, src); \ michael@0: } michael@0: michael@0: BIND_COMBINE_U (over) michael@0: BIND_COMBINE_U (add) michael@0: BIND_COMBINE_U (out_reverse) michael@0: michael@0: pixman_implementation_t * michael@0: _pixman_implementation_create_arm_neon (pixman_implementation_t *fallback) michael@0: { michael@0: pixman_implementation_t *imp = michael@0: _pixman_implementation_create (fallback, arm_neon_fast_paths); michael@0: michael@0: imp->combine_32[PIXMAN_OP_OVER] = neon_combine_over_u; michael@0: imp->combine_32[PIXMAN_OP_ADD] = neon_combine_add_u; michael@0: imp->combine_32[PIXMAN_OP_OUT_REVERSE] = neon_combine_out_reverse_u; michael@0: michael@0: imp->blt = arm_neon_blt; michael@0: imp->fill = arm_neon_fill; michael@0: michael@0: return imp; michael@0: }