Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2)

Side by Side Diff: src/opts/SkBitmapProcState_opts_mips_dsp.cpp

Issue 336533003: MIPS: added optimizations for functions from SkBitmapProcState (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: rebase Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « gyp/opts.gyp ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 /*
2 * Copyright 2014 The Android Open Source Project
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8
9 #include "SkBitmapProcState.h"
10 #include "SkBitmapScaler.h"
11 #include "SkColorPriv.h"
12 #include "SkPaint.h"
13 #include "SkUtils.h"
14
15 static void SI8_D16_nofilter_DX_mips_dsp(const SkBitmapProcState& s,
16 const uint32_t* SK_RESTRICT xy,
17 int count, uint16_t* SK_RESTRICT colors ) {
18 SkASSERT(count > 0 && colors != NULL);
19 SkASSERT(s.fInvType <= (SkMatrix::kTranslate_Mask | SkMatrix::kScale_Mask));
20 SkASSERT(SkPaint::kNone_FilterLevel == s.fFilterLevel);
21 const uint16_t* SK_RESTRICT table = s.fBitmap->getColorTable()->lock16BitCac he();
22 const uint8_t* SK_RESTRICT srcAddr = (const uint8_t*)s.fBitmap->getPixels();
23 SkASSERT((unsigned)xy[0] < (unsigned)s.fBitmap->height());
24 srcAddr = (const uint8_t*)((const char*)srcAddr + xy[0] * s.fBitmap->rowByte s());
25 uint8_t src;
26
27 if (1 == s.fBitmap->width()) {
28 src = srcAddr[0];
29 uint16_t dstValue = table[src];
30 sk_memset16(colors, dstValue, count);
31 } else {
32 int count8;
33 const uint16_t* SK_RESTRICT xx = (const uint16_t*)(xy + 1);
34
35 __asm__ volatile (
36 ".set push \n\t"
37 ".set noreorder \n\t"
38 ".set noat \n\t"
39 "sra %[count8], %[count], 3 \n\t"
40 "beqz %[count8], 3f \n\t"
41 " addiu %[count8], %[count8], -1 \n\t"
42 "1: \n\t"
43 "beqz %[count8], 2f \n\t"
44 " addiu %[count8], %[count8], -1 \n\t"
45 "pref 0, 16(%[xx]) \n\t"
46 "lhu $t0, 0(%[xx]) \n\t"
47 "lhu $t1, 2(%[xx]) \n\t"
48 "lhu $t2, 4(%[xx]) \n\t"
49 "lhu $t3, 6(%[xx]) \n\t"
50 "lhu $t4, 8(%[xx]) \n\t"
51 "lhu $t5, 10(%[xx]) \n\t"
52 "lhu $t6, 12(%[xx]) \n\t"
53 "lhu $t7, 14(%[xx]) \n\t"
54 "pref 0, 8(%[srcAddr]) \n\t"
55 "lbux $t0, $t0(%[srcAddr]) \n\t"
56 "lbux $t1, $t1(%[srcAddr]) \n\t"
57 "lbux $t2, $t2(%[srcAddr]) \n\t"
58 "lbux $t3, $t3(%[srcAddr]) \n\t"
59 "lbux $t4, $t4(%[srcAddr]) \n\t"
60 "lbux $t5, $t5(%[srcAddr]) \n\t"
61 "lbux $t6, $t6(%[srcAddr]) \n\t"
62 "lbux $t7, $t7(%[srcAddr]) \n\t"
63 "addu $t0, $t0, $t0 \n\t"
64 "addu $t1, $t1, $t1 \n\t"
65 "addu $t2, $t2, $t2 \n\t"
66 "addu $t3, $t3, $t3 \n\t"
67 "addu $t4, $t4, $t4 \n\t"
68 "addu $t5, $t5, $t5 \n\t"
69 "addu $t6, $t6, $t6 \n\t"
70 "addu $t7, $t7, $t7 \n\t"
71 "pref 0, 16(%[table]) \n\t"
72 "lhx $t0, $t0(%[table]) \n\t"
73 "lhx $t1, $t1(%[table]) \n\t"
74 "lhx $t2, $t2(%[table]) \n\t"
75 "lhx $t3, $t3(%[table]) \n\t"
76 "lhx $t4, $t4(%[table]) \n\t"
77 "lhx $t5, $t5(%[table]) \n\t"
78 "lhx $t6, $t6(%[table]) \n\t"
79 "lhx $t7, $t7(%[table]) \n\t"
80 "sh $t0, 0(%[colors]) \n\t"
81 "sh $t1, 2(%[colors]) \n\t"
82 "sh $t2, 4(%[colors]) \n\t"
83 "sh $t3, 6(%[colors]) \n\t"
84 "sh $t4, 8(%[colors]) \n\t"
85 "sh $t5, 10(%[colors]) \n\t"
86 "sh $t6, 12(%[colors]) \n\t"
87 "sh $t7, 14(%[colors]) \n\t"
88 "addiu %[xx], %[xx], 16 \n\t"
89 "bgtz %[count8], 1b \n\t"
90 " addiu %[colors], %[colors], 16 \n\t"
91 "2: \n\t"
92 "lhu $t0, 0(%[xx]) \n\t"
93 "lhu $t1, 2(%[xx]) \n\t"
94 "lhu $t2, 4(%[xx]) \n\t"
95 "lhu $t3, 6(%[xx]) \n\t"
96 "lhu $t4, 8(%[xx]) \n\t"
97 "lhu $t5, 10(%[xx]) \n\t"
98 "lhu $t6, 12(%[xx]) \n\t"
99 "lhu $t7, 14(%[xx]) \n\t"
100 "lbux $t0, $t0(%[srcAddr]) \n\t"
101 "lbux $t1, $t1(%[srcAddr]) \n\t"
102 "lbux $t2, $t2(%[srcAddr]) \n\t"
103 "lbux $t3, $t3(%[srcAddr]) \n\t"
104 "lbux $t4, $t4(%[srcAddr]) \n\t"
105 "lbux $t5, $t5(%[srcAddr]) \n\t"
106 "lbux $t6, $t6(%[srcAddr]) \n\t"
107 "lbux $t7, $t7(%[srcAddr]) \n\t"
108 "addu $t0, $t0, $t0 \n\t"
109 "addu $t1, $t1, $t1 \n\t"
110 "addu $t2, $t2, $t2 \n\t"
111 "addu $t3, $t3, $t3 \n\t"
112 "addu $t4, $t4, $t4 \n\t"
113 "addu $t5, $t5, $t5 \n\t"
114 "addu $t6, $t6, $t6 \n\t"
115 "addu $t7, $t7, $t7 \n\t"
116 "lhx $t0, $t0(%[table]) \n\t"
117 "lhx $t1, $t1(%[table]) \n\t"
118 "lhx $t2, $t2(%[table]) \n\t"
119 "lhx $t3, $t3(%[table]) \n\t"
120 "lhx $t4, $t4(%[table]) \n\t"
121 "lhx $t5, $t5(%[table]) \n\t"
122 "lhx $t6, $t6(%[table]) \n\t"
123 "lhx $t7, $t7(%[table]) \n\t"
124 "sh $t0, 0(%[colors]) \n\t"
125 "sh $t1, 2(%[colors]) \n\t"
126 "sh $t2, 4(%[colors]) \n\t"
127 "sh $t3, 6(%[colors]) \n\t"
128 "sh $t4, 8(%[colors]) \n\t"
129 "sh $t5, 10(%[colors]) \n\t"
130 "sh $t6, 12(%[colors]) \n\t"
131 "sh $t7, 14(%[colors]) \n\t"
132 "addiu %[xx], %[xx], 16 \n\t"
133 "addiu %[colors], %[colors], 16 \n\t"
134 "3: \n\t"
135 ".set pop \n\t"
136 : [xx]"+r"(xx), [count8]"=&r"(count8), [colors]"+r"(colors)
137 : [table]"r"(table), [srcAddr]"r"(srcAddr), [count]"r"(count)
138 : "memory","t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7"
139 );
140
141 for (int i = (count & 7); i > 0; --i) {
142 src = srcAddr[*xx++]; *colors++ = table[src];
143 }
144 }
145 s.fBitmap->getColorTable()->unlock16BitCache();
146 }
147
148 static void SI8_opaque_D32_nofilter_DX_mips_dsp(const SkBitmapProcState& s,
149 const uint32_t* SK_RESTRICT xy,
150 int count, SkPMColor* SK_RESTRIC T colors) {
151 SkASSERT(count > 0 && colors != NULL);
152 SkASSERT(s.fInvType <= (SkMatrix::kTranslate_Mask | SkMatrix::kScale_Mask));
153 SkASSERT(SkPaint::kNone_FilterLevel == s.fFilterLevel);
154 const SkPMColor* SK_RESTRICT table = s.fBitmap->getColorTable()->lockColors( );
155 const uint8_t* SK_RESTRICT srcAddr = (const uint8_t*)s.fBitmap->getPixels();
156 srcAddr = (const uint8_t*)((const char*)srcAddr + xy[0] * s.fBitmap->rowByte s());
157
158 if (1 == s.fBitmap->width()) {
159 uint8_t src = srcAddr[0];
160 SkPMColor dstValue = table[src];
161 sk_memset32(colors, dstValue, count);
162 } else {
163 const uint16_t* xx = (const uint16_t*)(xy + 1);
164 int s0, s1, s2, s3, s4, s5, s6, s7;
165 __asm__ volatile (
166 ".set push \n\t"
167 ".set noreorder \n\t"
168 ".set noat \n\t"
169 "srl $t8, %[count], 4 \n\t"
170 "beqz $t8, 3f \n\t"
171 " nop \n\t"
172 "1: \n\t"
173 "addiu $t8, $t8, -1 \n\t"
174 "beqz $t8, 2f \n\t"
175 " addiu %[count], %[count], -16 \n\t"
176 "pref 0, 32(%[xx]) \n\t"
177 "lhu $t0, 0(%[xx]) \n\t"
178 "lhu $t1, 2(%[xx]) \n\t"
179 "lhu $t2, 4(%[xx]) \n\t"
180 "lhu $t3, 6(%[xx]) \n\t"
181 "lhu $t4, 8(%[xx]) \n\t"
182 "lhu $t5, 10(%[xx]) \n\t"
183 "lhu $t6, 12(%[xx]) \n\t"
184 "lhu $t7, 14(%[xx]) \n\t"
185 "lhu %[s0], 16(%[xx]) \n\t"
186 "lhu %[s1], 18(%[xx]) \n\t"
187 "lhu %[s2], 20(%[xx]) \n\t"
188 "lhu %[s3], 22(%[xx]) \n\t"
189 "lhu %[s4], 24(%[xx]) \n\t"
190 "lhu %[s5], 26(%[xx]) \n\t"
191 "lhu %[s6], 28(%[xx]) \n\t"
192 "lhu %[s7], 30(%[xx]) \n\t"
193 "lbux $t0, $t0(%[srcAddr]) \n\t"
194 "lbux $t1, $t1(%[srcAddr]) \n\t"
195 "lbux $t2, $t2(%[srcAddr]) \n\t"
196 "lbux $t3, $t3(%[srcAddr]) \n\t"
197 "lbux $t4, $t4(%[srcAddr]) \n\t"
198 "lbux $t5, $t5(%[srcAddr]) \n\t"
199 "lbux $t6, $t6(%[srcAddr]) \n\t"
200 "lbux $t7, $t7(%[srcAddr]) \n\t"
201 "lbux %[s0], %[s0](%[srcAddr]) \n\t"
202 "lbux %[s1], %[s1](%[srcAddr]) \n\t"
203 "lbux %[s2], %[s2](%[srcAddr]) \n\t"
204 "lbux %[s3], %[s3](%[srcAddr]) \n\t"
205 "lbux %[s4], %[s4](%[srcAddr]) \n\t"
206 "lbux %[s5], %[s5](%[srcAddr]) \n\t"
207 "lbux %[s6], %[s6](%[srcAddr]) \n\t"
208 "lbux %[s7], %[s7](%[srcAddr]) \n\t"
209 "sll $t0, $t0, 2 \n\t"
210 "sll $t1, $t1, 2 \n\t"
211 "sll $t2, $t2, 2 \n\t"
212 "sll $t3, $t3, 2 \n\t"
213 "sll $t4, $t4, 2 \n\t"
214 "sll $t5, $t5, 2 \n\t"
215 "sll $t6, $t6, 2 \n\t"
216 "sll $t7, $t7, 2 \n\t"
217 "sll %[s0], %[s0], 2 \n\t"
218 "sll %[s1], %[s1], 2 \n\t"
219 "sll %[s2], %[s2], 2 \n\t"
220 "sll %[s3], %[s3], 2 \n\t"
221 "sll %[s4], %[s4], 2 \n\t"
222 "sll %[s5], %[s5], 2 \n\t"
223 "sll %[s6], %[s6], 2 \n\t"
224 "sll %[s7], %[s7], 2 \n\t"
225 "pref 0, 64(%[table]) \n\t"
226 "lwx $t0, $t0(%[table]) \n\t"
227 "lwx $t1, $t1(%[table]) \n\t"
228 "lwx $t2, $t2(%[table]) \n\t"
229 "lwx $t3, $t3(%[table]) \n\t"
230 "lwx $t4, $t4(%[table]) \n\t"
231 "lwx $t5, $t5(%[table]) \n\t"
232 "lwx $t6, $t6(%[table]) \n\t"
233 "lwx $t7, $t7(%[table]) \n\t"
234 "lwx %[s0], %[s0](%[table]) \n\t"
235 "lwx %[s1], %[s1](%[table]) \n\t"
236 "lwx %[s2], %[s2](%[table]) \n\t"
237 "lwx %[s3], %[s3](%[table]) \n\t"
238 "lwx %[s4], %[s4](%[table]) \n\t"
239 "lwx %[s5], %[s5](%[table]) \n\t"
240 "lwx %[s6], %[s6](%[table]) \n\t"
241 "lwx %[s7], %[s7](%[table]) \n\t"
242 "pref 30, 64(%[colors]) \n\t"
243 "sw $t0, 0(%[colors]) \n\t"
244 "sw $t1, 4(%[colors]) \n\t"
245 "sw $t2, 8(%[colors]) \n\t"
246 "sw $t3, 12(%[colors]) \n\t"
247 "sw $t4, 16(%[colors]) \n\t"
248 "sw $t5, 20(%[colors]) \n\t"
249 "sw $t6, 24(%[colors]) \n\t"
250 "sw $t7, 28(%[colors]) \n\t"
251 "sw %[s0], 32(%[colors]) \n\t"
252 "sw %[s1], 36(%[colors]) \n\t"
253 "sw %[s2], 40(%[colors]) \n\t"
254 "sw %[s3], 44(%[colors]) \n\t"
255 "sw %[s4], 48(%[colors]) \n\t"
256 "sw %[s5], 52(%[colors]) \n\t"
257 "sw %[s6], 56(%[colors]) \n\t"
258 "sw %[s7], 60(%[colors]) \n\t"
259 "addiu %[xx], %[xx], 32 \n\t"
260 "b 1b \n\t"
261 " addiu %[colors], %[colors], 64 \n\t"
262 "2: \n\t"
263 "lhu $t0, 0(%[xx]) \n\t"
264 "lhu $t1, 2(%[xx]) \n\t"
265 "lhu $t2, 4(%[xx]) \n\t"
266 "lhu $t3, 6(%[xx]) \n\t"
267 "lhu $t4, 8(%[xx]) \n\t"
268 "lhu $t5, 10(%[xx]) \n\t"
269 "lhu $t6, 12(%[xx]) \n\t"
270 "lhu $t7, 14(%[xx]) \n\t"
271 "lhu %[s0], 16(%[xx]) \n\t"
272 "lhu %[s1], 18(%[xx]) \n\t"
273 "lhu %[s2], 20(%[xx]) \n\t"
274 "lhu %[s3], 22(%[xx]) \n\t"
275 "lhu %[s4], 24(%[xx]) \n\t"
276 "lhu %[s5], 26(%[xx]) \n\t"
277 "lhu %[s6], 28(%[xx]) \n\t"
278 "lhu %[s7], 30(%[xx]) \n\t"
279 "lbux $t0, $t0(%[srcAddr]) \n\t"
280 "lbux $t1, $t1(%[srcAddr]) \n\t"
281 "lbux $t2, $t2(%[srcAddr]) \n\t"
282 "lbux $t3, $t3(%[srcAddr]) \n\t"
283 "lbux $t4, $t4(%[srcAddr]) \n\t"
284 "lbux $t5, $t5(%[srcAddr]) \n\t"
285 "lbux $t6, $t6(%[srcAddr]) \n\t"
286 "lbux $t7, $t7(%[srcAddr]) \n\t"
287 "lbux %[s0], %[s0](%[srcAddr]) \n\t"
288 "lbux %[s1], %[s1](%[srcAddr]) \n\t"
289 "lbux %[s2], %[s2](%[srcAddr]) \n\t"
290 "lbux %[s3], %[s3](%[srcAddr]) \n\t"
291 "lbux %[s4], %[s4](%[srcAddr]) \n\t"
292 "lbux %[s5], %[s5](%[srcAddr]) \n\t"
293 "lbux %[s6], %[s6](%[srcAddr]) \n\t"
294 "lbux %[s7], %[s7](%[srcAddr]) \n\t"
295 "sll $t0, $t0, 2 \n\t"
296 "sll $t1, $t1, 2 \n\t"
297 "sll $t2, $t2, 2 \n\t"
298 "sll $t3, $t3, 2 \n\t"
299 "sll $t4, $t4, 2 \n\t"
300 "sll $t5, $t5, 2 \n\t"
301 "sll $t6, $t6, 2 \n\t"
302 "sll $t7, $t7, 2 \n\t"
303 "sll %[s0], %[s0], 2 \n\t"
304 "sll %[s1], %[s1], 2 \n\t"
305 "sll %[s2], %[s2], 2 \n\t"
306 "sll %[s3], %[s3], 2 \n\t"
307 "sll %[s4], %[s4], 2 \n\t"
308 "sll %[s5], %[s5], 2 \n\t"
309 "sll %[s6], %[s6], 2 \n\t"
310 "sll %[s7], %[s7], 2 \n\t"
311 "lwx $t0, $t0(%[table]) \n\t"
312 "lwx $t1, $t1(%[table]) \n\t"
313 "lwx $t2, $t2(%[table]) \n\t"
314 "lwx $t3, $t3(%[table]) \n\t"
315 "lwx $t4, $t4(%[table]) \n\t"
316 "lwx $t5, $t5(%[table]) \n\t"
317 "lwx $t6, $t6(%[table]) \n\t"
318 "lwx $t7, $t7(%[table]) \n\t"
319 "lwx %[s0], %[s0](%[table]) \n\t"
320 "lwx %[s1], %[s1](%[table]) \n\t"
321 "lwx %[s2], %[s2](%[table]) \n\t"
322 "lwx %[s3], %[s3](%[table]) \n\t"
323 "lwx %[s4], %[s4](%[table]) \n\t"
324 "lwx %[s5], %[s5](%[table]) \n\t"
325 "lwx %[s6], %[s6](%[table]) \n\t"
326 "lwx %[s7], %[s7](%[table]) \n\t"
327 "sw $t0, 0(%[colors]) \n\t"
328 "sw $t1, 4(%[colors]) \n\t"
329 "sw $t2, 8(%[colors]) \n\t"
330 "sw $t3, 12(%[colors]) \n\t"
331 "sw $t4, 16(%[colors]) \n\t"
332 "sw $t5, 20(%[colors]) \n\t"
333 "sw $t6, 24(%[colors]) \n\t"
334 "sw $t7, 28(%[colors]) \n\t"
335 "sw %[s0], 32(%[colors]) \n\t"
336 "sw %[s1], 36(%[colors]) \n\t"
337 "sw %[s2], 40(%[colors]) \n\t"
338 "sw %[s3], 44(%[colors]) \n\t"
339 "sw %[s4], 48(%[colors]) \n\t"
340 "sw %[s5], 52(%[colors]) \n\t"
341 "sw %[s6], 56(%[colors]) \n\t"
342 "sw %[s7], 60(%[colors]) \n\t"
343 "addiu %[xx], %[xx], 32 \n\t"
344 "beqz %[count], 4f \n\t"
345 " addiu %[colors], %[colors], 64 \n\t"
346 "3: \n\t"
347 "addiu %[count], %[count], -1 \n\t"
348 "lhu $t0, 0(%[xx]) \n\t"
349 "lbux $t1, $t0(%[srcAddr]) \n\t"
350 "sll $t1, $t1, 2 \n\t"
351 "lwx $t2, $t1(%[table]) \n\t"
352 "sw $t2, 0(%[colors]) \n\t"
353 "addiu %[xx], %[xx], 2 \n\t"
354 "bnez %[count], 3b \n\t"
355 " addiu %[colors], %[colors], 4 \n\t"
356 "4: \n\t"
357 ".set pop \n\t"
358 : [xx]"+r"(xx), [count]"+r"(count), [colors]"+r"(colors),
359 [s0]"=&r"(s0), [s1]"=&r"(s1), [s2]"=&r"(s2), [s3]"=&r"(s3),
360 [s4]"=&r"(s4), [s5]"=&r"(s5), [s6]"=&r"(s6), [s7]"=&r"(s7)
361 : [table]"r"(table), [srcAddr]"r"(srcAddr)
362 : "memory", "t0", "t1", "t2", "t3",
363 "t4", "t5", "t6", "t7", "t8"
364 );
365 }
366 s.fBitmap->getColorTable()->unlockColors();
367 }
368
369 /* If we replace a sampleproc, then we null-out the associated shaderproc,
370 otherwise the shader won't even look at the matrix/sampler
371 */
372
373 void SkBitmapProcState::platformProcs() {
374 bool isOpaque = 256 == fAlphaScale;
375 bool justDx = false;
376
377 if (fInvType <= (SkMatrix::kTranslate_Mask | SkMatrix::kScale_Mask)) {
378 justDx = true;
379 }
380
381 switch (fBitmap->colorType()) {
382 case kIndex_8_SkColorType:
383 if (justDx && SkPaint::kNone_FilterLevel == fFilterLevel) {
384 fSampleProc16 = SI8_D16_nofilter_DX_mips_dsp;
385 fShaderProc16 = NULL;
386 if (isOpaque) {
387 fSampleProc32 = SI8_opaque_D32_nofilter_DX_mips_dsp;
388 fShaderProc32 = NULL;
389 }
390 }
391 break;
392 default:
393 break;
394 }
395 }
396
397 void SkBitmapScaler::PlatformConvolutionProcs(SkConvolutionProcs*) {}
OLDNEW
« no previous file with comments | « gyp/opts.gyp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698