1 | #pragma once |
---|---|
2 | |
3 | #include "taichi/util/lang_util.h" |
4 | |
5 | #include "taichi/codegen/spirv/snode_struct_compiler.h" |
6 | #include "taichi/codegen/spirv/kernel_utils.h" |
7 | |
8 | #include <spirv-tools/libspirv.hpp> |
9 | #include <spirv-tools/optimizer.hpp> |
10 | |
11 | namespace taichi::lang { |
12 | |
13 | class Kernel; |
14 | |
15 | namespace spirv { |
16 | |
17 | void lower(const CompileConfig &config, Kernel *kernel); |
18 | |
19 | class KernelCodegen { |
20 | public: |
21 | struct Params { |
22 | std::string ti_kernel_name; |
23 | Kernel *kernel; |
24 | std::vector<CompiledSNodeStructs> compiled_structs; |
25 | Arch arch; |
26 | DeviceCapabilityConfig caps; |
27 | bool enable_spv_opt{true}; |
28 | }; |
29 | |
30 | explicit KernelCodegen(const Params ¶ms); |
31 | |
32 | void run(TaichiKernelAttributes &kernel_attribs, |
33 | std::vector<std::vector<uint32_t>> &generated_spirv); |
34 | |
35 | private: |
36 | Params params_; |
37 | KernelContextAttributes ctx_attribs_; |
38 | |
39 | std::unique_ptr<spvtools::Optimizer> spirv_opt_{nullptr}; |
40 | std::unique_ptr<spvtools::SpirvTools> spirv_tools_{nullptr}; |
41 | spvtools::OptimizerOptions spirv_opt_options_; |
42 | }; |
43 | |
44 | } // namespace spirv |
45 | } // namespace taichi::lang |
46 |