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

Thu, 22 Jan 2015 13:21:57 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 22 Jan 2015 13:21:57 +0100
branch
TOR_BUG_9701
changeset 15
b8a032363ba2
permissions
-rw-r--r--

Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6

     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 <config.h>
    28 #endif
    30 #include "pixman-private.h"
    31 #include "pixman-arm-common.h"
    32 #include "pixman-inlines.h"
    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)
    45 PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (armv6, add_8_8,
    46                                    uint8_t, 1, uint8_t, 1)
    47 PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (armv6, over_8888_8888,
    48                                    uint32_t, 1, uint32_t, 1)
    50 PIXMAN_ARM_BIND_FAST_PATH_SRC_N_DST (SKIP_ZERO_MASK, armv6, over_8888_n_8888,
    51                                      uint32_t, 1, uint32_t, 1)
    53 PIXMAN_ARM_BIND_FAST_PATH_N_MASK_DST (SKIP_ZERO_SRC, armv6, over_n_8_8888,
    54                                       uint8_t, 1, uint32_t, 1)
    56 PIXMAN_ARM_BIND_SCALED_NEAREST_SRC_DST (armv6, 0565_0565, SRC,
    57                                         uint16_t, uint16_t)
    58 PIXMAN_ARM_BIND_SCALED_NEAREST_SRC_DST (armv6, 8888_8888, SRC,
    59                                         uint32_t, uint32_t)
    61 void
    62 pixman_composite_src_n_8888_asm_armv6 (int32_t   w,
    63                                        int32_t   h,
    64                                        uint32_t *dst,
    65                                        int32_t   dst_stride,
    66                                        uint32_t  src);
    68 void
    69 pixman_composite_src_n_0565_asm_armv6 (int32_t   w,
    70                                        int32_t   h,
    71                                        uint16_t *dst,
    72                                        int32_t   dst_stride,
    73                                        uint16_t  src);
    75 void
    76 pixman_composite_src_n_8_asm_armv6 (int32_t   w,
    77                                     int32_t   h,
    78                                     uint8_t  *dst,
    79                                     int32_t   dst_stride,
    80                                     uint8_t  src);
    82 static pixman_bool_t
    83 arm_simd_fill (pixman_implementation_t *imp,
    84                uint32_t *               bits,
    85                int                      stride, /* in 32-bit words */
    86                int                      bpp,
    87                int                      x,
    88                int                      y,
    89                int                      width,
    90                int                      height,
    91                uint32_t                 _xor)
    92 {
    93     /* stride is always multiple of 32bit units in pixman */
    94     uint32_t byte_stride = stride * sizeof(uint32_t);
    96     switch (bpp)
    97     {
    98     case 8:
    99 	pixman_composite_src_n_8_asm_armv6 (
   100 		width,
   101 		height,
   102 		(uint8_t *)(((char *) bits) + y * byte_stride + x),
   103 		byte_stride,
   104 		_xor & 0xff);
   105 	return TRUE;
   106     case 16:
   107 	pixman_composite_src_n_0565_asm_armv6 (
   108 		width,
   109 		height,
   110 		(uint16_t *)(((char *) bits) + y * byte_stride + x * 2),
   111 		byte_stride / 2,
   112 		_xor & 0xffff);
   113 	return TRUE;
   114     case 32:
   115 	pixman_composite_src_n_8888_asm_armv6 (
   116 		width,
   117 		height,
   118 		(uint32_t *)(((char *) bits) + y * byte_stride + x * 4),
   119 		byte_stride / 4,
   120 		_xor);
   121 	return TRUE;
   122     default:
   123 	return FALSE;
   124     }
   125 }
   127 static pixman_bool_t
   128 arm_simd_blt (pixman_implementation_t *imp,
   129               uint32_t *               src_bits,
   130               uint32_t *               dst_bits,
   131               int                      src_stride, /* in 32-bit words */
   132               int                      dst_stride, /* in 32-bit words */
   133               int                      src_bpp,
   134               int                      dst_bpp,
   135               int                      src_x,
   136               int                      src_y,
   137               int                      dest_x,
   138               int                      dest_y,
   139               int                      width,
   140               int                      height)
   141 {
   142     if (src_bpp != dst_bpp)
   143 	return FALSE;
   145     switch (src_bpp)
   146     {
   147     case 8:
   148         pixman_composite_src_8_8_asm_armv6 (
   149                 width, height,
   150                 (uint8_t *)(((char *) dst_bits) +
   151                 dest_y * dst_stride * 4 + dest_x * 1), dst_stride * 4,
   152                 (uint8_t *)(((char *) src_bits) +
   153                 src_y * src_stride * 4 + src_x * 1), src_stride * 4);
   154         return TRUE;
   155     case 16:
   156 	pixman_composite_src_0565_0565_asm_armv6 (
   157 		width, height,
   158 		(uint16_t *)(((char *) dst_bits) +
   159 		dest_y * dst_stride * 4 + dest_x * 2), dst_stride * 2,
   160 		(uint16_t *)(((char *) src_bits) +
   161 		src_y * src_stride * 4 + src_x * 2), src_stride * 2);
   162 	return TRUE;
   163     case 32:
   164 	pixman_composite_src_8888_8888_asm_armv6 (
   165 		width, height,
   166 		(uint32_t *)(((char *) dst_bits) +
   167 		dest_y * dst_stride * 4 + dest_x * 4), dst_stride,
   168 		(uint32_t *)(((char *) src_bits) +
   169 		src_y * src_stride * 4 + src_x * 4), src_stride);
   170 	return TRUE;
   171     default:
   172 	return FALSE;
   173     }
   174 }
   176 static const pixman_fast_path_t arm_simd_fast_paths[] =
   177 {
   178     PIXMAN_STD_FAST_PATH (SRC, a8r8g8b8, null, a8r8g8b8, armv6_composite_src_8888_8888),
   179     PIXMAN_STD_FAST_PATH (SRC, a8b8g8r8, null, a8b8g8r8, armv6_composite_src_8888_8888),
   180     PIXMAN_STD_FAST_PATH (SRC, a8r8g8b8, null, x8r8g8b8, armv6_composite_src_8888_8888),
   181     PIXMAN_STD_FAST_PATH (SRC, a8b8g8r8, null, x8b8g8r8, armv6_composite_src_8888_8888),
   182     PIXMAN_STD_FAST_PATH (SRC, x8r8g8b8, null, x8r8g8b8, armv6_composite_src_8888_8888),
   183     PIXMAN_STD_FAST_PATH (SRC, x8b8g8r8, null, x8b8g8r8, armv6_composite_src_8888_8888),
   185     PIXMAN_STD_FAST_PATH (SRC, x8b8g8r8, null, a8b8g8r8, armv6_composite_src_x888_8888),
   186     PIXMAN_STD_FAST_PATH (SRC, x8r8g8b8, null, a8r8g8b8, armv6_composite_src_x888_8888),
   188     PIXMAN_STD_FAST_PATH (SRC, r5g6b5, null, r5g6b5, armv6_composite_src_0565_0565),
   189     PIXMAN_STD_FAST_PATH (SRC, b5g6r5, null, b5g6r5, armv6_composite_src_0565_0565),
   190     PIXMAN_STD_FAST_PATH (SRC, a1r5g5b5, null, a1r5g5b5, armv6_composite_src_0565_0565),
   191     PIXMAN_STD_FAST_PATH (SRC, a1b5g5r5, null, a1b5g5r5, armv6_composite_src_0565_0565),
   192     PIXMAN_STD_FAST_PATH (SRC, a1r5g5b5, null, x1r5g5b5, armv6_composite_src_0565_0565),
   193     PIXMAN_STD_FAST_PATH (SRC, a1b5g5r5, null, x1b5g5r5, armv6_composite_src_0565_0565),
   194     PIXMAN_STD_FAST_PATH (SRC, x1r5g5b5, null, x1r5g5b5, armv6_composite_src_0565_0565),
   195     PIXMAN_STD_FAST_PATH (SRC, x1b5g5r5, null, x1b5g5r5, armv6_composite_src_0565_0565),
   196     PIXMAN_STD_FAST_PATH (SRC, a4r4g4b4, null, a4r4g4b4, armv6_composite_src_0565_0565),
   197     PIXMAN_STD_FAST_PATH (SRC, a4b4g4r4, null, a4b4g4r4, armv6_composite_src_0565_0565),
   198     PIXMAN_STD_FAST_PATH (SRC, a4r4g4b4, null, x4r4g4b4, armv6_composite_src_0565_0565),
   199     PIXMAN_STD_FAST_PATH (SRC, a4b4g4r4, null, x4b4g4r4, armv6_composite_src_0565_0565),
   200     PIXMAN_STD_FAST_PATH (SRC, x4r4g4b4, null, x4r4g4b4, armv6_composite_src_0565_0565),
   201     PIXMAN_STD_FAST_PATH (SRC, x4b4g4r4, null, x4b4g4r4, armv6_composite_src_0565_0565),
   203     PIXMAN_STD_FAST_PATH (SRC, a8, null, a8, armv6_composite_src_8_8),
   204     PIXMAN_STD_FAST_PATH (SRC, r3g3b2, null, r3g3b2, armv6_composite_src_8_8),
   205     PIXMAN_STD_FAST_PATH (SRC, b2g3r3, null, b2g3r3, armv6_composite_src_8_8),
   206     PIXMAN_STD_FAST_PATH (SRC, a2r2g2b2, null, a2r2g2b2, armv6_composite_src_8_8),
   207     PIXMAN_STD_FAST_PATH (SRC, a2b2g2r2, null, a2b2g2r2, armv6_composite_src_8_8),
   208     PIXMAN_STD_FAST_PATH (SRC, c8, null, c8, armv6_composite_src_8_8),
   209     PIXMAN_STD_FAST_PATH (SRC, g8, null, g8, armv6_composite_src_8_8),
   210     PIXMAN_STD_FAST_PATH (SRC, x4a4, null, x4a4, armv6_composite_src_8_8),
   211     PIXMAN_STD_FAST_PATH (SRC, x4c4, null, x4c4, armv6_composite_src_8_8),
   212     PIXMAN_STD_FAST_PATH (SRC, x4g4, null, x4g4, armv6_composite_src_8_8),
   214     PIXMAN_STD_FAST_PATH (SRC, r5g6b5, null, a8r8g8b8, armv6_composite_src_0565_8888),
   215     PIXMAN_STD_FAST_PATH (SRC, r5g6b5, null, x8r8g8b8, armv6_composite_src_0565_8888),
   216     PIXMAN_STD_FAST_PATH (SRC, b5g6r5, null, a8b8g8r8, armv6_composite_src_0565_8888),
   217     PIXMAN_STD_FAST_PATH (SRC, b5g6r5, null, x8b8g8r8, armv6_composite_src_0565_8888),
   219     PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, null, a8r8g8b8, armv6_composite_over_8888_8888),
   220     PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, null, x8r8g8b8, armv6_composite_over_8888_8888),
   221     PIXMAN_STD_FAST_PATH (OVER, a8b8g8r8, null, a8b8g8r8, armv6_composite_over_8888_8888),
   222     PIXMAN_STD_FAST_PATH (OVER, a8b8g8r8, null, x8b8g8r8, armv6_composite_over_8888_8888),
   223     PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, solid, a8r8g8b8, armv6_composite_over_8888_n_8888),
   224     PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, solid, x8r8g8b8, armv6_composite_over_8888_n_8888),
   225     PIXMAN_STD_FAST_PATH (OVER, a8b8g8r8, solid, a8b8g8r8, armv6_composite_over_8888_n_8888),
   226     PIXMAN_STD_FAST_PATH (OVER, a8b8g8r8, solid, x8b8g8r8, armv6_composite_over_8888_n_8888),
   228     PIXMAN_STD_FAST_PATH (ADD, a8, null, a8, armv6_composite_add_8_8),
   230     PIXMAN_STD_FAST_PATH (OVER, solid, a8, a8r8g8b8, armv6_composite_over_n_8_8888),
   231     PIXMAN_STD_FAST_PATH (OVER, solid, a8, x8r8g8b8, armv6_composite_over_n_8_8888),
   232     PIXMAN_STD_FAST_PATH (OVER, solid, a8, a8b8g8r8, armv6_composite_over_n_8_8888),
   233     PIXMAN_STD_FAST_PATH (OVER, solid, a8, x8b8g8r8, armv6_composite_over_n_8_8888),
   235     PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (SRC, r5g6b5, r5g6b5, armv6_0565_0565),
   236     PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (SRC, b5g6r5, b5g6r5, armv6_0565_0565),
   238     PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (SRC, a8r8g8b8, a8r8g8b8, armv6_8888_8888),
   239     PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (SRC, a8r8g8b8, x8r8g8b8, armv6_8888_8888),
   240     PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (SRC, x8r8g8b8, x8r8g8b8, armv6_8888_8888),
   241     PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (SRC, a8b8g8r8, a8b8g8r8, armv6_8888_8888),
   242     PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (SRC, a8b8g8r8, x8b8g8r8, armv6_8888_8888),
   243     PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (SRC, x8b8g8r8, x8b8g8r8, armv6_8888_8888),
   245     { PIXMAN_OP_NONE },
   246 };
   248 pixman_implementation_t *
   249 _pixman_implementation_create_arm_simd (pixman_implementation_t *fallback)
   250 {
   251     pixman_implementation_t *imp = _pixman_implementation_create (fallback, arm_simd_fast_paths);
   253     imp->blt = arm_simd_blt;
   254     imp->fill = arm_simd_fill;
   256     return imp;
   257 }

mercurial