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 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 77 __m128i g = blendfunc_multiply_byte_SSE2(sg, dg, sa, da); | 77 __m128i g = blendfunc_multiply_byte_SSE2(sg, dg, sa, da); |
| 78 | 78 |
| 79 | 79 |
| 80 __m128i sb = SkGetPackedB32_SSE2(src); | 80 __m128i sb = SkGetPackedB32_SSE2(src); |
| 81 __m128i db = SkGetPackedB32_SSE2(dst); | 81 __m128i db = SkGetPackedB32_SSE2(dst); |
| 82 __m128i b = blendfunc_multiply_byte_SSE2(sb, db, sa, da); | 82 __m128i b = blendfunc_multiply_byte_SSE2(sb, db, sa, da); |
| 83 | 83 |
| 84 return SkPackARGB32_SSE2(a, r, g, b); | 84 return SkPackARGB32_SSE2(a, r, g, b); |
| 85 } | 85 } |
| 86 | 86 |
| 87 static inline __m128i darken_byte_SSE2(const __m128i& sc, const __m128i& dc, | |
| 88 const __m128i& sa, const __m128i& da) { | |
| 89 __m128i sd = _mm_mullo_epi16(sc, da); | |
| 90 __m128i ds = _mm_mullo_epi16(dc, sa); | |
| 91 | |
| 92 __m128i cmp = _mm_cmplt_epi32(sd, ds); | |
| 93 | |
| 94 __m128i ret1 = _mm_add_epi32(sc, dc); | |
|
mtklein
2014/04/24 17:55:12
I'm not sure why the original code was written so
qiankun
2014/04/25 14:13:24
Done.
| |
| 95 ret1 = _mm_sub_epi32(ret1, SkDiv255Round_SSE2(ds)); | |
| 96 | |
| 97 __m128i ret2 = _mm_add_epi32(dc, sc); | |
| 98 ret2 = _mm_sub_epi32(ret2, SkDiv255Round_SSE2(sd)); | |
| 99 | |
| 100 __m128i ret = _mm_or_si128(_mm_and_si128(cmp, ret1), | |
| 101 _mm_andnot_si128(cmp, ret2)); | |
| 102 | |
| 103 return ret; | |
| 104 } | |
| 105 | |
| 106 static __m128i darken_modeproc_SSE2(const __m128i& src, const __m128i& dst) { | |
| 107 __m128i sa = SkGetPackedA32_SSE2(src); | |
| 108 __m128i da = SkGetPackedA32_SSE2(dst); | |
| 109 | |
| 110 __m128i a = srcover_byte_SSE2(sa, da); | |
| 111 __m128i r = darken_byte_SSE2(SkGetPackedR32_SSE2(src), | |
| 112 SkGetPackedR32_SSE2(dst), sa, da); | |
| 113 __m128i g = darken_byte_SSE2(SkGetPackedG32_SSE2(src), | |
| 114 SkGetPackedG32_SSE2(dst), sa, da); | |
| 115 __m128i b = darken_byte_SSE2(SkGetPackedB32_SSE2(src), | |
| 116 SkGetPackedB32_SSE2(dst), sa, da); | |
| 117 return SkPackARGB32_SSE2(a, r, g, b); | |
| 118 } | |
| 119 | |
| 120 static inline __m128i lighten_byte_SSE2(const __m128i& sc, const __m128i& dc, | |
| 121 const __m128i& sa, const __m128i& da) { | |
| 122 __m128i sd = _mm_mullo_epi16(sc, da); | |
| 123 __m128i ds = _mm_mullo_epi16(dc, sa); | |
| 124 | |
| 125 __m128i cmp = _mm_cmpgt_epi32(sd, ds); | |
| 126 | |
| 127 __m128i ret1 = _mm_add_epi32(sc, dc); | |
|
mtklein
2014/04/24 17:55:12
Same here.
qiankun
2014/04/25 14:13:24
Done.
| |
| 128 ret1 = _mm_sub_epi32(ret1, SkDiv255Round_SSE2(ds)); | |
| 129 | |
| 130 __m128i ret2 = _mm_add_epi32(dc, sc); | |
| 131 ret2 = _mm_sub_epi32(ret2, SkDiv255Round_SSE2(sd)); | |
| 132 | |
| 133 __m128i ret = _mm_or_si128(_mm_and_si128(cmp, ret1), | |
| 134 _mm_andnot_si128(cmp, ret2)); | |
| 135 | |
| 136 return ret; | |
| 137 } | |
| 138 | |
| 139 static __m128i lighten_modeproc_SSE2(const __m128i& src, const __m128i& dst) { | |
| 140 __m128i sa = SkGetPackedA32_SSE2(src); | |
| 141 __m128i da = SkGetPackedA32_SSE2(dst); | |
| 142 | |
| 143 __m128i a = srcover_byte_SSE2(sa, da); | |
| 144 __m128i r = lighten_byte_SSE2(SkGetPackedR32_SSE2(src), | |
| 145 SkGetPackedR32_SSE2(dst), sa, da); | |
| 146 __m128i g = lighten_byte_SSE2(SkGetPackedG32_SSE2(src), | |
| 147 SkGetPackedG32_SSE2(dst), sa, da); | |
| 148 __m128i b = lighten_byte_SSE2(SkGetPackedB32_SSE2(src), | |
| 149 SkGetPackedB32_SSE2(dst), sa, da); | |
| 150 return SkPackARGB32_SSE2(a, r, g, b); | |
| 151 } | |
| 152 | |
| 87 //////////////////////////////////////////////////////////////////////////////// | 153 //////////////////////////////////////////////////////////////////////////////// |
| 88 | 154 |
| 89 typedef __m128i (*SkXfermodeProcSIMD)(const __m128i& src, const __m128i& dst); | 155 typedef __m128i (*SkXfermodeProcSIMD)(const __m128i& src, const __m128i& dst); |
| 90 | 156 |
| 91 extern SkXfermodeProcSIMD gSSE2XfermodeProcs[]; | 157 extern SkXfermodeProcSIMD gSSE2XfermodeProcs[]; |
| 92 | 158 |
| 93 SkSSE2ProcCoeffXfermode::SkSSE2ProcCoeffXfermode(SkReadBuffer& buffer) | 159 SkSSE2ProcCoeffXfermode::SkSSE2ProcCoeffXfermode(SkReadBuffer& buffer) |
| 94 : INHERITED(buffer) { | 160 : INHERITED(buffer) { |
| 95 fProcSIMD = reinterpret_cast<void*>(gSSE2XfermodeProcs[this->getMode()]); | 161 fProcSIMD = reinterpret_cast<void*>(gSSE2XfermodeProcs[this->getMode()]); |
| 96 } | 162 } |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 233 NULL, // kSrcOut_Mode | 299 NULL, // kSrcOut_Mode |
| 234 NULL, // kDstOut_Mode | 300 NULL, // kDstOut_Mode |
| 235 NULL, // kSrcATop_Mode | 301 NULL, // kSrcATop_Mode |
| 236 NULL, // kDstATop_Mode | 302 NULL, // kDstATop_Mode |
| 237 NULL, // kXor_Mode | 303 NULL, // kXor_Mode |
| 238 NULL, // kPlus_Mode | 304 NULL, // kPlus_Mode |
| 239 NULL, // kModulate_Mode | 305 NULL, // kModulate_Mode |
| 240 NULL, // kScreen_Mode | 306 NULL, // kScreen_Mode |
| 241 | 307 |
| 242 NULL, // kOverlay_Mode | 308 NULL, // kOverlay_Mode |
| 243 NULL, // kDarken_Mode | 309 darken_modeproc_SSE2, |
| 244 NULL, // kLighten_Mode | 310 lighten_modeproc_SSE2, |
| 245 NULL, // kColorDodge_Mode | 311 NULL, // kColorDodge_Mode |
| 246 NULL, // kColorBurn_Mode | 312 NULL, // kColorBurn_Mode |
| 247 NULL, // kHardLight_Mode | 313 NULL, // kHardLight_Mode |
| 248 NULL, // kSoftLight_Mode | 314 NULL, // kSoftLight_Mode |
| 249 NULL, // kDifference_Mode | 315 NULL, // kDifference_Mode |
| 250 NULL, // kExclusion_Mode | 316 NULL, // kExclusion_Mode |
| 251 multiply_modeproc_SSE2, | 317 multiply_modeproc_SSE2, |
| 252 | 318 |
| 253 NULL, // kHue_Mode | 319 NULL, // kHue_Mode |
| 254 NULL, // kSaturation_Mode | 320 NULL, // kSaturation_Mode |
| 255 NULL, // kColor_Mode | 321 NULL, // kColor_Mode |
| 256 NULL, // kLuminosity_Mode | 322 NULL, // kLuminosity_Mode |
| 257 }; | 323 }; |
| 258 | 324 |
| 259 SkProcCoeffXfermode* SkPlatformXfermodeFactory_impl_SSE2(const ProcCoeff& rec, | 325 SkProcCoeffXfermode* SkPlatformXfermodeFactory_impl_SSE2(const ProcCoeff& rec, |
| 260 SkXfermode::Mode mode) { | 326 SkXfermode::Mode mode) { |
| 261 void* procSIMD = reinterpret_cast<void*>(gSSE2XfermodeProcs[mode]); | 327 void* procSIMD = reinterpret_cast<void*>(gSSE2XfermodeProcs[mode]); |
| 262 | 328 |
| 263 if (procSIMD != NULL) { | 329 if (procSIMD != NULL) { |
| 264 return SkNEW_ARGS(SkSSE2ProcCoeffXfermode, (rec, mode, procSIMD)); | 330 return SkNEW_ARGS(SkSSE2ProcCoeffXfermode, (rec, mode, procSIMD)); |
| 265 } | 331 } |
| 266 return NULL; | 332 return NULL; |
| 267 } | 333 } |
| OLD | NEW |