1#include "extension.h"
2
3#include <unordered_map>
4#include <unordered_set>
5
6namespace taichi::lang {
7
8bool is_extension_supported(Arch arch, Extension ext) {
9 static std::unordered_map<Arch, std::unordered_set<Extension>> arch2ext = {
10 {Arch::x64,
11 {Extension::sparse, Extension::quant, Extension::quant_basic,
12 Extension::data64, Extension::adstack, Extension::assertion,
13 Extension::extfunc, Extension::mesh}},
14 {Arch::arm64,
15 {Extension::sparse, Extension::quant, Extension::quant_basic,
16 Extension::data64, Extension::adstack, Extension::assertion,
17 Extension::mesh}},
18 {Arch::cuda,
19 {Extension::sparse, Extension::quant, Extension::quant_basic,
20 Extension::data64, Extension::adstack, Extension::bls,
21 Extension::assertion, Extension::mesh}},
22 {Arch::amdgpu, {Extension::assertion}},
23 {Arch::metal, {}},
24 {Arch::opengl, {Extension::extfunc}},
25 {Arch::gles, {}},
26 {Arch::vulkan, {}},
27 {Arch::dx11, {}},
28 {Arch::cc, {Extension::data64, Extension::extfunc, Extension::adstack}},
29 };
30 // if (with_opengl_extension_data64())
31 // arch2ext[Arch::opengl].insert(Extension::data64); // TODO: singleton
32 const auto &exts = arch2ext[arch];
33 return exts.find(ext) != exts.end();
34}
35
36} // namespace taichi::lang
37