OLD | NEW |
---|---|
1 #include "SkColorPriv.h" | 1 #include "SkColorPriv.h" |
2 #include "SkColor_opts_SSE2.h" | 2 #include "SkColor_opts_SSE2.h" |
3 #include "SkMathPriv.h" | 3 #include "SkMathPriv.h" |
4 #include "SkXfermode.h" | 4 #include "SkXfermode.h" |
5 #include "SkXfermode_opts_SSE2.h" | 5 #include "SkXfermode_opts_SSE2.h" |
6 #include "SkXfermode_proccoeff.h" | 6 #include "SkXfermode_proccoeff.h" |
7 | 7 |
8 //////////////////////////////////////////////////////////////////////////////// | 8 //////////////////////////////////////////////////////////////////////////////// |
9 // 4 pixels SSE2 version functions | 9 // 4 pixels SSE2 version functions |
10 //////////////////////////////////////////////////////////////////////////////// | 10 //////////////////////////////////////////////////////////////////////////////// |
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
222 SkGetPackedA32_SSE2(dst)); | 222 SkGetPackedA32_SSE2(dst)); |
223 __m128i r = srcover_byte_SSE2(SkGetPackedR32_SSE2(src), | 223 __m128i r = srcover_byte_SSE2(SkGetPackedR32_SSE2(src), |
224 SkGetPackedR32_SSE2(dst)); | 224 SkGetPackedR32_SSE2(dst)); |
225 __m128i g = srcover_byte_SSE2(SkGetPackedG32_SSE2(src), | 225 __m128i g = srcover_byte_SSE2(SkGetPackedG32_SSE2(src), |
226 SkGetPackedG32_SSE2(dst)); | 226 SkGetPackedG32_SSE2(dst)); |
227 __m128i b = srcover_byte_SSE2(SkGetPackedB32_SSE2(src), | 227 __m128i b = srcover_byte_SSE2(SkGetPackedB32_SSE2(src), |
228 SkGetPackedB32_SSE2(dst)); | 228 SkGetPackedB32_SSE2(dst)); |
229 return SkPackARGB32_SSE2(a, r, g, b); | 229 return SkPackARGB32_SSE2(a, r, g, b); |
230 } | 230 } |
231 | 231 |
232 static inline __m128i overlay_byte_SSE2(const __m128i& sc, const __m128i& dc, | |
mtklein
2014/04/22 15:18:21
A brief description of this one would also help.
qiankun
2014/04/23 07:40:05
This SSE2 function is translated from overlay_byte
| |
233 const __m128i& sa, const __m128i& da) { | |
234 __m128i ida = _mm_sub_epi32(_mm_set1_epi32(255), da); | |
235 __m128i tmp1 = _mm_mullo_epi16(sc, ida); | |
236 __m128i isa = _mm_sub_epi32(_mm_set1_epi32(255), sa); | |
237 __m128i tmp2 = _mm_mullo_epi16(dc, isa); | |
238 __m128i tmp = _mm_add_epi32(tmp1, tmp2); | |
239 | |
240 __m128i cmp = _mm_cmpgt_epi32(_mm_slli_epi32(dc, 1), da); | |
241 __m128i rc1 = _mm_slli_epi32(sc, 1); // 2 * sc | |
242 rc1 = Multiply32_SSE2(rc1, dc); // *dc | |
243 | |
244 __m128i rc2 = _mm_mullo_epi16(sa, da); // sa * da | |
245 __m128i tmp3 = _mm_slli_epi32(_mm_sub_epi32(da, dc), 1); // 2 * (da - dc) | |
246 tmp3 = Multiply32_SSE2(tmp3, _mm_sub_epi32(sa, sc)); // * (sa - sc) | |
247 rc2 = _mm_sub_epi32(rc2, tmp3); | |
248 | |
249 __m128i rc = _mm_or_si128(_mm_andnot_si128(cmp, rc1), | |
250 _mm_and_si128(cmp, rc2)); | |
251 return clamp_div255round_SSE2(_mm_add_epi32(rc, tmp)); | |
252 } | |
253 | |
254 static __m128i overlay_modeproc_SSE2(const __m128i& src, const __m128i& dst) { | |
255 __m128i sa = SkGetPackedA32_SSE2(src); | |
256 __m128i da = SkGetPackedA32_SSE2(dst); | |
257 | |
258 __m128i a = srcover_byte_SSE2(sa, da); | |
259 __m128i r = overlay_byte_SSE2(SkGetPackedR32_SSE2(src), | |
260 SkGetPackedR32_SSE2(dst), sa, da); | |
261 __m128i g = overlay_byte_SSE2(SkGetPackedG32_SSE2(src), | |
262 SkGetPackedG32_SSE2(dst), sa, da); | |
263 __m128i b = overlay_byte_SSE2(SkGetPackedB32_SSE2(src), | |
264 SkGetPackedB32_SSE2(dst), sa, da); | |
265 return SkPackARGB32_SSE2(a, r, g, b); | |
266 } | |
267 | |
232 //////////////////////////////////////////////////////////////////////////////// | 268 //////////////////////////////////////////////////////////////////////////////// |
233 | 269 |
234 typedef __m128i (*SkXfermodeProcSIMD)(const __m128i& src, const __m128i& dst); | 270 typedef __m128i (*SkXfermodeProcSIMD)(const __m128i& src, const __m128i& dst); |
235 | 271 |
236 extern SkXfermodeProcSIMD gSSE2XfermodeProcs[]; | 272 extern SkXfermodeProcSIMD gSSE2XfermodeProcs[]; |
237 | 273 |
238 SkSSE2ProcCoeffXfermode::SkSSE2ProcCoeffXfermode(SkReadBuffer& buffer) | 274 SkSSE2ProcCoeffXfermode::SkSSE2ProcCoeffXfermode(SkReadBuffer& buffer) |
239 : INHERITED(buffer) { | 275 : INHERITED(buffer) { |
240 fProcSIMD = reinterpret_cast<void*>(gSSE2XfermodeProcs[this->getMode()]); | 276 fProcSIMD = reinterpret_cast<void*>(gSSE2XfermodeProcs[this->getMode()]); |
241 } | 277 } |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
377 dstin_modeproc_SSE2, | 413 dstin_modeproc_SSE2, |
378 srcout_modeproc_SSE2, | 414 srcout_modeproc_SSE2, |
379 dstout_modeproc_SSE2, | 415 dstout_modeproc_SSE2, |
380 srcatop_modeproc_SSE2, | 416 srcatop_modeproc_SSE2, |
381 dstatop_modeproc_SSE2, | 417 dstatop_modeproc_SSE2, |
382 xor_modeproc_SSE2, | 418 xor_modeproc_SSE2, |
383 plus_modeproc_SSE2, | 419 plus_modeproc_SSE2, |
384 modulate_modeproc_SSE2, | 420 modulate_modeproc_SSE2, |
385 screen_modeproc_SSE2, | 421 screen_modeproc_SSE2, |
386 | 422 |
387 NULL, // kOverlay_Mode | 423 overlay_modeproc_SSE2, |
388 NULL, // kDarken_Mode | 424 NULL, // kDarken_Mode |
389 NULL, // kLighten_Mode | 425 NULL, // kLighten_Mode |
390 NULL, // kColorDodge_Mode | 426 NULL, // kColorDodge_Mode |
391 NULL, // kColorBurn_Mode | 427 NULL, // kColorBurn_Mode |
392 NULL, // kHardLight_Mode | 428 NULL, // kHardLight_Mode |
393 NULL, // kSoftLight_Mode | 429 NULL, // kSoftLight_Mode |
394 NULL, // kDifference_Mode | 430 NULL, // kDifference_Mode |
395 NULL, // kExclusion_Mode | 431 NULL, // kExclusion_Mode |
396 multiply_modeproc_SSE2, | 432 multiply_modeproc_SSE2, |
397 | 433 |
398 NULL, // kHue_Mode | 434 NULL, // kHue_Mode |
399 NULL, // kSaturation_Mode | 435 NULL, // kSaturation_Mode |
400 NULL, // kColor_Mode | 436 NULL, // kColor_Mode |
401 NULL, // kLuminosity_Mode | 437 NULL, // kLuminosity_Mode |
402 }; | 438 }; |
403 | 439 |
404 SkProcCoeffXfermode* SkPlatformXfermodeFactory_impl_SSE2(const ProcCoeff& rec, | 440 SkProcCoeffXfermode* SkPlatformXfermodeFactory_impl_SSE2(const ProcCoeff& rec, |
405 SkXfermode::Mode mode) { | 441 SkXfermode::Mode mode) { |
406 void* procSIMD = reinterpret_cast<void*>(gSSE2XfermodeProcs[mode]); | 442 void* procSIMD = reinterpret_cast<void*>(gSSE2XfermodeProcs[mode]); |
407 | 443 |
408 if (procSIMD != NULL) { | 444 if (procSIMD != NULL) { |
409 return SkNEW_ARGS(SkSSE2ProcCoeffXfermode, (rec, mode, procSIMD)); | 445 return SkNEW_ARGS(SkSSE2ProcCoeffXfermode, (rec, mode, procSIMD)); |
410 } | 446 } |
411 return NULL; | 447 return NULL; |
412 } | 448 } |
OLD | NEW |