Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(88)

Side by Side Diff: src/core/SkUtilsArm.h

Issue 1890483002: Move CPU feature detection to its own file. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: link Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/core/SkOpts.cpp ('k') | src/core/SkUtilsArm.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2012 The Android Open Source Project 2 * Copyright 2012 The Android Open Source Project
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #ifndef SkUtilsArm_DEFINED 8 #ifndef SkUtilsArm_DEFINED
9 #define SkUtilsArm_DEFINED 9 #define SkUtilsArm_DEFINED
10 10
11 #include "SkCpu.h"
11 #include "SkUtils.h" 12 #include "SkUtils.h"
12 13
13 // Define SK_ARM_NEON_MODE to one of the following values 14 // Define SK_ARM_NEON_MODE to one of the following values
14 // corresponding respectively to: 15 // corresponding respectively to:
15 // - No ARM Neon support at all (not targetting ARMv7-A, or don't have NEON) 16 // - No ARM Neon support at all (not targetting ARMv7-A, or don't have NEON)
16 // - Full ARM Neon support (i.e. assume the CPU always supports it) 17 // - Full ARM Neon support (i.e. assume the CPU always supports it)
17 // - Optional ARM Neon support (i.e. probe CPU at runtime) 18 // - Optional ARM Neon support (i.e. probe CPU at runtime)
18 // 19 //
19 #define SK_ARM_NEON_MODE_NONE 0 20 #define SK_ARM_NEON_MODE_NONE 0
20 #define SK_ARM_NEON_MODE_ALWAYS 1 21 #define SK_ARM_NEON_MODE_ALWAYS 1
21 #define SK_ARM_NEON_MODE_DYNAMIC 2 22 #define SK_ARM_NEON_MODE_DYNAMIC 2
22 23
23 #if defined(SK_ARM_HAS_OPTIONAL_NEON) 24 #if defined(SK_ARM_HAS_OPTIONAL_NEON)
24 # define SK_ARM_NEON_MODE SK_ARM_NEON_MODE_DYNAMIC 25 # define SK_ARM_NEON_MODE SK_ARM_NEON_MODE_DYNAMIC
25 #elif defined(SK_ARM_HAS_NEON) 26 #elif defined(SK_ARM_HAS_NEON)
26 # define SK_ARM_NEON_MODE SK_ARM_NEON_MODE_ALWAYS 27 # define SK_ARM_NEON_MODE SK_ARM_NEON_MODE_ALWAYS
27 #else 28 #else
28 # define SK_ARM_NEON_MODE SK_ARM_NEON_MODE_NONE 29 # define SK_ARM_NEON_MODE SK_ARM_NEON_MODE_NONE
29 #endif 30 #endif
30 31
31 // Convenience test macros, always defined as 0 or 1 32 // Convenience test macros, always defined as 0 or 1
32 #define SK_ARM_NEON_IS_NONE (SK_ARM_NEON_MODE == SK_ARM_NEON_MODE_NONE) 33 #define SK_ARM_NEON_IS_NONE (SK_ARM_NEON_MODE == SK_ARM_NEON_MODE_NONE)
33 #define SK_ARM_NEON_IS_ALWAYS (SK_ARM_NEON_MODE == SK_ARM_NEON_MODE_ALWAYS) 34 #define SK_ARM_NEON_IS_ALWAYS (SK_ARM_NEON_MODE == SK_ARM_NEON_MODE_ALWAYS)
34 #define SK_ARM_NEON_IS_DYNAMIC (SK_ARM_NEON_MODE == SK_ARM_NEON_MODE_DYNAMIC) 35 #define SK_ARM_NEON_IS_DYNAMIC (SK_ARM_NEON_MODE == SK_ARM_NEON_MODE_DYNAMIC)
35 36
36 // The sk_cpu_arm_has_neon() function returns true iff the target device 37 // The sk_cpu_arm_has_neon() function returns true iff the target device
37 // is ARMv7-A and supports Neon instructions. In DYNAMIC mode, this actually 38 // is ARMv7-A and supports Neon instructions. In DYNAMIC mode, this actually
38 // probes the CPU at runtime (and caches the result). 39 // probes the CPU at runtime (and caches the result).
39 40
41 static inline bool sk_cpu_arm_has_neon(void) {
40 #if SK_ARM_NEON_IS_NONE 42 #if SK_ARM_NEON_IS_NONE
41 static inline bool sk_cpu_arm_has_neon(void) {
42 return false; 43 return false;
44 #else
45 return SkCpu::Supports(SkCpu::NEON);
46 #endif
43 } 47 }
44 #elif SK_ARM_NEON_IS_ALWAYS
45 static inline bool sk_cpu_arm_has_neon(void) {
46 return true;
47 }
48 #else // SK_ARM_NEON_IS_DYNAMIC
49
50 extern bool sk_cpu_arm_has_neon(void) SK_PURE_FUNC;
51 #endif
52 48
53 // Use SK_ARM_NEON_WRAP(symbol) to map 'symbol' to a NEON-specific symbol 49 // Use SK_ARM_NEON_WRAP(symbol) to map 'symbol' to a NEON-specific symbol
54 // when applicable. This will transform 'symbol' differently depending on 50 // when applicable. This will transform 'symbol' differently depending on
55 // the current NEON configuration, i.e.: 51 // the current NEON configuration, i.e.:
56 // 52 //
57 // NONE -> 'symbol' 53 // NONE -> 'symbol'
58 // ALWAYS -> 'symbol_neon' 54 // ALWAYS -> 'symbol_neon'
59 // DYNAMIC -> 'symbol' or 'symbol_neon' depending on runtime check. 55 // DYNAMIC -> 'symbol' or 'symbol_neon' depending on runtime check.
60 // 56 //
61 // The goal is to simplify user code, for example: 57 // The goal is to simplify user code, for example:
(...skipping 15 matching lines...) Expand all
77 // 73 //
78 #if SK_ARM_NEON_IS_NONE 74 #if SK_ARM_NEON_IS_NONE
79 # define SK_ARM_NEON_WRAP(x) (x) 75 # define SK_ARM_NEON_WRAP(x) (x)
80 #elif SK_ARM_NEON_IS_ALWAYS 76 #elif SK_ARM_NEON_IS_ALWAYS
81 # define SK_ARM_NEON_WRAP(x) (x ## _neon) 77 # define SK_ARM_NEON_WRAP(x) (x ## _neon)
82 #elif SK_ARM_NEON_IS_DYNAMIC 78 #elif SK_ARM_NEON_IS_DYNAMIC
83 # define SK_ARM_NEON_WRAP(x) (sk_cpu_arm_has_neon() ? x ## _neon : x) 79 # define SK_ARM_NEON_WRAP(x) (sk_cpu_arm_has_neon() ? x ## _neon : x)
84 #endif 80 #endif
85 81
86 #endif // SkUtilsArm_DEFINED 82 #endif // SkUtilsArm_DEFINED
OLDNEW
« no previous file with comments | « src/core/SkOpts.cpp ('k') | src/core/SkUtilsArm.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698