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...) 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...) 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 |