blob: e3b6b470786f9825f04857bcf9b535f1a194a052 [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.orgce4402c2014-05-12 14:16:19 +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.orgce4402c2014-05-12 14:16:19 +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.orgce4402c2014-05-12 14:16:19 +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.org443c0a62014-05-08 15:27:52 +000078 */
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +000079static int get_SIMD_level() {
commit-bot@chromium.org443c0a62014-05-08 15:27:52 +000080 int cpu_info[4] = { 0 };
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +000081
commit-bot@chromium.org443c0a62014-05-08 15:27:52 +000082 getcpuid(1, cpu_info);
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +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 }
commit-bot@chromium.org443c0a62014-05-08 15:27:52 +000092}
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +000093
94/* Verify that the requested SIMD level is supported in the build.
95 * If not, check if the platform supports it.
96 */
97static inline bool supports_simd(int minLevel) {
98#if defined(SK_CPU_SSE_LEVEL)
99 if (minLevel <= SK_CPU_SSE_LEVEL) {
100 return true;
101 } else
commit-bot@chromium.org443c0a62014-05-08 15:27:52 +0000102#endif
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000103 {
104#if defined(SK_BUILD_FOR_ANDROID_FRAMEWORK)
105 /* For the Android framework we should always know at compile time if the device
106 * we are building for supports SSSE3. The one exception to this rule is on the
107 * emulator where we are compiled without the -mssse3 option (so we have no
108 * SSSE3 procs) but can be run on a host machine that supports SSSE3
109 * instructions. So for that particular case we disable our SSSE3 options.
110 */
111 return false;
112#else
113 static int gSIMDLevel = get_SIMD_level();
114 return (minLevel <= gSIMDLevel);
115#endif
116 }
tomhudson@google.com95ad1552012-02-14 18:28:54 +0000117}
118
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000119////////////////////////////////////////////////////////////////////////////////
120
humper@google.comb0889472013-07-09 21:37:14 +0000121SK_CONF_DECLARE( bool, c_hqfilter_sse, "bitmap.filter.highQualitySSE", false, "Use SSE optimized version of high quality image filters");
122
reed@google.comfed04b32013-09-05 20:31:17 +0000123void SkBitmapProcState::platformConvolutionProcs(SkConvolutionProcs* procs) {
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000124 if (supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
reed@google.comfed04b32013-09-05 20:31:17 +0000125 procs->fExtraHorizontalReads = 3;
126 procs->fConvolveVertically = &convolveVertically_SSE2;
127 procs->fConvolve4RowsHorizontally = &convolve4RowsHorizontally_SSE2;
128 procs->fConvolveHorizontally = &convolveHorizontally_SSE2;
129 procs->fApplySIMDPadding = &applySIMDPadding_SSE2;
humper@google.com138ebc32013-07-19 20:20:04 +0000130 }
131}
132
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000133////////////////////////////////////////////////////////////////////////////////
134
senorblanco@chromium.orgdc7de742009-11-30 20:00:29 +0000135void SkBitmapProcState::platformProcs() {
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +0000136 /* Every optimization in the function requires at least SSE2 */
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000137 if (!supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +0000138 return;
139 }
commit-bot@chromium.orgc398f712014-04-23 20:07:19 +0000140
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +0000141 /* Check fSampleProc32 */
142 if (fSampleProc32 == S32_opaque_D32_filter_DX) {
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000143 if (supports_simd(SK_CPU_SSE_LEVEL_SSSE3)) {
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +0000144 fSampleProc32 = S32_opaque_D32_filter_DX_SSSE3;
145 } else {
commit-bot@chromium.orgc398f712014-04-23 20:07:19 +0000146 fSampleProc32 = S32_opaque_D32_filter_DX_SSE2;
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +0000147 }
148 } else if (fSampleProc32 == S32_opaque_D32_filter_DXDY) {
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000149 if (supports_simd(SK_CPU_SSE_LEVEL_SSSE3)) {
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +0000150 fSampleProc32 = S32_opaque_D32_filter_DXDY_SSSE3;
151 }
152 } else if (fSampleProc32 == S32_alpha_D32_filter_DX) {
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000153 if (supports_simd(SK_CPU_SSE_LEVEL_SSSE3)) {
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +0000154 fSampleProc32 = S32_alpha_D32_filter_DX_SSSE3;
155 } else {
commit-bot@chromium.orgc398f712014-04-23 20:07:19 +0000156 fSampleProc32 = S32_alpha_D32_filter_DX_SSE2;
157 }
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +0000158 } else if (fSampleProc32 == S32_alpha_D32_filter_DXDY) {
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000159 if (supports_simd(SK_CPU_SSE_LEVEL_SSSE3)) {
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +0000160 fSampleProc32 = S32_alpha_D32_filter_DXDY_SSSE3;
commit-bot@chromium.orgc398f712014-04-23 20:07:19 +0000161 }
senorblanco@chromium.orgdc7de742009-11-30 20:00:29 +0000162 }
tomhudson@google.com06a73132012-02-22 18:30:43 +0000163
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +0000164 /* Check fSampleProc16 */
165 if (fSampleProc16 == S32_D16_filter_DX) {
166 fSampleProc16 = S32_D16_filter_DX_SSE2;
167 }
tomhudson@google.com5efaf262012-02-28 15:41:49 +0000168
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +0000169 /* Check fMatrixProc */
170 if (fMatrixProc == ClampX_ClampY_filter_scale) {
171 fMatrixProc = ClampX_ClampY_filter_scale_SSE2;
172 } else if (fMatrixProc == ClampX_ClampY_nofilter_scale) {
173 fMatrixProc = ClampX_ClampY_nofilter_scale_SSE2;
174 } else if (fMatrixProc == ClampX_ClampY_filter_affine) {
175 fMatrixProc = ClampX_ClampY_filter_affine_SSE2;
176 } else if (fMatrixProc == ClampX_ClampY_nofilter_affine) {
177 fMatrixProc = ClampX_ClampY_nofilter_affine_SSE2;
178 }
179
180 /* Check fShaderProc32 */
181 if (c_hqfilter_sse) {
182 if (fShaderProc32 == highQualityFilter32) {
183 fShaderProc32 = highQualityFilter_SSE2;
humper@google.comb0889472013-07-09 21:37:14 +0000184 }
tomhudson@google.com06a73132012-02-22 18:30:43 +0000185 }
senorblanco@chromium.orgdc7de742009-11-30 20:00:29 +0000186}
187
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000188////////////////////////////////////////////////////////////////////////////////
189
commit-bot@chromium.org47591072014-02-19 03:09:52 +0000190static SkBlitRow::Proc platform_16_procs[] = {
commit-bot@chromium.org39ce33a2014-02-24 04:23:39 +0000191 S32_D565_Opaque_SSE2, // S32_D565_Opaque
commit-bot@chromium.org47591072014-02-19 03:09:52 +0000192 NULL, // S32_D565_Blend
193 S32A_D565_Opaque_SSE2, // S32A_D565_Opaque
194 NULL, // S32A_D565_Blend
commit-bot@chromium.org27580472014-03-07 03:25:32 +0000195 S32_D565_Opaque_Dither_SSE2, // S32_D565_Opaque_Dither
commit-bot@chromium.org47591072014-02-19 03:09:52 +0000196 NULL, // S32_D565_Blend_Dither
commit-bot@chromium.orgfe089b32014-03-07 13:24:42 +0000197 S32A_D565_Opaque_Dither_SSE2, // S32A_D565_Opaque_Dither
commit-bot@chromium.org47591072014-02-19 03:09:52 +0000198 NULL, // S32A_D565_Blend_Dither
199};
200
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000201SkBlitRow::Proc SkBlitRow::PlatformProcs565(unsigned flags) {
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000202 if (supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000203 return platform_16_procs[flags];
204 } else {
205 return NULL;
206 }
207}
208
senorblanco@chromium.org4e753552009-11-16 21:09:00 +0000209static SkBlitRow::Proc32 platform_32_procs[] = {
210 NULL, // S32_Opaque,
211 S32_Blend_BlitRow32_SSE2, // S32_Blend,
212 S32A_Opaque_BlitRow32_SSE2, // S32A_Opaque
213 S32A_Blend_BlitRow32_SSE2, // S32A_Blend,
214};
215
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000216SkBlitRow::Proc32 SkBlitRow::PlatformProcs32(unsigned flags) {
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000217 if (supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000218 return platform_32_procs[flags];
commit-bot@chromium.org47591072014-02-19 03:09:52 +0000219 } else {
220 return NULL;
221 }
senorblanco@chromium.org4e753552009-11-16 21:09:00 +0000222}
223
senorblanco@chromium.orgc3856382010-12-13 15:27:20 +0000224SkBlitRow::ColorProc SkBlitRow::PlatformColorProc() {
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000225 if (supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
senorblanco@chromium.orgc3856382010-12-13 15:27:20 +0000226 return Color32_SSE2;
227 } else {
228 return NULL;
229 }
230}
231
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000232SkBlitRow::ColorRectProc PlatformColorRectProcFactory(); // suppress warning
233
234SkBlitRow::ColorRectProc PlatformColorRectProcFactory() {
235/* Return NULL for now, since the optimized path in ColorRect32_SSE2 is disabled.
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000236 if (supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000237 return ColorRect32_SSE2;
senorblanco@chromium.org4e753552009-11-16 21:09:00 +0000238 } else {
239 return NULL;
240 }
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000241*/
242 return NULL;
senorblanco@chromium.org4e753552009-11-16 21:09:00 +0000243}
244
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000245////////////////////////////////////////////////////////////////////////////////
reed@google.com981d4792011-03-09 12:55:47 +0000246
reed@google.come901b4c2011-11-14 21:56:45 +0000247SkBlitMask::ColorProc SkBlitMask::PlatformColorProcs(SkBitmap::Config dstConfig,
248 SkMask::Format maskFormat,
249 SkColor color) {
reed@google.comedb606c2011-10-18 13:56:50 +0000250 if (SkMask::kA8_Format != maskFormat) {
251 return NULL;
252 }
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000253
reed@google.come901b4c2011-11-14 21:56:45 +0000254 ColorProc proc = NULL;
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000255 if (supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
reed@google.com981d4792011-03-09 12:55:47 +0000256 switch (dstConfig) {
257 case SkBitmap::kARGB_8888_Config:
reed@google.come6ea6062011-07-07 19:12:50 +0000258 // The SSE2 version is not (yet) faster for black, so we check
259 // for that.
260 if (SK_ColorBLACK != color) {
reed@google.comedb606c2011-10-18 13:56:50 +0000261 proc = SkARGB32_A8_BlitMask_SSE2;
reed@google.come6ea6062011-07-07 19:12:50 +0000262 }
reed@google.com981d4792011-03-09 12:55:47 +0000263 break;
264 default:
reed@google.come901b4c2011-11-14 21:56:45 +0000265 break;
reed@google.com981d4792011-03-09 12:55:47 +0000266 }
267 }
268 return proc;
269}
270
tomhudson@google.comd6770e62012-02-14 16:01:15 +0000271SkBlitMask::BlitLCD16RowProc SkBlitMask::PlatformBlitRowProcs16(bool isOpaque) {
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000272 if (supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
tomhudson@google.comd6770e62012-02-14 16:01:15 +0000273 if (isOpaque) {
274 return SkBlitLCD16OpaqueRow_SSE2;
275 } else {
276 return SkBlitLCD16Row_SSE2;
277 }
278 } else {
279 return NULL;
280 }
281
282}
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000283
reed@google.come901b4c2011-11-14 21:56:45 +0000284SkBlitMask::RowProc SkBlitMask::PlatformRowProcs(SkBitmap::Config dstConfig,
reed@google.com1750bf12011-11-15 19:51:02 +0000285 SkMask::Format maskFormat,
286 RowFlags flags) {
reed@google.come901b4c2011-11-14 21:56:45 +0000287 return NULL;
288}
289
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000290////////////////////////////////////////////////////////////////////////////////
291
senorblanco@chromium.org4e753552009-11-16 21:09:00 +0000292SkMemset16Proc SkMemset16GetPlatformProc() {
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000293 if (supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
senorblanco@chromium.org4e753552009-11-16 21:09:00 +0000294 return sk_memset16_SSE2;
295 } else {
296 return NULL;
297 }
298}
299
300SkMemset32Proc SkMemset32GetPlatformProc() {
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000301 if (supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
senorblanco@chromium.org4e753552009-11-16 21:09:00 +0000302 return sk_memset32_SSE2;
303 } else {
304 return NULL;
305 }
306}
tomhudson@google.com8dd90a92012-03-19 13:49:50 +0000307
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000308////////////////////////////////////////////////////////////////////////////////
309
senorblanco@chromium.org0ded88d2014-01-24 15:43:50 +0000310SkMorphologyImageFilter::Proc SkMorphologyGetPlatformProc(SkMorphologyProcType type) {
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000311 if (!supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
senorblanco@chromium.org7a47ad32013-10-30 21:57:04 +0000312 return NULL;
313 }
314 switch (type) {
315 case kDilateX_SkMorphologyProcType:
316 return SkDilateX_SSE2;
317 case kDilateY_SkMorphologyProcType:
318 return SkDilateY_SSE2;
319 case kErodeX_SkMorphologyProcType:
320 return SkErodeX_SSE2;
321 case kErodeY_SkMorphologyProcType:
322 return SkErodeY_SSE2;
323 default:
324 return NULL;
325 }
326}
327
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000328////////////////////////////////////////////////////////////////////////////////
329
senorblanco@chromium.org27eec462013-11-08 20:49:04 +0000330bool SkBoxBlurGetPlatformProcs(SkBoxBlurProc* boxBlurX,
331 SkBoxBlurProc* boxBlurY,
senorblanco@chromium.org05edd022013-11-11 20:12:34 +0000332 SkBoxBlurProc* boxBlurXY,
333 SkBoxBlurProc* boxBlurYX) {
senorblanco@chromium.org27eec462013-11-08 20:49:04 +0000334#ifdef SK_DISABLE_BLUR_DIVISION_OPTIMIZATION
335 return false;
336#else
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000337 if (!supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
senorblanco@chromium.org27eec462013-11-08 20:49:04 +0000338 return false;
339 }
senorblanco@chromium.org05edd022013-11-11 20:12:34 +0000340 return SkBoxBlurGetPlatformProcs_SSE2(boxBlurX, boxBlurY, boxBlurXY, boxBlurYX);
senorblanco@chromium.org27eec462013-11-08 20:49:04 +0000341#endif
342}
343
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000344////////////////////////////////////////////////////////////////////////////////
commit-bot@chromium.orgc524e982014-04-09 15:43:46 +0000345
346extern SkProcCoeffXfermode* SkPlatformXfermodeFactory_impl_SSE2(const ProcCoeff& rec,
347 SkXfermode::Mode mode);
348
349SkProcCoeffXfermode* SkPlatformXfermodeFactory_impl(const ProcCoeff& rec,
350 SkXfermode::Mode mode);
351
352SkProcCoeffXfermode* SkPlatformXfermodeFactory_impl(const ProcCoeff& rec,
353 SkXfermode::Mode mode) {
354 return NULL;
355}
356
357SkProcCoeffXfermode* SkPlatformXfermodeFactory(const ProcCoeff& rec,
358 SkXfermode::Mode mode);
359
360SkProcCoeffXfermode* SkPlatformXfermodeFactory(const ProcCoeff& rec,
361 SkXfermode::Mode mode) {
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000362 if (supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
commit-bot@chromium.orgc524e982014-04-09 15:43:46 +0000363 return SkPlatformXfermodeFactory_impl_SSE2(rec, mode);
364 } else {
365 return SkPlatformXfermodeFactory_impl(rec, mode);
366 }
367}
368
369SkXfermodeProc SkPlatformXfermodeProcFactory(SkXfermode::Mode mode);
370
371SkXfermodeProc SkPlatformXfermodeProcFactory(SkXfermode::Mode mode) {
372 return NULL;
373}