Chromium Code Reviews| 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 |