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
11namespace taichi::lang {
12
13class Kernel;
14
15namespace spirv {
16
17void lower(const CompileConfig &config, Kernel *kernel);
18
19class 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 &params);
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