18317a1832f55e175531ee7ae7ccd12a3a15e3c75mtklein/* 28317a1832f55e175531ee7ae7ccd12a3a15e3c75mtklein * Copyright 2015 Google Inc. 38317a1832f55e175531ee7ae7ccd12a3a15e3c75mtklein * 48317a1832f55e175531ee7ae7ccd12a3a15e3c75mtklein * Use of this source code is governed by a BSD-style license that can be 58317a1832f55e175531ee7ae7ccd12a3a15e3c75mtklein * found in the LICENSE file. 68317a1832f55e175531ee7ae7ccd12a3a15e3c75mtklein */ 78317a1832f55e175531ee7ae7ccd12a3a15e3c75mtklein 84311f016612a814282029daa4bd102053a853d82mtklein#include "SkCpu.h" 9a525cb151bb39fb6362af051f69b6d633f660fd9mtklein#include "SkHalf.h" 108317a1832f55e175531ee7ae7ccd12a3a15e3c75mtklein#include "SkOnce.h" 118317a1832f55e175531ee7ae7ccd12a3a15e3c75mtklein#include "SkOpts.h" 128caa5af92cf91debc1598380cb72c330e8c63efbMike Klein 130358a6ac00497ecb9fa9412045560b7f33d3a9ebmtklein#if defined(SK_ARM_HAS_NEON) 149441af52aafd59553ab1a2ea52c390400f93e0bbmtklein #if defined(SK_ARM_HAS_CRC32) 15da7136750d30f5f8a38808414e0f67f3382edacfmtklein #define SK_OPTS_NS neon_and_crc32 16da7136750d30f5f8a38808414e0f67f3382edacfmtklein #else 17da7136750d30f5f8a38808414e0f67f3382edacfmtklein #define SK_OPTS_NS neon 18da7136750d30f5f8a38808414e0f67f3382edacfmtklein #endif 19da7136750d30f5f8a38808414e0f67f3382edacfmtklein#elif SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_AVX2 20da7136750d30f5f8a38808414e0f67f3382edacfmtklein #define SK_OPTS_NS avx2 21da7136750d30f5f8a38808414e0f67f3382edacfmtklein#elif SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_AVX 22da7136750d30f5f8a38808414e0f67f3382edacfmtklein #define SK_OPTS_NS avx 23da7136750d30f5f8a38808414e0f67f3382edacfmtklein#elif SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_SSE42 24da7136750d30f5f8a38808414e0f67f3382edacfmtklein #define SK_OPTS_NS sse42 25da7136750d30f5f8a38808414e0f67f3382edacfmtklein#elif SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_SSE41 26da7136750d30f5f8a38808414e0f67f3382edacfmtklein #define SK_OPTS_NS sse41 270358a6ac00497ecb9fa9412045560b7f33d3a9ebmtklein#elif SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_SSSE3 280358a6ac00497ecb9fa9412045560b7f33d3a9ebmtklein #define SK_OPTS_NS ssse3 290358a6ac00497ecb9fa9412045560b7f33d3a9ebmtklein#elif SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_SSE3 300358a6ac00497ecb9fa9412045560b7f33d3a9ebmtklein #define SK_OPTS_NS sse3 310358a6ac00497ecb9fa9412045560b7f33d3a9ebmtklein#elif SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_SSE2 320358a6ac00497ecb9fa9412045560b7f33d3a9ebmtklein #define SK_OPTS_NS sse2 33da7136750d30f5f8a38808414e0f67f3382edacfmtklein#elif SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_SSE1 34da7136750d30f5f8a38808414e0f67f3382edacfmtklein #define SK_OPTS_NS sse 350358a6ac00497ecb9fa9412045560b7f33d3a9ebmtklein#else 360358a6ac00497ecb9fa9412045560b7f33d3a9ebmtklein #define SK_OPTS_NS portable 370358a6ac00497ecb9fa9412045560b7f33d3a9ebmtklein#endif 380358a6ac00497ecb9fa9412045560b7f33d3a9ebmtklein 39d2265e537c8015f8115d7b5b7f6de970aa688172xiangze.zhang#include "SkBitmapFilter_opts.h" 40c5091b5b6c4b8a7aef8c12db9ea2a85e907b01c4mtklein#include "SkBlend_opts.h" 414977983510028712528743aa877f6da83781b381mtklein#include "SkBlitMask_opts.h" 424a37d08382a16717cde52c3d2687b021c5413464mtklein#include "SkBlitRow_opts.h" 43dce5ce4276e2825efc6d8c4daa819c965794cd12mtklein#include "SkBlurImageFilter_opts.h" 444e97607d9a1cef66fac16f347c5ca813ec4f9515mtklein#include "SkChecksum_opts.h" 45d029ded92d409a004f2096c78f5a99b524206481mtklein#include "SkMorphologyImageFilter_opts.h" 46baaf8ad95237d1defdb7d93077d9bf8410d8ad7fMike Klein#include "SkRasterPipeline_opts.h" 473a24f459582f2665f0e66bd35a0d8f46a1c4c72fmsarett#include "SkSwizzler_opts.h" 48490b61569d27c9b7ba164fbc4394994d2e7cb022mtklein#include "SkXfermode_opts.h" 498317a1832f55e175531ee7ae7ccd12a3a15e3c75mtklein 508317a1832f55e175531ee7ae7ccd12a3a15e3c75mtkleinnamespace SkOpts { 51f684a78d9ea988883c9b2c7bcc4ea4d5e68bd998mtklein // Define default function pointer values here... 52b2a327094f2b9a072fddfd440481b1c0a8b0bc80mtklein // If our global compile options are set high enough, these defaults might even be 53b2a327094f2b9a072fddfd440481b1c0a8b0bc80mtklein // CPU-specialized, e.g. a typical x86-64 machine might start with SSE2 defaults. 548caa5af92cf91debc1598380cb72c330e8c63efbMike Klein // They'll still get a chance to be replaced with even better ones, e.g. using SSE4.1. 550358a6ac00497ecb9fa9412045560b7f33d3a9ebmtklein#define DEFINE_DEFAULT(name) decltype(name) name = SK_OPTS_NS::name 560358a6ac00497ecb9fa9412045560b7f33d3a9ebmtklein DEFINE_DEFAULT(create_xfermode); 570358a6ac00497ecb9fa9412045560b7f33d3a9ebmtklein 580358a6ac00497ecb9fa9412045560b7f33d3a9ebmtklein DEFINE_DEFAULT(box_blur_xx); 590358a6ac00497ecb9fa9412045560b7f33d3a9ebmtklein DEFINE_DEFAULT(box_blur_xy); 600358a6ac00497ecb9fa9412045560b7f33d3a9ebmtklein DEFINE_DEFAULT(box_blur_yx); 610358a6ac00497ecb9fa9412045560b7f33d3a9ebmtklein 620358a6ac00497ecb9fa9412045560b7f33d3a9ebmtklein DEFINE_DEFAULT(dilate_x); 630358a6ac00497ecb9fa9412045560b7f33d3a9ebmtklein DEFINE_DEFAULT(dilate_y); 640358a6ac00497ecb9fa9412045560b7f33d3a9ebmtklein DEFINE_DEFAULT( erode_x); 650358a6ac00497ecb9fa9412045560b7f33d3a9ebmtklein DEFINE_DEFAULT( erode_y); 660358a6ac00497ecb9fa9412045560b7f33d3a9ebmtklein 670358a6ac00497ecb9fa9412045560b7f33d3a9ebmtklein DEFINE_DEFAULT(blit_mask_d32_a8); 680358a6ac00497ecb9fa9412045560b7f33d3a9ebmtklein 690358a6ac00497ecb9fa9412045560b7f33d3a9ebmtklein DEFINE_DEFAULT(blit_row_color32); 700358a6ac00497ecb9fa9412045560b7f33d3a9ebmtklein DEFINE_DEFAULT(blit_row_s32a_opaque); 710358a6ac00497ecb9fa9412045560b7f33d3a9ebmtklein 720358a6ac00497ecb9fa9412045560b7f33d3a9ebmtklein DEFINE_DEFAULT(RGBA_to_BGRA); 730358a6ac00497ecb9fa9412045560b7f33d3a9ebmtklein DEFINE_DEFAULT(RGBA_to_rgbA); 740358a6ac00497ecb9fa9412045560b7f33d3a9ebmtklein DEFINE_DEFAULT(RGBA_to_bgrA); 750358a6ac00497ecb9fa9412045560b7f33d3a9ebmtklein DEFINE_DEFAULT(RGB_to_RGB1); 760358a6ac00497ecb9fa9412045560b7f33d3a9ebmtklein DEFINE_DEFAULT(RGB_to_BGR1); 770358a6ac00497ecb9fa9412045560b7f33d3a9ebmtklein DEFINE_DEFAULT(gray_to_RGB1); 780358a6ac00497ecb9fa9412045560b7f33d3a9ebmtklein DEFINE_DEFAULT(grayA_to_RGBA); 790358a6ac00497ecb9fa9412045560b7f33d3a9ebmtklein DEFINE_DEFAULT(grayA_to_rgbA); 800358a6ac00497ecb9fa9412045560b7f33d3a9ebmtklein DEFINE_DEFAULT(inverted_CMYK_to_RGB1); 810358a6ac00497ecb9fa9412045560b7f33d3a9ebmtklein DEFINE_DEFAULT(inverted_CMYK_to_BGR1); 820358a6ac00497ecb9fa9412045560b7f33d3a9ebmtklein 830358a6ac00497ecb9fa9412045560b7f33d3a9ebmtklein DEFINE_DEFAULT(srcover_srgb_srgb); 844e97607d9a1cef66fac16f347c5ca813ec4f9515mtklein 854e97607d9a1cef66fac16f347c5ca813ec4f9515mtklein DEFINE_DEFAULT(hash_fn); 8604adfda9c74481d0b640c0ce18864588babfcdf6Mike Klein 87c789b61167dd98efc3c3bfcf9673eef24c2e57f4Mike Klein DEFINE_DEFAULT(run_pipeline); 88d2265e537c8015f8115d7b5b7f6de970aa688172xiangze.zhang 89d2265e537c8015f8115d7b5b7f6de970aa688172xiangze.zhang DEFINE_DEFAULT(convolve_vertically); 90d2265e537c8015f8115d7b5b7f6de970aa688172xiangze.zhang DEFINE_DEFAULT(convolve_horizontally); 91d2265e537c8015f8115d7b5b7f6de970aa688172xiangze.zhang DEFINE_DEFAULT(convolve_4_rows_horizontally); 92d2265e537c8015f8115d7b5b7f6de970aa688172xiangze.zhang 930358a6ac00497ecb9fa9412045560b7f33d3a9ebmtklein#undef DEFINE_DEFAULT 94a9e878c836994bce695274b4c28890290139dcdfmsarett 958317a1832f55e175531ee7ae7ccd12a3a15e3c75mtklein // Each Init_foo() is defined in src/opts/SkOpts_foo.cpp. 968317a1832f55e175531ee7ae7ccd12a3a15e3c75mtklein void Init_ssse3(); 978317a1832f55e175531ee7ae7ccd12a3a15e3c75mtklein void Init_sse41(); 984e97607d9a1cef66fac16f347c5ca813ec4f9515mtklein void Init_sse42(); 994d1dd6643f2efa34d22d5fc3cf9cb4866252358eherb void Init_avx(); 10078d5a3bac5cbde50cd12d8b9ab6dd269324b5272Mike Klein void Init_hsw(); 10178559a78f9d3e6444f8c0c9443696699703d6531mtklein void Init_crc32(); 1028317a1832f55e175531ee7ae7ccd12a3a15e3c75mtklein 1038317a1832f55e175531ee7ae7ccd12a3a15e3c75mtklein static void init() { 10478559a78f9d3e6444f8c0c9443696699703d6531mtklein#if !defined(SK_BUILD_NO_OPTS) 10578559a78f9d3e6444f8c0c9443696699703d6531mtklein #if defined(SK_CPU_X86) 1064311f016612a814282029daa4bd102053a853d82mtklein if (SkCpu::Supports(SkCpu::SSSE3)) { Init_ssse3(); } 1074311f016612a814282029daa4bd102053a853d82mtklein if (SkCpu::Supports(SkCpu::SSE41)) { Init_sse41(); } 1084311f016612a814282029daa4bd102053a853d82mtklein if (SkCpu::Supports(SkCpu::SSE42)) { Init_sse42(); } 1094311f016612a814282029daa4bd102053a853d82mtklein if (SkCpu::Supports(SkCpu::AVX )) { Init_avx(); } 11078d5a3bac5cbde50cd12d8b9ab6dd269324b5272Mike Klein if (SkCpu::Supports(SkCpu::HSW )) { Init_hsw(); } 11178559a78f9d3e6444f8c0c9443696699703d6531mtklein 11278559a78f9d3e6444f8c0c9443696699703d6531mtklein #elif defined(SK_CPU_ARM64) 11378559a78f9d3e6444f8c0c9443696699703d6531mtklein if (SkCpu::Supports(SkCpu::CRC32)) { Init_crc32(); } 11478559a78f9d3e6444f8c0c9443696699703d6531mtklein 1158317a1832f55e175531ee7ae7ccd12a3a15e3c75mtklein #endif 11678559a78f9d3e6444f8c0c9443696699703d6531mtklein#endif 1178317a1832f55e175531ee7ae7ccd12a3a15e3c75mtklein } 1188317a1832f55e175531ee7ae7ccd12a3a15e3c75mtklein 119d9dd4282118fc14eac735e6fa0b3ec53047b457fmtklein void Init() { 120d9dd4282118fc14eac735e6fa0b3ec53047b457fmtklein static SkOnce once; 121d9dd4282118fc14eac735e6fa0b3ec53047b457fmtklein once(init); 122d9dd4282118fc14eac735e6fa0b3ec53047b457fmtklein } 12305db63b5fc262136da9b289418b871180cd1359bmtklein} // namespace SkOpts 124