1 | #include "extension.h" |
2 | |
3 | #include <unordered_map> |
4 | #include <unordered_set> |
5 | |
6 | namespace taichi::lang { |
7 | |
8 | bool 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 | |