Krita Source Code Documentation
Loading...
Searching...
No Matches
KoMultiArchBuildSupport.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2012 Dmitry Kazakov <dimula73@gmail.com>
3 * SPDX-FileCopyrightText: 2022 L. E. Segovia <amy@amyspark.me>
4 *
5 * SPDX-License-Identifier: LGPL-2.1-or-later
6 */
7
8#ifndef KO_MULTI_ARCH_BUILD_SUPPORT_H
9#define KO_MULTI_ARCH_BUILD_SUPPORT_H
10
11#include "kritamultiarch_export.h"
12
13#include <utility>
15
16#include <QDebug>
17
18KRITAMULTIARCH_EXPORT
19std::tuple<bool, bool> vectorizationConfiguration();
20
21template<class FactoryType, class... Args>
22auto createOptimizedClass(Args &&...param)
23{
24 bool useVectorization = true;
25 bool disableAVXOptimizations = false;
26
27 std::tie(useVectorization, disableAVXOptimizations) =
29
30 if (!useVectorization) {
31 qWarning() << "WARNING: vector instructions disabled by the "
32 "\'amdDisableVectorWorkaround\' option!";
33 return FactoryType::template create<xsimd::generic>(
34 std::forward<Args>(param)...);
35 }
36
37 if (disableAVXOptimizations
38 && (xsimd::available_architectures().fma3_avx2
39 || xsimd::available_architectures().avx)) {
40 qWarning() << "WARNING: AVX and AVX2 optimizations are disabled by the "
41 "\'disableAVXOptimizations\' option!";
42 }
43
44#ifdef Q_PROCESSOR_X86
45
46 if (!disableAVXOptimizations &&
47 xsimd::available_architectures().fma3_avx2) {
48
49 return FactoryType::template create<xsimd::fma3<xsimd::avx2>>(
50 std::forward<Args>(param)...);
51
52 } else if (!disableAVXOptimizations &&
53 xsimd::available_architectures().avx) {
54
55 return FactoryType::template create<xsimd::avx>(
56 std::forward<Args>(param)...);
57
58 } else if (xsimd::available_architectures().sse4_1) {
59 return FactoryType::template create<xsimd::sse4_1>(
60 std::forward<Args>(param)...);
61 } else if (xsimd::available_architectures().ssse3) {
62 return FactoryType::template create<xsimd::ssse3>(
63 std::forward<Args>(param)...);
64 } else if (xsimd::available_architectures().sse2) {
65 return FactoryType::template create<xsimd::sse2>(
66 std::forward<Args>(param)...);
67 }
68#elif XSIMD_WITH_NEON64
69 if (xsimd::available_architectures().neon64) {
70 return FactoryType::template create<xsimd::neon64>(
71 std::forward<Args>(param)...);
72 }
73#elif XSIMD_WITH_NEON
74 if (xsimd::available_architectures().neon) {
75 return FactoryType::template create<xsimd::neon>(
76 std::forward<Args>(param)...);
77 }
78#endif // XSIMD_WITH_SSE2
79
80 return FactoryType::template create<xsimd::generic>(
81 std::forward<Args>(param)...);
82}
83
84template<class FactoryType, class... Args>
85auto createScalarClass(Args &&...params)
86{
87 return FactoryType::template create<xsimd::generic>(
88 std::forward<Args>(params)...);
89}
90
91#endif /* KO_MULTI_ARCH_BUILD_SUPPORT_H */
auto createOptimizedClass(Args &&...param)
KRITAMULTIARCH_EXPORT std::tuple< bool, bool > vectorizationConfiguration()
auto createScalarClass(Args &&...params)