Line data Source code
1 : /*
2 : * Copyright 2015 Google Inc.
3 : *
4 : * Use of this source code is governed by a BSD-style license that can be
5 : * found in the LICENSE file.
6 : */
7 :
8 : #include "SkCpu.h"
9 : #include "SkHalf.h"
10 : #include "SkOnce.h"
11 : #include "SkOpts.h"
12 :
13 : #if defined(SK_ARM_HAS_NEON)
14 : #if defined(SK_ARM_HAS_CRC32)
15 : #define SK_OPTS_NS neon_and_crc32
16 : #else
17 : #define SK_OPTS_NS neon
18 : #endif
19 : #elif SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_AVX2
20 : #define SK_OPTS_NS avx2
21 : #elif SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_AVX
22 : #define SK_OPTS_NS avx
23 : #elif SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_SSE42
24 : #define SK_OPTS_NS sse42
25 : #elif SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_SSE41
26 : #define SK_OPTS_NS sse41
27 : #elif SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_SSSE3
28 : #define SK_OPTS_NS ssse3
29 : #elif SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_SSE3
30 : #define SK_OPTS_NS sse3
31 : #elif SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_SSE2
32 : #define SK_OPTS_NS sse2
33 : #elif SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_SSE1
34 : #define SK_OPTS_NS sse
35 : #else
36 : #define SK_OPTS_NS portable
37 : #endif
38 :
39 : #include "SkBitmapFilter_opts.h"
40 : #include "SkBlend_opts.h"
41 : #include "SkBlitMask_opts.h"
42 : #include "SkBlitRow_opts.h"
43 : #include "SkBlurImageFilter_opts.h"
44 : #include "SkChecksum_opts.h"
45 : #include "SkMorphologyImageFilter_opts.h"
46 : #include "SkRasterPipeline_opts.h"
47 : #include "SkSwizzler_opts.h"
48 : #include "SkXfermode_opts.h"
49 :
50 : namespace SkOpts {
51 : // Define default function pointer values here...
52 : // If our global compile options are set high enough, these defaults might even be
53 : // CPU-specialized, e.g. a typical x86-64 machine might start with SSE2 defaults.
54 : // They'll still get a chance to be replaced with even better ones, e.g. using SSE4.1.
55 : #define DEFINE_DEFAULT(name) decltype(name) name = SK_OPTS_NS::name
56 : DEFINE_DEFAULT(create_xfermode);
57 :
58 3 : DEFINE_DEFAULT(box_blur_xx);
59 3 : DEFINE_DEFAULT(box_blur_xy);
60 3 : DEFINE_DEFAULT(box_blur_yx);
61 :
62 3 : DEFINE_DEFAULT(dilate_x);
63 3 : DEFINE_DEFAULT(dilate_y);
64 3 : DEFINE_DEFAULT( erode_x);
65 3 : DEFINE_DEFAULT( erode_y);
66 :
67 : DEFINE_DEFAULT(blit_mask_d32_a8);
68 :
69 : DEFINE_DEFAULT(blit_row_color32);
70 : DEFINE_DEFAULT(blit_row_s32a_opaque);
71 :
72 : DEFINE_DEFAULT(RGBA_to_BGRA);
73 : DEFINE_DEFAULT(RGBA_to_rgbA);
74 : DEFINE_DEFAULT(RGBA_to_bgrA);
75 : DEFINE_DEFAULT(RGB_to_RGB1);
76 : DEFINE_DEFAULT(RGB_to_BGR1);
77 : DEFINE_DEFAULT(gray_to_RGB1);
78 : DEFINE_DEFAULT(grayA_to_RGBA);
79 : DEFINE_DEFAULT(grayA_to_rgbA);
80 : DEFINE_DEFAULT(inverted_CMYK_to_RGB1);
81 : DEFINE_DEFAULT(inverted_CMYK_to_BGR1);
82 :
83 : DEFINE_DEFAULT(srcover_srgb_srgb);
84 :
85 : DEFINE_DEFAULT(hash_fn);
86 :
87 : DEFINE_DEFAULT(run_pipeline);
88 :
89 : DEFINE_DEFAULT(convolve_vertically);
90 : DEFINE_DEFAULT(convolve_horizontally);
91 : DEFINE_DEFAULT(convolve_4_rows_horizontally);
92 :
93 : #undef DEFINE_DEFAULT
94 :
95 : // Each Init_foo() is defined in src/opts/SkOpts_foo.cpp.
96 : void Init_ssse3();
97 : void Init_sse41();
98 : void Init_sse42();
99 : void Init_avx();
100 : void Init_hsw();
101 : void Init_crc32();
102 :
103 3 : static void init() {
104 : #if !defined(SK_BUILD_NO_OPTS)
105 : #if defined(SK_CPU_X86)
106 3 : if (SkCpu::Supports(SkCpu::SSSE3)) { Init_ssse3(); }
107 3 : if (SkCpu::Supports(SkCpu::SSE41)) { Init_sse41(); }
108 3 : if (SkCpu::Supports(SkCpu::SSE42)) { Init_sse42(); }
109 3 : if (SkCpu::Supports(SkCpu::AVX )) { Init_avx(); }
110 3 : if (SkCpu::Supports(SkCpu::HSW )) { Init_hsw(); }
111 :
112 : #elif defined(SK_CPU_ARM64)
113 : if (SkCpu::Supports(SkCpu::CRC32)) { Init_crc32(); }
114 :
115 : #endif
116 : #endif
117 3 : }
118 :
119 3 : void Init() {
120 : static SkOnce once;
121 3 : once(init);
122 3 : }
123 9 : } // namespace SkOpts
|