summaryrefslogtreecommitdiff
path: root/src/amd/compiler/aco_interface.cpp
diff options
context:
space:
mode:
authorDaniel Schürmann <daniel@schuermann.dev>2023-02-21 14:21:39 +0100
committerMarge Bot <emma+marge@anholt.net>2023-03-16 01:40:30 +0000
commit4b92a532859e5a027958ee348bcc50d678aca598 (patch)
treeea8350b02939d16d7cc8150e62607cb02509230d /src/amd/compiler/aco_interface.cpp
parent6446b791681419397a8c98df9b06a07a1d34f5bb (diff)
downloadmesa-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.cpp54
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