diff options
author | Daniel Schürmann <daniel@schuermann.dev> | 2023-02-21 14:21:39 +0100 |
---|---|---|
committer | Marge Bot <emma+marge@anholt.net> | 2023-03-16 01:40:30 +0000 |
commit | 4b92a532859e5a027958ee348bcc50d678aca598 (patch) | |
tree | ea8350b02939d16d7cc8150e62607cb02509230d /src/amd/compiler/aco_interface.cpp | |
parent | 6446b791681419397a8c98df9b06a07a1d34f5bb (diff) | |
download | mesa-4b92a532859e5a027958ee348bcc50d678aca598.tar.gz |
radv: add radv_create_rt_prolog()
Co-authored-by: Friedrich Vock <friedrich.vock@gmx.de>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21780>
Diffstat (limited to 'src/amd/compiler/aco_interface.cpp')
-rw-r--r-- | src/amd/compiler/aco_interface.cpp | 54 |
1 files changed, 42 insertions, 12 deletions
diff --git a/src/amd/compiler/aco_interface.cpp b/src/amd/compiler/aco_interface.cpp index 0664d644939..bb4f6e278ee 100644 --- a/src/amd/compiler/aco_interface.cpp +++ b/src/amd/compiler/aco_interface.cpp @@ -252,18 +252,48 @@ aco_compile_shader(const struct aco_compiler_options* options, if (program->collect_statistics) stats_size = aco_num_statistics * sizeof(uint32_t); - (*build_binary)(binary, - shaders[shader_count - 1]->info.stage, - &config, - llvm_ir.c_str(), - llvm_ir.size(), - disasm.c_str(), - disasm.size(), - program->statistics, - stats_size, - exec_size, - code.data(), - code.size()); + (*build_binary)(binary, shaders[shader_count - 1]->info.stage, &config, llvm_ir.c_str(), + llvm_ir.size(), disasm.c_str(), disasm.size(), program->statistics, stats_size, + exec_size, code.data(), code.size()); +} + +void +aco_compile_rt_prolog(const struct aco_compiler_options* options, + const struct aco_shader_info* info, const struct ac_shader_args* in_args, + const struct ac_shader_args* out_args, aco_callback* build_prolog, + void** binary) +{ + aco::init(); + + /* create program */ + ac_shader_config config = {0}; + std::unique_ptr<aco::Program> program{new aco::Program}; + program->collect_statistics = false; + program->debug.func = NULL; + program->debug.private_data = NULL; + + aco::select_rt_prolog(program.get(), &config, options, info, in_args, out_args); + aco::insert_wait_states(program.get()); + aco::insert_NOPs(program.get()); + if (program->gfx_level >= GFX10) + aco::form_hard_clauses(program.get()); + + if (options->dump_shader) + aco_print_program(program.get(), stderr); + + /* assembly */ + std::vector<uint32_t> code; + code.reserve(align(program->blocks[0].instructions.size() * 2, 16)); + unsigned exec_size = aco::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_prolog)(binary, MESA_SHADER_COMPUTE, &config, NULL, 0, disasm.c_str(), disasm.size(), + program->statistics, 0, exec_size, code.data(), code.size()); } void |