blob: 84041d05b0c8ba32494431f5c3c7ac1d94b9f854 [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) {
qiankun.miao72b0c052014-12-10 07:21:35 -0800179 if (ssse3) {
180 fSampleProc16 = S32_D16_filter_DX_SSSE3;
181 } else {
182 fSampleProc16 = S32_D16_filter_DX_SSE2;
183 }
qiankun.miao60f3c652014-12-04 06:27:03 -0800184 } else if (ssse3 && fSampleProc16 == S32_D16_filter_DXDY) {
185 fSampleProc16 = S32_D16_filter_DXDY_SSSE3;
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +0000186 }
tomhudson@google.com5efaf262012-02-28 15:41:49 +0000187
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +0000188 /* Check fMatrixProc */
189 if (fMatrixProc == ClampX_ClampY_filter_scale) {
190 fMatrixProc = ClampX_ClampY_filter_scale_SSE2;
191 } else if (fMatrixProc == ClampX_ClampY_nofilter_scale) {
192 fMatrixProc = ClampX_ClampY_nofilter_scale_SSE2;
193 } else if (fMatrixProc == ClampX_ClampY_filter_affine) {
194 fMatrixProc = ClampX_ClampY_filter_affine_SSE2;
195 } else if (fMatrixProc == ClampX_ClampY_nofilter_affine) {
196 fMatrixProc = ClampX_ClampY_nofilter_affine_SSE2;
197 }
198
199 /* Check fShaderProc32 */
200 if (c_hqfilter_sse) {
201 if (fShaderProc32 == highQualityFilter32) {
202 fShaderProc32 = highQualityFilter_SSE2;
humper@google.comb0889472013-07-09 21:37:14 +0000203 }
tomhudson@google.com06a73132012-02-22 18:30:43 +0000204 }
senorblanco@chromium.orgdc7de742009-11-30 20:00:29 +0000205}
206
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000207////////////////////////////////////////////////////////////////////////////////
208
commit-bot@chromium.org47591072014-02-19 03:09:52 +0000209static SkBlitRow::Proc platform_16_procs[] = {
commit-bot@chromium.org39ce33a2014-02-24 04:23:39 +0000210 S32_D565_Opaque_SSE2, // S32_D565_Opaque
commit-bot@chromium.org47591072014-02-19 03:09:52 +0000211 NULL, // S32_D565_Blend
212 S32A_D565_Opaque_SSE2, // S32A_D565_Opaque
213 NULL, // S32A_D565_Blend
commit-bot@chromium.org27580472014-03-07 03:25:32 +0000214 S32_D565_Opaque_Dither_SSE2, // S32_D565_Opaque_Dither
commit-bot@chromium.org47591072014-02-19 03:09:52 +0000215 NULL, // S32_D565_Blend_Dither
commit-bot@chromium.orgfe089b32014-03-07 13:24:42 +0000216 S32A_D565_Opaque_Dither_SSE2, // S32A_D565_Opaque_Dither
commit-bot@chromium.org47591072014-02-19 03:09:52 +0000217 NULL, // S32A_D565_Blend_Dither
218};
219
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000220SkBlitRow::Proc SkBlitRow::PlatformProcs565(unsigned flags) {
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000221 if (supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000222 return platform_16_procs[flags];
223 } else {
224 return NULL;
225 }
226}
227
henrik.smiding3bb195e2014-06-27 08:03:17 -0700228static SkBlitRow::Proc32 platform_32_procs_SSE2[] = {
senorblanco@chromium.org4e753552009-11-16 21:09:00 +0000229 NULL, // S32_Opaque,
230 S32_Blend_BlitRow32_SSE2, // S32_Blend,
231 S32A_Opaque_BlitRow32_SSE2, // S32A_Opaque
232 S32A_Blend_BlitRow32_SSE2, // S32A_Blend,
233};
234
henrik.smiding3bb195e2014-06-27 08:03:17 -0700235#if defined(SK_ATT_ASM_SUPPORTED)
236static SkBlitRow::Proc32 platform_32_procs_SSE4[] = {
237 NULL, // S32_Opaque,
238 S32_Blend_BlitRow32_SSE2, // S32_Blend,
239 S32A_Opaque_BlitRow32_SSE4_asm, // S32A_Opaque
240 S32A_Blend_BlitRow32_SSE2, // S32A_Blend,
241};
242#endif
243
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000244SkBlitRow::Proc32 SkBlitRow::PlatformProcs32(unsigned flags) {
henrik.smiding3bb195e2014-06-27 08:03:17 -0700245#if defined(SK_ATT_ASM_SUPPORTED)
246 if (supports_simd(SK_CPU_SSE_LEVEL_SSE41)) {
247 return platform_32_procs_SSE4[flags];
248 } else
249#endif
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000250 if (supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
henrik.smiding3bb195e2014-06-27 08:03:17 -0700251 return platform_32_procs_SSE2[flags];
commit-bot@chromium.org47591072014-02-19 03:09:52 +0000252 } else {
253 return NULL;
254 }
senorblanco@chromium.org4e753552009-11-16 21:09:00 +0000255}
256
senorblanco@chromium.orgc3856382010-12-13 15:27:20 +0000257SkBlitRow::ColorProc SkBlitRow::PlatformColorProc() {
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000258 if (supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
senorblanco@chromium.orgc3856382010-12-13 15:27:20 +0000259 return Color32_SSE2;
260 } else {
261 return NULL;
262 }
263}
264
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000265SkBlitRow::ColorRectProc PlatformColorRectProcFactory(); // suppress warning
266
267SkBlitRow::ColorRectProc PlatformColorRectProcFactory() {
268/* Return NULL for now, since the optimized path in ColorRect32_SSE2 is disabled.
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000269 if (supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000270 return ColorRect32_SSE2;
senorblanco@chromium.org4e753552009-11-16 21:09:00 +0000271 } else {
272 return NULL;
273 }
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000274*/
275 return NULL;
senorblanco@chromium.org4e753552009-11-16 21:09:00 +0000276}
277
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000278////////////////////////////////////////////////////////////////////////////////
reed@google.com981d4792011-03-09 12:55:47 +0000279
commit-bot@chromium.orgcba73782014-05-29 15:57:47 +0000280SkBlitMask::ColorProc SkBlitMask::PlatformColorProcs(SkColorType dstCT,
reed@google.come901b4c2011-11-14 21:56:45 +0000281 SkMask::Format maskFormat,
282 SkColor color) {
reed@google.comedb606c2011-10-18 13:56:50 +0000283 if (SkMask::kA8_Format != maskFormat) {
284 return NULL;
285 }
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000286
reed@google.come901b4c2011-11-14 21:56:45 +0000287 ColorProc proc = NULL;
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000288 if (supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
commit-bot@chromium.orgcba73782014-05-29 15:57:47 +0000289 switch (dstCT) {
290 case kN32_SkColorType:
reed@google.come6ea6062011-07-07 19:12:50 +0000291 // The SSE2 version is not (yet) faster for black, so we check
292 // for that.
293 if (SK_ColorBLACK != color) {
reed@google.comedb606c2011-10-18 13:56:50 +0000294 proc = SkARGB32_A8_BlitMask_SSE2;
reed@google.come6ea6062011-07-07 19:12:50 +0000295 }
reed@google.com981d4792011-03-09 12:55:47 +0000296 break;
297 default:
reed@google.come901b4c2011-11-14 21:56:45 +0000298 break;
reed@google.com981d4792011-03-09 12:55:47 +0000299 }
300 }
301 return proc;
302}
303
tomhudson@google.comd6770e62012-02-14 16:01:15 +0000304SkBlitMask::BlitLCD16RowProc SkBlitMask::PlatformBlitRowProcs16(bool isOpaque) {
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000305 if (supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
tomhudson@google.comd6770e62012-02-14 16:01:15 +0000306 if (isOpaque) {
307 return SkBlitLCD16OpaqueRow_SSE2;
308 } else {
309 return SkBlitLCD16Row_SSE2;
310 }
311 } else {
312 return NULL;
313 }
314
315}
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000316
commit-bot@chromium.orgcba73782014-05-29 15:57:47 +0000317SkBlitMask::RowProc SkBlitMask::PlatformRowProcs(SkColorType, SkMask::Format, RowFlags) {
reed@google.come901b4c2011-11-14 21:56:45 +0000318 return NULL;
319}
320
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000321////////////////////////////////////////////////////////////////////////////////
322
senorblanco@chromium.org4e753552009-11-16 21:09:00 +0000323SkMemset16Proc SkMemset16GetPlatformProc() {
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000324 if (supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
senorblanco@chromium.org4e753552009-11-16 21:09:00 +0000325 return sk_memset16_SSE2;
326 } else {
327 return NULL;
328 }
329}
330
331SkMemset32Proc SkMemset32GetPlatformProc() {
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000332 if (supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
senorblanco@chromium.org4e753552009-11-16 21:09:00 +0000333 return sk_memset32_SSE2;
334 } else {
335 return NULL;
336 }
337}
tomhudson@google.com8dd90a92012-03-19 13:49:50 +0000338
commit-bot@chromium.orgf0ea77a2014-05-21 12:43:07 +0000339SkMemcpy32Proc SkMemcpy32GetPlatformProc() {
340 if (supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
341 return sk_memcpy32_SSE2;
342 } else {
343 return NULL;
344 }
345}
346
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000347////////////////////////////////////////////////////////////////////////////////
348
senorblanco@chromium.org0ded88d2014-01-24 15:43:50 +0000349SkMorphologyImageFilter::Proc SkMorphologyGetPlatformProc(SkMorphologyProcType type) {
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000350 if (!supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
senorblanco@chromium.org7a47ad32013-10-30 21:57:04 +0000351 return NULL;
352 }
353 switch (type) {
354 case kDilateX_SkMorphologyProcType:
355 return SkDilateX_SSE2;
356 case kDilateY_SkMorphologyProcType:
357 return SkDilateY_SSE2;
358 case kErodeX_SkMorphologyProcType:
359 return SkErodeX_SSE2;
360 case kErodeY_SkMorphologyProcType:
361 return SkErodeY_SSE2;
362 default:
363 return NULL;
364 }
365}
366
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000367////////////////////////////////////////////////////////////////////////////////
368
senorblanco@chromium.org27eec462013-11-08 20:49:04 +0000369bool SkBoxBlurGetPlatformProcs(SkBoxBlurProc* boxBlurX,
370 SkBoxBlurProc* boxBlurY,
senorblanco@chromium.org05edd022013-11-11 20:12:34 +0000371 SkBoxBlurProc* boxBlurXY,
372 SkBoxBlurProc* boxBlurYX) {
senorblanco@chromium.org27eec462013-11-08 20:49:04 +0000373#ifdef SK_DISABLE_BLUR_DIVISION_OPTIMIZATION
374 return false;
375#else
henrik.smiding5f7f9d02014-07-07 08:05:40 -0700376 if (supports_simd(SK_CPU_SSE_LEVEL_SSE41)) {
377 return SkBoxBlurGetPlatformProcs_SSE4(boxBlurX, boxBlurY, boxBlurXY, boxBlurYX);
senorblanco@chromium.org27eec462013-11-08 20:49:04 +0000378 }
henrik.smiding5f7f9d02014-07-07 08:05:40 -0700379 else if (supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
380 return SkBoxBlurGetPlatformProcs_SSE2(boxBlurX, boxBlurY, boxBlurXY, boxBlurYX);
381 }
382 return false;
senorblanco@chromium.org27eec462013-11-08 20:49:04 +0000383#endif
384}
385
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000386////////////////////////////////////////////////////////////////////////////////
commit-bot@chromium.orgc524e982014-04-09 15:43:46 +0000387
388extern SkProcCoeffXfermode* SkPlatformXfermodeFactory_impl_SSE2(const ProcCoeff& rec,
389 SkXfermode::Mode mode);
390
391SkProcCoeffXfermode* SkPlatformXfermodeFactory_impl(const ProcCoeff& rec,
392 SkXfermode::Mode mode);
393
394SkProcCoeffXfermode* SkPlatformXfermodeFactory_impl(const ProcCoeff& rec,
395 SkXfermode::Mode mode) {
396 return NULL;
397}
398
399SkProcCoeffXfermode* SkPlatformXfermodeFactory(const ProcCoeff& rec,
400 SkXfermode::Mode mode);
401
402SkProcCoeffXfermode* SkPlatformXfermodeFactory(const ProcCoeff& rec,
403 SkXfermode::Mode mode) {
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +0000404 if (supports_simd(SK_CPU_SSE_LEVEL_SSE2)) {
commit-bot@chromium.orgc524e982014-04-09 15:43:46 +0000405 return SkPlatformXfermodeFactory_impl_SSE2(rec, mode);
406 } else {
407 return SkPlatformXfermodeFactory_impl(rec, mode);
408 }
409}
410
411SkXfermodeProc SkPlatformXfermodeProcFactory(SkXfermode::Mode mode);
412
413SkXfermodeProc SkPlatformXfermodeProcFactory(SkXfermode::Mode mode) {
414 return NULL;
415}