tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

pixman-arm-simd.c (13871B)


      1 /*
      2 * Copyright © 2008 Mozilla Corporation
      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 Mozilla Corporation not be used in
      9 * advertising or publicity pertaining to distribution of the software without
     10 * specific, written prior permission.  Mozilla Corporation 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:  Jeff Muizelaar (jeff@infidigm.net)
     24 *
     25 */
     26 #ifdef HAVE_CONFIG_H
     27 #include <pixman-config.h>
     28 #endif
     29 
     30 #include "pixman-private.h"
     31 #include "pixman-arm-common.h"
     32 #include "pixman-inlines.h"
     33 
     34 PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (armv6, src_8888_8888,
     35 	                   uint32_t, 1, uint32_t, 1)
     36 PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (armv6, src_x888_8888,
     37                                   uint32_t, 1, uint32_t, 1)
     38 PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (armv6, src_0565_0565,
     39                                   uint16_t, 1, uint16_t, 1)
     40 PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (armv6, src_8_8,
     41                                   uint8_t, 1, uint8_t, 1)
     42 PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (armv6, src_0565_8888,
     43                                   uint16_t, 1, uint32_t, 1)
     44 PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (armv6, src_x888_0565,
     45                                   uint32_t, 1, uint16_t, 1)
     46 
     47 PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (armv6, add_8_8,
     48                                   uint8_t, 1, uint8_t, 1)
     49 PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (armv6, over_8888_8888,
     50                                   uint32_t, 1, uint32_t, 1)
     51 PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (armv6, in_reverse_8888_8888,
     52                                   uint32_t, 1, uint32_t, 1)
     53 
     54 PIXMAN_ARM_BIND_FAST_PATH_N_DST (SKIP_ZERO_SRC, armv6, over_n_8888,
     55                                 uint32_t, 1)
     56 PIXMAN_ARM_BIND_FAST_PATH_N_DST (0, armv6, over_reverse_n_8888,
     57                                 uint32_t, 1)
     58 
     59 PIXMAN_ARM_BIND_FAST_PATH_SRC_N_DST (SKIP_ZERO_MASK, armv6, over_8888_n_8888,
     60                                     uint32_t, 1, uint32_t, 1)
     61 
     62 PIXMAN_ARM_BIND_FAST_PATH_N_MASK_DST (SKIP_ZERO_SRC, armv6, over_n_8_8888,
     63                                      uint8_t, 1, uint32_t, 1)
     64 
     65 PIXMAN_ARM_BIND_FAST_PATH_N_MASK_DST (SKIP_ZERO_SRC, armv6, over_n_8888_8888_ca,
     66                                      uint32_t, 1, uint32_t, 1)
     67 
     68 PIXMAN_ARM_BIND_SCALED_NEAREST_SRC_DST (armv6, 0565_0565, SRC,
     69                                        uint16_t, uint16_t)
     70 PIXMAN_ARM_BIND_SCALED_NEAREST_SRC_DST (armv6, 8888_8888, SRC,
     71                                        uint32_t, uint32_t)
     72 
     73 void
     74 pixman_composite_src_n_8888_asm_armv6 (int32_t   w,
     75                                       int32_t   h,
     76                                       uint32_t *dst,
     77                                       int32_t   dst_stride,
     78                                       uint32_t  src);
     79 
     80 void
     81 pixman_composite_src_n_0565_asm_armv6 (int32_t   w,
     82                                       int32_t   h,
     83                                       uint16_t *dst,
     84                                       int32_t   dst_stride,
     85                                       uint16_t  src);
     86 
     87 void
     88 pixman_composite_src_n_8_asm_armv6 (int32_t   w,
     89                                    int32_t   h,
     90                                    uint8_t  *dst,
     91                                    int32_t   dst_stride,
     92                                    uint8_t  src);
     93 
     94 static pixman_bool_t
     95 arm_simd_fill (pixman_implementation_t *imp,
     96               uint32_t *               bits,
     97               int                      stride, /* in 32-bit words */
     98               int                      bpp,
     99               int                      x,
    100               int                      y,
    101               int                      width,
    102               int                      height,
    103               uint32_t                 _xor)
    104 {
    105    /* stride is always multiple of 32bit units in pixman */
    106    uint32_t byte_stride = stride * sizeof(uint32_t);
    107 
    108    switch (bpp)
    109    {
    110    case 8:
    111 pixman_composite_src_n_8_asm_armv6 (
    112 	width,
    113 	height,
    114 	(uint8_t *)(((char *) bits) + y * byte_stride + x),
    115 	byte_stride,
    116 	_xor & 0xff);
    117 return TRUE;
    118    case 16:
    119 pixman_composite_src_n_0565_asm_armv6 (
    120 	width,
    121 	height,
    122 	(uint16_t *)(((char *) bits) + y * byte_stride + x * 2),
    123 	byte_stride / 2,
    124 	_xor & 0xffff);
    125 return TRUE;
    126    case 32:
    127 pixman_composite_src_n_8888_asm_armv6 (
    128 	width,
    129 	height,
    130 	(uint32_t *)(((char *) bits) + y * byte_stride + x * 4),
    131 	byte_stride / 4,
    132 	_xor);
    133 return TRUE;
    134    default:
    135 return FALSE;
    136    }
    137 }
    138 
    139 static pixman_bool_t
    140 arm_simd_blt (pixman_implementation_t *imp,
    141              uint32_t *               src_bits,
    142              uint32_t *               dst_bits,
    143              int                      src_stride, /* in 32-bit words */
    144              int                      dst_stride, /* in 32-bit words */
    145              int                      src_bpp,
    146              int                      dst_bpp,
    147              int                      src_x,
    148              int                      src_y,
    149              int                      dest_x,
    150              int                      dest_y,
    151              int                      width,
    152              int                      height)
    153 {
    154    if (src_bpp != dst_bpp)
    155 return FALSE;
    156 
    157    switch (src_bpp)
    158    {
    159    case 8:
    160        pixman_composite_src_8_8_asm_armv6 (
    161                width, height,
    162                (uint8_t *)(((char *) dst_bits) +
    163                dest_y * dst_stride * 4 + dest_x * 1), dst_stride * 4,
    164                (uint8_t *)(((char *) src_bits) +
    165                src_y * src_stride * 4 + src_x * 1), src_stride * 4);
    166        return TRUE;
    167    case 16:
    168 pixman_composite_src_0565_0565_asm_armv6 (
    169 	width, height,
    170 	(uint16_t *)(((char *) dst_bits) +
    171 	dest_y * dst_stride * 4 + dest_x * 2), dst_stride * 2,
    172 	(uint16_t *)(((char *) src_bits) +
    173 	src_y * src_stride * 4 + src_x * 2), src_stride * 2);
    174 return TRUE;
    175    case 32:
    176 pixman_composite_src_8888_8888_asm_armv6 (
    177 	width, height,
    178 	(uint32_t *)(((char *) dst_bits) +
    179 	dest_y * dst_stride * 4 + dest_x * 4), dst_stride,
    180 	(uint32_t *)(((char *) src_bits) +
    181 	src_y * src_stride * 4 + src_x * 4), src_stride);
    182 return TRUE;
    183    default:
    184 return FALSE;
    185    }
    186 }
    187 
    188 static const pixman_fast_path_t arm_simd_fast_paths[] =
    189 {
    190    PIXMAN_STD_FAST_PATH (SRC, a8r8g8b8, null, a8r8g8b8, armv6_composite_src_8888_8888),
    191    PIXMAN_STD_FAST_PATH (SRC, a8b8g8r8, null, a8b8g8r8, armv6_composite_src_8888_8888),
    192    PIXMAN_STD_FAST_PATH (SRC, a8r8g8b8, null, x8r8g8b8, armv6_composite_src_8888_8888),
    193    PIXMAN_STD_FAST_PATH (SRC, a8b8g8r8, null, x8b8g8r8, armv6_composite_src_8888_8888),
    194    PIXMAN_STD_FAST_PATH (SRC, x8r8g8b8, null, x8r8g8b8, armv6_composite_src_8888_8888),
    195    PIXMAN_STD_FAST_PATH (SRC, x8b8g8r8, null, x8b8g8r8, armv6_composite_src_8888_8888),
    196 
    197    PIXMAN_STD_FAST_PATH (SRC, x8b8g8r8, null, a8b8g8r8, armv6_composite_src_x888_8888),
    198    PIXMAN_STD_FAST_PATH (SRC, x8r8g8b8, null, a8r8g8b8, armv6_composite_src_x888_8888),
    199 
    200    PIXMAN_STD_FAST_PATH (SRC, r5g6b5, null, r5g6b5, armv6_composite_src_0565_0565),
    201    PIXMAN_STD_FAST_PATH (SRC, b5g6r5, null, b5g6r5, armv6_composite_src_0565_0565),
    202    PIXMAN_STD_FAST_PATH (SRC, a1r5g5b5, null, a1r5g5b5, armv6_composite_src_0565_0565),
    203    PIXMAN_STD_FAST_PATH (SRC, a1b5g5r5, null, a1b5g5r5, armv6_composite_src_0565_0565),
    204    PIXMAN_STD_FAST_PATH (SRC, a1r5g5b5, null, x1r5g5b5, armv6_composite_src_0565_0565),
    205    PIXMAN_STD_FAST_PATH (SRC, a1b5g5r5, null, x1b5g5r5, armv6_composite_src_0565_0565),
    206    PIXMAN_STD_FAST_PATH (SRC, x1r5g5b5, null, x1r5g5b5, armv6_composite_src_0565_0565),
    207    PIXMAN_STD_FAST_PATH (SRC, x1b5g5r5, null, x1b5g5r5, armv6_composite_src_0565_0565),
    208    PIXMAN_STD_FAST_PATH (SRC, a4r4g4b4, null, a4r4g4b4, armv6_composite_src_0565_0565),
    209    PIXMAN_STD_FAST_PATH (SRC, a4b4g4r4, null, a4b4g4r4, armv6_composite_src_0565_0565),
    210    PIXMAN_STD_FAST_PATH (SRC, a4r4g4b4, null, x4r4g4b4, armv6_composite_src_0565_0565),
    211    PIXMAN_STD_FAST_PATH (SRC, a4b4g4r4, null, x4b4g4r4, armv6_composite_src_0565_0565),
    212    PIXMAN_STD_FAST_PATH (SRC, x4r4g4b4, null, x4r4g4b4, armv6_composite_src_0565_0565),
    213    PIXMAN_STD_FAST_PATH (SRC, x4b4g4r4, null, x4b4g4r4, armv6_composite_src_0565_0565),
    214 
    215    PIXMAN_STD_FAST_PATH (SRC, a8, null, a8, armv6_composite_src_8_8),
    216    PIXMAN_STD_FAST_PATH (SRC, r3g3b2, null, r3g3b2, armv6_composite_src_8_8),
    217    PIXMAN_STD_FAST_PATH (SRC, b2g3r3, null, b2g3r3, armv6_composite_src_8_8),
    218    PIXMAN_STD_FAST_PATH (SRC, a2r2g2b2, null, a2r2g2b2, armv6_composite_src_8_8),
    219    PIXMAN_STD_FAST_PATH (SRC, a2b2g2r2, null, a2b2g2r2, armv6_composite_src_8_8),
    220    PIXMAN_STD_FAST_PATH (SRC, c8, null, c8, armv6_composite_src_8_8),
    221    PIXMAN_STD_FAST_PATH (SRC, g8, null, g8, armv6_composite_src_8_8),
    222    PIXMAN_STD_FAST_PATH (SRC, x4a4, null, x4a4, armv6_composite_src_8_8),
    223    PIXMAN_STD_FAST_PATH (SRC, x4c4, null, x4c4, armv6_composite_src_8_8),
    224    PIXMAN_STD_FAST_PATH (SRC, x4g4, null, x4g4, armv6_composite_src_8_8),
    225 
    226    PIXMAN_STD_FAST_PATH (SRC, r5g6b5, null, a8r8g8b8, armv6_composite_src_0565_8888),
    227    PIXMAN_STD_FAST_PATH (SRC, r5g6b5, null, x8r8g8b8, armv6_composite_src_0565_8888),
    228    PIXMAN_STD_FAST_PATH (SRC, b5g6r5, null, a8b8g8r8, armv6_composite_src_0565_8888),
    229    PIXMAN_STD_FAST_PATH (SRC, b5g6r5, null, x8b8g8r8, armv6_composite_src_0565_8888),
    230 
    231    PIXMAN_STD_FAST_PATH (SRC, a8r8g8b8, null, r5g6b5, armv6_composite_src_x888_0565),
    232    PIXMAN_STD_FAST_PATH (SRC, x8r8g8b8, null, r5g6b5, armv6_composite_src_x888_0565),
    233    PIXMAN_STD_FAST_PATH (SRC, a8b8g8r8, null, b5g6r5, armv6_composite_src_x888_0565),
    234    PIXMAN_STD_FAST_PATH (SRC, x8b8g8r8, null, b5g6r5, armv6_composite_src_x888_0565),
    235 
    236    PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, null, a8r8g8b8, armv6_composite_over_8888_8888),
    237    PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, null, x8r8g8b8, armv6_composite_over_8888_8888),
    238    PIXMAN_STD_FAST_PATH (OVER, a8b8g8r8, null, a8b8g8r8, armv6_composite_over_8888_8888),
    239    PIXMAN_STD_FAST_PATH (OVER, a8b8g8r8, null, x8b8g8r8, armv6_composite_over_8888_8888),
    240    PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, solid, a8r8g8b8, armv6_composite_over_8888_n_8888),
    241    PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, solid, x8r8g8b8, armv6_composite_over_8888_n_8888),
    242    PIXMAN_STD_FAST_PATH (OVER, a8b8g8r8, solid, a8b8g8r8, armv6_composite_over_8888_n_8888),
    243    PIXMAN_STD_FAST_PATH (OVER, a8b8g8r8, solid, x8b8g8r8, armv6_composite_over_8888_n_8888),
    244 
    245    PIXMAN_STD_FAST_PATH (OVER, solid, null, a8r8g8b8, armv6_composite_over_n_8888),
    246    PIXMAN_STD_FAST_PATH (OVER, solid, null, x8r8g8b8, armv6_composite_over_n_8888),
    247    PIXMAN_STD_FAST_PATH (OVER, solid, null, a8b8g8r8, armv6_composite_over_n_8888),
    248    PIXMAN_STD_FAST_PATH (OVER, solid, null, x8b8g8r8, armv6_composite_over_n_8888),
    249    PIXMAN_STD_FAST_PATH (OVER_REVERSE, solid, null, a8r8g8b8, armv6_composite_over_reverse_n_8888),
    250    PIXMAN_STD_FAST_PATH (OVER_REVERSE, solid, null, a8b8g8r8, armv6_composite_over_reverse_n_8888),
    251 
    252    PIXMAN_STD_FAST_PATH (ADD, a8, null, a8, armv6_composite_add_8_8),
    253 
    254    PIXMAN_STD_FAST_PATH (OVER, solid, a8, a8r8g8b8, armv6_composite_over_n_8_8888),
    255    PIXMAN_STD_FAST_PATH (OVER, solid, a8, x8r8g8b8, armv6_composite_over_n_8_8888),
    256    PIXMAN_STD_FAST_PATH (OVER, solid, a8, a8b8g8r8, armv6_composite_over_n_8_8888),
    257    PIXMAN_STD_FAST_PATH (OVER, solid, a8, x8b8g8r8, armv6_composite_over_n_8_8888),
    258 
    259    PIXMAN_STD_FAST_PATH (IN_REVERSE, a8r8g8b8, null, a8r8g8b8, armv6_composite_in_reverse_8888_8888),
    260    PIXMAN_STD_FAST_PATH (IN_REVERSE, a8r8g8b8, null, x8r8g8b8, armv6_composite_in_reverse_8888_8888),
    261    PIXMAN_STD_FAST_PATH (IN_REVERSE, a8b8g8r8, null, a8b8g8r8, armv6_composite_in_reverse_8888_8888),
    262    PIXMAN_STD_FAST_PATH (IN_REVERSE, a8b8g8r8, null, x8b8g8r8, armv6_composite_in_reverse_8888_8888),
    263 
    264    PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8r8g8b8, a8r8g8b8, armv6_composite_over_n_8888_8888_ca),
    265    PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8r8g8b8, x8r8g8b8, armv6_composite_over_n_8888_8888_ca),
    266    PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8b8g8r8, a8b8g8r8, armv6_composite_over_n_8888_8888_ca),
    267    PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8b8g8r8, x8b8g8r8, armv6_composite_over_n_8888_8888_ca),
    268 
    269    SIMPLE_NEAREST_FAST_PATH (SRC, r5g6b5, r5g6b5, armv6_0565_0565),
    270    SIMPLE_NEAREST_FAST_PATH (SRC, b5g6r5, b5g6r5, armv6_0565_0565),
    271 
    272    SIMPLE_NEAREST_FAST_PATH (SRC, a8r8g8b8, a8r8g8b8, armv6_8888_8888),
    273    SIMPLE_NEAREST_FAST_PATH (SRC, a8r8g8b8, x8r8g8b8, armv6_8888_8888),
    274    SIMPLE_NEAREST_FAST_PATH (SRC, x8r8g8b8, x8r8g8b8, armv6_8888_8888),
    275    SIMPLE_NEAREST_FAST_PATH (SRC, a8b8g8r8, a8b8g8r8, armv6_8888_8888),
    276    SIMPLE_NEAREST_FAST_PATH (SRC, a8b8g8r8, x8b8g8r8, armv6_8888_8888),
    277    SIMPLE_NEAREST_FAST_PATH (SRC, x8b8g8r8, x8b8g8r8, armv6_8888_8888),
    278 
    279    { PIXMAN_OP_NONE },
    280 };
    281 
    282 pixman_implementation_t *
    283 _pixman_implementation_create_arm_simd (pixman_implementation_t *fallback)
    284 {
    285    pixman_implementation_t *imp = _pixman_implementation_create (fallback, arm_simd_fast_paths);
    286 
    287    imp->blt = arm_simd_blt;
    288    imp->fill = arm_simd_fill;
    289 
    290    return imp;
    291 }