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