3 * MIPS Technologies, Inc., California.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. Neither the name of the MIPS Technologies, Inc., nor the names of its
14 * contributors may be used to endorse or promote products derived from
15 * this software without specific prior written permission.
17 * THIS SOFTWARE IS PROVIDED BY THE MIPS TECHNOLOGIES, INC. ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE MIPS TECHNOLOGIES, INC. BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 * Author: Nemanja Lukic (nlukic@mips.com)
36 #include "pixman-private.h"
37 #include "pixman-mips-dspr2.h"
39 PIXMAN_MIPS_BIND_FAST_PATH_SRC_DST (0, src_x888_8888,
40 uint32_t, 1, uint32_t, 1)
41 PIXMAN_MIPS_BIND_FAST_PATH_SRC_DST (0, src_8888_0565,
42 uint32_t, 1, uint16_t, 1)
43 PIXMAN_MIPS_BIND_FAST_PATH_SRC_DST (0, src_0565_8888,
44 uint16_t, 1, uint32_t, 1)
45 PIXMAN_MIPS_BIND_FAST_PATH_SRC_DST (DO_FAST_MEMCPY, src_0565_0565,
46 uint16_t, 1, uint16_t, 1)
47 PIXMAN_MIPS_BIND_FAST_PATH_SRC_DST (DO_FAST_MEMCPY, src_8888_8888,
48 uint32_t, 1, uint32_t, 1)
49 PIXMAN_MIPS_BIND_FAST_PATH_SRC_DST (DO_FAST_MEMCPY, src_0888_0888,
50 uint8_t, 3, uint8_t, 3)
52 PIXMAN_MIPS_BIND_FAST_PATH_N_MASK_DST (SKIP_ZERO_SRC, over_n_8888_8888_ca,
53 uint32_t, 1, uint32_t, 1)
54 PIXMAN_MIPS_BIND_FAST_PATH_N_MASK_DST (SKIP_ZERO_SRC, over_n_8888_0565_ca,
55 uint32_t, 1, uint16_t, 1)
56 PIXMAN_MIPS_BIND_FAST_PATH_N_MASK_DST (SKIP_ZERO_SRC, over_n_8_8888,
57 uint8_t, 1, uint32_t, 1)
58 PIXMAN_MIPS_BIND_FAST_PATH_N_MASK_DST (SKIP_ZERO_SRC, over_n_8_0565,
59 uint8_t, 1, uint16_t, 1)
61 PIXMAN_MIPS_BIND_SCALED_BILINEAR_SRC_A8_DST (SKIP_ZERO_SRC, 8888_8_8888, OVER,
65 pixman_fill_mips (uint32_t *bits,
79 stride = stride * (int) sizeof (uint32_t) / 2;
80 byte_line = (uint8_t *)(((uint16_t *)bits) + stride * y + x);
81 byte_width = width * 2;
86 uint8_t *dst = byte_line;
88 pixman_fill_buff16_mips (dst, byte_width, _xor & 0xffff);
92 stride = stride * (int) sizeof (uint32_t) / 4;
93 byte_line = (uint8_t *)(((uint32_t *)bits) + stride * y + x);
94 byte_width = width * 4;
99 uint8_t *dst = byte_line;
101 pixman_fill_buff32_mips (dst, byte_width, _xor);
110 pixman_blt_mips (uint32_t *src_bits,
123 if (src_bpp != dst_bpp)
133 src_stride = src_stride * (int) sizeof (uint32_t) / 2;
134 dst_stride = dst_stride * (int) sizeof (uint32_t) / 2;
135 src_bytes =(uint8_t *)(((uint16_t *)src_bits)
136 + src_stride * (src_y) + (src_x));
137 dst_bytes = (uint8_t *)(((uint16_t *)dst_bits)
138 + dst_stride * (dest_y) + (dest_x));
139 byte_width = width * 2;
145 uint8_t *src = src_bytes;
146 uint8_t *dst = dst_bytes;
147 src_bytes += src_stride;
148 dst_bytes += dst_stride;
149 pixman_mips_fast_memcpy (dst, src, byte_width);
153 src_stride = src_stride * (int) sizeof (uint32_t) / 4;
154 dst_stride = dst_stride * (int) sizeof (uint32_t) / 4;
155 src_bytes = (uint8_t *)(((uint32_t *)src_bits)
156 + src_stride * (src_y) + (src_x));
157 dst_bytes = (uint8_t *)(((uint32_t *)dst_bits)
158 + dst_stride * (dest_y) + (dest_x));
159 byte_width = width * 4;
165 uint8_t *src = src_bytes;
166 uint8_t *dst = dst_bytes;
167 src_bytes += src_stride;
168 dst_bytes += dst_stride;
169 pixman_mips_fast_memcpy (dst, src, byte_width);
177 static const pixman_fast_path_t mips_dspr2_fast_paths[] =
179 PIXMAN_STD_FAST_PATH (SRC, r5g6b5, null, r5g6b5, mips_composite_src_0565_0565),
180 PIXMAN_STD_FAST_PATH (SRC, b5g6r5, null, b5g6r5, mips_composite_src_0565_0565),
181 PIXMAN_STD_FAST_PATH (SRC, a8r8g8b8, null, r5g6b5, mips_composite_src_8888_0565),
182 PIXMAN_STD_FAST_PATH (SRC, x8r8g8b8, null, r5g6b5, mips_composite_src_8888_0565),
183 PIXMAN_STD_FAST_PATH (SRC, a8b8g8r8, null, b5g6r5, mips_composite_src_8888_0565),
184 PIXMAN_STD_FAST_PATH (SRC, x8b8g8r8, null, b5g6r5, mips_composite_src_8888_0565),
185 PIXMAN_STD_FAST_PATH (SRC, r5g6b5, null, a8r8g8b8, mips_composite_src_0565_8888),
186 PIXMAN_STD_FAST_PATH (SRC, r5g6b5, null, x8r8g8b8, mips_composite_src_0565_8888),
187 PIXMAN_STD_FAST_PATH (SRC, b5g6r5, null, a8b8g8r8, mips_composite_src_0565_8888),
188 PIXMAN_STD_FAST_PATH (SRC, b5g6r5, null, x8b8g8r8, mips_composite_src_0565_8888),
189 PIXMAN_STD_FAST_PATH (SRC, a8r8g8b8, null, x8r8g8b8, mips_composite_src_8888_8888),
190 PIXMAN_STD_FAST_PATH (SRC, x8r8g8b8, null, x8r8g8b8, mips_composite_src_8888_8888),
191 PIXMAN_STD_FAST_PATH (SRC, a8b8g8r8, null, x8b8g8r8, mips_composite_src_8888_8888),
192 PIXMAN_STD_FAST_PATH (SRC, x8b8g8r8, null, x8b8g8r8, mips_composite_src_8888_8888),
193 PIXMAN_STD_FAST_PATH (SRC, a8r8g8b8, null, a8r8g8b8, mips_composite_src_8888_8888),
194 PIXMAN_STD_FAST_PATH (SRC, a8b8g8r8, null, a8b8g8r8, mips_composite_src_8888_8888),
195 PIXMAN_STD_FAST_PATH (SRC, x8r8g8b8, null, a8r8g8b8, mips_composite_src_x888_8888),
196 PIXMAN_STD_FAST_PATH (SRC, x8b8g8r8, null, a8b8g8r8, mips_composite_src_x888_8888),
197 PIXMAN_STD_FAST_PATH (SRC, r8g8b8, null, r8g8b8, mips_composite_src_0888_0888),
199 PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8r8g8b8, a8r8g8b8, mips_composite_over_n_8888_8888_ca),
200 PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8r8g8b8, x8r8g8b8, mips_composite_over_n_8888_8888_ca),
201 PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8b8g8r8, a8b8g8r8, mips_composite_over_n_8888_8888_ca),
202 PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8b8g8r8, x8b8g8r8, mips_composite_over_n_8888_8888_ca),
203 PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8r8g8b8, r5g6b5, mips_composite_over_n_8888_0565_ca),
204 PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8b8g8r8, b5g6r5, mips_composite_over_n_8888_0565_ca),
205 PIXMAN_STD_FAST_PATH (OVER, solid, a8, a8r8g8b8, mips_composite_over_n_8_8888),
206 PIXMAN_STD_FAST_PATH (OVER, solid, a8, x8r8g8b8, mips_composite_over_n_8_8888),
207 PIXMAN_STD_FAST_PATH (OVER, solid, a8, a8b8g8r8, mips_composite_over_n_8_8888),
208 PIXMAN_STD_FAST_PATH (OVER, solid, a8, x8b8g8r8, mips_composite_over_n_8_8888),
209 PIXMAN_STD_FAST_PATH (OVER, solid, a8, r5g6b5, mips_composite_over_n_8_0565),
210 PIXMAN_STD_FAST_PATH (OVER, solid, a8, b5g6r5, mips_composite_over_n_8_0565),
212 SIMPLE_BILINEAR_A8_MASK_FAST_PATH (OVER, a8r8g8b8, a8r8g8b8, mips_8888_8_8888),
213 SIMPLE_BILINEAR_A8_MASK_FAST_PATH (OVER, a8r8g8b8, x8r8g8b8, mips_8888_8_8888),
219 mips_dspr2_blt (pixman_implementation_t *imp,
233 if (!pixman_blt_mips (
234 src_bits, dst_bits, src_stride, dst_stride, src_bpp, dst_bpp,
235 src_x, src_y, dest_x, dest_y, width, height))
238 return _pixman_implementation_blt (
240 src_bits, dst_bits, src_stride, dst_stride, src_bpp, dst_bpp,
241 src_x, src_y, dest_x, dest_y, width, height);
248 mips_dspr2_fill (pixman_implementation_t *imp,
258 if (pixman_fill_mips (bits, stride, bpp, x, y, width, height, xor))
261 return _pixman_implementation_fill (
262 imp->delegate, bits, stride, bpp, x, y, width, height, xor);
265 pixman_implementation_t *
266 _pixman_implementation_create_mips_dspr2 (pixman_implementation_t *fallback)
268 pixman_implementation_t *imp =
269 _pixman_implementation_create (fallback, mips_dspr2_fast_paths);
271 imp->blt = mips_dspr2_blt;
272 imp->fill = mips_dspr2_fill;