gfx/cairo/libpixman/src/pixman-arm-neon.c

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

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

mercurial