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

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

Issue 232783002: Xfermode: SSE2 implementation of overlay_modeproc (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: rebase Created 6 years, 8 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
« src/opts/SkColor_opts_SSE2.h ('K') | « src/opts/SkColor_opts_SSE2.h ('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
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
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
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 }
OLDNEW
« src/opts/SkColor_opts_SSE2.h ('K') | « src/opts/SkColor_opts_SSE2.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698