71
72
struct ra_test_policy;
74
void create_program(enum amd_gfx_level gfx_level, aco::Stage stage,
75
unsigned wave_size=64, enum radeon_family family=CHIP_UNKNOWN);
76
bool setup_cs(const char *input_spec, enum amd_gfx_level gfx_level,
77
enum radeon_family family=CHIP_UNKNOWN, const char* subvariant = "",
78
unsigned wave_size=64);
75
void create_program(enum amd_gfx_level gfx_level, aco::Stage stage, unsigned wave_size = 64,
76
enum radeon_family family = CHIP_UNKNOWN);
77
bool setup_cs(const char* input_spec, enum amd_gfx_level gfx_level,
78
enum radeon_family family = CHIP_UNKNOWN, const char* subvariant = "",
79
unsigned wave_size = 64);
80
void finish_program(aco::Program *program);
81
void finish_program(aco::Program* program);
81
82
void finish_validator_test();
82
83
void finish_opt_test();
83
84
void finish_setup_reduce_temp_test();
84
void finish_ra_test(aco::ra_test_policy, bool lower=false);
85
void finish_ra_test(aco::ra_test_policy, bool lower = false);
85
86
void finish_optimizer_postRA_test();
86
87
void finish_to_hw_instr_test();
87
88
void finish_waitcnt_test();
89
90
void finish_form_hard_clause_test();
90
91
void finish_assembler_test();
92
void writeout(unsigned i, aco::Temp tmp=aco::Temp(0, aco::s1));
93
void writeout(unsigned i, aco::Temp tmp = aco::Temp(0, aco::s1));
93
94
void writeout(unsigned i, aco::Builder::Result res);
94
95
void writeout(unsigned i, aco::Operand op);
95
96
void writeout(unsigned i, aco::Operand op0, aco::Operand op1);
97
aco::Temp fneg(aco::Temp src, aco::Builder b=bld);
98
aco::Temp fabs(aco::Temp src, aco::Builder b=bld);
99
aco::Temp f2f32(aco::Temp src, aco::Builder b=bld);
100
aco::Temp f2f16(aco::Temp src, aco::Builder b=bld);
101
aco::Temp u2u16(aco::Temp src, aco::Builder b=bld);
102
aco::Temp fadd(aco::Temp src0, aco::Temp src1, aco::Builder b=bld);
103
aco::Temp fmul(aco::Temp src0, aco::Temp src1, aco::Builder b=bld);
104
aco::Temp fma(aco::Temp src0, aco::Temp src1, aco::Temp src2, aco::Builder b=bld);
105
aco::Temp fsat(aco::Temp src, aco::Builder b=bld);
106
aco::Temp fmin(aco::Temp src0, aco::Temp src1, aco::Builder b=bld);
107
aco::Temp fmax(aco::Temp src0, aco::Temp src1, aco::Builder b=bld);
108
aco::Temp ext_ushort(aco::Temp src, unsigned idx, aco::Builder b=bld);
109
aco::Temp ext_ubyte(aco::Temp src, unsigned idx, aco::Builder b=bld);
110
void emit_divergent_if_else(aco::Program* prog, aco::Builder& b, aco::Operand cond, std::function<void()> then,
111
std::function<void()> els);
98
aco::Temp fneg(aco::Temp src, aco::Builder b = bld);
99
aco::Temp fabs(aco::Temp src, aco::Builder b = bld);
100
aco::Temp f2f32(aco::Temp src, aco::Builder b = bld);
101
aco::Temp f2f16(aco::Temp src, aco::Builder b = bld);
102
aco::Temp u2u16(aco::Temp src, aco::Builder b = bld);
103
aco::Temp fadd(aco::Temp src0, aco::Temp src1, aco::Builder b = bld);
104
aco::Temp fmul(aco::Temp src0, aco::Temp src1, aco::Builder b = bld);
105
aco::Temp fma(aco::Temp src0, aco::Temp src1, aco::Temp src2, aco::Builder b = bld);
106
aco::Temp fsat(aco::Temp src, aco::Builder b = bld);
107
aco::Temp fmin(aco::Temp src0, aco::Temp src1, aco::Builder b = bld);
108
aco::Temp fmax(aco::Temp src0, aco::Temp src1, aco::Builder b = bld);
109
aco::Temp ext_ushort(aco::Temp src, unsigned idx, aco::Builder b = bld);
110
aco::Temp ext_ubyte(aco::Temp src, unsigned idx, aco::Builder b = bld);
111
void emit_divergent_if_else(aco::Program* prog, aco::Builder& b, aco::Operand cond,
112
std::function<void()> then, std::function<void()> els);
113
114
/* vulkan helpers */
114
115
VkDevice get_vk_device(enum amd_gfx_level gfx_level);
115
116
VkDevice get_vk_device(enum radeon_family family);
117
118
void print_pipeline_ir(VkDevice device, VkPipeline pipeline, VkShaderStageFlagBits stages,
118
const char *name, bool remove_encoding=false);
119
const char* name, bool remove_encoding = false);
120
VkShaderModule __qoCreateShaderModule(VkDevice dev, const QoShaderModuleCreateInfo *info);
121
VkShaderModule __qoCreateShaderModule(VkDevice dev, const QoShaderModuleCreateInfo* info);
122
123
class PipelineBuilder {
152
153
~PipelineBuilder();
154
155
PipelineBuilder(const PipelineBuilder&) = delete;
155
PipelineBuilder& operator = (const PipelineBuilder&) = delete;
157
void add_desc_binding(VkShaderStageFlags stage_flags, uint32_t layout,
158
uint32_t binding, VkDescriptorType type, uint32_t count=1);
160
void add_vertex_binding(uint32_t binding, uint32_t stride, VkVertexInputRate rate=VK_VERTEX_INPUT_RATE_VERTEX);
156
PipelineBuilder& operator=(const PipelineBuilder&) = delete;
158
void add_desc_binding(VkShaderStageFlags stage_flags, uint32_t layout, uint32_t binding,
159
VkDescriptorType type, uint32_t count = 1);
161
void add_vertex_binding(uint32_t binding, uint32_t stride,
162
VkVertexInputRate rate = VK_VERTEX_INPUT_RATE_VERTEX);
161
163
void add_vertex_attribute(uint32_t location, uint32_t binding, VkFormat format, uint32_t offset);
163
void add_resource_decls(QoShaderModuleCreateInfo *module);
164
void add_io_decls(QoShaderModuleCreateInfo *module);
165
void add_resource_decls(QoShaderModuleCreateInfo* module);
166
void add_io_decls(QoShaderModuleCreateInfo* module);
166
void add_stage(VkShaderStageFlagBits stage, VkShaderModule module, const char *name="main");
167
void add_stage(VkShaderStageFlagBits stage, QoShaderModuleCreateInfo module, const char *name="main");
168
void add_stage(VkShaderStageFlagBits stage, VkShaderModule module, const char* name = "main");
169
void add_stage(VkShaderStageFlagBits stage, QoShaderModuleCreateInfo module,
170
const char* name = "main");
168
171
void add_vsfs(VkShaderModule vs, VkShaderModule fs);
169
172
void add_vsfs(QoShaderModuleCreateInfo vs, QoShaderModuleCreateInfo fs);
170
173
void add_cs(VkShaderModule cs);