michael@0: /* michael@0: * Copyright (c) 2012 michael@0: * MIPS Technologies, Inc., California. michael@0: * michael@0: * Redistribution and use in source and binary forms, with or without michael@0: * modification, are permitted provided that the following conditions michael@0: * are met: michael@0: * 1. Redistributions of source code must retain the above copyright michael@0: * notice, this list of conditions and the following disclaimer. michael@0: * 2. Redistributions in binary form must reproduce the above copyright michael@0: * notice, this list of conditions and the following disclaimer in the michael@0: * documentation and/or other materials provided with the distribution. michael@0: * 3. Neither the name of the MIPS Technologies, Inc., nor the names of its michael@0: * contributors may be used to endorse or promote products derived from michael@0: * this software without specific prior written permission. michael@0: * michael@0: * THIS SOFTWARE IS PROVIDED BY THE MIPS TECHNOLOGIES, INC. ``AS IS'' AND michael@0: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE michael@0: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE michael@0: * ARE DISCLAIMED. IN NO EVENT SHALL THE MIPS TECHNOLOGIES, INC. BE LIABLE michael@0: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL michael@0: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS michael@0: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) michael@0: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT michael@0: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY michael@0: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF michael@0: * SUCH DAMAGE. michael@0: * michael@0: * Author: Nemanja Lukic (nlukic@mips.com) michael@0: */ michael@0: michael@0: #ifdef HAVE_CONFIG_H michael@0: #include michael@0: #endif michael@0: michael@0: #include "pixman-private.h" michael@0: #include "pixman-mips-dspr2.h" michael@0: michael@0: PIXMAN_MIPS_BIND_FAST_PATH_SRC_DST (0, src_x888_8888, michael@0: uint32_t, 1, uint32_t, 1) michael@0: PIXMAN_MIPS_BIND_FAST_PATH_SRC_DST (0, src_8888_0565, michael@0: uint32_t, 1, uint16_t, 1) michael@0: PIXMAN_MIPS_BIND_FAST_PATH_SRC_DST (0, src_0565_8888, michael@0: uint16_t, 1, uint32_t, 1) michael@0: PIXMAN_MIPS_BIND_FAST_PATH_SRC_DST (DO_FAST_MEMCPY, src_0565_0565, michael@0: uint16_t, 1, uint16_t, 1) michael@0: PIXMAN_MIPS_BIND_FAST_PATH_SRC_DST (DO_FAST_MEMCPY, src_8888_8888, michael@0: uint32_t, 1, uint32_t, 1) michael@0: PIXMAN_MIPS_BIND_FAST_PATH_SRC_DST (DO_FAST_MEMCPY, src_0888_0888, michael@0: uint8_t, 3, uint8_t, 3) michael@0: PIXMAN_MIPS_BIND_FAST_PATH_SRC_DST (0, over_8888_8888, michael@0: uint32_t, 1, uint32_t, 1) michael@0: PIXMAN_MIPS_BIND_FAST_PATH_SRC_DST (0, add_8_8, michael@0: uint8_t, 1, uint8_t, 1) michael@0: PIXMAN_MIPS_BIND_FAST_PATH_SRC_DST (0, add_8888_8888, michael@0: uint32_t, 1, uint32_t, 1) michael@0: PIXMAN_MIPS_BIND_FAST_PATH_SRC_DST (0, out_reverse_8_0565, michael@0: uint8_t, 1, uint16_t, 1) michael@0: PIXMAN_MIPS_BIND_FAST_PATH_SRC_DST (0, out_reverse_8_8888, michael@0: uint8_t, 1, uint32_t, 1) michael@0: michael@0: PIXMAN_MIPS_BIND_FAST_PATH_N_MASK_DST (0, src_n_8_8888, michael@0: uint8_t, 1, uint32_t, 1) michael@0: PIXMAN_MIPS_BIND_FAST_PATH_N_MASK_DST (0, src_n_8_8, michael@0: uint8_t, 1, uint8_t, 1) michael@0: PIXMAN_MIPS_BIND_FAST_PATH_N_MASK_DST (SKIP_ZERO_SRC, over_n_8888_8888_ca, michael@0: uint32_t, 1, uint32_t, 1) michael@0: PIXMAN_MIPS_BIND_FAST_PATH_N_MASK_DST (SKIP_ZERO_SRC, over_n_8888_0565_ca, michael@0: uint32_t, 1, uint16_t, 1) michael@0: PIXMAN_MIPS_BIND_FAST_PATH_N_MASK_DST (SKIP_ZERO_SRC, over_n_8_8888, michael@0: uint8_t, 1, uint32_t, 1) michael@0: PIXMAN_MIPS_BIND_FAST_PATH_N_MASK_DST (SKIP_ZERO_SRC, over_n_8_0565, michael@0: uint8_t, 1, uint16_t, 1) michael@0: PIXMAN_MIPS_BIND_FAST_PATH_N_MASK_DST (SKIP_ZERO_SRC, add_n_8_8, michael@0: uint8_t, 1, uint8_t, 1) michael@0: PIXMAN_MIPS_BIND_FAST_PATH_N_MASK_DST (SKIP_ZERO_SRC, add_n_8_8888, michael@0: uint8_t, 1, uint32_t, 1) michael@0: michael@0: PIXMAN_MIPS_BIND_FAST_PATH_SRC_N_DST (SKIP_ZERO_MASK, over_8888_n_8888, michael@0: uint32_t, 1, uint32_t, 1) michael@0: PIXMAN_MIPS_BIND_FAST_PATH_SRC_N_DST (SKIP_ZERO_MASK, over_8888_n_0565, michael@0: uint32_t, 1, uint16_t, 1) michael@0: PIXMAN_MIPS_BIND_FAST_PATH_SRC_N_DST (SKIP_ZERO_MASK, over_0565_n_0565, michael@0: uint16_t, 1, uint16_t, 1) michael@0: PIXMAN_MIPS_BIND_FAST_PATH_SRC_N_DST (SKIP_ZERO_MASK, add_8888_n_8888, michael@0: uint32_t, 1, uint32_t, 1) michael@0: michael@0: PIXMAN_MIPS_BIND_FAST_PATH_N_DST (SKIP_ZERO_SRC, over_n_0565, michael@0: uint16_t, 1) michael@0: PIXMAN_MIPS_BIND_FAST_PATH_N_DST (SKIP_ZERO_SRC, over_n_8888, michael@0: uint32_t, 1) michael@0: PIXMAN_MIPS_BIND_FAST_PATH_N_DST (SKIP_ZERO_SRC, over_reverse_n_8888, michael@0: uint32_t, 1) michael@0: PIXMAN_MIPS_BIND_FAST_PATH_N_DST (0, in_n_8, michael@0: uint8_t, 1) michael@0: michael@0: PIXMAN_MIPS_BIND_FAST_PATH_SRC_MASK_DST (add_8_8_8, uint8_t, 1, michael@0: uint8_t, 1, uint8_t, 1) michael@0: PIXMAN_MIPS_BIND_FAST_PATH_SRC_MASK_DST (add_8888_8_8888, uint32_t, 1, michael@0: uint8_t, 1, uint32_t, 1) michael@0: PIXMAN_MIPS_BIND_FAST_PATH_SRC_MASK_DST (add_8888_8888_8888, uint32_t, 1, michael@0: uint32_t, 1, uint32_t, 1) michael@0: PIXMAN_MIPS_BIND_FAST_PATH_SRC_MASK_DST (add_0565_8_0565, uint16_t, 1, michael@0: uint8_t, 1, uint16_t, 1) michael@0: PIXMAN_MIPS_BIND_FAST_PATH_SRC_MASK_DST (over_8888_8_8888, uint32_t, 1, michael@0: uint8_t, 1, uint32_t, 1) michael@0: PIXMAN_MIPS_BIND_FAST_PATH_SRC_MASK_DST (over_8888_8_0565, uint32_t, 1, michael@0: uint8_t, 1, uint16_t, 1) michael@0: PIXMAN_MIPS_BIND_FAST_PATH_SRC_MASK_DST (over_0565_8_0565, uint16_t, 1, michael@0: uint8_t, 1, uint16_t, 1) michael@0: PIXMAN_MIPS_BIND_FAST_PATH_SRC_MASK_DST (over_8888_8888_8888, uint32_t, 1, michael@0: uint32_t, 1, uint32_t, 1) michael@0: michael@0: PIXMAN_MIPS_BIND_SCALED_BILINEAR_SRC_DST (0, 8888_8888, SRC, michael@0: uint32_t, uint32_t) michael@0: PIXMAN_MIPS_BIND_SCALED_BILINEAR_SRC_DST (0, 8888_0565, SRC, michael@0: uint32_t, uint16_t) michael@0: PIXMAN_MIPS_BIND_SCALED_BILINEAR_SRC_DST (0, 0565_8888, SRC, michael@0: uint16_t, uint32_t) michael@0: PIXMAN_MIPS_BIND_SCALED_BILINEAR_SRC_DST (0, 0565_0565, SRC, michael@0: uint16_t, uint16_t) michael@0: PIXMAN_MIPS_BIND_SCALED_BILINEAR_SRC_DST (SKIP_ZERO_SRC, 8888_8888, OVER, michael@0: uint32_t, uint32_t) michael@0: PIXMAN_MIPS_BIND_SCALED_BILINEAR_SRC_DST (SKIP_ZERO_SRC, 8888_8888, ADD, michael@0: uint32_t, uint32_t) michael@0: michael@0: PIXMAN_MIPS_BIND_SCALED_NEAREST_SRC_A8_DST (SKIP_ZERO_SRC, 8888_8_0565, michael@0: OVER, uint32_t, uint16_t) michael@0: PIXMAN_MIPS_BIND_SCALED_NEAREST_SRC_A8_DST (SKIP_ZERO_SRC, 0565_8_0565, michael@0: OVER, uint16_t, uint16_t) michael@0: michael@0: PIXMAN_MIPS_BIND_SCALED_BILINEAR_SRC_A8_DST (0, 8888_8_8888, SRC, michael@0: uint32_t, uint32_t) michael@0: PIXMAN_MIPS_BIND_SCALED_BILINEAR_SRC_A8_DST (0, 8888_8_0565, SRC, michael@0: uint32_t, uint16_t) michael@0: PIXMAN_MIPS_BIND_SCALED_BILINEAR_SRC_A8_DST (0, 0565_8_x888, SRC, michael@0: uint16_t, uint32_t) michael@0: PIXMAN_MIPS_BIND_SCALED_BILINEAR_SRC_A8_DST (0, 0565_8_0565, SRC, michael@0: uint16_t, uint16_t) michael@0: PIXMAN_MIPS_BIND_SCALED_BILINEAR_SRC_A8_DST (SKIP_ZERO_SRC, 8888_8_8888, OVER, michael@0: uint32_t, uint32_t) michael@0: PIXMAN_MIPS_BIND_SCALED_BILINEAR_SRC_A8_DST (SKIP_ZERO_SRC, 8888_8_8888, ADD, michael@0: uint32_t, uint32_t) michael@0: michael@0: static pixman_bool_t michael@0: mips_dspr2_fill (pixman_implementation_t *imp, michael@0: uint32_t * bits, michael@0: int stride, michael@0: int bpp, michael@0: int x, michael@0: int y, michael@0: int width, michael@0: int height, michael@0: uint32_t _xor) michael@0: { michael@0: uint8_t *byte_line; michael@0: uint32_t byte_width; michael@0: switch (bpp) michael@0: { michael@0: case 16: michael@0: stride = stride * (int) sizeof (uint32_t) / 2; michael@0: byte_line = (uint8_t *)(((uint16_t *)bits) + stride * y + x); michael@0: byte_width = width * 2; michael@0: stride *= 2; michael@0: michael@0: while (height--) michael@0: { michael@0: uint8_t *dst = byte_line; michael@0: byte_line += stride; michael@0: pixman_fill_buff16_mips (dst, byte_width, _xor & 0xffff); michael@0: } michael@0: return TRUE; michael@0: case 32: michael@0: stride = stride * (int) sizeof (uint32_t) / 4; michael@0: byte_line = (uint8_t *)(((uint32_t *)bits) + stride * y + x); michael@0: byte_width = width * 4; michael@0: stride *= 4; michael@0: michael@0: while (height--) michael@0: { michael@0: uint8_t *dst = byte_line; michael@0: byte_line += stride; michael@0: pixman_fill_buff32_mips (dst, byte_width, _xor); michael@0: } michael@0: return TRUE; michael@0: default: michael@0: return FALSE; michael@0: } michael@0: } michael@0: michael@0: static pixman_bool_t michael@0: mips_dspr2_blt (pixman_implementation_t *imp, michael@0: uint32_t * src_bits, michael@0: uint32_t * dst_bits, michael@0: int src_stride, michael@0: int dst_stride, michael@0: int src_bpp, michael@0: int dst_bpp, michael@0: int src_x, michael@0: int src_y, michael@0: int dest_x, michael@0: int dest_y, michael@0: int width, michael@0: int height) michael@0: { michael@0: if (src_bpp != dst_bpp) michael@0: return FALSE; michael@0: michael@0: uint8_t *src_bytes; michael@0: uint8_t *dst_bytes; michael@0: uint32_t byte_width; michael@0: michael@0: switch (src_bpp) michael@0: { michael@0: case 16: michael@0: src_stride = src_stride * (int) sizeof (uint32_t) / 2; michael@0: dst_stride = dst_stride * (int) sizeof (uint32_t) / 2; michael@0: src_bytes =(uint8_t *)(((uint16_t *)src_bits) michael@0: + src_stride * (src_y) + (src_x)); michael@0: dst_bytes = (uint8_t *)(((uint16_t *)dst_bits) michael@0: + dst_stride * (dest_y) + (dest_x)); michael@0: byte_width = width * 2; michael@0: src_stride *= 2; michael@0: dst_stride *= 2; michael@0: michael@0: while (height--) michael@0: { michael@0: uint8_t *src = src_bytes; michael@0: uint8_t *dst = dst_bytes; michael@0: src_bytes += src_stride; michael@0: dst_bytes += dst_stride; michael@0: pixman_mips_fast_memcpy (dst, src, byte_width); michael@0: } michael@0: return TRUE; michael@0: case 32: michael@0: src_stride = src_stride * (int) sizeof (uint32_t) / 4; michael@0: dst_stride = dst_stride * (int) sizeof (uint32_t) / 4; michael@0: src_bytes = (uint8_t *)(((uint32_t *)src_bits) michael@0: + src_stride * (src_y) + (src_x)); michael@0: dst_bytes = (uint8_t *)(((uint32_t *)dst_bits) michael@0: + dst_stride * (dest_y) + (dest_x)); michael@0: byte_width = width * 4; michael@0: src_stride *= 4; michael@0: dst_stride *= 4; michael@0: michael@0: while (height--) michael@0: { michael@0: uint8_t *src = src_bytes; michael@0: uint8_t *dst = dst_bytes; michael@0: src_bytes += src_stride; michael@0: dst_bytes += dst_stride; michael@0: pixman_mips_fast_memcpy (dst, src, byte_width); michael@0: } michael@0: return TRUE; michael@0: default: michael@0: return FALSE; michael@0: } michael@0: } michael@0: michael@0: static const pixman_fast_path_t mips_dspr2_fast_paths[] = michael@0: { michael@0: PIXMAN_STD_FAST_PATH (SRC, r5g6b5, null, r5g6b5, mips_composite_src_0565_0565), michael@0: PIXMAN_STD_FAST_PATH (SRC, b5g6r5, null, b5g6r5, mips_composite_src_0565_0565), michael@0: PIXMAN_STD_FAST_PATH (SRC, a8r8g8b8, null, r5g6b5, mips_composite_src_8888_0565), michael@0: PIXMAN_STD_FAST_PATH (SRC, x8r8g8b8, null, r5g6b5, mips_composite_src_8888_0565), michael@0: PIXMAN_STD_FAST_PATH (SRC, a8b8g8r8, null, b5g6r5, mips_composite_src_8888_0565), michael@0: PIXMAN_STD_FAST_PATH (SRC, x8b8g8r8, null, b5g6r5, mips_composite_src_8888_0565), michael@0: PIXMAN_STD_FAST_PATH (SRC, r5g6b5, null, a8r8g8b8, mips_composite_src_0565_8888), michael@0: PIXMAN_STD_FAST_PATH (SRC, r5g6b5, null, x8r8g8b8, mips_composite_src_0565_8888), michael@0: PIXMAN_STD_FAST_PATH (SRC, b5g6r5, null, a8b8g8r8, mips_composite_src_0565_8888), michael@0: PIXMAN_STD_FAST_PATH (SRC, b5g6r5, null, x8b8g8r8, mips_composite_src_0565_8888), michael@0: PIXMAN_STD_FAST_PATH (SRC, a8r8g8b8, null, x8r8g8b8, mips_composite_src_8888_8888), michael@0: PIXMAN_STD_FAST_PATH (SRC, x8r8g8b8, null, x8r8g8b8, mips_composite_src_8888_8888), michael@0: PIXMAN_STD_FAST_PATH (SRC, a8b8g8r8, null, x8b8g8r8, mips_composite_src_8888_8888), michael@0: PIXMAN_STD_FAST_PATH (SRC, x8b8g8r8, null, x8b8g8r8, mips_composite_src_8888_8888), michael@0: PIXMAN_STD_FAST_PATH (SRC, a8r8g8b8, null, a8r8g8b8, mips_composite_src_8888_8888), michael@0: PIXMAN_STD_FAST_PATH (SRC, a8b8g8r8, null, a8b8g8r8, mips_composite_src_8888_8888), michael@0: PIXMAN_STD_FAST_PATH (SRC, x8r8g8b8, null, a8r8g8b8, mips_composite_src_x888_8888), michael@0: PIXMAN_STD_FAST_PATH (SRC, x8b8g8r8, null, a8b8g8r8, mips_composite_src_x888_8888), michael@0: PIXMAN_STD_FAST_PATH (SRC, r8g8b8, null, r8g8b8, mips_composite_src_0888_0888), michael@0: PIXMAN_STD_FAST_PATH (SRC, solid, a8, a8r8g8b8, mips_composite_src_n_8_8888), michael@0: PIXMAN_STD_FAST_PATH (SRC, solid, a8, x8r8g8b8, mips_composite_src_n_8_8888), michael@0: PIXMAN_STD_FAST_PATH (SRC, solid, a8, a8b8g8r8, mips_composite_src_n_8_8888), michael@0: PIXMAN_STD_FAST_PATH (SRC, solid, a8, x8b8g8r8, mips_composite_src_n_8_8888), michael@0: PIXMAN_STD_FAST_PATH (SRC, solid, a8, a8, mips_composite_src_n_8_8), michael@0: michael@0: PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8r8g8b8, a8r8g8b8, mips_composite_over_n_8888_8888_ca), michael@0: PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8r8g8b8, x8r8g8b8, mips_composite_over_n_8888_8888_ca), michael@0: PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8b8g8r8, a8b8g8r8, mips_composite_over_n_8888_8888_ca), michael@0: PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8b8g8r8, x8b8g8r8, mips_composite_over_n_8888_8888_ca), michael@0: PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8r8g8b8, r5g6b5, mips_composite_over_n_8888_0565_ca), michael@0: PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8b8g8r8, b5g6r5, mips_composite_over_n_8888_0565_ca), michael@0: PIXMAN_STD_FAST_PATH (OVER, solid, a8, a8r8g8b8, mips_composite_over_n_8_8888), michael@0: PIXMAN_STD_FAST_PATH (OVER, solid, a8, x8r8g8b8, mips_composite_over_n_8_8888), michael@0: PIXMAN_STD_FAST_PATH (OVER, solid, a8, a8b8g8r8, mips_composite_over_n_8_8888), michael@0: PIXMAN_STD_FAST_PATH (OVER, solid, a8, x8b8g8r8, mips_composite_over_n_8_8888), michael@0: PIXMAN_STD_FAST_PATH (OVER, solid, a8, r5g6b5, mips_composite_over_n_8_0565), michael@0: PIXMAN_STD_FAST_PATH (OVER, solid, a8, b5g6r5, mips_composite_over_n_8_0565), michael@0: PIXMAN_STD_FAST_PATH (OVER, solid, null, r5g6b5, mips_composite_over_n_0565), michael@0: PIXMAN_STD_FAST_PATH (OVER, solid, null, a8r8g8b8, mips_composite_over_n_8888), michael@0: PIXMAN_STD_FAST_PATH (OVER, solid, null, x8r8g8b8, mips_composite_over_n_8888), michael@0: PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, solid, a8r8g8b8, mips_composite_over_8888_n_8888), michael@0: PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, solid, x8r8g8b8, mips_composite_over_8888_n_8888), michael@0: PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, solid, r5g6b5, mips_composite_over_8888_n_0565), michael@0: PIXMAN_STD_FAST_PATH (OVER, a8b8g8r8, solid, b5g6r5, mips_composite_over_8888_n_0565), michael@0: PIXMAN_STD_FAST_PATH (OVER, r5g6b5, solid, r5g6b5, mips_composite_over_0565_n_0565), michael@0: PIXMAN_STD_FAST_PATH (OVER, b5g6r5, solid, b5g6r5, mips_composite_over_0565_n_0565), michael@0: PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, a8, a8r8g8b8, mips_composite_over_8888_8_8888), michael@0: PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, a8, x8r8g8b8, mips_composite_over_8888_8_8888), michael@0: PIXMAN_STD_FAST_PATH (OVER, a8b8g8r8, a8, a8b8g8r8, mips_composite_over_8888_8_8888), michael@0: PIXMAN_STD_FAST_PATH (OVER, a8b8g8r8, a8, x8b8g8r8, mips_composite_over_8888_8_8888), michael@0: PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, a8, r5g6b5, mips_composite_over_8888_8_0565), michael@0: PIXMAN_STD_FAST_PATH (OVER, a8b8g8r8, a8, b5g6r5, mips_composite_over_8888_8_0565), michael@0: PIXMAN_STD_FAST_PATH (OVER, r5g6b5, a8, r5g6b5, mips_composite_over_0565_8_0565), michael@0: PIXMAN_STD_FAST_PATH (OVER, b5g6r5, a8, b5g6r5, mips_composite_over_0565_8_0565), michael@0: PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, a8r8g8b8, a8r8g8b8, mips_composite_over_8888_8888_8888), michael@0: PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, null, a8r8g8b8, mips_composite_over_8888_8888), michael@0: PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, null, x8r8g8b8, mips_composite_over_8888_8888), michael@0: PIXMAN_STD_FAST_PATH (OVER, a8b8g8r8, null, a8b8g8r8, mips_composite_over_8888_8888), michael@0: PIXMAN_STD_FAST_PATH (OVER, a8b8g8r8, null, x8b8g8r8, mips_composite_over_8888_8888), michael@0: PIXMAN_STD_FAST_PATH (ADD, solid, a8, a8, mips_composite_add_n_8_8), michael@0: PIXMAN_STD_FAST_PATH (ADD, solid, a8, a8r8g8b8, mips_composite_add_n_8_8888), michael@0: PIXMAN_STD_FAST_PATH (ADD, solid, a8, a8b8g8r8, mips_composite_add_n_8_8888), michael@0: PIXMAN_STD_FAST_PATH (ADD, a8, a8, a8, mips_composite_add_8_8_8), michael@0: PIXMAN_STD_FAST_PATH (ADD, r5g6b5, a8, r5g6b5, mips_composite_add_0565_8_0565), michael@0: PIXMAN_STD_FAST_PATH (ADD, b5g6r5, a8, b5g6r5, mips_composite_add_0565_8_0565), michael@0: PIXMAN_STD_FAST_PATH (ADD, a8r8g8b8, a8, a8r8g8b8, mips_composite_add_8888_8_8888), michael@0: PIXMAN_STD_FAST_PATH (ADD, a8b8g8r8, a8, a8b8g8r8, mips_composite_add_8888_8_8888), michael@0: PIXMAN_STD_FAST_PATH (ADD, a8r8g8b8, a8r8g8b8, a8r8g8b8, mips_composite_add_8888_8888_8888), michael@0: PIXMAN_STD_FAST_PATH (ADD, a8r8g8b8, solid, a8r8g8b8, mips_composite_add_8888_n_8888), michael@0: PIXMAN_STD_FAST_PATH (ADD, a8b8g8r8, solid, a8b8g8r8, mips_composite_add_8888_n_8888), michael@0: PIXMAN_STD_FAST_PATH (ADD, a8, null, a8, mips_composite_add_8_8), michael@0: PIXMAN_STD_FAST_PATH (ADD, a8r8g8b8, null, a8r8g8b8, mips_composite_add_8888_8888), michael@0: PIXMAN_STD_FAST_PATH (ADD, a8b8g8r8, null, a8b8g8r8, mips_composite_add_8888_8888), michael@0: PIXMAN_STD_FAST_PATH (OUT_REVERSE, a8, null, r5g6b5, mips_composite_out_reverse_8_0565), michael@0: PIXMAN_STD_FAST_PATH (OUT_REVERSE, a8, null, b5g6r5, mips_composite_out_reverse_8_0565), michael@0: PIXMAN_STD_FAST_PATH (OUT_REVERSE, a8, null, a8r8g8b8, mips_composite_out_reverse_8_8888), michael@0: PIXMAN_STD_FAST_PATH (OUT_REVERSE, a8, null, a8b8g8r8, mips_composite_out_reverse_8_8888), michael@0: PIXMAN_STD_FAST_PATH (OVER_REVERSE, solid, null, a8r8g8b8, mips_composite_over_reverse_n_8888), michael@0: PIXMAN_STD_FAST_PATH (OVER_REVERSE, solid, null, a8b8g8r8, mips_composite_over_reverse_n_8888), michael@0: PIXMAN_STD_FAST_PATH (IN, solid, null, a8, mips_composite_in_n_8), michael@0: michael@0: PIXMAN_MIPS_SIMPLE_NEAREST_A8_MASK_FAST_PATH (OVER, a8r8g8b8, r5g6b5, mips_8888_8_0565), michael@0: PIXMAN_MIPS_SIMPLE_NEAREST_A8_MASK_FAST_PATH (OVER, a8b8g8r8, b5g6r5, mips_8888_8_0565), michael@0: michael@0: PIXMAN_MIPS_SIMPLE_NEAREST_A8_MASK_FAST_PATH (OVER, r5g6b5, r5g6b5, mips_0565_8_0565), michael@0: PIXMAN_MIPS_SIMPLE_NEAREST_A8_MASK_FAST_PATH (OVER, b5g6r5, b5g6r5, mips_0565_8_0565), michael@0: michael@0: SIMPLE_BILINEAR_FAST_PATH (SRC, a8r8g8b8, a8r8g8b8, mips_8888_8888), michael@0: SIMPLE_BILINEAR_FAST_PATH (SRC, a8r8g8b8, x8r8g8b8, mips_8888_8888), michael@0: SIMPLE_BILINEAR_FAST_PATH (SRC, x8r8g8b8, x8r8g8b8, mips_8888_8888), michael@0: michael@0: SIMPLE_BILINEAR_FAST_PATH (SRC, a8r8g8b8, r5g6b5, mips_8888_0565), michael@0: SIMPLE_BILINEAR_FAST_PATH (SRC, x8r8g8b8, r5g6b5, mips_8888_0565), michael@0: michael@0: SIMPLE_BILINEAR_FAST_PATH (SRC, r5g6b5, x8r8g8b8, mips_0565_8888), michael@0: SIMPLE_BILINEAR_FAST_PATH (SRC, r5g6b5, r5g6b5, mips_0565_0565), michael@0: michael@0: SIMPLE_BILINEAR_FAST_PATH (OVER, a8r8g8b8, a8r8g8b8, mips_8888_8888), michael@0: SIMPLE_BILINEAR_FAST_PATH (OVER, a8r8g8b8, x8r8g8b8, mips_8888_8888), michael@0: michael@0: SIMPLE_BILINEAR_FAST_PATH (ADD, a8r8g8b8, a8r8g8b8, mips_8888_8888), michael@0: SIMPLE_BILINEAR_FAST_PATH (ADD, a8r8g8b8, x8r8g8b8, mips_8888_8888), michael@0: michael@0: SIMPLE_BILINEAR_A8_MASK_FAST_PATH (SRC, a8r8g8b8, a8r8g8b8, mips_8888_8_8888), michael@0: SIMPLE_BILINEAR_A8_MASK_FAST_PATH (SRC, a8r8g8b8, x8r8g8b8, mips_8888_8_8888), michael@0: SIMPLE_BILINEAR_A8_MASK_FAST_PATH (SRC, x8r8g8b8, x8r8g8b8, mips_8888_8_8888), michael@0: michael@0: SIMPLE_BILINEAR_A8_MASK_FAST_PATH (SRC, a8r8g8b8, r5g6b5, mips_8888_8_0565), michael@0: SIMPLE_BILINEAR_A8_MASK_FAST_PATH (SRC, x8r8g8b8, r5g6b5, mips_8888_8_0565), michael@0: michael@0: SIMPLE_BILINEAR_A8_MASK_FAST_PATH (SRC, r5g6b5, x8r8g8b8, mips_0565_8_x888), michael@0: SIMPLE_BILINEAR_A8_MASK_FAST_PATH (SRC, r5g6b5, r5g6b5, mips_0565_8_0565), michael@0: michael@0: SIMPLE_BILINEAR_A8_MASK_FAST_PATH (OVER, a8r8g8b8, a8r8g8b8, mips_8888_8_8888), michael@0: SIMPLE_BILINEAR_A8_MASK_FAST_PATH (OVER, a8r8g8b8, x8r8g8b8, mips_8888_8_8888), michael@0: michael@0: SIMPLE_BILINEAR_A8_MASK_FAST_PATH (ADD, a8r8g8b8, a8r8g8b8, mips_8888_8_8888), michael@0: SIMPLE_BILINEAR_A8_MASK_FAST_PATH (ADD, a8r8g8b8, x8r8g8b8, mips_8888_8_8888), michael@0: { PIXMAN_OP_NONE }, michael@0: }; michael@0: michael@0: static void michael@0: mips_dspr2_combine_over_u (pixman_implementation_t *imp, michael@0: pixman_op_t op, michael@0: uint32_t * dest, michael@0: const uint32_t * src, michael@0: const uint32_t * mask, michael@0: int width) michael@0: { michael@0: if (mask) michael@0: pixman_composite_over_8888_8888_8888_asm_mips ( michael@0: dest, (uint32_t *)src, (uint32_t *)mask, width); michael@0: else michael@0: pixman_composite_over_8888_8888_asm_mips ( michael@0: dest, (uint32_t *)src, width); michael@0: } michael@0: michael@0: pixman_implementation_t * michael@0: _pixman_implementation_create_mips_dspr2 (pixman_implementation_t *fallback) michael@0: { michael@0: pixman_implementation_t *imp = michael@0: _pixman_implementation_create (fallback, mips_dspr2_fast_paths); michael@0: michael@0: imp->combine_32[PIXMAN_OP_OVER] = mips_dspr2_combine_over_u; michael@0: michael@0: imp->blt = mips_dspr2_blt; michael@0: imp->fill = mips_dspr2_fill; michael@0: michael@0: return imp; michael@0: }