radeonsi: use ac_compile_module_to_binary to reduce compile times
Compile times of simple shaders are reduced by ~20%. Compile times of prologs and epilogs are reduced by up to 40%. Reviewed-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
parent
0075e5fed8
commit
ff330055e9
|
@ -116,10 +116,12 @@ static void si_init_compiler(struct si_screen *sscreen,
|
|||
|
||||
ac_init_llvm_once();
|
||||
ac_init_llvm_compiler(compiler, true, sscreen->info.family, tm_options);
|
||||
compiler->passes = ac_create_llvm_passes(compiler->tm);
|
||||
}
|
||||
|
||||
static void si_destroy_compiler(struct ac_llvm_compiler *compiler)
|
||||
{
|
||||
ac_destroy_llvm_passes(compiler->passes);
|
||||
ac_destroy_llvm_compiler(compiler);
|
||||
}
|
||||
|
||||
|
|
|
@ -85,12 +85,7 @@ unsigned si_llvm_compile(LLVMModuleRef M, struct ac_shader_binary *binary,
|
|||
struct pipe_debug_callback *debug)
|
||||
{
|
||||
struct si_llvm_diagnostics diag;
|
||||
char *err;
|
||||
LLVMContextRef llvm_ctx;
|
||||
LLVMMemoryBufferRef out_buffer;
|
||||
unsigned buffer_size;
|
||||
const char *buffer_data;
|
||||
LLVMBool mem_err;
|
||||
|
||||
diag.debug = debug;
|
||||
diag.retval = 0;
|
||||
|
@ -100,34 +95,10 @@ unsigned si_llvm_compile(LLVMModuleRef M, struct ac_shader_binary *binary,
|
|||
|
||||
LLVMContextSetDiagnosticHandler(llvm_ctx, si_diagnostic_handler, &diag);
|
||||
|
||||
/* Compile IR*/
|
||||
mem_err = LLVMTargetMachineEmitToMemoryBuffer(compiler->tm, M,
|
||||
LLVMObjectFile, &err,
|
||||
&out_buffer);
|
||||
|
||||
/* Process Errors/Warnings */
|
||||
if (mem_err) {
|
||||
fprintf(stderr, "%s: %s", __FUNCTION__, err);
|
||||
pipe_debug_message(debug, SHADER_INFO,
|
||||
"LLVM emit error: %s", err);
|
||||
FREE(err);
|
||||
/* Compile IR. */
|
||||
if (!ac_compile_module_to_binary(compiler->passes, M, binary))
|
||||
diag.retval = 1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Extract Shader Code*/
|
||||
buffer_size = LLVMGetBufferSize(out_buffer);
|
||||
buffer_data = LLVMGetBufferStart(out_buffer);
|
||||
|
||||
if (!ac_elf_read(buffer_data, buffer_size, binary)) {
|
||||
fprintf(stderr, "radeonsi: cannot read an ELF shader binary\n");
|
||||
diag.retval = 1;
|
||||
}
|
||||
|
||||
/* Clean up */
|
||||
LLVMDisposeMemoryBuffer(out_buffer);
|
||||
|
||||
out:
|
||||
if (diag.retval != 0)
|
||||
pipe_debug_message(debug, SHADER_INFO, "LLVM compile failed");
|
||||
return diag.retval;
|
||||
|
|
Loading…
Reference in New Issue