X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Fradeon%2Fradeon_llvm_emit.c;h=3d0987624a6e3b8a86eb6fea99afffa4f8d9e71c;hb=e945235aed86f473f27362bae902fbe67d5f0f20;hp=dc871d79717bd6292800298bffe1980f8030742c;hpb=43b243236824ce80daaa5cb4af5db94aaca0855e;p=mesa.git diff --git a/src/gallium/drivers/radeon/radeon_llvm_emit.c b/src/gallium/drivers/radeon/radeon_llvm_emit.c index dc871d79717..3d0987624a6 100644 --- a/src/gallium/drivers/radeon/radeon_llvm_emit.c +++ b/src/gallium/drivers/radeon/radeon_llvm_emit.c @@ -23,10 +23,15 @@ * Authors: Tom Stellard * */ + #include "radeon_llvm_emit.h" #include "radeon_elf_util.h" +#include "c11/threads.h" +#include "gallivm/lp_bld_misc.h" +#include "util/u_debug.h" #include "util/u_memory.h" #include "pipe/p_shader_tokens.h" +#include "pipe/p_state.h" #include #include @@ -62,6 +67,8 @@ void radeon_llvm_shader_type(LLVMValueRef F, unsigned type) switch (type) { case TGSI_PROCESSOR_VERTEX: + case TGSI_PROCESSOR_TESS_CTRL: + case TGSI_PROCESSOR_TESS_EVAL: llvm_type = RADEON_LLVM_SHADER_VS; break; case TGSI_PROCESSOR_GEOMETRY: @@ -80,57 +87,84 @@ void radeon_llvm_shader_type(LLVMValueRef F, unsigned type) sprintf(Str, "%1d", llvm_type); LLVMAddTargetDependentFunctionAttr(F, "ShaderType", Str); - - if (type != TGSI_PROCESSOR_COMPUTE) { - LLVMAddTargetDependentFunctionAttr(F, "unsafe-fp-math", "true"); - } } static void init_r600_target() { - static unsigned initialized = 0; - if (!initialized) { - LLVMInitializeR600TargetInfo(); - LLVMInitializeR600Target(); - LLVMInitializeR600TargetMC(); - LLVMInitializeR600AsmPrinter(); - initialized = 1; - } + gallivm_init_llvm_targets(); +#if HAVE_LLVM < 0x0307 + LLVMInitializeR600TargetInfo(); + LLVMInitializeR600Target(); + LLVMInitializeR600TargetMC(); + LLVMInitializeR600AsmPrinter(); +#else + LLVMInitializeAMDGPUTargetInfo(); + LLVMInitializeAMDGPUTarget(); + LLVMInitializeAMDGPUTargetMC(); + LLVMInitializeAMDGPUAsmPrinter(); + +#endif } -static LLVMTargetRef get_r600_target() +static once_flag init_r600_target_once_flag = ONCE_FLAG_INIT; + +LLVMTargetRef radeon_llvm_get_r600_target(const char *triple) { LLVMTargetRef target = NULL; + char *err_message = NULL; - for (target = LLVMGetFirstTarget(); target; - target = LLVMGetNextTarget(target)) { - if (!strncmp(LLVMGetTargetName(target), "r600", 4)) { - break; - } - } + call_once(&init_r600_target_once_flag, init_r600_target); - if (!target) { - fprintf(stderr, "Can't find target r600\n"); + if (LLVMGetTargetFromTriple(triple, &target, &err_message)) { + fprintf(stderr, "Cannot find target for triple %s ", triple); + if (err_message) { + fprintf(stderr, "%s\n", err_message); + } + LLVMDisposeMessage(err_message); return NULL; } return target; } -#if HAVE_LLVM >= 0x0305 +struct radeon_llvm_diagnostics { + struct pipe_debug_callback *debug; + unsigned retval; +}; static void radeonDiagnosticHandler(LLVMDiagnosticInfoRef di, void *context) { - if (LLVMGetDiagInfoSeverity(di) == LLVMDSError) { - unsigned int *diagnosticflag = (unsigned int *)context; - char *diaginfo_message = LLVMGetDiagInfoDescription(di); + struct radeon_llvm_diagnostics *diag = (struct radeon_llvm_diagnostics *)context; + LLVMDiagnosticSeverity severity = LLVMGetDiagInfoSeverity(di); + char *description = LLVMGetDiagInfoDescription(di); + const char *severity_str = NULL; + + switch (severity) { + case LLVMDSError: + severity_str = "error"; + break; + case LLVMDSWarning: + severity_str = "warning"; + break; + case LLVMDSRemark: + severity_str = "remark"; + break; + case LLVMDSNote: + severity_str = "note"; + break; + default: + severity_str = "unknown"; + } + + pipe_debug_message(diag->debug, SHADER_INFO, + "LLVM diagnostic (%s): %s", severity_str, description); - *diagnosticflag = 1; - fprintf(stderr,"LLVM triggered Diagnostic Handler: %s\n", diaginfo_message); - LLVMDisposeMessage(diaginfo_message); + if (severity == LLVMDSError) { + diag->retval = 1; + fprintf(stderr,"LLVM triggered Diagnostic Handler: %s\n", description); } -} -#endif + LLVMDisposeMessage(description); +} /** * Compile an LLVM module to machine code. @@ -138,73 +172,73 @@ static void radeonDiagnosticHandler(LLVMDiagnosticInfoRef di, void *context) * @returns 0 for success, 1 for failure */ unsigned radeon_llvm_compile(LLVMModuleRef M, struct radeon_shader_binary *binary, - const char *gpu_family, unsigned dump) + const char *gpu_family, + LLVMTargetMachineRef tm, + struct pipe_debug_callback *debug) { - - LLVMTargetRef target; - LLVMTargetMachineRef tm; + struct radeon_llvm_diagnostics diag; char cpu[CPU_STRING_LEN]; char fs[FS_STRING_LEN]; char *err; + bool dispose_tm = false; LLVMContextRef llvm_ctx; - unsigned rval = 0; LLVMMemoryBufferRef out_buffer; unsigned buffer_size; const char *buffer_data; char triple[TRIPLE_STRING_LEN]; LLVMBool mem_err; - /* initialise */ - init_r600_target(); + diag.debug = debug; + diag.retval = 0; - target = get_r600_target(); - if (!target) { - return 1; - } - - strncpy(cpu, gpu_family, CPU_STRING_LEN); - memset(fs, 0, sizeof(fs)); - if (dump) { - LLVMDumpModule(M); + if (!tm) { + strncpy(triple, "r600--", TRIPLE_STRING_LEN); + LLVMTargetRef target = radeon_llvm_get_r600_target(triple); + if (!target) { + return 1; + } + strncpy(cpu, gpu_family, CPU_STRING_LEN); + memset(fs, 0, sizeof(fs)); strncpy(fs, "+DumpCode", FS_STRING_LEN); + tm = LLVMCreateTargetMachine(target, triple, cpu, fs, + LLVMCodeGenLevelDefault, LLVMRelocDefault, + LLVMCodeModelDefault); + dispose_tm = true; } - strncpy(triple, "r600--", TRIPLE_STRING_LEN); /* Setup Diagnostic Handler*/ llvm_ctx = LLVMGetModuleContext(M); -#if HAVE_LLVM >= 0x0305 - LLVMContextSetDiagnosticHandler(llvm_ctx, radeonDiagnosticHandler, &rval); -#endif - rval = 0; + LLVMContextSetDiagnosticHandler(llvm_ctx, radeonDiagnosticHandler, &diag); /* Compile IR*/ - tm = LLVMCreateTargetMachine(target, triple, cpu, fs, - LLVMCodeGenLevelDefault, LLVMRelocDefault, - LLVMCodeModelDefault); mem_err = LLVMTargetMachineEmitToMemoryBuffer(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); - LLVMDisposeTargetMachine(tm); - return 1; - } - - if (0 != rval) { - fprintf(stderr, "%s: Processing Diag Flag\n", __FUNCTION__); + diag.retval = 1; + goto out; } /* Extract Shader Code*/ buffer_size = LLVMGetBufferSize(out_buffer); buffer_data = LLVMGetBufferStart(out_buffer); - radeon_elf_read(buffer_data, buffer_size, binary, dump); + radeon_elf_read(buffer_data, buffer_size, binary); /* Clean up */ LLVMDisposeMemoryBuffer(out_buffer); - LLVMDisposeTargetMachine(tm); - return rval; + +out: + if (dispose_tm) { + LLVMDisposeTargetMachine(tm); + } + if (diag.retval != 0) + pipe_debug_message(debug, SHADER_INFO, "LLVM compile failed"); + return diag.retval; }