xref: /aosp_15_r20/external/mesa3d/src/amd/compiler/tests/helpers.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © 2020 Valve Corporation
3*61046927SAndroid Build Coastguard Worker  *
4*61046927SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
5*61046927SAndroid Build Coastguard Worker  */
6*61046927SAndroid Build Coastguard Worker #ifndef ACO_TEST_HELPERS_H
7*61046927SAndroid Build Coastguard Worker #define ACO_TEST_HELPERS_H
8*61046927SAndroid Build Coastguard Worker 
9*61046927SAndroid Build Coastguard Worker #include "vulkan/vulkan.h"
10*61046927SAndroid Build Coastguard Worker 
11*61046927SAndroid Build Coastguard Worker #include "framework.h"
12*61046927SAndroid Build Coastguard Worker #include "ac_gpu_info.h"
13*61046927SAndroid Build Coastguard Worker #include "nir_builder.h"
14*61046927SAndroid Build Coastguard Worker #include <functional>
15*61046927SAndroid Build Coastguard Worker 
16*61046927SAndroid Build Coastguard Worker enum QoShaderDeclType {
17*61046927SAndroid Build Coastguard Worker    QoShaderDeclType_ubo,
18*61046927SAndroid Build Coastguard Worker    QoShaderDeclType_ssbo,
19*61046927SAndroid Build Coastguard Worker    QoShaderDeclType_img_buf,
20*61046927SAndroid Build Coastguard Worker    QoShaderDeclType_img,
21*61046927SAndroid Build Coastguard Worker    QoShaderDeclType_tex_buf,
22*61046927SAndroid Build Coastguard Worker    QoShaderDeclType_combined,
23*61046927SAndroid Build Coastguard Worker    QoShaderDeclType_tex,
24*61046927SAndroid Build Coastguard Worker    QoShaderDeclType_samp,
25*61046927SAndroid Build Coastguard Worker    QoShaderDeclType_in,
26*61046927SAndroid Build Coastguard Worker    QoShaderDeclType_out,
27*61046927SAndroid Build Coastguard Worker };
28*61046927SAndroid Build Coastguard Worker 
29*61046927SAndroid Build Coastguard Worker struct QoShaderDecl {
30*61046927SAndroid Build Coastguard Worker    const char* name;
31*61046927SAndroid Build Coastguard Worker    const char* type;
32*61046927SAndroid Build Coastguard Worker    QoShaderDeclType decl_type;
33*61046927SAndroid Build Coastguard Worker    // TODO: array size?
34*61046927SAndroid Build Coastguard Worker    unsigned location;
35*61046927SAndroid Build Coastguard Worker    unsigned component;
36*61046927SAndroid Build Coastguard Worker    unsigned binding;
37*61046927SAndroid Build Coastguard Worker    unsigned set;
38*61046927SAndroid Build Coastguard Worker };
39*61046927SAndroid Build Coastguard Worker 
40*61046927SAndroid Build Coastguard Worker struct QoShaderModuleCreateInfo {
41*61046927SAndroid Build Coastguard Worker    void* pNext;
42*61046927SAndroid Build Coastguard Worker    size_t spirvSize;
43*61046927SAndroid Build Coastguard Worker    const void* pSpirv;
44*61046927SAndroid Build Coastguard Worker    uint32_t declarationCount;
45*61046927SAndroid Build Coastguard Worker    const QoShaderDecl* pDeclarations;
46*61046927SAndroid Build Coastguard Worker    VkShaderStageFlagBits stage;
47*61046927SAndroid Build Coastguard Worker };
48*61046927SAndroid Build Coastguard Worker 
49*61046927SAndroid Build Coastguard Worker extern ac_shader_config config;
50*61046927SAndroid Build Coastguard Worker extern aco_shader_info info;
51*61046927SAndroid Build Coastguard Worker extern std::unique_ptr<aco::Program> program;
52*61046927SAndroid Build Coastguard Worker extern aco::Builder bld;
53*61046927SAndroid Build Coastguard Worker extern aco::Temp inputs[16];
54*61046927SAndroid Build Coastguard Worker extern nir_builder *nb;
55*61046927SAndroid Build Coastguard Worker 
56*61046927SAndroid Build Coastguard Worker namespace aco {
57*61046927SAndroid Build Coastguard Worker struct ra_test_policy;
58*61046927SAndroid Build Coastguard Worker }
59*61046927SAndroid Build Coastguard Worker 
60*61046927SAndroid Build Coastguard Worker void create_program(enum amd_gfx_level gfx_level, aco::Stage stage, unsigned wave_size = 64,
61*61046927SAndroid Build Coastguard Worker                     enum radeon_family family = CHIP_UNKNOWN);
62*61046927SAndroid Build Coastguard Worker bool setup_cs(const char* input_spec, enum amd_gfx_level gfx_level,
63*61046927SAndroid Build Coastguard Worker               enum radeon_family family = CHIP_UNKNOWN, const char* subvariant = "",
64*61046927SAndroid Build Coastguard Worker               unsigned wave_size = 64);
65*61046927SAndroid Build Coastguard Worker bool
66*61046927SAndroid Build Coastguard Worker setup_nir_cs(enum amd_gfx_level gfx_level, gl_shader_stage stage = MESA_SHADER_COMPUTE,
67*61046927SAndroid Build Coastguard Worker              enum radeon_family family = CHIP_UNKNOWN, const char* subvariant = "");
68*61046927SAndroid Build Coastguard Worker 
69*61046927SAndroid Build Coastguard Worker void finish_program(aco::Program* program, bool endpgm = true, bool dominance = false);
70*61046927SAndroid Build Coastguard Worker void finish_validator_test();
71*61046927SAndroid Build Coastguard Worker void finish_opt_test();
72*61046927SAndroid Build Coastguard Worker void finish_setup_reduce_temp_test();
73*61046927SAndroid Build Coastguard Worker void finish_lower_subdword_test();
74*61046927SAndroid Build Coastguard Worker void finish_ra_test(aco::ra_test_policy);
75*61046927SAndroid Build Coastguard Worker void finish_optimizer_postRA_test();
76*61046927SAndroid Build Coastguard Worker void finish_to_hw_instr_test();
77*61046927SAndroid Build Coastguard Worker void finish_schedule_vopd_test();
78*61046927SAndroid Build Coastguard Worker void finish_waitcnt_test();
79*61046927SAndroid Build Coastguard Worker void finish_insert_nops_test(bool endpgm = true);
80*61046927SAndroid Build Coastguard Worker void finish_form_hard_clause_test();
81*61046927SAndroid Build Coastguard Worker void finish_assembler_test();
82*61046927SAndroid Build Coastguard Worker void finish_isel_test(enum ac_hw_stage hw_stage = AC_HW_COMPUTE_SHADER, unsigned wave_size = 64);
83*61046927SAndroid Build Coastguard Worker 
84*61046927SAndroid Build Coastguard Worker void writeout(unsigned i, aco::Temp tmp = aco::Temp(0, aco::s1));
85*61046927SAndroid Build Coastguard Worker void writeout(unsigned i, aco::Builder::Result res);
86*61046927SAndroid Build Coastguard Worker void writeout(unsigned i, aco::Operand op);
87*61046927SAndroid Build Coastguard Worker void writeout(unsigned i, aco::Operand op0, aco::Operand op1);
88*61046927SAndroid Build Coastguard Worker 
89*61046927SAndroid Build Coastguard Worker aco::Temp fneg(aco::Temp src, aco::Builder b = bld);
90*61046927SAndroid Build Coastguard Worker aco::Temp fabs(aco::Temp src, aco::Builder b = bld);
91*61046927SAndroid Build Coastguard Worker aco::Temp f2f32(aco::Temp src, aco::Builder b = bld);
92*61046927SAndroid Build Coastguard Worker aco::Temp f2f16(aco::Temp src, aco::Builder b = bld);
93*61046927SAndroid Build Coastguard Worker aco::Temp u2u16(aco::Temp src, aco::Builder b = bld);
94*61046927SAndroid Build Coastguard Worker aco::Temp fadd(aco::Temp src0, aco::Temp src1, aco::Builder b = bld);
95*61046927SAndroid Build Coastguard Worker aco::Temp fmul(aco::Temp src0, aco::Temp src1, aco::Builder b = bld);
96*61046927SAndroid Build Coastguard Worker aco::Temp fma(aco::Temp src0, aco::Temp src1, aco::Temp src2, aco::Builder b = bld);
97*61046927SAndroid Build Coastguard Worker aco::Temp fsat(aco::Temp src, aco::Builder b = bld);
98*61046927SAndroid Build Coastguard Worker aco::Temp fmin(aco::Temp src0, aco::Temp src1, aco::Builder b = bld);
99*61046927SAndroid Build Coastguard Worker aco::Temp fmax(aco::Temp src0, aco::Temp src1, aco::Builder b = bld);
100*61046927SAndroid Build Coastguard Worker aco::Temp ext_ushort(aco::Temp src, unsigned idx, aco::Builder b = bld);
101*61046927SAndroid Build Coastguard Worker aco::Temp ext_ubyte(aco::Temp src, unsigned idx, aco::Builder b = bld);
102*61046927SAndroid Build Coastguard Worker void emit_divergent_if_else(aco::Program* prog, aco::Builder& b, aco::Operand cond,
103*61046927SAndroid Build Coastguard Worker                             std::function<void()> then, std::function<void()> els);
104*61046927SAndroid Build Coastguard Worker 
105*61046927SAndroid Build Coastguard Worker /* vulkan helpers */
106*61046927SAndroid Build Coastguard Worker VkDevice get_vk_device(enum amd_gfx_level gfx_level);
107*61046927SAndroid Build Coastguard Worker VkDevice get_vk_device(enum radeon_family family);
108*61046927SAndroid Build Coastguard Worker 
109*61046927SAndroid Build Coastguard Worker void print_pipeline_ir(VkDevice device, VkPipeline pipeline, VkShaderStageFlagBits stages,
110*61046927SAndroid Build Coastguard Worker                        const char* name, bool remove_encoding = false);
111*61046927SAndroid Build Coastguard Worker 
112*61046927SAndroid Build Coastguard Worker VkShaderModule __qoCreateShaderModule(VkDevice dev, const QoShaderModuleCreateInfo* info);
113*61046927SAndroid Build Coastguard Worker 
114*61046927SAndroid Build Coastguard Worker class PipelineBuilder {
115*61046927SAndroid Build Coastguard Worker public:
116*61046927SAndroid Build Coastguard Worker    /* inputs */
117*61046927SAndroid Build Coastguard Worker    VkDevice device;
118*61046927SAndroid Build Coastguard Worker    VkFormat color_outputs[16];
119*61046927SAndroid Build Coastguard Worker    VkFormat ds_output;
120*61046927SAndroid Build Coastguard Worker    VkPrimitiveTopology topology;
121*61046927SAndroid Build Coastguard Worker    VkSampleCountFlagBits samples;
122*61046927SAndroid Build Coastguard Worker    bool sample_shading_enable;
123*61046927SAndroid Build Coastguard Worker    float min_sample_shading;
124*61046927SAndroid Build Coastguard Worker    uint32_t patch_size;
125*61046927SAndroid Build Coastguard Worker    VkPipelineVertexInputStateCreateInfo vs_input;
126*61046927SAndroid Build Coastguard Worker    VkVertexInputBindingDescription vs_bindings[16];
127*61046927SAndroid Build Coastguard Worker    VkVertexInputAttributeDescription vs_attributes[16];
128*61046927SAndroid Build Coastguard Worker    VkPushConstantRange push_constant_range;
129*61046927SAndroid Build Coastguard Worker    uint64_t desc_layouts_used;
130*61046927SAndroid Build Coastguard Worker    unsigned num_desc_bindings[64];
131*61046927SAndroid Build Coastguard Worker    VkDescriptorSetLayoutBinding desc_bindings[64][64];
132*61046927SAndroid Build Coastguard Worker    VkPipelineShaderStageCreateInfo stages[5];
133*61046927SAndroid Build Coastguard Worker    VkShaderStageFlags owned_stages;
134*61046927SAndroid Build Coastguard Worker 
135*61046927SAndroid Build Coastguard Worker    /* outputs */
136*61046927SAndroid Build Coastguard Worker    VkGraphicsPipelineCreateInfo gfx_pipeline_info;
137*61046927SAndroid Build Coastguard Worker    VkComputePipelineCreateInfo cs_pipeline_info;
138*61046927SAndroid Build Coastguard Worker    VkDescriptorSetLayout desc_layouts[64];
139*61046927SAndroid Build Coastguard Worker    VkPipelineLayout pipeline_layout;
140*61046927SAndroid Build Coastguard Worker    VkRenderPass render_pass;
141*61046927SAndroid Build Coastguard Worker    VkPipeline pipeline;
142*61046927SAndroid Build Coastguard Worker 
143*61046927SAndroid Build Coastguard Worker    PipelineBuilder(VkDevice dev);
144*61046927SAndroid Build Coastguard Worker    ~PipelineBuilder();
145*61046927SAndroid Build Coastguard Worker 
146*61046927SAndroid Build Coastguard Worker    PipelineBuilder(const PipelineBuilder&) = delete;
147*61046927SAndroid Build Coastguard Worker    PipelineBuilder& operator=(const PipelineBuilder&) = delete;
148*61046927SAndroid Build Coastguard Worker 
149*61046927SAndroid Build Coastguard Worker    void add_desc_binding(VkShaderStageFlags stage_flags, uint32_t layout, uint32_t binding,
150*61046927SAndroid Build Coastguard Worker                          VkDescriptorType type, uint32_t count = 1);
151*61046927SAndroid Build Coastguard Worker 
152*61046927SAndroid Build Coastguard Worker    void add_vertex_binding(uint32_t binding, uint32_t stride,
153*61046927SAndroid Build Coastguard Worker                            VkVertexInputRate rate = VK_VERTEX_INPUT_RATE_VERTEX);
154*61046927SAndroid Build Coastguard Worker    void add_vertex_attribute(uint32_t location, uint32_t binding, VkFormat format, uint32_t offset);
155*61046927SAndroid Build Coastguard Worker 
156*61046927SAndroid Build Coastguard Worker    void add_resource_decls(QoShaderModuleCreateInfo* module);
157*61046927SAndroid Build Coastguard Worker    void add_io_decls(QoShaderModuleCreateInfo* module);
158*61046927SAndroid Build Coastguard Worker 
159*61046927SAndroid Build Coastguard Worker    void add_stage(VkShaderStageFlagBits stage, VkShaderModule module, const char* name = "main");
160*61046927SAndroid Build Coastguard Worker    void add_stage(VkShaderStageFlagBits stage, QoShaderModuleCreateInfo module,
161*61046927SAndroid Build Coastguard Worker                   const char* name = "main");
162*61046927SAndroid Build Coastguard Worker    void add_vsfs(VkShaderModule vs, VkShaderModule fs);
163*61046927SAndroid Build Coastguard Worker    void add_vsfs(QoShaderModuleCreateInfo vs, QoShaderModuleCreateInfo fs);
164*61046927SAndroid Build Coastguard Worker    void add_cs(VkShaderModule cs);
165*61046927SAndroid Build Coastguard Worker    void add_cs(QoShaderModuleCreateInfo cs);
166*61046927SAndroid Build Coastguard Worker 
167*61046927SAndroid Build Coastguard Worker    bool is_compute();
168*61046927SAndroid Build Coastguard Worker 
169*61046927SAndroid Build Coastguard Worker    void create_pipeline();
170*61046927SAndroid Build Coastguard Worker 
171*61046927SAndroid Build Coastguard Worker    void print_ir(VkShaderStageFlagBits stages, const char* name, bool remove_encoding = false);
172*61046927SAndroid Build Coastguard Worker 
173*61046927SAndroid Build Coastguard Worker private:
174*61046927SAndroid Build Coastguard Worker    void create_compute_pipeline();
175*61046927SAndroid Build Coastguard Worker    void create_graphics_pipeline();
176*61046927SAndroid Build Coastguard Worker };
177*61046927SAndroid Build Coastguard Worker 
178*61046927SAndroid Build Coastguard Worker #endif /* ACO_TEST_HELPERS_H */
179