From 44dfeb4479164e1862310d3daaf4e03347cb5466 Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Fri, 8 Nov 2024 14:22:05 +0100 Subject: [PATCH] radv,aco: add a separate function to compile the trap handler shader Signed-off-by: Samuel Pitoiset Part-of: --- .../compiler/aco_instruction_selection.cpp | 2 +- src/amd/compiler/aco_interface.cpp | 37 +++++++++++++++++-- src/amd/compiler/aco_interface.h | 4 ++ src/amd/compiler/aco_ir.h | 3 +- src/amd/vulkan/radv_shader.c | 18 ++++++++- 5 files changed, 56 insertions(+), 8 deletions(-) diff --git a/src/amd/compiler/aco_instruction_selection.cpp b/src/amd/compiler/aco_instruction_selection.cpp index 9ba1540f326..bf01a27f9bc 100644 --- a/src/amd/compiler/aco_instruction_selection.cpp +++ b/src/amd/compiler/aco_instruction_selection.cpp @@ -12451,7 +12451,7 @@ dump_sgpr_to_mem(isel_context* ctx, Operand rsrc, Operand data, uint32_t offset) } void -select_trap_handler_shader(Program* program, struct nir_shader* shader, ac_shader_config* config, +select_trap_handler_shader(Program* program, ac_shader_config* config, const struct aco_compiler_options* options, const struct aco_shader_info* info, const struct ac_shader_args* args) { diff --git a/src/amd/compiler/aco_interface.cpp b/src/amd/compiler/aco_interface.cpp index 46817ae9154..6b539e02027 100644 --- a/src/amd/compiler/aco_interface.cpp +++ b/src/amd/compiler/aco_interface.cpp @@ -269,10 +269,7 @@ aco_compile_shader(const struct aco_compiler_options* options, const struct aco_ program->debug.private_data = options->debug.private_data; /* Instruction Selection */ - if (info->is_trap_handler_shader) - select_trap_handler_shader(program.get(), shaders[0], &config, options, info, args); - else - select_program(program.get(), shader_count, shaders, &config, options, info, args); + select_program(program.get(), shader_count, shaders, &config, options, info, args); std::string llvm_ir = aco_postprocess_shader(options, info, program); @@ -408,6 +405,38 @@ aco_compile_ps_prolog(const struct aco_compiler_options* options, binary, true); } +void +aco_compile_trap_handler(const struct aco_compiler_options* options, + const struct aco_shader_info* info, const struct ac_shader_args* args, + aco_callback* build_binary, void** binary) +{ + init(); + + ac_shader_config config = {0}; + std::unique_ptr program{new Program}; + program->collect_statistics = false; + program->debug.func = NULL; + program->debug.private_data = NULL; + + select_trap_handler_shader(program.get(), &config, options, info, args); + + aco_postprocess_shader(options, info, program); + + /* assembly */ + std::vector code; + code.reserve(align(program->blocks[0].instructions.size() * 2, 16)); + unsigned exec_size = emit_program(program.get(), code); + + bool get_disasm = options->dump_shader || options->record_ir; + + std::string disasm; + if (get_disasm) + disasm = get_disasm_string(program.get(), code, exec_size); + + (*build_binary)(binary, &config, NULL, 0, disasm.c_str(), disasm.size(), program->statistics, 0, + exec_size, code.data(), code.size(), NULL, 0, NULL, 0); +} + uint64_t aco_get_codegen_flags() { diff --git a/src/amd/compiler/aco_interface.h b/src/amd/compiler/aco_interface.h index d9427c19533..a48a406f1fa 100644 --- a/src/amd/compiler/aco_interface.h +++ b/src/amd/compiler/aco_interface.h @@ -72,6 +72,10 @@ void aco_compile_ps_prolog(const struct aco_compiler_options* options, const struct ac_shader_args* args, aco_shader_part_callback* build_prolog, void** binary); +void aco_compile_trap_handler(const struct aco_compiler_options* options, + const struct aco_shader_info* info, const struct ac_shader_args* args, + aco_callback* build_binary, void** binary); + uint64_t aco_get_codegen_flags(); bool aco_is_gpu_supported(const struct radeon_info* info); diff --git a/src/amd/compiler/aco_ir.h b/src/amd/compiler/aco_ir.h index b5a26489b33..40fb9021e78 100644 --- a/src/amd/compiler/aco_ir.h +++ b/src/amd/compiler/aco_ir.h @@ -2223,8 +2223,7 @@ void init_program(Program* program, Stage stage, const struct aco_shader_info* i void select_program(Program* program, unsigned shader_count, struct nir_shader* const* shaders, ac_shader_config* config, const struct aco_compiler_options* options, const struct aco_shader_info* info, const struct ac_shader_args* args); -void select_trap_handler_shader(Program* program, struct nir_shader* shader, - ac_shader_config* config, +void select_trap_handler_shader(Program* program, ac_shader_config* config, const struct aco_compiler_options* options, const struct aco_shader_info* info, const struct ac_shader_args* args); diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c index bef3bcae242..ea888d633d7 100644 --- a/src/amd/vulkan/radv_shader.c +++ b/src/amd/vulkan/radv_shader.c @@ -3144,7 +3144,23 @@ radv_create_trap_handler_shader(struct radv_device *device) struct radv_shader_args args; radv_declare_shader_args(device, NULL, &info, stage, MESA_SHADER_NONE, &args); - struct radv_shader_binary *binary = shader_compile(device, &b.shader, 1, stage, &info, &args, &stage_key, &options); +#if AMD_LLVM_AVAILABLE + if (options.dump_shader || options.record_ir) + ac_init_llvm_once(); +#endif + + struct radv_shader_binary *binary = NULL; + struct aco_compiler_options ac_opts; + struct aco_shader_info ac_info; + + radv_aco_convert_shader_info(&ac_info, &info, &args, &device->cache_key, options.info->gfx_level); + radv_aco_convert_opts(&ac_opts, &options, &args, &stage_key); + + aco_compile_trap_handler(&ac_opts, &ac_info, &args.ac, &radv_aco_build_shader_binary, (void **)&binary); + binary->info = info; + + radv_postprocess_binary_config(device, binary, &args); + struct radv_shader *shader; radv_shader_create_uncached(device, binary, false, NULL, &shader);