ARM: added 'bindings' for NEON assembly optimized functions
authorSiarhei Siamashka <siarhei.siamashka@nokia.com>
Wed, 4 Nov 2009 15:05:46 +0000 (17:05 +0200)
committerSiarhei Siamashka <siarhei.siamashka@nokia.com>
Wed, 11 Nov 2009 16:12:56 +0000 (18:12 +0200)
These functions serve as 'adaptors', converting standard internal
pixman fast path function arguments into arguments expected
by assembly functions.

pixman/pixman-arm-neon.c

index 494f06c..5339cbd 100644 (file)
 #include <string.h>
 #include "pixman-private.h"
 
+#define BIND_SRC_NULL_DST(name, src_type, src_cnt, dst_type, dst_cnt)   \
+void                                                                    \
+pixman_##name##_asm_neon (int32_t   w,                                  \
+                          int32_t   h,                                  \
+                          dst_type *dst,                                \
+                          int32_t   dst_stride,                         \
+                          src_type *src,                                \
+                          int32_t   src_stride);                        \
+                                                                        \
+static void                                                             \
+neon_##name (pixman_implementation_t *imp,                              \
+             pixman_op_t              op,                               \
+             pixman_image_t *         src_image,                        \
+             pixman_image_t *         mask_image,                       \
+             pixman_image_t *         dst_image,                        \
+             int32_t                  src_x,                            \
+             int32_t                  src_y,                            \
+             int32_t                  mask_x,                           \
+             int32_t                  mask_y,                           \
+             int32_t                  dest_x,                           \
+             int32_t                  dest_y,                           \
+             int32_t                  width,                            \
+             int32_t                  height)                           \
+{                                                                       \
+    dst_type *dst_line;                                                 \
+    src_type *src_line;                                                 \
+    int32_t dst_stride, src_stride;                                     \
+                                                                        \
+    PIXMAN_IMAGE_GET_LINE (src_image, src_x, src_y, src_type,           \
+                           src_stride, src_line, src_cnt);              \
+    PIXMAN_IMAGE_GET_LINE (dst_image, dest_x, dest_y, dst_type,         \
+                           dst_stride, dst_line, dst_cnt);              \
+                                                                        \
+    pixman_##name##_asm_neon (width, height,                            \
+                              dst_line, dst_stride,                     \
+                              src_line, src_stride);                    \
+}
+
+#define BIND_N_MASK_DST(name, mask_type, mask_cnt, dst_type, dst_cnt)   \
+void                                                                    \
+pixman_##name##_asm_neon (int32_t    w,                                 \
+                          int32_t    h,                                 \
+                          dst_type  *dst,                               \
+                          int32_t    dst_stride,                        \
+                          uint32_t   src,                               \
+                          int32_t    unused,                            \
+                          mask_type *mask,                              \
+                          int32_t    mask_stride);                      \
+                                                                        \
+static void                                                             \
+neon_##name (pixman_implementation_t *imp,                              \
+             pixman_op_t              op,                               \
+             pixman_image_t *         src_image,                        \
+             pixman_image_t *         mask_image,                       \
+             pixman_image_t *         dst_image,                        \
+             int32_t                  src_x,                            \
+             int32_t                  src_y,                            \
+             int32_t                  mask_x,                           \
+             int32_t                  mask_y,                           \
+             int32_t                  dest_x,                           \
+             int32_t                  dest_y,                           \
+             int32_t                  width,                            \
+             int32_t                  height)                           \
+{                                                                       \
+    dst_type  *dst_line;                                                \
+    mask_type *mask_line;                                               \
+    int32_t    dst_stride, mask_stride;                                 \
+    uint32_t   src;                                                     \
+                                                                        \
+    src = _pixman_image_get_solid (src_image, dst_image->bits.format);  \
+                                                                        \
+    if (src == 0)                                                       \
+       return;                                                         \
+                                                                        \
+    PIXMAN_IMAGE_GET_LINE (dst_image, dest_x, dest_y, dst_type,         \
+                           dst_stride, dst_line, dst_cnt);              \
+    PIXMAN_IMAGE_GET_LINE (mask_image, mask_x, mask_y, mask_type,       \
+                           mask_stride, mask_line, mask_cnt);           \
+                                                                        \
+    pixman_##name##_asm_neon (width, height,                            \
+                              dst_line, dst_stride,                     \
+                              src, 0,                                   \
+                              mask_line, mask_stride);                  \
+}
+
+#define BIND_SRC_N_DST(name, src_type, src_cnt, dst_type, dst_cnt)      \
+void                                                                    \
+pixman_##name##_asm_neon (int32_t    w,                                 \
+                          int32_t    h,                                 \
+                          dst_type  *dst,                               \
+                          int32_t    dst_stride,                        \
+                          src_type  *src,                               \
+                          int32_t    src_stride,                        \
+                          uint32_t   mask);                             \
+                                                                        \
+static void                                                             \
+neon_##name (pixman_implementation_t *imp,                              \
+             pixman_op_t              op,                               \
+             pixman_image_t *         src_image,                        \
+             pixman_image_t *         mask_image,                       \
+             pixman_image_t *         dst_image,                        \
+             int32_t                  src_x,                            \
+             int32_t                  src_y,                            \
+             int32_t                  mask_x,                           \
+             int32_t                  mask_y,                           \
+             int32_t                  dest_x,                           \
+             int32_t                  dest_y,                           \
+             int32_t                  width,                            \
+             int32_t                  height)                           \
+{                                                                       \
+    dst_type  *dst_line;                                                \
+    src_type  *src_line;                                                \
+    int32_t    dst_stride, src_stride;                                  \
+    uint32_t   mask;                                                    \
+                                                                        \
+    mask = _pixman_image_get_solid (mask_image, dst_image->bits.format);\
+                                                                        \
+    if (mask == 0)                                                      \
+       return;                                                         \
+                                                                        \
+    PIXMAN_IMAGE_GET_LINE (dst_image, dest_x, dest_y, dst_type,         \
+                           dst_stride, dst_line, dst_cnt);              \
+    PIXMAN_IMAGE_GET_LINE (src_image, src_x, src_y, src_type,           \
+                           src_stride, src_line, src_cnt);              \
+                                                                        \
+    pixman_##name##_asm_neon (width, height,                            \
+                              dst_line, dst_stride,                     \
+                              src_line, src_stride,                     \
+                              mask);                                    \
+}
+
+#define BIND_SRC_MASK_DST(name, src_type, src_cnt, mask_type, mask_cnt, \
+                          dst_type, dst_cnt)                            \
+void                                                                    \
+pixman_##name##_asm_neon (int32_t    w,                                 \
+                          int32_t    h,                                 \
+                          dst_type  *dst,                               \
+                          int32_t    dst_stride,                        \
+                          src_type  *src,                               \
+                          int32_t    src_stride,                        \
+                          mask_type *mask,                              \
+                          int32_t    mask_stride);                      \
+                                                                        \
+static void                                                             \
+neon_##name (pixman_implementation_t *imp,                              \
+             pixman_op_t              op,                               \
+             pixman_image_t *         src_image,                        \
+             pixman_image_t *         mask_image,                       \
+             pixman_image_t *         dst_image,                        \
+             int32_t                  src_x,                            \
+             int32_t                  src_y,                            \
+             int32_t                  mask_x,                           \
+             int32_t                  mask_y,                           \
+             int32_t                  dest_x,                           \
+             int32_t                  dest_y,                           \
+             int32_t                  width,                            \
+             int32_t                  height)                           \
+{                                                                       \
+    dst_type  *dst_line;                                                \
+    src_type  *src_line;                                                \
+    mask_type *mask_line;                                               \
+    int32_t    dst_stride, src_stride, mask_stride;                     \
+                                                                        \
+    PIXMAN_IMAGE_GET_LINE (dst_image, dest_x, dest_y, dst_type,         \
+                           dst_stride, dst_line, dst_cnt);              \
+    PIXMAN_IMAGE_GET_LINE (src_image, src_x, src_y, src_type,           \
+                           src_stride, src_line, src_cnt);              \
+    PIXMAN_IMAGE_GET_LINE (mask_image, mask_x, mask_y, mask_type,       \
+                           mask_stride, mask_line, mask_cnt);           \
+                                                                        \
+    pixman_##name##_asm_neon (width, height,                            \
+                              dst_line, dst_stride,                     \
+                              src_line, src_stride,                     \
+                              mask_line, mask_stride);                  \
+}
+
+
+BIND_SRC_NULL_DST(composite_src_8888_8888, uint32_t, 1, uint32_t, 1)
+BIND_SRC_NULL_DST(composite_src_0565_0565, uint16_t, 1, uint16_t, 1)
+BIND_SRC_NULL_DST(composite_src_0888_0888, uint8_t, 3, uint8_t, 3)
+BIND_SRC_NULL_DST(composite_src_8888_0565, uint32_t, 1, uint16_t, 1)
+BIND_SRC_NULL_DST(composite_add_8000_8000, uint8_t, 1, uint8_t, 1)
+
+BIND_SRC_NULL_DST(composite_over_8888_0565, uint32_t, 1, uint16_t, 1)
+BIND_SRC_NULL_DST(composite_over_8888_8888, uint32_t, 1, uint32_t, 1)
+
+BIND_N_MASK_DST(composite_over_n_8_0565, uint8_t, 1, uint16_t, 1)
+BIND_N_MASK_DST(composite_over_n_8_8888, uint8_t, 1, uint32_t, 1)
+BIND_N_MASK_DST(composite_add_n_8_8, uint8_t, 1, uint8_t, 1)
+
+BIND_SRC_N_DST(composite_over_8888_n_8888, uint32_t, 1, uint32_t, 1)
+
+BIND_SRC_MASK_DST(composite_add_8_8_8, uint8_t, 1, uint8_t, 1, uint8_t, 1)
+
 void
 pixman_composite_src_n_8_asm_neon (int32_t   w,
                                    int32_t   h,