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

changeset 0
6474c204b198
     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 +}

mercurial