blob: d6142931912f5ec1a07ffca2fb32b105d93a277d [file] [log] [blame]
senorblanco@chromium.org4e753552009-11-16 21:09:00 +00001/*
epoger@google.comec3ed6a2011-07-28 14:26:00 +00002 * Copyright 2009 The Android Open Source Project
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
senorblanco@chromium.org4e753552009-11-16 21:09:00 +00006 */
7
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +00008#include "SkBitmapFilter_opts_SSE2.h"
senorblanco@chromium.orgdc7de742009-11-30 20:00:29 +00009#include "SkBitmapProcState_opts_SSE2.h"
tomhudson@google.com95ad1552012-02-14 18:28:54 +000010#include "SkBitmapProcState_opts_SSSE3.h"
reed@google.com58af9a62011-10-12 13:43:52 +000011#include "SkBlitMask.h"
tomhudson@google.com8dd90a92012-03-19 13:49:50 +000012#include "SkBlitRect_opts_SSE2.h"
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +000013#include "SkBlitRow.h"
senorblanco@chromium.org4e753552009-11-16 21:09:00 +000014#include "SkBlitRow_opts_SSE2.h"
senorblanco@chromium.org27eec462013-11-08 20:49:04 +000015#include "SkBlurImage_opts_SSE2.h"
senorblanco@chromium.org7a47ad32013-10-30 21:57:04 +000016#include "SkMorphology_opts.h"
17#include "SkMorphology_opts_SSE2.h"
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +000018#include "SkRTConf.h"
19#include "SkUtils.h"
20#include "SkUtils_opts_SSE2.h"
commit-bot@chromium.orgc524e982014-04-09 15:43:46 +000021#include "SkXfermode.h"
22#include "SkXfermode_proccoeff.h"
senorblanco@chromium.org4e753552009-11-16 21:09:00 +000023
tomhudson@google.comea854942012-05-17 15:09:17 +000024#if defined(_MSC_VER) && defined(_WIN64)
25#include <intrin.h>
26#endif
27
commit-bot@chromium.org2656b1d2014-05-08 15:17:50 +000028/* This file must *not* be compiled with -msse or any other optional SIMD
29 extension, otherwise gcc may generate SIMD instructions even for scalar ops
30 (and thus give an invalid instruction on Pentium3 on the code below).
31 For example, only files named *_SSE2.cpp in this directory should be
32 compiled with -msse2 or higher. */
senorblanco@chromium.org4e753552009-11-16 21:09:00 +000033
tomhudson@google.com95ad1552012-02-14 18:28:54 +000034
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +000035/* Function to get the CPU SSE-level in runtime, for different compilers. */
senorblanco@chromium.org4e753552009-11-16 21:09:00 +000036#ifdef _MSC_VER
37static inline void getcpuid(int info_type, int info[4]) {
tomhudson@google.comea854942012-05-17 15:09:17 +000038#if defined(_WIN64)
39 __cpuid(info, info_type);
40#else
senorblanco@chromium.org4e753552009-11-16 21:09:00 +000041 __asm {
42 mov eax, [info_type]
43 cpuid
44 mov edi, [info]
45 mov [edi], eax
46 mov [edi+4], ebx
47 mov [edi+8], ecx
48 mov [edi+12], edx
49 }
tomhudson@google.comea854942012-05-17 15:09:17 +000050#endif
senorblanco@chromium.org4e753552009-11-16 21:09:00 +000051}
commit-bot@chromium.org2656b1d2014-05-08 15:17:50 +000052#elif defined(__x86_64__)
tomhudson@google.com95ad1552012-02-14 18:28:54 +000053static inline void getcpuid(int info_type, int info[4]) {
54 asm volatile (
55 "cpuid \n\t"
56 : "=a"(info[0]), "=b"(info[1]), "=c"(info[2]), "=d"(info[3])
57 : "a"(info_type)
58 );
59}
60#else
senorblanco@chromium.org4e753552009-11-16 21:09:00 +000061static inline void getcpuid(int info_type, int info[4]) {
62 // We save and restore ebx, so this code can be compatible with -fPIC
63 asm volatile (
64 "pushl %%ebx \n\t"
65 "cpuid \n\t"
66 "movl %%ebx, %1 \n\t"
67 "popl %%ebx \n\t"
68 : "=a"(info[0]), "=r"(info[1]), "=c"(info[2]), "=d"(info[3])
69 : "a"(info_type)
senorblanco@chromium.org4e753552009-11-16 21:09:00 +000070 );
71}
72#endif
tomhudson@google.com95ad1552012-02-14 18:28:54 +000073
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +000074////////////////////////////////////////////////////////////////////////////////
75
commit-bot@chromium.org2656b1d2014-05-08 15:17:50 +000076/* Fetch the SIMD level directly from the CPU, at run-time.
77 * Only checks the levels needed by the optimizations in this file.
commit-bot@chromium.orgcedbc732014-04-23 22:53:02 +000078 */
commit-bot@chromium.org2656b1d2014-05-08 15:17:50 +000079static int get_SIMD_level() {
tomhudson@google.com95ad1552012-02-14 18:28:54 +000080 int cpu_info[4] = { 0 };
commit-bot@chromium.org2656b1d2014-05-08 15:17:50 +000081
tomhudson@google.com95ad1552012-02-14 18:28:54 +000082 getcpuid(1, cpu_info);
commit-bot@chromium.org2656b1d2014-05-08 15:17:50 +000083 if ((cpu_info[2] & (1<<20)) != 0) {
84 return SK_CPU_SSE_LEVEL_SSE42;
85 } else if ((cpu_info[2] & (1<<9)) != 0) {
86 return SK_CPU_SSE_LEVEL_SSSE3;
87 } else if ((cpu_info[3] & (1<<26)) != 0) {
88 return SK_CPU_SSE_LEVEL_SSE2;
89 } else {
90 return 0;
91 }
tomhudson@google.com95ad1552012-02-14 18:28:54 +000092}
commit-bot@chromium.org2656b1d2014-05-08 15:17:50 +000093
94/* Verify that the requested SIMD level exists in the build.
95 * If not, check if the platform supports it.
96 */
97static inline bool supports_simd(int minLevel) {
98 if (minLevel <= SK_CPU_SSE_LEVEL) {
99 return true;
100 } else {
101#if defined(SK_BUILD_FOR_ANDROID_FRAMEWORK)
102 /* For the Android framework we should always know at compile time if the device
103 * we are building for supports SSSE3. The one exception to this rule is on the
104 * emulator where we are compiled without the -mssse3 option (so we have no
105 * SSSE3 procs) but can be run on a host machine that supports SSSE3
106 * instructions. So for that particular case we disable our SSSE3 options.
107 */
108 return false;
109#else
110 static int gSIMDLevel = get_SIMD_level();
111 return (minLevel <= gSIMDLevel);
reed@google.com70d1be52012-07-16 16:07:42 +0000112#endif
commit-bot@chromium.org2656b1d2014-05-08 15:17:50 +0000113 }
tomhudson@google.com95ad1552012-02-14 18:28:54 +0000114}
115
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000116////////////////////////////////////////////////////////////////////////////////
117
humper@google.comb0889472013-07-09 21:37:14 +0000118SK_CONF_DECLARE( bool, c_hqfilter_sse, "bitmap.filter.highQualitySSE", false, "Use SSE optimized version of high quality image filters");
119
reed@google.comfed04b32013-09-05 20:31:17 +0000120void SkBitmapProcState::platformConvolutionProcs(SkConvolutionProcs* procs) {
commit-bot@chromium.org2656b1d2014-05-08 15:17:50 +0000121 if (supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
reed@google.comfed04b32013-09-05 20:31:17 +0000122 procs->fExtraHorizontalReads = 3;
123 procs->fConvolveVertically = &convolveVertically_SSE2;
124 procs->fConvolve4RowsHorizontally = &convolve4RowsHorizontally_SSE2;
125 procs->fConvolveHorizontally = &convolveHorizontally_SSE2;
126 procs->fApplySIMDPadding = &applySIMDPadding_SSE2;
humper@google.com138ebc32013-07-19 20:20:04 +0000127 }
128}
129
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000130////////////////////////////////////////////////////////////////////////////////
131
senorblanco@chromium.orgdc7de742009-11-30 20:00:29 +0000132void SkBitmapProcState::platformProcs() {
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +0000133 /* Every optimization in the function requires at least SSE2 */
commit-bot@chromium.org2656b1d2014-05-08 15:17:50 +0000134 if (!supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +0000135 return;
136 }
commit-bot@chromium.orgc398f712014-04-23 20:07:19 +0000137
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +0000138 /* Check fSampleProc32 */
139 if (fSampleProc32 == S32_opaque_D32_filter_DX) {
commit-bot@chromium.org2656b1d2014-05-08 15:17:50 +0000140 if (supports_simd(SK_CPU_SSE_LEVEL_SSSE3)) {
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +0000141 fSampleProc32 = S32_opaque_D32_filter_DX_SSSE3;
142 } else {
commit-bot@chromium.orgc398f712014-04-23 20:07:19 +0000143 fSampleProc32 = S32_opaque_D32_filter_DX_SSE2;
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +0000144 }
145 } else if (fSampleProc32 == S32_opaque_D32_filter_DXDY) {
commit-bot@chromium.org2656b1d2014-05-08 15:17:50 +0000146 if (supports_simd(SK_CPU_SSE_LEVEL_SSSE3)) {
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +0000147 fSampleProc32 = S32_opaque_D32_filter_DXDY_SSSE3;
148 }
149 } else if (fSampleProc32 == S32_alpha_D32_filter_DX) {
commit-bot@chromium.org2656b1d2014-05-08 15:17:50 +0000150 if (supports_simd(SK_CPU_SSE_LEVEL_SSSE3)) {
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +0000151 fSampleProc32 = S32_alpha_D32_filter_DX_SSSE3;
152 } else {
commit-bot@chromium.orgc398f712014-04-23 20:07:19 +0000153 fSampleProc32 = S32_alpha_D32_filter_DX_SSE2;
154 }
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +0000155 } else if (fSampleProc32 == S32_alpha_D32_filter_DXDY) {
commit-bot@chromium.org2656b1d2014-05-08 15:17:50 +0000156 if (supports_simd(SK_CPU_SSE_LEVEL_SSSE3)) {
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +0000157 fSampleProc32 = S32_alpha_D32_filter_DXDY_SSSE3;
commit-bot@chromium.orgc398f712014-04-23 20:07:19 +0000158 }
senorblanco@chromium.orgdc7de742009-11-30 20:00:29 +0000159 }
tomhudson@google.com06a73132012-02-22 18:30:43 +0000160
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +0000161 /* Check fSampleProc16 */
162 if (fSampleProc16 == S32_D16_filter_DX) {
163 fSampleProc16 = S32_D16_filter_DX_SSE2;
164 }
tomhudson@google.com5efaf262012-02-28 15:41:49 +0000165
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +0000166 /* Check fMatrixProc */
167 if (fMatrixProc == ClampX_ClampY_filter_scale) {
168 fMatrixProc = ClampX_ClampY_filter_scale_SSE2;
169 } else if (fMatrixProc == ClampX_ClampY_nofilter_scale) {
170 fMatrixProc = ClampX_ClampY_nofilter_scale_SSE2;
171 } else if (fMatrixProc == ClampX_ClampY_filter_affine) {
172 fMatrixProc = ClampX_ClampY_filter_affine_SSE2;
173 } else if (fMatrixProc == ClampX_ClampY_nofilter_affine) {
174 fMatrixProc = ClampX_ClampY_nofilter_affine_SSE2;
175 }
176
177 /* Check fShaderProc32 */
178 if (c_hqfilter_sse) {
179 if (fShaderProc32 == highQualityFilter32) {
180 fShaderProc32 = highQualityFilter_SSE2;
humper@google.comb0889472013-07-09 21:37:14 +0000181 }
tomhudson@google.com06a73132012-02-22 18:30:43 +0000182 }
senorblanco@chromium.orgdc7de742009-11-30 20:00:29 +0000183}
184
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000185////////////////////////////////////////////////////////////////////////////////
186
commit-bot@chromium.org47591072014-02-19 03:09:52 +0000187static SkBlitRow::Proc platform_16_procs[] = {
commit-bot@chromium.org39ce33a2014-02-24 04:23:39 +0000188 S32_D565_Opaque_SSE2, // S32_D565_Opaque
commit-bot@chromium.org47591072014-02-19 03:09:52 +0000189 NULL, // S32_D565_Blend
190 S32A_D565_Opaque_SSE2, // S32A_D565_Opaque
191 NULL, // S32A_D565_Blend
commit-bot@chromium.org27580472014-03-07 03:25:32 +0000192 S32_D565_Opaque_Dither_SSE2, // S32_D565_Opaque_Dither
commit-bot@chromium.org47591072014-02-19 03:09:52 +0000193 NULL, // S32_D565_Blend_Dither
commit-bot@chromium.orgfe089b32014-03-07 13:24:42 +0000194 S32A_D565_Opaque_Dither_SSE2, // S32A_D565_Opaque_Dither
commit-bot@chromium.org47591072014-02-19 03:09:52 +0000195 NULL, // S32A_D565_Blend_Dither
196};
197
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000198SkBlitRow::Proc SkBlitRow::PlatformProcs565(unsigned flags) {
commit-bot@chromium.org2656b1d2014-05-08 15:17:50 +0000199 if (supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000200 return platform_16_procs[flags];
201 } else {
202 return NULL;
203 }
204}
205
senorblanco@chromium.org4e753552009-11-16 21:09:00 +0000206static SkBlitRow::Proc32 platform_32_procs[] = {
207 NULL, // S32_Opaque,
208 S32_Blend_BlitRow32_SSE2, // S32_Blend,
209 S32A_Opaque_BlitRow32_SSE2, // S32A_Opaque
210 S32A_Blend_BlitRow32_SSE2, // S32A_Blend,
211};
212
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000213SkBlitRow::Proc32 SkBlitRow::PlatformProcs32(unsigned flags) {
commit-bot@chromium.org2656b1d2014-05-08 15:17:50 +0000214 if (supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000215 return platform_32_procs[flags];
commit-bot@chromium.org47591072014-02-19 03:09:52 +0000216 } else {
217 return NULL;
218 }
senorblanco@chromium.org4e753552009-11-16 21:09:00 +0000219}
220
senorblanco@chromium.orgc3856382010-12-13 15:27:20 +0000221SkBlitRow::ColorProc SkBlitRow::PlatformColorProc() {
commit-bot@chromium.org2656b1d2014-05-08 15:17:50 +0000222 if (supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
senorblanco@chromium.orgc3856382010-12-13 15:27:20 +0000223 return Color32_SSE2;
224 } else {
225 return NULL;
226 }
227}
228
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000229SkBlitRow::ColorRectProc PlatformColorRectProcFactory(); // suppress warning
230
231SkBlitRow::ColorRectProc PlatformColorRectProcFactory() {
232/* Return NULL for now, since the optimized path in ColorRect32_SSE2 is disabled.
commit-bot@chromium.org2656b1d2014-05-08 15:17:50 +0000233 if (supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000234 return ColorRect32_SSE2;
senorblanco@chromium.org4e753552009-11-16 21:09:00 +0000235 } else {
236 return NULL;
237 }
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000238*/
239 return NULL;
senorblanco@chromium.org4e753552009-11-16 21:09:00 +0000240}
241
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000242////////////////////////////////////////////////////////////////////////////////
reed@google.com981d4792011-03-09 12:55:47 +0000243
reed@google.come901b4c2011-11-14 21:56:45 +0000244SkBlitMask::ColorProc SkBlitMask::PlatformColorProcs(SkBitmap::Config dstConfig,
245 SkMask::Format maskFormat,
246 SkColor color) {
reed@google.comedb606c2011-10-18 13:56:50 +0000247 if (SkMask::kA8_Format != maskFormat) {
248 return NULL;
249 }
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000250
reed@google.come901b4c2011-11-14 21:56:45 +0000251 ColorProc proc = NULL;
commit-bot@chromium.org2656b1d2014-05-08 15:17:50 +0000252 if (supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
reed@google.com981d4792011-03-09 12:55:47 +0000253 switch (dstConfig) {
254 case SkBitmap::kARGB_8888_Config:
reed@google.come6ea6062011-07-07 19:12:50 +0000255 // The SSE2 version is not (yet) faster for black, so we check
256 // for that.
257 if (SK_ColorBLACK != color) {
reed@google.comedb606c2011-10-18 13:56:50 +0000258 proc = SkARGB32_A8_BlitMask_SSE2;
reed@google.come6ea6062011-07-07 19:12:50 +0000259 }
reed@google.com981d4792011-03-09 12:55:47 +0000260 break;
261 default:
reed@google.come901b4c2011-11-14 21:56:45 +0000262 break;
reed@google.com981d4792011-03-09 12:55:47 +0000263 }
264 }
265 return proc;
266}
267
tomhudson@google.comd6770e62012-02-14 16:01:15 +0000268SkBlitMask::BlitLCD16RowProc SkBlitMask::PlatformBlitRowProcs16(bool isOpaque) {
commit-bot@chromium.org2656b1d2014-05-08 15:17:50 +0000269 if (supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
tomhudson@google.comd6770e62012-02-14 16:01:15 +0000270 if (isOpaque) {
271 return SkBlitLCD16OpaqueRow_SSE2;
272 } else {
273 return SkBlitLCD16Row_SSE2;
274 }
275 } else {
276 return NULL;
277 }
278
279}
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000280
reed@google.come901b4c2011-11-14 21:56:45 +0000281SkBlitMask::RowProc SkBlitMask::PlatformRowProcs(SkBitmap::Config dstConfig,
reed@google.com1750bf12011-11-15 19:51:02 +0000282 SkMask::Format maskFormat,
283 RowFlags flags) {
reed@google.come901b4c2011-11-14 21:56:45 +0000284 return NULL;
285}
286
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000287////////////////////////////////////////////////////////////////////////////////
288
senorblanco@chromium.org4e753552009-11-16 21:09:00 +0000289SkMemset16Proc SkMemset16GetPlatformProc() {
commit-bot@chromium.org2656b1d2014-05-08 15:17:50 +0000290 if (supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
senorblanco@chromium.org4e753552009-11-16 21:09:00 +0000291 return sk_memset16_SSE2;
292 } else {
293 return NULL;
294 }
295}
296
297SkMemset32Proc SkMemset32GetPlatformProc() {
commit-bot@chromium.org2656b1d2014-05-08 15:17:50 +0000298 if (supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
senorblanco@chromium.org4e753552009-11-16 21:09:00 +0000299 return sk_memset32_SSE2;
300 } else {
301 return NULL;
302 }
303}
tomhudson@google.com8dd90a92012-03-19 13:49:50 +0000304
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000305////////////////////////////////////////////////////////////////////////////////
306
senorblanco@chromium.org0ded88d2014-01-24 15:43:50 +0000307SkMorphologyImageFilter::Proc SkMorphologyGetPlatformProc(SkMorphologyProcType type) {
commit-bot@chromium.org2656b1d2014-05-08 15:17:50 +0000308 if (!supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
senorblanco@chromium.org7a47ad32013-10-30 21:57:04 +0000309 return NULL;
310 }
311 switch (type) {
312 case kDilateX_SkMorphologyProcType:
313 return SkDilateX_SSE2;
314 case kDilateY_SkMorphologyProcType:
315 return SkDilateY_SSE2;
316 case kErodeX_SkMorphologyProcType:
317 return SkErodeX_SSE2;
318 case kErodeY_SkMorphologyProcType:
319 return SkErodeY_SSE2;
320 default:
321 return NULL;
322 }
323}
324
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000325////////////////////////////////////////////////////////////////////////////////
326
senorblanco@chromium.org27eec462013-11-08 20:49:04 +0000327bool SkBoxBlurGetPlatformProcs(SkBoxBlurProc* boxBlurX,
328 SkBoxBlurProc* boxBlurY,
senorblanco@chromium.org05edd022013-11-11 20:12:34 +0000329 SkBoxBlurProc* boxBlurXY,
330 SkBoxBlurProc* boxBlurYX) {
senorblanco@chromium.org27eec462013-11-08 20:49:04 +0000331#ifdef SK_DISABLE_BLUR_DIVISION_OPTIMIZATION
332 return false;
333#else
commit-bot@chromium.org2656b1d2014-05-08 15:17:50 +0000334 if (!supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
senorblanco@chromium.org27eec462013-11-08 20:49:04 +0000335 return false;
336 }
senorblanco@chromium.org05edd022013-11-11 20:12:34 +0000337 return SkBoxBlurGetPlatformProcs_SSE2(boxBlurX, boxBlurY, boxBlurXY, boxBlurYX);
senorblanco@chromium.org27eec462013-11-08 20:49:04 +0000338#endif
339}
340
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000341////////////////////////////////////////////////////////////////////////////////
commit-bot@chromium.orgc524e982014-04-09 15:43:46 +0000342
343extern SkProcCoeffXfermode* SkPlatformXfermodeFactory_impl_SSE2(const ProcCoeff& rec,
344 SkXfermode::Mode mode);
345
346SkProcCoeffXfermode* SkPlatformXfermodeFactory_impl(const ProcCoeff& rec,
347 SkXfermode::Mode mode);
348
349SkProcCoeffXfermode* SkPlatformXfermodeFactory_impl(const ProcCoeff& rec,
350 SkXfermode::Mode mode) {
351 return NULL;
352}
353
354SkProcCoeffXfermode* SkPlatformXfermodeFactory(const ProcCoeff& rec,
355 SkXfermode::Mode mode);
356
357SkProcCoeffXfermode* SkPlatformXfermodeFactory(const ProcCoeff& rec,
358 SkXfermode::Mode mode) {
commit-bot@chromium.org2656b1d2014-05-08 15:17:50 +0000359 if (supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
commit-bot@chromium.orgc524e982014-04-09 15:43:46 +0000360 return SkPlatformXfermodeFactory_impl_SSE2(rec, mode);
361 } else {
362 return SkPlatformXfermodeFactory_impl(rec, mode);
363 }
364}
365
366SkXfermodeProc SkPlatformXfermodeProcFactory(SkXfermode::Mode mode);
367
368SkXfermodeProc SkPlatformXfermodeProcFactory(SkXfermode::Mode mode) {
369 return NULL;
370}