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