diff --git a/include/core/SkPreConfig.h b/include/core/SkPreConfig.h index 1c2e24fba6..406a159d89 100644 --- a/include/core/SkPreConfig.h +++ b/include/core/SkPreConfig.h @@ -116,40 +116,30 @@ // Are we in GCC? #ifndef SK_CPU_SSE_LEVEL - #if defined(__SSE2__) - #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_SSE2 + // These checks must be done in descending order to ensure we set the highest + // available SSE level. + #if defined(__SSSE3__) + #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_SSSE3 #elif defined(__SSE3__) #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_SSE3 - #elif defined(__SSSE3__) - #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_SSSE3 + #elif defined(__SSE2__) + #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_SSE2 #endif #endif // Are we in VisualStudio? #ifndef SK_CPU_SSE_LEVEL + // These checks must be done in descending order to ensure we set the highest + // available SSE level. #if defined (_M_IX86_FP) - #if _M_IX86_FP == 1 - #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_SSE1 - #elif _M_IX86_FP >= 2 + #if _M_IX86_FP >= 2 #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_SSE2 + #elif _M_IX86_FP == 1 + #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_SSE1 #endif #endif #endif -// 64bit intel guarantees at least SSE2 -#if defined(__x86_64__) || defined(_WIN64) - #if !defined(SK_CPU_SSE_LEVEL) || (SK_CPU_SSE_LEVEL < SK_CPU_SSE_LEVEL_SSE2) - #undef SK_CPU_SSE_LEVEL - #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_SSE2 - #endif -#endif - -// Android x86 NDK ABI requires SSE3 support -#if defined(SK_BUILD_FOR_ANDROID) - #undef SK_CPU_SSE_LEVEL - #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_SSE3 -#endif - ////////////////////////////////////////////////////////////////////// // ARM defines diff --git a/src/opts/SkBitmapProcState_opts_SSSE3.cpp b/src/opts/SkBitmapProcState_opts_SSSE3.cpp index f8342ecaad..ddc8ccc5ab 100644 --- a/src/opts/SkBitmapProcState_opts_SSSE3.cpp +++ b/src/opts/SkBitmapProcState_opts_SSSE3.cpp @@ -5,11 +5,19 @@ * found in the LICENSE file. */ -#include // SSSE3 #include "SkBitmapProcState_opts_SSSE3.h" #include "SkPaint.h" #include "SkUtils.h" +/* With the exception of the Android framework we always build the SSSE3 functions + * and enable the caller to determine SSSE3 support. However for the Android framework + * if the device does not support SSSE3 then the compiler will not supply the required + * -mssse3 option needed to build this file, so instead we provide a stub implementation. + */ +#if !defined(SK_BUILD_FOR_ANDROID_FRAMEWORK) || SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_SSSE3 + +#include // SSSE3 + // adding anonymous namespace seemed to force gcc to inline directly the // instantiation, instead of creating the functions // S32_generic_D32_filter_DX_SSSE3 and @@ -722,3 +730,31 @@ void S32_alpha_D32_filter_DXDY_SSSE3(const SkBitmapProcState& s, int count, uint32_t* colors) { S32_generic_D32_filter_DXDY_SSSE3(s, xy, count, colors); } + +#else // !defined(SK_BUILD_FOR_ANDROID_FRAMEWORK) || SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_SSSE3 + +void S32_opaque_D32_filter_DX_SSSE3(const SkBitmapProcState& s, + const uint32_t* xy, + int count, uint32_t* colors) { + sk_throw(); +} + +void S32_alpha_D32_filter_DX_SSSE3(const SkBitmapProcState& s, + const uint32_t* xy, + int count, uint32_t* colors) { + sk_throw(); +} + +void S32_opaque_D32_filter_DXDY_SSSE3(const SkBitmapProcState& s, + const uint32_t* xy, + int count, uint32_t* colors) { + sk_throw(); +} + +void S32_alpha_D32_filter_DXDY_SSSE3(const SkBitmapProcState& s, + const uint32_t* xy, + int count, uint32_t* colors) { + sk_throw(); +} + +#endif