blob: 603458ba26abcddb7e6370454971572fef142a0a [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"
humper4f96ab32014-06-27 11:27:03 -070011#include "SkBitmapScaler.h"
reed@google.com58af9a62011-10-12 13:43:52 +000012#include "SkBlitMask.h"
tomhudson@google.com8dd90a92012-03-19 13:49:50 +000013#include "SkBlitRect_opts_SSE2.h"
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +000014#include "SkBlitRow.h"
senorblanco@chromium.org4e753552009-11-16 21:09:00 +000015#include "SkBlitRow_opts_SSE2.h"
henrik.smiding3bb195e2014-06-27 08:03:17 -070016#include "SkBlitRow_opts_SSE4.h"
senorblanco@chromium.org27eec462013-11-08 20:49:04 +000017#include "SkBlurImage_opts_SSE2.h"
senorblanco@chromium.org7a47ad32013-10-30 21:57:04 +000018#include "SkMorphology_opts.h"
19#include "SkMorphology_opts_SSE2.h"
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +000020#include "SkRTConf.h"
21#include "SkUtils.h"
22#include "SkUtils_opts_SSE2.h"
commit-bot@chromium.orgc524e982014-04-09 15:43:46 +000023#include "SkXfermode.h"
24#include "SkXfermode_proccoeff.h"
senorblanco@chromium.org4e753552009-11-16 21:09:00 +000025
tomhudson@google.comea854942012-05-17 15:09:17 +000026#if defined(_MSC_VER) && defined(_WIN64)
27#include <intrin.h>
28#endif
29
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +000030/* This file must *not* be compiled with -msse or any other optional SIMD
31 extension, otherwise gcc may generate SIMD instructions even for scalar ops
32 (and thus give an invalid instruction on Pentium3 on the code below).
33 For example, only files named *_SSE2.cpp in this directory should be
34 compiled with -msse2 or higher. */
senorblanco@chromium.org4e753552009-11-16 21:09:00 +000035
tomhudson@google.com95ad1552012-02-14 18:28:54 +000036
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +000037/* Function to get the CPU SSE-level in runtime, for different compilers. */
senorblanco@chromium.org4e753552009-11-16 21:09:00 +000038#ifdef _MSC_VER
39static inline void getcpuid(int info_type, int info[4]) {
tomhudson@google.comea854942012-05-17 15:09:17 +000040#if defined(_WIN64)
41 __cpuid(info, info_type);
42#else
senorblanco@chromium.org4e753552009-11-16 21:09:00 +000043 __asm {
44 mov eax, [info_type]
45 cpuid
46 mov edi, [info]
47 mov [edi], eax
48 mov [edi+4], ebx
49 mov [edi+8], ecx
50 mov [edi+12], edx
51 }
tomhudson@google.comea854942012-05-17 15:09:17 +000052#endif
senorblanco@chromium.org4e753552009-11-16 21:09:00 +000053}
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +000054#elif defined(__x86_64__)
tomhudson@google.com95ad1552012-02-14 18:28:54 +000055static inline void getcpuid(int info_type, int info[4]) {
56 asm volatile (
57 "cpuid \n\t"
58 : "=a"(info[0]), "=b"(info[1]), "=c"(info[2]), "=d"(info[3])
59 : "a"(info_type)
60 );
61}
62#else
senorblanco@chromium.org4e753552009-11-16 21:09:00 +000063static inline void getcpuid(int info_type, int info[4]) {
64 // We save and restore ebx, so this code can be compatible with -fPIC
65 asm volatile (
66 "pushl %%ebx \n\t"
67 "cpuid \n\t"
68 "movl %%ebx, %1 \n\t"
69 "popl %%ebx \n\t"
70 : "=a"(info[0]), "=r"(info[1]), "=c"(info[2]), "=d"(info[3])
71 : "a"(info_type)
senorblanco@chromium.org4e753552009-11-16 21:09:00 +000072 );
73}
74#endif
tomhudson@google.com95ad1552012-02-14 18:28:54 +000075
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +000076////////////////////////////////////////////////////////////////////////////////
77
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +000078/* Fetch the SIMD level directly from the CPU, at run-time.
79 * Only checks the levels needed by the optimizations in this file.
commit-bot@chromium.org443c0a62014-05-08 15:27:52 +000080 */
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +000081static int get_SIMD_level() {
commit-bot@chromium.org443c0a62014-05-08 15:27:52 +000082 int cpu_info[4] = { 0 };
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +000083
commit-bot@chromium.org443c0a62014-05-08 15:27:52 +000084 getcpuid(1, cpu_info);
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +000085 if ((cpu_info[2] & (1<<20)) != 0) {
86 return SK_CPU_SSE_LEVEL_SSE42;
henrik.smiding3bb195e2014-06-27 08:03:17 -070087 } else if ((cpu_info[2] & (1<<19)) != 0) {
88 return SK_CPU_SSE_LEVEL_SSE41;
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +000089 } else if ((cpu_info[2] & (1<<9)) != 0) {
90 return SK_CPU_SSE_LEVEL_SSSE3;
91 } else if ((cpu_info[3] & (1<<26)) != 0) {
92 return SK_CPU_SSE_LEVEL_SSE2;
93 } else {
94 return 0;
95 }
commit-bot@chromium.org443c0a62014-05-08 15:27:52 +000096}
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +000097
98/* Verify that the requested SIMD level is supported in the build.
99 * If not, check if the platform supports it.
100 */
101static inline bool supports_simd(int minLevel) {
102#if defined(SK_CPU_SSE_LEVEL)
103 if (minLevel <= SK_CPU_SSE_LEVEL) {
104 return true;
105 } else
commit-bot@chromium.org443c0a62014-05-08 15:27:52 +0000106#endif
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000107 {
108#if defined(SK_BUILD_FOR_ANDROID_FRAMEWORK)
109 /* For the Android framework we should always know at compile time if the device
110 * we are building for supports SSSE3. The one exception to this rule is on the
111 * emulator where we are compiled without the -mssse3 option (so we have no
112 * SSSE3 procs) but can be run on a host machine that supports SSSE3
113 * instructions. So for that particular case we disable our SSSE3 options.
114 */
115 return false;
116#else
117 static int gSIMDLevel = get_SIMD_level();
118 return (minLevel <= gSIMDLevel);
119#endif
120 }
tomhudson@google.com95ad1552012-02-14 18:28:54 +0000121}
122
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000123////////////////////////////////////////////////////////////////////////////////
124
humper@google.comb0889472013-07-09 21:37:14 +0000125SK_CONF_DECLARE( bool, c_hqfilter_sse, "bitmap.filter.highQualitySSE", false, "Use SSE optimized version of high quality image filters");
126
humper4f96ab32014-06-27 11:27:03 -0700127void SkBitmapScaler::PlatformConvolutionProcs(SkConvolutionProcs* procs) {
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000128 if (supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
reed@google.comfed04b32013-09-05 20:31:17 +0000129 procs->fExtraHorizontalReads = 3;
130 procs->fConvolveVertically = &convolveVertically_SSE2;
131 procs->fConvolve4RowsHorizontally = &convolve4RowsHorizontally_SSE2;
132 procs->fConvolveHorizontally = &convolveHorizontally_SSE2;
133 procs->fApplySIMDPadding = &applySIMDPadding_SSE2;
humper@google.com138ebc32013-07-19 20:20:04 +0000134 }
135}
136
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000137////////////////////////////////////////////////////////////////////////////////
138
senorblanco@chromium.orgdc7de742009-11-30 20:00:29 +0000139void SkBitmapProcState::platformProcs() {
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +0000140 /* Every optimization in the function requires at least SSE2 */
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000141 if (!supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +0000142 return;
143 }
commit-bot@chromium.orgc398f712014-04-23 20:07:19 +0000144
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +0000145 /* Check fSampleProc32 */
146 if (fSampleProc32 == S32_opaque_D32_filter_DX) {
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000147 if (supports_simd(SK_CPU_SSE_LEVEL_SSSE3)) {
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +0000148 fSampleProc32 = S32_opaque_D32_filter_DX_SSSE3;
149 } else {
commit-bot@chromium.orgc398f712014-04-23 20:07:19 +0000150 fSampleProc32 = S32_opaque_D32_filter_DX_SSE2;
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +0000151 }
152 } else if (fSampleProc32 == S32_opaque_D32_filter_DXDY) {
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_opaque_D32_filter_DXDY_SSSE3;
155 }
156 } else if (fSampleProc32 == S32_alpha_D32_filter_DX) {
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000157 if (supports_simd(SK_CPU_SSE_LEVEL_SSSE3)) {
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +0000158 fSampleProc32 = S32_alpha_D32_filter_DX_SSSE3;
159 } else {
commit-bot@chromium.orgc398f712014-04-23 20:07:19 +0000160 fSampleProc32 = S32_alpha_D32_filter_DX_SSE2;
161 }
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +0000162 } else if (fSampleProc32 == S32_alpha_D32_filter_DXDY) {
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000163 if (supports_simd(SK_CPU_SSE_LEVEL_SSSE3)) {
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +0000164 fSampleProc32 = S32_alpha_D32_filter_DXDY_SSSE3;
commit-bot@chromium.orgc398f712014-04-23 20:07:19 +0000165 }
senorblanco@chromium.orgdc7de742009-11-30 20:00:29 +0000166 }
tomhudson@google.com06a73132012-02-22 18:30:43 +0000167
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +0000168 /* Check fSampleProc16 */
169 if (fSampleProc16 == S32_D16_filter_DX) {
170 fSampleProc16 = S32_D16_filter_DX_SSE2;
171 }
tomhudson@google.com5efaf262012-02-28 15:41:49 +0000172
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +0000173 /* Check fMatrixProc */
174 if (fMatrixProc == ClampX_ClampY_filter_scale) {
175 fMatrixProc = ClampX_ClampY_filter_scale_SSE2;
176 } else if (fMatrixProc == ClampX_ClampY_nofilter_scale) {
177 fMatrixProc = ClampX_ClampY_nofilter_scale_SSE2;
178 } else if (fMatrixProc == ClampX_ClampY_filter_affine) {
179 fMatrixProc = ClampX_ClampY_filter_affine_SSE2;
180 } else if (fMatrixProc == ClampX_ClampY_nofilter_affine) {
181 fMatrixProc = ClampX_ClampY_nofilter_affine_SSE2;
182 }
183
184 /* Check fShaderProc32 */
185 if (c_hqfilter_sse) {
186 if (fShaderProc32 == highQualityFilter32) {
187 fShaderProc32 = highQualityFilter_SSE2;
humper@google.comb0889472013-07-09 21:37:14 +0000188 }
tomhudson@google.com06a73132012-02-22 18:30:43 +0000189 }
senorblanco@chromium.orgdc7de742009-11-30 20:00:29 +0000190}
191
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000192////////////////////////////////////////////////////////////////////////////////
193
commit-bot@chromium.org47591072014-02-19 03:09:52 +0000194static SkBlitRow::Proc platform_16_procs[] = {
commit-bot@chromium.org39ce33a2014-02-24 04:23:39 +0000195 S32_D565_Opaque_SSE2, // S32_D565_Opaque
commit-bot@chromium.org47591072014-02-19 03:09:52 +0000196 NULL, // S32_D565_Blend
197 S32A_D565_Opaque_SSE2, // S32A_D565_Opaque
198 NULL, // S32A_D565_Blend
commit-bot@chromium.org27580472014-03-07 03:25:32 +0000199 S32_D565_Opaque_Dither_SSE2, // S32_D565_Opaque_Dither
commit-bot@chromium.org47591072014-02-19 03:09:52 +0000200 NULL, // S32_D565_Blend_Dither
commit-bot@chromium.orgfe089b32014-03-07 13:24:42 +0000201 S32A_D565_Opaque_Dither_SSE2, // S32A_D565_Opaque_Dither
commit-bot@chromium.org47591072014-02-19 03:09:52 +0000202 NULL, // S32A_D565_Blend_Dither
203};
204
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000205SkBlitRow::Proc SkBlitRow::PlatformProcs565(unsigned flags) {
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000206 if (supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000207 return platform_16_procs[flags];
208 } else {
209 return NULL;
210 }
211}
212
henrik.smiding3bb195e2014-06-27 08:03:17 -0700213static SkBlitRow::Proc32 platform_32_procs_SSE2[] = {
senorblanco@chromium.org4e753552009-11-16 21:09:00 +0000214 NULL, // S32_Opaque,
215 S32_Blend_BlitRow32_SSE2, // S32_Blend,
216 S32A_Opaque_BlitRow32_SSE2, // S32A_Opaque
217 S32A_Blend_BlitRow32_SSE2, // S32A_Blend,
218};
219
henrik.smiding3bb195e2014-06-27 08:03:17 -0700220#if defined(SK_ATT_ASM_SUPPORTED)
221static SkBlitRow::Proc32 platform_32_procs_SSE4[] = {
222 NULL, // S32_Opaque,
223 S32_Blend_BlitRow32_SSE2, // S32_Blend,
224 S32A_Opaque_BlitRow32_SSE4_asm, // S32A_Opaque
225 S32A_Blend_BlitRow32_SSE2, // S32A_Blend,
226};
227#endif
228
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000229SkBlitRow::Proc32 SkBlitRow::PlatformProcs32(unsigned flags) {
henrik.smiding3bb195e2014-06-27 08:03:17 -0700230#if defined(SK_ATT_ASM_SUPPORTED)
231 if (supports_simd(SK_CPU_SSE_LEVEL_SSE41)) {
232 return platform_32_procs_SSE4[flags];
233 } else
234#endif
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000235 if (supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
henrik.smiding3bb195e2014-06-27 08:03:17 -0700236 return platform_32_procs_SSE2[flags];
commit-bot@chromium.org47591072014-02-19 03:09:52 +0000237 } else {
238 return NULL;
239 }
senorblanco@chromium.org4e753552009-11-16 21:09:00 +0000240}
241
senorblanco@chromium.orgc3856382010-12-13 15:27:20 +0000242SkBlitRow::ColorProc SkBlitRow::PlatformColorProc() {
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000243 if (supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
senorblanco@chromium.orgc3856382010-12-13 15:27:20 +0000244 return Color32_SSE2;
245 } else {
246 return NULL;
247 }
248}
249
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000250SkBlitRow::ColorRectProc PlatformColorRectProcFactory(); // suppress warning
251
252SkBlitRow::ColorRectProc PlatformColorRectProcFactory() {
253/* Return NULL for now, since the optimized path in ColorRect32_SSE2 is disabled.
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000254 if (supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000255 return ColorRect32_SSE2;
senorblanco@chromium.org4e753552009-11-16 21:09:00 +0000256 } else {
257 return NULL;
258 }
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000259*/
260 return NULL;
senorblanco@chromium.org4e753552009-11-16 21:09:00 +0000261}
262
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000263////////////////////////////////////////////////////////////////////////////////
reed@google.com981d4792011-03-09 12:55:47 +0000264
commit-bot@chromium.orgcba73782014-05-29 15:57:47 +0000265SkBlitMask::ColorProc SkBlitMask::PlatformColorProcs(SkColorType dstCT,
reed@google.come901b4c2011-11-14 21:56:45 +0000266 SkMask::Format maskFormat,
267 SkColor color) {
reed@google.comedb606c2011-10-18 13:56:50 +0000268 if (SkMask::kA8_Format != maskFormat) {
269 return NULL;
270 }
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000271
reed@google.come901b4c2011-11-14 21:56:45 +0000272 ColorProc proc = NULL;
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000273 if (supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
commit-bot@chromium.orgcba73782014-05-29 15:57:47 +0000274 switch (dstCT) {
275 case kN32_SkColorType:
reed@google.come6ea6062011-07-07 19:12:50 +0000276 // The SSE2 version is not (yet) faster for black, so we check
277 // for that.
278 if (SK_ColorBLACK != color) {
reed@google.comedb606c2011-10-18 13:56:50 +0000279 proc = SkARGB32_A8_BlitMask_SSE2;
reed@google.come6ea6062011-07-07 19:12:50 +0000280 }
reed@google.com981d4792011-03-09 12:55:47 +0000281 break;
282 default:
reed@google.come901b4c2011-11-14 21:56:45 +0000283 break;
reed@google.com981d4792011-03-09 12:55:47 +0000284 }
285 }
286 return proc;
287}
288
tomhudson@google.comd6770e62012-02-14 16:01:15 +0000289SkBlitMask::BlitLCD16RowProc SkBlitMask::PlatformBlitRowProcs16(bool isOpaque) {
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000290 if (supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
tomhudson@google.comd6770e62012-02-14 16:01:15 +0000291 if (isOpaque) {
292 return SkBlitLCD16OpaqueRow_SSE2;
293 } else {
294 return SkBlitLCD16Row_SSE2;
295 }
296 } else {
297 return NULL;
298 }
299
300}
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000301
commit-bot@chromium.orgcba73782014-05-29 15:57:47 +0000302SkBlitMask::RowProc SkBlitMask::PlatformRowProcs(SkColorType, SkMask::Format, RowFlags) {
reed@google.come901b4c2011-11-14 21:56:45 +0000303 return NULL;
304}
305
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000306////////////////////////////////////////////////////////////////////////////////
307
senorblanco@chromium.org4e753552009-11-16 21:09:00 +0000308SkMemset16Proc SkMemset16GetPlatformProc() {
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000309 if (supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
senorblanco@chromium.org4e753552009-11-16 21:09:00 +0000310 return sk_memset16_SSE2;
311 } else {
312 return NULL;
313 }
314}
315
316SkMemset32Proc SkMemset32GetPlatformProc() {
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000317 if (supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
senorblanco@chromium.org4e753552009-11-16 21:09:00 +0000318 return sk_memset32_SSE2;
319 } else {
320 return NULL;
321 }
322}
tomhudson@google.com8dd90a92012-03-19 13:49:50 +0000323
commit-bot@chromium.orgf0ea77a2014-05-21 12:43:07 +0000324SkMemcpy32Proc SkMemcpy32GetPlatformProc() {
325 if (supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
326 return sk_memcpy32_SSE2;
327 } else {
328 return NULL;
329 }
330}
331
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000332////////////////////////////////////////////////////////////////////////////////
333
senorblanco@chromium.org0ded88d2014-01-24 15:43:50 +0000334SkMorphologyImageFilter::Proc SkMorphologyGetPlatformProc(SkMorphologyProcType type) {
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000335 if (!supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
senorblanco@chromium.org7a47ad32013-10-30 21:57:04 +0000336 return NULL;
337 }
338 switch (type) {
339 case kDilateX_SkMorphologyProcType:
340 return SkDilateX_SSE2;
341 case kDilateY_SkMorphologyProcType:
342 return SkDilateY_SSE2;
343 case kErodeX_SkMorphologyProcType:
344 return SkErodeX_SSE2;
345 case kErodeY_SkMorphologyProcType:
346 return SkErodeY_SSE2;
347 default:
348 return NULL;
349 }
350}
351
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000352////////////////////////////////////////////////////////////////////////////////
353
senorblanco@chromium.org27eec462013-11-08 20:49:04 +0000354bool SkBoxBlurGetPlatformProcs(SkBoxBlurProc* boxBlurX,
355 SkBoxBlurProc* boxBlurY,
senorblanco@chromium.org05edd022013-11-11 20:12:34 +0000356 SkBoxBlurProc* boxBlurXY,
357 SkBoxBlurProc* boxBlurYX) {
senorblanco@chromium.org27eec462013-11-08 20:49:04 +0000358#ifdef SK_DISABLE_BLUR_DIVISION_OPTIMIZATION
359 return false;
360#else
reed82cb86f2014-07-06 18:51:29 -0700361 if (!supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
362 return false;
senorblanco@chromium.org27eec462013-11-08 20:49:04 +0000363 }
reed82cb86f2014-07-06 18:51:29 -0700364 return SkBoxBlurGetPlatformProcs_SSE2(boxBlurX, boxBlurY, boxBlurXY, boxBlurYX);
senorblanco@chromium.org27eec462013-11-08 20:49:04 +0000365#endif
366}
367
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000368////////////////////////////////////////////////////////////////////////////////
commit-bot@chromium.orgc524e982014-04-09 15:43:46 +0000369
370extern SkProcCoeffXfermode* SkPlatformXfermodeFactory_impl_SSE2(const ProcCoeff& rec,
371 SkXfermode::Mode mode);
372
373SkProcCoeffXfermode* SkPlatformXfermodeFactory_impl(const ProcCoeff& rec,
374 SkXfermode::Mode mode);
375
376SkProcCoeffXfermode* SkPlatformXfermodeFactory_impl(const ProcCoeff& rec,
377 SkXfermode::Mode mode) {
378 return NULL;
379}
380
381SkProcCoeffXfermode* SkPlatformXfermodeFactory(const ProcCoeff& rec,
382 SkXfermode::Mode mode);
383
384SkProcCoeffXfermode* SkPlatformXfermodeFactory(const ProcCoeff& rec,
385 SkXfermode::Mode mode) {
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000386 if (supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
commit-bot@chromium.orgc524e982014-04-09 15:43:46 +0000387 return SkPlatformXfermodeFactory_impl_SSE2(rec, mode);
388 } else {
389 return SkPlatformXfermodeFactory_impl(rec, mode);
390 }
391}
392
393SkXfermodeProc SkPlatformXfermodeProcFactory(SkXfermode::Mode mode);
394
395SkXfermodeProc SkPlatformXfermodeProcFactory(SkXfermode::Mode mode) {
396 return NULL;
397}