blob: 34aae928eb18e07d17669bb3cd3cc4b37c52831d [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"
henrik.smiding5f7f9d02014-07-07 08:05:40 -070018#include "SkBlurImage_opts_SSE4.h"
mtkleinc09e2af2014-10-13 12:48:16 -070019#include "SkLazyPtr.h"
senorblanco@chromium.org7a47ad32013-10-30 21:57:04 +000020#include "SkMorphology_opts.h"
21#include "SkMorphology_opts_SSE2.h"
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +000022#include "SkRTConf.h"
23#include "SkUtils.h"
24#include "SkUtils_opts_SSE2.h"
commit-bot@chromium.orgc524e982014-04-09 15:43:46 +000025#include "SkXfermode.h"
26#include "SkXfermode_proccoeff.h"
senorblanco@chromium.org4e753552009-11-16 21:09:00 +000027
tomhudson@google.comea854942012-05-17 15:09:17 +000028#if defined(_MSC_VER) && defined(_WIN64)
29#include <intrin.h>
30#endif
31
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +000032/* This file must *not* be compiled with -msse or any other optional SIMD
33 extension, otherwise gcc may generate SIMD instructions even for scalar ops
34 (and thus give an invalid instruction on Pentium3 on the code below).
35 For example, only files named *_SSE2.cpp in this directory should be
36 compiled with -msse2 or higher. */
senorblanco@chromium.org4e753552009-11-16 21:09:00 +000037
tomhudson@google.com95ad1552012-02-14 18:28:54 +000038
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +000039/* Function to get the CPU SSE-level in runtime, for different compilers. */
senorblanco@chromium.org4e753552009-11-16 21:09:00 +000040#ifdef _MSC_VER
41static inline void getcpuid(int info_type, int info[4]) {
tomhudson@google.comea854942012-05-17 15:09:17 +000042#if defined(_WIN64)
43 __cpuid(info, info_type);
44#else
senorblanco@chromium.org4e753552009-11-16 21:09:00 +000045 __asm {
46 mov eax, [info_type]
47 cpuid
48 mov edi, [info]
49 mov [edi], eax
50 mov [edi+4], ebx
51 mov [edi+8], ecx
52 mov [edi+12], edx
53 }
tomhudson@google.comea854942012-05-17 15:09:17 +000054#endif
senorblanco@chromium.org4e753552009-11-16 21:09:00 +000055}
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +000056#elif defined(__x86_64__)
tomhudson@google.com95ad1552012-02-14 18:28:54 +000057static inline void getcpuid(int info_type, int info[4]) {
58 asm volatile (
59 "cpuid \n\t"
60 : "=a"(info[0]), "=b"(info[1]), "=c"(info[2]), "=d"(info[3])
61 : "a"(info_type)
62 );
63}
64#else
senorblanco@chromium.org4e753552009-11-16 21:09:00 +000065static inline void getcpuid(int info_type, int info[4]) {
66 // We save and restore ebx, so this code can be compatible with -fPIC
67 asm volatile (
68 "pushl %%ebx \n\t"
69 "cpuid \n\t"
70 "movl %%ebx, %1 \n\t"
71 "popl %%ebx \n\t"
72 : "=a"(info[0]), "=r"(info[1]), "=c"(info[2]), "=d"(info[3])
73 : "a"(info_type)
senorblanco@chromium.org4e753552009-11-16 21:09:00 +000074 );
75}
76#endif
tomhudson@google.com95ad1552012-02-14 18:28:54 +000077
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +000078////////////////////////////////////////////////////////////////////////////////
79
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +000080/* Fetch the SIMD level directly from the CPU, at run-time.
81 * Only checks the levels needed by the optimizations in this file.
commit-bot@chromium.org443c0a62014-05-08 15:27:52 +000082 */
mtkleinc09e2af2014-10-13 12:48:16 -070083namespace { // get_SIMD_level() technically must have external linkage, so no static.
84int* get_SIMD_level() {
85 int cpu_info[4] = { 0, 0, 0, 0 };
commit-bot@chromium.org443c0a62014-05-08 15:27:52 +000086 getcpuid(1, cpu_info);
mtkleinc09e2af2014-10-13 12:48:16 -070087
88 int* level = SkNEW(int);
89
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +000090 if ((cpu_info[2] & (1<<20)) != 0) {
mtkleinc09e2af2014-10-13 12:48:16 -070091 *level = SK_CPU_SSE_LEVEL_SSE42;
henrik.smiding3bb195e2014-06-27 08:03:17 -070092 } else if ((cpu_info[2] & (1<<19)) != 0) {
mtkleinc09e2af2014-10-13 12:48:16 -070093 *level = SK_CPU_SSE_LEVEL_SSE41;
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +000094 } else if ((cpu_info[2] & (1<<9)) != 0) {
mtkleinc09e2af2014-10-13 12:48:16 -070095 *level = SK_CPU_SSE_LEVEL_SSSE3;
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +000096 } else if ((cpu_info[3] & (1<<26)) != 0) {
mtkleinc09e2af2014-10-13 12:48:16 -070097 *level = SK_CPU_SSE_LEVEL_SSE2;
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +000098 } else {
mtkleinc09e2af2014-10-13 12:48:16 -070099 *level = 0;
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000100 }
mtkleinc09e2af2014-10-13 12:48:16 -0700101 return level;
commit-bot@chromium.org443c0a62014-05-08 15:27:52 +0000102}
mtkleinc09e2af2014-10-13 12:48:16 -0700103} // namespace
104
105SK_DECLARE_STATIC_LAZY_PTR(int, gSIMDLevel, get_SIMD_level);
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000106
107/* Verify that the requested SIMD level is supported in the build.
108 * If not, check if the platform supports it.
109 */
110static inline bool supports_simd(int minLevel) {
111#if defined(SK_CPU_SSE_LEVEL)
112 if (minLevel <= SK_CPU_SSE_LEVEL) {
113 return true;
114 } else
commit-bot@chromium.org443c0a62014-05-08 15:27:52 +0000115#endif
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000116 {
117#if defined(SK_BUILD_FOR_ANDROID_FRAMEWORK)
118 /* For the Android framework we should always know at compile time if the device
119 * we are building for supports SSSE3. The one exception to this rule is on the
120 * emulator where we are compiled without the -mssse3 option (so we have no
121 * SSSE3 procs) but can be run on a host machine that supports SSSE3
122 * instructions. So for that particular case we disable our SSSE3 options.
123 */
124 return false;
125#else
mtkleinc09e2af2014-10-13 12:48:16 -0700126 return minLevel <= *gSIMDLevel.get();
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000127#endif
128 }
tomhudson@google.com95ad1552012-02-14 18:28:54 +0000129}
130
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000131////////////////////////////////////////////////////////////////////////////////
132
qiankun.miaof31507b2014-09-04 07:36:38 -0700133SK_CONF_DECLARE( bool, c_hqfilter_sse, "bitmap.filter.highQualitySSE", true, "Use SSE optimized version of high quality image filters");
humper@google.comb0889472013-07-09 21:37:14 +0000134
humper4f96ab32014-06-27 11:27:03 -0700135void SkBitmapScaler::PlatformConvolutionProcs(SkConvolutionProcs* procs) {
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000136 if (supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
reed@google.comfed04b32013-09-05 20:31:17 +0000137 procs->fExtraHorizontalReads = 3;
138 procs->fConvolveVertically = &convolveVertically_SSE2;
139 procs->fConvolve4RowsHorizontally = &convolve4RowsHorizontally_SSE2;
140 procs->fConvolveHorizontally = &convolveHorizontally_SSE2;
141 procs->fApplySIMDPadding = &applySIMDPadding_SSE2;
humper@google.com138ebc32013-07-19 20:20:04 +0000142 }
143}
144
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000145////////////////////////////////////////////////////////////////////////////////
146
senorblanco@chromium.orgdc7de742009-11-30 20:00:29 +0000147void SkBitmapProcState::platformProcs() {
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +0000148 /* Every optimization in the function requires at least SSE2 */
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000149 if (!supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +0000150 return;
151 }
qiankun.miao60f3c652014-12-04 06:27:03 -0800152 const bool ssse3 = supports_simd(SK_CPU_SSE_LEVEL_SSSE3);
commit-bot@chromium.orgc398f712014-04-23 20:07:19 +0000153
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +0000154 /* Check fSampleProc32 */
155 if (fSampleProc32 == S32_opaque_D32_filter_DX) {
qiankun.miao60f3c652014-12-04 06:27:03 -0800156 if (ssse3) {
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +0000157 fSampleProc32 = S32_opaque_D32_filter_DX_SSSE3;
158 } else {
commit-bot@chromium.orgc398f712014-04-23 20:07:19 +0000159 fSampleProc32 = S32_opaque_D32_filter_DX_SSE2;
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +0000160 }
161 } else if (fSampleProc32 == S32_opaque_D32_filter_DXDY) {
qiankun.miao60f3c652014-12-04 06:27:03 -0800162 if (ssse3) {
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +0000163 fSampleProc32 = S32_opaque_D32_filter_DXDY_SSSE3;
164 }
165 } else if (fSampleProc32 == S32_alpha_D32_filter_DX) {
qiankun.miao60f3c652014-12-04 06:27:03 -0800166 if (ssse3) {
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +0000167 fSampleProc32 = S32_alpha_D32_filter_DX_SSSE3;
168 } else {
commit-bot@chromium.orgc398f712014-04-23 20:07:19 +0000169 fSampleProc32 = S32_alpha_D32_filter_DX_SSE2;
170 }
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +0000171 } else if (fSampleProc32 == S32_alpha_D32_filter_DXDY) {
qiankun.miao60f3c652014-12-04 06:27:03 -0800172 if (ssse3) {
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +0000173 fSampleProc32 = S32_alpha_D32_filter_DXDY_SSSE3;
commit-bot@chromium.orgc398f712014-04-23 20:07:19 +0000174 }
senorblanco@chromium.orgdc7de742009-11-30 20:00:29 +0000175 }
tomhudson@google.com06a73132012-02-22 18:30:43 +0000176
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +0000177 /* Check fSampleProc16 */
178 if (fSampleProc16 == S32_D16_filter_DX) {
179 fSampleProc16 = S32_D16_filter_DX_SSE2;
qiankun.miao60f3c652014-12-04 06:27:03 -0800180 } else if (ssse3 && fSampleProc16 == S32_D16_filter_DXDY) {
181 fSampleProc16 = S32_D16_filter_DXDY_SSSE3;
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +0000182 }
tomhudson@google.com5efaf262012-02-28 15:41:49 +0000183
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +0000184 /* Check fMatrixProc */
185 if (fMatrixProc == ClampX_ClampY_filter_scale) {
186 fMatrixProc = ClampX_ClampY_filter_scale_SSE2;
187 } else if (fMatrixProc == ClampX_ClampY_nofilter_scale) {
188 fMatrixProc = ClampX_ClampY_nofilter_scale_SSE2;
189 } else if (fMatrixProc == ClampX_ClampY_filter_affine) {
190 fMatrixProc = ClampX_ClampY_filter_affine_SSE2;
191 } else if (fMatrixProc == ClampX_ClampY_nofilter_affine) {
192 fMatrixProc = ClampX_ClampY_nofilter_affine_SSE2;
193 }
194
195 /* Check fShaderProc32 */
196 if (c_hqfilter_sse) {
197 if (fShaderProc32 == highQualityFilter32) {
198 fShaderProc32 = highQualityFilter_SSE2;
humper@google.comb0889472013-07-09 21:37:14 +0000199 }
tomhudson@google.com06a73132012-02-22 18:30:43 +0000200 }
senorblanco@chromium.orgdc7de742009-11-30 20:00:29 +0000201}
202
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000203////////////////////////////////////////////////////////////////////////////////
204
commit-bot@chromium.org47591072014-02-19 03:09:52 +0000205static SkBlitRow::Proc platform_16_procs[] = {
commit-bot@chromium.org39ce33a2014-02-24 04:23:39 +0000206 S32_D565_Opaque_SSE2, // S32_D565_Opaque
commit-bot@chromium.org47591072014-02-19 03:09:52 +0000207 NULL, // S32_D565_Blend
208 S32A_D565_Opaque_SSE2, // S32A_D565_Opaque
209 NULL, // S32A_D565_Blend
commit-bot@chromium.org27580472014-03-07 03:25:32 +0000210 S32_D565_Opaque_Dither_SSE2, // S32_D565_Opaque_Dither
commit-bot@chromium.org47591072014-02-19 03:09:52 +0000211 NULL, // S32_D565_Blend_Dither
commit-bot@chromium.orgfe089b32014-03-07 13:24:42 +0000212 S32A_D565_Opaque_Dither_SSE2, // S32A_D565_Opaque_Dither
commit-bot@chromium.org47591072014-02-19 03:09:52 +0000213 NULL, // S32A_D565_Blend_Dither
214};
215
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000216SkBlitRow::Proc SkBlitRow::PlatformProcs565(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_16_procs[flags];
219 } else {
220 return NULL;
221 }
222}
223
henrik.smiding3bb195e2014-06-27 08:03:17 -0700224static SkBlitRow::Proc32 platform_32_procs_SSE2[] = {
senorblanco@chromium.org4e753552009-11-16 21:09:00 +0000225 NULL, // S32_Opaque,
226 S32_Blend_BlitRow32_SSE2, // S32_Blend,
227 S32A_Opaque_BlitRow32_SSE2, // S32A_Opaque
228 S32A_Blend_BlitRow32_SSE2, // S32A_Blend,
229};
230
henrik.smiding3bb195e2014-06-27 08:03:17 -0700231#if defined(SK_ATT_ASM_SUPPORTED)
232static SkBlitRow::Proc32 platform_32_procs_SSE4[] = {
233 NULL, // S32_Opaque,
234 S32_Blend_BlitRow32_SSE2, // S32_Blend,
235 S32A_Opaque_BlitRow32_SSE4_asm, // S32A_Opaque
236 S32A_Blend_BlitRow32_SSE2, // S32A_Blend,
237};
238#endif
239
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000240SkBlitRow::Proc32 SkBlitRow::PlatformProcs32(unsigned flags) {
henrik.smiding3bb195e2014-06-27 08:03:17 -0700241#if defined(SK_ATT_ASM_SUPPORTED)
242 if (supports_simd(SK_CPU_SSE_LEVEL_SSE41)) {
243 return platform_32_procs_SSE4[flags];
244 } else
245#endif
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000246 if (supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
henrik.smiding3bb195e2014-06-27 08:03:17 -0700247 return platform_32_procs_SSE2[flags];
commit-bot@chromium.org47591072014-02-19 03:09:52 +0000248 } else {
249 return NULL;
250 }
senorblanco@chromium.org4e753552009-11-16 21:09:00 +0000251}
252
senorblanco@chromium.orgc3856382010-12-13 15:27:20 +0000253SkBlitRow::ColorProc SkBlitRow::PlatformColorProc() {
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000254 if (supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
senorblanco@chromium.orgc3856382010-12-13 15:27:20 +0000255 return Color32_SSE2;
256 } else {
257 return NULL;
258 }
259}
260
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000261SkBlitRow::ColorRectProc PlatformColorRectProcFactory(); // suppress warning
262
263SkBlitRow::ColorRectProc PlatformColorRectProcFactory() {
264/* Return NULL for now, since the optimized path in ColorRect32_SSE2 is disabled.
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000265 if (supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000266 return ColorRect32_SSE2;
senorblanco@chromium.org4e753552009-11-16 21:09:00 +0000267 } else {
268 return NULL;
269 }
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000270*/
271 return NULL;
senorblanco@chromium.org4e753552009-11-16 21:09:00 +0000272}
273
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000274////////////////////////////////////////////////////////////////////////////////
reed@google.com981d4792011-03-09 12:55:47 +0000275
commit-bot@chromium.orgcba73782014-05-29 15:57:47 +0000276SkBlitMask::ColorProc SkBlitMask::PlatformColorProcs(SkColorType dstCT,
reed@google.come901b4c2011-11-14 21:56:45 +0000277 SkMask::Format maskFormat,
278 SkColor color) {
reed@google.comedb606c2011-10-18 13:56:50 +0000279 if (SkMask::kA8_Format != maskFormat) {
280 return NULL;
281 }
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000282
reed@google.come901b4c2011-11-14 21:56:45 +0000283 ColorProc proc = NULL;
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000284 if (supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
commit-bot@chromium.orgcba73782014-05-29 15:57:47 +0000285 switch (dstCT) {
286 case kN32_SkColorType:
reed@google.come6ea6062011-07-07 19:12:50 +0000287 // The SSE2 version is not (yet) faster for black, so we check
288 // for that.
289 if (SK_ColorBLACK != color) {
reed@google.comedb606c2011-10-18 13:56:50 +0000290 proc = SkARGB32_A8_BlitMask_SSE2;
reed@google.come6ea6062011-07-07 19:12:50 +0000291 }
reed@google.com981d4792011-03-09 12:55:47 +0000292 break;
293 default:
reed@google.come901b4c2011-11-14 21:56:45 +0000294 break;
reed@google.com981d4792011-03-09 12:55:47 +0000295 }
296 }
297 return proc;
298}
299
tomhudson@google.comd6770e62012-02-14 16:01:15 +0000300SkBlitMask::BlitLCD16RowProc SkBlitMask::PlatformBlitRowProcs16(bool isOpaque) {
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000301 if (supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
tomhudson@google.comd6770e62012-02-14 16:01:15 +0000302 if (isOpaque) {
303 return SkBlitLCD16OpaqueRow_SSE2;
304 } else {
305 return SkBlitLCD16Row_SSE2;
306 }
307 } else {
308 return NULL;
309 }
310
311}
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000312
commit-bot@chromium.orgcba73782014-05-29 15:57:47 +0000313SkBlitMask::RowProc SkBlitMask::PlatformRowProcs(SkColorType, SkMask::Format, RowFlags) {
reed@google.come901b4c2011-11-14 21:56:45 +0000314 return NULL;
315}
316
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000317////////////////////////////////////////////////////////////////////////////////
318
senorblanco@chromium.org4e753552009-11-16 21:09:00 +0000319SkMemset16Proc SkMemset16GetPlatformProc() {
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000320 if (supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
senorblanco@chromium.org4e753552009-11-16 21:09:00 +0000321 return sk_memset16_SSE2;
322 } else {
323 return NULL;
324 }
325}
326
327SkMemset32Proc SkMemset32GetPlatformProc() {
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000328 if (supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
senorblanco@chromium.org4e753552009-11-16 21:09:00 +0000329 return sk_memset32_SSE2;
330 } else {
331 return NULL;
332 }
333}
tomhudson@google.com8dd90a92012-03-19 13:49:50 +0000334
commit-bot@chromium.orgf0ea77a2014-05-21 12:43:07 +0000335SkMemcpy32Proc SkMemcpy32GetPlatformProc() {
336 if (supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
337 return sk_memcpy32_SSE2;
338 } else {
339 return NULL;
340 }
341}
342
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000343////////////////////////////////////////////////////////////////////////////////
344
senorblanco@chromium.org0ded88d2014-01-24 15:43:50 +0000345SkMorphologyImageFilter::Proc SkMorphologyGetPlatformProc(SkMorphologyProcType type) {
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000346 if (!supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
senorblanco@chromium.org7a47ad32013-10-30 21:57:04 +0000347 return NULL;
348 }
349 switch (type) {
350 case kDilateX_SkMorphologyProcType:
351 return SkDilateX_SSE2;
352 case kDilateY_SkMorphologyProcType:
353 return SkDilateY_SSE2;
354 case kErodeX_SkMorphologyProcType:
355 return SkErodeX_SSE2;
356 case kErodeY_SkMorphologyProcType:
357 return SkErodeY_SSE2;
358 default:
359 return NULL;
360 }
361}
362
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000363////////////////////////////////////////////////////////////////////////////////
364
senorblanco@chromium.org27eec462013-11-08 20:49:04 +0000365bool SkBoxBlurGetPlatformProcs(SkBoxBlurProc* boxBlurX,
366 SkBoxBlurProc* boxBlurY,
senorblanco@chromium.org05edd022013-11-11 20:12:34 +0000367 SkBoxBlurProc* boxBlurXY,
368 SkBoxBlurProc* boxBlurYX) {
senorblanco@chromium.org27eec462013-11-08 20:49:04 +0000369#ifdef SK_DISABLE_BLUR_DIVISION_OPTIMIZATION
370 return false;
371#else
henrik.smiding5f7f9d02014-07-07 08:05:40 -0700372 if (supports_simd(SK_CPU_SSE_LEVEL_SSE41)) {
373 return SkBoxBlurGetPlatformProcs_SSE4(boxBlurX, boxBlurY, boxBlurXY, boxBlurYX);
senorblanco@chromium.org27eec462013-11-08 20:49:04 +0000374 }
henrik.smiding5f7f9d02014-07-07 08:05:40 -0700375 else if (supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
376 return SkBoxBlurGetPlatformProcs_SSE2(boxBlurX, boxBlurY, boxBlurXY, boxBlurYX);
377 }
378 return false;
senorblanco@chromium.org27eec462013-11-08 20:49:04 +0000379#endif
380}
381
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000382////////////////////////////////////////////////////////////////////////////////
commit-bot@chromium.orgc524e982014-04-09 15:43:46 +0000383
384extern SkProcCoeffXfermode* SkPlatformXfermodeFactory_impl_SSE2(const ProcCoeff& rec,
385 SkXfermode::Mode mode);
386
387SkProcCoeffXfermode* SkPlatformXfermodeFactory_impl(const ProcCoeff& rec,
388 SkXfermode::Mode mode);
389
390SkProcCoeffXfermode* SkPlatformXfermodeFactory_impl(const ProcCoeff& rec,
391 SkXfermode::Mode mode) {
392 return NULL;
393}
394
395SkProcCoeffXfermode* SkPlatformXfermodeFactory(const ProcCoeff& rec,
396 SkXfermode::Mode mode);
397
398SkProcCoeffXfermode* SkPlatformXfermodeFactory(const ProcCoeff& rec,
399 SkXfermode::Mode mode) {
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000400 if (supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
commit-bot@chromium.orgc524e982014-04-09 15:43:46 +0000401 return SkPlatformXfermodeFactory_impl_SSE2(rec, mode);
402 } else {
403 return SkPlatformXfermodeFactory_impl(rec, mode);
404 }
405}
406
407SkXfermodeProc SkPlatformXfermodeProcFactory(SkXfermode::Mode mode);
408
409SkXfermodeProc SkPlatformXfermodeProcFactory(SkXfermode::Mode mode) {
410 return NULL;
411}