Mesa (master): gallivm: Make sure module has the correct data layout when pass manager runs
Module: Mesa Branch: master Commit: 14e525a4d70649eb10185bebd2aef9dc339fb5e6 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=14e525a4d70649eb10185bebd2aef9dc339fb5e6 Author: Tom Stellard Date: Fri May 5 01:07:00 2017 + gallivm: Make sure module has the correct data layout when pass manager runs The datalayout for modules was purposely not being set in order to work around the fact that the ExecutionEngine requires that the module's datalayout matches the datalayout of the TargetMachine that the ExecutionEngine is using. When the pass manager runs on a module with no datalayout, it uses the default datalayout which is little-endian. This causes problems on big-endian targets, because some optimizations that are legal on little-endian or illegal on big-endian. To resolve this, we set the datalayout prior to running the pass manager, and then clear it before creating the ExectionEngine. This patch fixes a lot of piglit tests on big-endian ppc64. Cc: mesa-sta...@lists.freedesktop.org --- src/gallium/auxiliary/gallivm/lp_bld_init.c | 34 +++-- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/src/gallium/auxiliary/gallivm/lp_bld_init.c b/src/gallium/auxiliary/gallivm/lp_bld_init.c index ef2580e826..9f1ade68c4 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_init.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_init.c @@ -125,19 +125,6 @@ create_pass_manager(struct gallivm_state *gallivm) LLVMAddTargetData(gallivm->target, gallivm->passmgr); #endif - /* Setting the module's DataLayout to an empty string will cause the -* ExecutionEngine to copy to the DataLayout string from its target -* machine to the module. As of LLVM 3.8 the module and the execution -* engine are required to have the same DataLayout. -* -* TODO: This is just a temporary work-around. The correct solution is -* for gallivm_init_state() to create a TargetMachine and pull the -* DataLayout from there. Currently, the TargetMachine used by llvmpipe -* is being implicitly created by the EngineBuilder in -* lp_build_create_jit_compiler_for_module() -*/ - -#if HAVE_LLVM < 0x0308 { char *td_str; // New ones from the Module. @@ -145,9 +132,6 @@ create_pass_manager(struct gallivm_state *gallivm) LLVMSetDataLayout(gallivm->module, td_str); free(td_str); } -#else - LLVMSetDataLayout(gallivm->module, ""); -#endif if ((gallivm_debug & GALLIVM_DEBUG_NO_OPT) == 0) { /* These are the passes currently listed in llvm-c/Transforms/Scalar.h, @@ -628,6 +612,24 @@ gallivm_compile_module(struct gallivm_state *gallivm) } if (use_mcjit) { + /* Setting the module's DataLayout to an empty string will cause the + * ExecutionEngine to copy to the DataLayout string from its target + * machine to the module. As of LLVM 3.8 the module and the execution + * engine are required to have the same DataLayout. + * + * We must make sure we do this after running the optimization passes, + * because those passes need a correct datalayout string. For example, + * if those optimization passes see an empty datalayout, they will assume + * this is a little endian target and will do optimizations that break big + * endian machines. + * + * TODO: This is just a temporary work-around. The correct solution is + * for gallivm_init_state() to create a TargetMachine and pull the + * DataLayout from there. Currently, the TargetMachine used by llvmpipe + * is being implicitly created by the EngineBuilder in + * lp_build_create_jit_compiler_for_module() + */ + LLVMSetDataLayout(gallivm->module, ""); assert(!gallivm->engine); if (!init_gallivm_engine(gallivm)) { assert(0); ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): radeonsi: Fix build on LLVM < 3.9 v2
Module: Mesa Branch: master Commit: 226a2c6d6eaa94919aa865edfe207c615bc741e7 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=226a2c6d6eaa94919aa865edfe207c615bc741e7 Author: Tom Stellard Date: Wed Feb 1 00:18:01 2017 + radeonsi: Fix build on LLVM < 3.9 v2 This was broken by: e0cc0a614c96011958bc3a1b84da9168e0e1ccbb v2: - Use preprocessor macro Tested-by: Mark Janes --- src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c | 6 -- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c b/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c index 205686a..c7445e0 100644 --- a/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c +++ b/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c @@ -1256,8 +1256,6 @@ void si_llvm_context_init(struct si_shader_context *ctx, const struct tgsi_token *tokens) { struct lp_type type; - LLVMTargetDataRef data_layout = LLVMCreateTargetDataLayout(tm); - char *data_layout_str = LLVMCopyStringRepOfTargetData(data_layout); /* Initialize the gallivm object: * We are only using the module, context, and builder fields of this struct. @@ -1275,9 +1273,13 @@ void si_llvm_context_init(struct si_shader_context *ctx, ctx->gallivm.context); LLVMSetTarget(ctx->gallivm.module, "amdgcn--"); +#if HAVE_LLVM >= 0x0309 + LLVMTargetDataRef data_layout = LLVMCreateTargetDataLayout(tm); + char *data_layout_str = LLVMCopyStringRepOfTargetData(data_layout); LLVMSetDataLayout(ctx->gallivm.module, data_layout_str); LLVMDisposeTargetData(data_layout); LLVMDisposeMessage(data_layout_str); +#endif bool unsafe_fpmath = (sscreen->b.debug_flags & DBG_UNSAFE_MATH) != 0; ctx->gallivm.builder = lp_create_builder(ctx->gallivm.context, ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): radeonsi: Set datalayout on the llvm module
Module: Mesa Branch: master Commit: e0cc0a614c96011958bc3a1b84da9168e0e1ccbb URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=e0cc0a614c96011958bc3a1b84da9168e0e1ccbb Author: Tom Stellard Date: Thu Dec 15 15:25:49 2016 + radeonsi: Set datalayout on the llvm module This prevents LLVM from using sext instructions for local memory offsets and allows the backend to fold immediate offsets into the instruction. This also prevents some incorrect code generation for ptrtoint and inttoptr instructions. Reviewed-by: Nicolai Hähnle --- src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c | 6 ++ 1 file changed, 6 insertions(+) diff --git a/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c b/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c index 4f355e5..205686a 100644 --- a/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c +++ b/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c @@ -1256,6 +1256,8 @@ void si_llvm_context_init(struct si_shader_context *ctx, const struct tgsi_token *tokens) { struct lp_type type; + LLVMTargetDataRef data_layout = LLVMCreateTargetDataLayout(tm); + char *data_layout_str = LLVMCopyStringRepOfTargetData(data_layout); /* Initialize the gallivm object: * We are only using the module, context, and builder fields of this struct. @@ -1273,6 +1275,10 @@ void si_llvm_context_init(struct si_shader_context *ctx, ctx->gallivm.context); LLVMSetTarget(ctx->gallivm.module, "amdgcn--"); + LLVMSetDataLayout(ctx->gallivm.module, data_layout_str); + LLVMDisposeTargetData(data_layout); + LLVMDisposeMessage(data_layout_str); + bool unsafe_fpmath = (sscreen->b.debug_flags & DBG_UNSAFE_MATH) != 0; ctx->gallivm.builder = lp_create_builder(ctx->gallivm.context, unsafe_fpmath); ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): radeonsi: Use amdgcn intrinsics for fs interpolation
Module: Mesa Branch: master Commit: 4c8c13b3568c82e503a10ddcb846b4c96261ec4c URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=4c8c13b3568c82e503a10ddcb846b4c96261ec4c Author: Tom Stellard Date: Tue Nov 15 23:50:38 2016 + radeonsi: Use amdgcn intrinsics for fs interpolation Reviewed-by: Nicolai Hähnle --- src/gallium/drivers/radeonsi/si_shader.c | 196 ++- 1 file changed, 142 insertions(+), 54 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index 44a4dd2..7813103 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -1220,6 +1220,80 @@ static int lookup_interp_param_index(unsigned interpolate, unsigned location) } } +static LLVMValueRef build_fs_interp( + struct lp_build_tgsi_context *bld_base, + LLVMValueRef llvm_chan, + LLVMValueRef attr_number, + LLVMValueRef params, + LLVMValueRef i, + LLVMValueRef j) { + + struct si_shader_context *ctx = si_shader_context(bld_base); + struct gallivm_state *gallivm = bld_base->base.gallivm; + LLVMValueRef args[5]; + LLVMValueRef p1; + if (HAVE_LLVM < 0x0400) { + LLVMValueRef ij[2]; + ij[0] = LLVMBuildBitCast(gallivm->builder, i, ctx->i32, ""); + ij[1] = LLVMBuildBitCast(gallivm->builder, j, ctx->i32, ""); + + args[0] = llvm_chan; + args[1] = attr_number; + args[2] = params; + args[3] = lp_build_gather_values(gallivm, ij, 2); + return lp_build_intrinsic(gallivm->builder, "llvm.fs.interp", + ctx->f32, args, 4, + LP_FUNC_ATTR_READNONE); + } + + args[0] = i; + args[1] = llvm_chan; + args[2] = attr_number; + args[3] = params; + + p1 = lp_build_intrinsic(gallivm->builder, "llvm.amdgcn.interp.p1", + ctx->f32, args, 4, LP_FUNC_ATTR_READNONE); + + args[0] = p1; + args[1] = j; + args[2] = llvm_chan; + args[3] = attr_number; + args[4] = params; + + return lp_build_intrinsic(gallivm->builder, "llvm.amdgcn.interp.p2", + ctx->f32, args, 5, LP_FUNC_ATTR_READNONE); +} + +static LLVMValueRef build_fs_interp_mov( + struct lp_build_tgsi_context *bld_base, + LLVMValueRef parameter, + LLVMValueRef llvm_chan, + LLVMValueRef attr_number, + LLVMValueRef params) { + + struct si_shader_context *ctx = si_shader_context(bld_base); + struct gallivm_state *gallivm = bld_base->base.gallivm; + LLVMValueRef args[4]; + if (HAVE_LLVM < 0x0400) { + args[0] = llvm_chan; + args[1] = attr_number; + args[2] = params; + + return lp_build_intrinsic(gallivm->builder, + "llvm.SI.fs.constant", + ctx->f32, args, 3, + LP_FUNC_ATTR_READNONE); + } + + args[0] = parameter; + args[1] = llvm_chan; + args[2] = attr_number; + args[3] = params; + + return lp_build_intrinsic(gallivm->builder, "llvm.amdgcn.interp.mov", + ctx->f32, args, 4, LP_FUNC_ATTR_READNONE); +} + /** * Interpolate a fragment shader input. * @@ -1245,16 +1319,15 @@ static void interp_fs_input(struct si_shader_context *ctx, LLVMValueRef face, LLVMValueRef result[4]) { - struct lp_build_context *base = &ctx->soa.bld_base.base; - struct lp_build_context *uint = &ctx->soa.bld_base.uint_bld; + struct lp_build_tgsi_context *bld_base = &ctx->soa.bld_base; + struct lp_build_context *base = &bld_base->base; + struct lp_build_context *uint = &bld_base->uint_bld; struct gallivm_state *gallivm = base->gallivm; - const char *intr_name; LLVMValueRef attr_number; + LLVMValueRef i, j; unsigned chan; - attr_number = lp_build_const_int32(gallivm, input_index); - /* fs.constant returns the param from the middle vertex, so it's not * really useful for flat shading. It's meant to be used for custom * interpolation (but the intrinsic can't fetch from the other two @@ -1264,12 +1337,26 @@ static void interp_fs_input(struct si_shader_context *ctx, * to do the right thing. The only reason we use fs.constant is that * fs.interp cannot be used on integers, because they can be equal * to NaN. +* +* When interp is false we will use fs.constant or for
Mesa (master): mesa: Add missing call to _mesa_unlock_debug_state(ctx); v2
Module: Mesa Branch: master Commit: 929fcee47e46781c57f2a354ce0a013915c033d1 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=929fcee47e46781c57f2a354ce0a013915c033d1 Author: Tom Stellard Date: Wed Nov 16 21:21:15 2016 + mesa: Add missing call to _mesa_unlock_debug_state(ctx); v2 cd724208d3e1e3307f84a794f2c1fc83b69ccf8a added a call to _mesa_lock_debug_state(ctx) but wasn't unlocking the debug state. This fixes a hang in glsl-fs-loop piglit test with MESA_DEBUG=context. v2: - Remove unrelated changes. Reviewed-by: Brian Paul --- src/mesa/main/debug_output.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/mesa/main/debug_output.c b/src/mesa/main/debug_output.c index 4e9209b..48dbbb3 100644 --- a/src/mesa/main/debug_output.c +++ b/src/mesa/main/debug_output.c @@ -1282,12 +1282,14 @@ _mesa_init_debug_output(struct gl_context *ctx) */ struct gl_debug_state *debug = _mesa_lock_debug_state(ctx); if (!debug) { - return; + goto done; } debug->DebugOutput = GL_TRUE; debug->LogToStderr = GL_TRUE; ctx->Const.ContextFlags |= GL_CONTEXT_FLAG_DEBUG_BIT; } +done: + _mesa_unlock_debug_state(ctx); } ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): clover: adapt to new error API since LLVM r286752
Module: Mesa Branch: master Commit: 8e430ff8b060b4e8e922bae24b3c57837da6ea77 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=8e430ff8b060b4e8e922bae24b3c57837da6ea77 Author: Vedran Miletić Date: Mon Nov 14 12:17:42 2016 +0100 clover: adapt to new error API since LLVM r286752 Tested-by: Dieter Nützel --- src/gallium/state_trackers/clover/llvm/codegen/bitcode.cpp | 10 -- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/gallium/state_trackers/clover/llvm/codegen/bitcode.cpp b/src/gallium/state_trackers/clover/llvm/codegen/bitcode.cpp index 8e89a49..5dcc4f8 100644 --- a/src/gallium/state_trackers/clover/llvm/codegen/bitcode.cpp +++ b/src/gallium/state_trackers/clover/llvm/codegen/bitcode.cpp @@ -98,8 +98,14 @@ clover::llvm::parse_module_library(const module &m, ::llvm::LLVMContext &ctx, std::string &r_log) { auto mod = ::llvm::parseBitcodeFile(::llvm::MemoryBufferRef( as_string(m.secs[0].data), " "), ctx); - if (!mod) - fail(r_log, error(CL_INVALID_PROGRAM), mod.getError().message()); + + if (::llvm::Error err = mod.takeError()) { + std::string msg; + ::llvm::handleAllErrors(std::move(err), [&](::llvm::ErrorInfoBase &EIB) { + msg = EIB.message(); + fail(r_log, error(CL_INVALID_PROGRAM), msg.c_str()); + }); + } return std::unique_ptr<::llvm::Module>(std::move(*mod)); } ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): clover: fix building since llvm r286566
Module: Mesa Branch: master Commit: 3ff9f8c5328310a463d3f16f573b68aa20ab8339 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=3ff9f8c5328310a463d3f16f573b68aa20ab8339 Author: Laurent Carlier Date: Fri Nov 11 14:00:26 2016 +0100 clover: fix building since llvm r286566 pretty trivial fix --- src/gallium/state_trackers/clover/llvm/codegen/bitcode.cpp | 5 + 1 file changed, 5 insertions(+) diff --git a/src/gallium/state_trackers/clover/llvm/codegen/bitcode.cpp b/src/gallium/state_trackers/clover/llvm/codegen/bitcode.cpp index 108f8d5..8e89a49 100644 --- a/src/gallium/state_trackers/clover/llvm/codegen/bitcode.cpp +++ b/src/gallium/state_trackers/clover/llvm/codegen/bitcode.cpp @@ -37,7 +37,12 @@ #include "util/algorithm.hpp" #include +#if HAVE_LLVM < 0x0400 #include +#else +#include +#include +#endif #include using namespace clover; ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): llvmpipe: Fix build after removal of deprecated attribute API v2
Module: Mesa Branch: master Commit: 14926330703bb5ea6a84c845e192021f057f9401 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=14926330703bb5ea6a84c845e192021f057f9401 Author: Aaron Watry Date: Mon Nov 7 21:55:14 2016 -0600 llvmpipe: Fix build after removal of deprecated attribute API v2 Applies on top of v3 of Tom's gallivm change. v2: - Tom Stellard: Use enums instread of strings. Reviewed-by: Nicolai Hähnle Signed-off-by: Aaron Watry CC: Tom Stellard CC: Jan Vesely --- src/gallium/drivers/llvmpipe/lp_state_fs.c| 2 +- src/gallium/drivers/llvmpipe/lp_state_setup.c | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/gallium/drivers/llvmpipe/lp_state_fs.c b/src/gallium/drivers/llvmpipe/lp_state_fs.c index 3428eed..0910815 100644 --- a/src/gallium/drivers/llvmpipe/lp_state_fs.c +++ b/src/gallium/drivers/llvmpipe/lp_state_fs.c @@ -2296,7 +2296,7 @@ generate_fragment(struct llvmpipe_context *lp, */ for(i = 0; i < ARRAY_SIZE(arg_types); ++i) if(LLVMGetTypeKind(arg_types[i]) == LLVMPointerTypeKind) - LLVMAddAttribute(LLVMGetParam(function, i), LLVMNoAliasAttribute); + lp_add_function_attr(function, i + 1, LP_FUNC_ATTR_NOALIAS); context_ptr = LLVMGetParam(function, 0); x= LLVMGetParam(function, 1); diff --git a/src/gallium/drivers/llvmpipe/lp_state_setup.c b/src/gallium/drivers/llvmpipe/lp_state_setup.c index a57e2f0..6b0df21 100644 --- a/src/gallium/drivers/llvmpipe/lp_state_setup.c +++ b/src/gallium/drivers/llvmpipe/lp_state_setup.c @@ -624,8 +624,7 @@ set_noalias(LLVMBuilderRef builder, int i; for(i = 0; i < nr_args; ++i) if(LLVMGetTypeKind(arg_types[i]) == LLVMPointerTypeKind) - LLVMAddAttribute(LLVMGetParam(function, i), -LLVMNoAliasAttribute); + lp_add_function_attr(function, i + 1, LP_FUNC_ATTR_NOALIAS); } static void ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): gallivm: Fix build after removal of deprecated attribute API v3
Module: Mesa Branch: master Commit: 8bdd52c8f3595128cbc1da4f23cdb10ff861a6ef URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=8bdd52c8f3595128cbc1da4f23cdb10ff861a6ef Author: Tom Stellard Date: Mon Nov 7 18:35:09 2016 + gallivm: Fix build after removal of deprecated attribute API v3 v2: Fix adding parameter attributes with LLVM < 4.0. v3: Fix typo. Fix parameter index. Add a gallivm enum for function attributes. Reviewed-by: Nicolai Hähnle --- src/gallium/auxiliary/draw/draw_llvm.c| 6 +- src/gallium/auxiliary/gallivm/lp_bld_intr.c | 70 ++- src/gallium/auxiliary/gallivm/lp_bld_intr.h | 17 +- src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c | 4 +- src/gallium/drivers/radeonsi/si_shader.c | 69 +++--- src/gallium/drivers/radeonsi/si_shader_tgsi_alu.c | 24 6 files changed, 138 insertions(+), 52 deletions(-) diff --git a/src/gallium/auxiliary/draw/draw_llvm.c b/src/gallium/auxiliary/draw/draw_llvm.c index 5b4e2a1..ba86b11 100644 --- a/src/gallium/auxiliary/draw/draw_llvm.c +++ b/src/gallium/auxiliary/draw/draw_llvm.c @@ -1568,8 +1568,7 @@ draw_llvm_generate(struct draw_llvm *llvm, struct draw_llvm_variant *variant, LLVMSetFunctionCallConv(variant_func, LLVMCCallConv); for (i = 0; i < num_arg_types; ++i) if (LLVMGetTypeKind(arg_types[i]) == LLVMPointerTypeKind) - LLVMAddAttribute(LLVMGetParam(variant_func, i), - LLVMNoAliasAttribute); + lp_add_function_attr(variant_func, i + 1, LP_FUNC_ATTR_NOALIAS); context_ptr = LLVMGetParam(variant_func, 0); io_ptr= LLVMGetParam(variant_func, 1); @@ -2193,8 +2192,7 @@ draw_gs_llvm_generate(struct draw_llvm *llvm, for (i = 0; i < ARRAY_SIZE(arg_types); ++i) if (LLVMGetTypeKind(arg_types[i]) == LLVMPointerTypeKind) - LLVMAddAttribute(LLVMGetParam(variant_func, i), - LLVMNoAliasAttribute); + lp_add_function_attr(variant_func, i + 1, LP_FUNC_ATTR_NOALIAS); context_ptr = LLVMGetParam(variant_func, 0); input_array = LLVMGetParam(variant_func, 1); diff --git a/src/gallium/auxiliary/gallivm/lp_bld_intr.c b/src/gallium/auxiliary/gallivm/lp_bld_intr.c index f12e735..049671a 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_intr.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_intr.c @@ -46,6 +46,7 @@ #include "util/u_debug.h" #include "util/u_string.h" +#include "util/bitscan.h" #include "lp_bld_const.h" #include "lp_bld_intr.h" @@ -120,13 +121,73 @@ lp_declare_intrinsic(LLVMModuleRef module, } +#if HAVE_LLVM < 0x0400 +static LLVMAttribute lp_attr_to_llvm_attr(enum lp_func_attr attr) +{ + switch (attr) { + case LP_FUNC_ATTR_ALWAYSINLINE: return LLVMAlwaysInlineAttribute; + case LP_FUNC_ATTR_BYVAL: return LLVMByValAttribute; + case LP_FUNC_ATTR_INREG: return LLVMInRegAttribute; + case LP_FUNC_ATTR_NOALIAS: return LLVMNoAliasAttribute; + case LP_FUNC_ATTR_NOUNWIND: return LLVMNoUnwindAttribute; + case LP_FUNC_ATTR_READNONE: return LLVMReadNoneAttribute; + case LP_FUNC_ATTR_READONLY: return LLVMReadOnlyAttribute; + default: + _debug_printf("Unhandled function attribute: %x\n", attr); + return 0; + } +} + +#else + +static const char *attr_to_str(enum lp_func_attr attr) +{ + switch (attr) { + case LP_FUNC_ATTR_ALWAYSINLINE: return "alwaysinline"; + case LP_FUNC_ATTR_BYVAL: return "byval"; + case LP_FUNC_ATTR_INREG: return "inreg"; + case LP_FUNC_ATTR_NOALIAS: return "noalias"; + case LP_FUNC_ATTR_NOUNWIND: return "nounwind"; + case LP_FUNC_ATTR_READNONE: return "readnone"; + case LP_FUNC_ATTR_READONLY: return "readonly"; + default: + _debug_printf("Unhandled function attribute: %x\n", attr); + return 0; + } +} + +#endif + +void +lp_add_function_attr(LLVMValueRef function, + int attr_idx, + enum lp_func_attr attr) +{ + +#if HAVE_LLVM < 0x0400 + LLVMAttribute llvm_attr = lp_attr_to_llvm_attr(attr); + if (attr_idx == -1) { + LLVMAddFunctionAttr(function, llvm_attr); + } else { + LLVMAddAttribute(LLVMGetParam(function, attr_idx - 1), llvm_attr); + } +#else + LLVMContextRef context = LLVMGetModuleContext(LLVMGetGlobalParent(function)); + const char *attr_name = attr_to_str(attr); + unsigned kind_id = LLVMGetEnumAttributeKindForName(attr_name, + strlen(attr_name)); + LLVMAttributeRef llvm_attr = LLVMCreateEnumAttribute(context, kind_id, 0); + LLVMAddAttributeAtIndex(function, attr_idx, llvm_attr); +#endif +} + LLVMValueRef lp_build_intrinsic(LLVMBuilderRef builder, const char *name, LLVMTypeRef re
Mesa (master): radeonsi: Refactor image store/load intrinsic name creation
Module: Mesa Branch: master Commit: a96a7eae04843e3c1c952d6aba62313116a6d368 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=a96a7eae04843e3c1c952d6aba62313116a6d368 Author: Tom Stellard Date: Tue Oct 11 16:43:36 2016 + radeonsi: Refactor image store/load intrinsic name creation Reviewed-by: Nicolai Hähnle --- src/gallium/drivers/radeonsi/si_shader.c | 29 ++--- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index 49d4121..8254cb2 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -3738,6 +3738,18 @@ static void load_emit_memory( emit_data->output[emit_data->chan] = lp_build_gather_values(gallivm, channels, 4); } +static void get_image_intr_name(const char *base_name, + LLVMTypeRef coords_type, + char *out_name, unsigned out_len) +{ + char coords_type_name[8]; + + build_int_type_name(coords_type, coords_type_name, + sizeof(coords_type_name)); + + snprintf(out_name, out_len, "%s.%s", base_name, coords_type_name); +} + static void load_emit( const struct lp_build_tgsi_action *action, struct lp_build_tgsi_context *bld_base, @@ -3748,7 +3760,6 @@ static void load_emit( LLVMBuilderRef builder = gallivm->builder; const struct tgsi_full_instruction * inst = emit_data->inst; char intrinsic_name[32]; - char coords_type[8]; if (inst->Src[0].Register.File == TGSI_FILE_MEMORY) { load_emit_memory(ctx, emit_data); @@ -3770,11 +3781,9 @@ static void load_emit( emit_data->args, emit_data->arg_count, LLVMReadOnlyAttribute); } else { - build_int_type_name(LLVMTypeOf(emit_data->args[0]), - coords_type, sizeof(coords_type)); - - snprintf(intrinsic_name, sizeof(intrinsic_name), -"llvm.amdgcn.image.load.%s", coords_type); + get_image_intr_name("llvm.amdgcn.image.load", + LLVMTypeOf(emit_data->args[0]), + intrinsic_name, sizeof(intrinsic_name)); emit_data->output[emit_data->chan] = lp_build_intrinsic( @@ -3951,7 +3960,6 @@ static void store_emit( const struct tgsi_full_instruction * inst = emit_data->inst; unsigned target = inst->Memory.Texture; char intrinsic_name[32]; - char coords_type[8]; if (inst->Dst[0].Register.File == TGSI_FILE_MEMORY) { store_emit_memory(ctx, emit_data); @@ -3972,10 +3980,9 @@ static void store_emit( emit_data->dst_type, emit_data->args, emit_data->arg_count, 0); } else { - build_int_type_name(LLVMTypeOf(emit_data->args[1]), - coords_type, sizeof(coords_type)); - snprintf(intrinsic_name, sizeof(intrinsic_name), -"llvm.amdgcn.image.store.%s", coords_type); + get_image_intr_name("llvm.amdgcn.image.store", + LLVMTypeOf(emit_data->args[1]), + intrinsic_name, sizeof(intrinsic_name)); emit_data->output[emit_data->chan] = lp_build_intrinsic( ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): radeonsi: Use the new image load/store intrinsic signatures
Module: Mesa Branch: master Commit: b33cb709fd06006d4c51824f850a4bb6d8d11f98 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=b33cb709fd06006d4c51824f850a4bb6d8d11f98 Author: Tom Stellard Date: Tue Oct 11 21:06:54 2016 + radeonsi: Use the new image load/store intrinsic signatures This patch requires LLVM r284024 or newer. Reviewed-by: Nicolai Hähnle --- src/gallium/drivers/radeonsi/si_shader.c | 59 1 file changed, 45 insertions(+), 14 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index 4e07317..8b77fd1 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -3575,16 +3575,29 @@ static void image_append_args( const struct tgsi_full_instruction *inst = emit_data->inst; LLVMValueRef i1false = LLVMConstInt(ctx->i1, 0, 0); LLVMValueRef i1true = LLVMConstInt(ctx->i1, 1, 0); - - emit_data->args[emit_data->arg_count++] = i1false; /* r128 */ - emit_data->args[emit_data->arg_count++] = - tgsi_is_array_image(target) ? i1true : i1false; /* da */ - if (!atomic) { - emit_data->args[emit_data->arg_count++] = - inst->Memory.Qualifier & (TGSI_MEMORY_COHERENT | TGSI_MEMORY_VOLATILE) ? - i1true : i1false; /* glc */ + LLVMValueRef r128 = i1false; + LLVMValueRef da = tgsi_is_array_image(target) ? i1true : i1false; + LLVMValueRef glc = + inst->Memory.Qualifier & (TGSI_MEMORY_COHERENT | TGSI_MEMORY_VOLATILE) ? + i1true : i1false; + LLVMValueRef slc = i1false; + LLVMValueRef lwe = i1false; + + if (atomic || (HAVE_LLVM <= 0x0309)) { + emit_data->args[emit_data->arg_count++] = r128; + emit_data->args[emit_data->arg_count++] = da; + if (!atomic) { + emit_data->args[emit_data->arg_count++] = glc; + } + emit_data->args[emit_data->arg_count++] = slc; + return; } - emit_data->args[emit_data->arg_count++] = i1false; /* slc */ + + /* HAVE_LLVM >= 0x0400 */ + emit_data->args[emit_data->arg_count++] = glc; + emit_data->args[emit_data->arg_count++] = slc; + emit_data->args[emit_data->arg_count++] = lwe; + emit_data->args[emit_data->arg_count++] = da; } /** @@ -3761,7 +3774,9 @@ static void load_emit_memory( } static void get_image_intr_name(const char *base_name, + LLVMTypeRef data_type, LLVMTypeRef coords_type, + LLVMTypeRef rsrc_type, char *out_name, unsigned out_len) { char coords_type_name[8]; @@ -3769,7 +3784,19 @@ static void get_image_intr_name(const char *base_name, build_type_name_for_intr(coords_type, coords_type_name, sizeof(coords_type_name)); - snprintf(out_name, out_len, "%s.%s", base_name, coords_type_name); + if (HAVE_LLVM <= 0x0309) { + snprintf(out_name, out_len, "%s.%s", base_name, coords_type_name); + } else { + char data_type_name[8]; + char rsrc_type_name[8]; + + build_type_name_for_intr(data_type, data_type_name, + sizeof(data_type_name)); + build_type_name_for_intr(rsrc_type, rsrc_type_name, + sizeof(rsrc_type_name)); + snprintf(out_name, out_len, "%s.%s.%s.%s", base_name, +data_type_name, coords_type_name, rsrc_type_name); + } } static void load_emit( @@ -3781,7 +3808,7 @@ static void load_emit( struct gallivm_state *gallivm = bld_base->base.gallivm; LLVMBuilderRef builder = gallivm->builder; const struct tgsi_full_instruction * inst = emit_data->inst; - char intrinsic_name[32]; + char intrinsic_name[64]; if (inst->Src[0].Register.File == TGSI_FILE_MEMORY) { load_emit_memory(ctx, emit_data); @@ -3804,7 +3831,9 @@ static void load_emit( LLVMReadOnlyAttribute); } else { get_image_intr_name("llvm.amdgcn.image.load", - LLVMTypeOf(emit_data->args[0]), + emit_data->dst_type,/* vdata */ + LLVMTypeOf(emit_data->args[0]), /* coords */ + LLVMTypeOf(emit_data->args[1]), /* rsrc */ intrinsic_name, sizeof(intrinsic_name)); emit_data->output[emit_data->chan] = @@ -3981,7 +4010,7 @@
Mesa (master): radeonsi: Add function for converting LLVM type to intrinsic string
Module: Mesa Branch: master Commit: ff0df66e10476fdb5be90395eed300f4d32a83c3 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=ff0df66e10476fdb5be90395eed300f4d32a83c3 Author: Tom Stellard Date: Tue Oct 11 20:23:52 2016 + radeonsi: Add function for converting LLVM type to intrinsic string The existing function only worked for integer types. Reviewed-by: Nicolai Hähnle --- src/gallium/drivers/radeonsi/si_shader.c | 42 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index 8254cb2..4e07317 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -3347,17 +3347,39 @@ static LLVMValueRef get_buffer_size( * Given the i32 or vNi32 \p type, generate the textual name (e.g. for use with * intrinsic names). */ -static void build_int_type_name( +static void build_type_name_for_intr( LLVMTypeRef type, char *buf, unsigned bufsize) { - assert(bufsize >= 6); + LLVMTypeRef elem_type = type; - if (LLVMGetTypeKind(type) == LLVMVectorTypeKind) - snprintf(buf, bufsize, "v%ui32", -LLVMGetVectorSize(type)); - else - strcpy(buf, "i32"); + assert(bufsize >= 8); + + if (LLVMGetTypeKind(type) == LLVMVectorTypeKind) { + int ret = snprintf(buf, bufsize, "v%u", + LLVMGetVectorSize(type)); + if (ret < 0) { + char *type_name = LLVMPrintTypeToString(type); + fprintf(stderr, "Error building type name for: %s\n", + type_name); + return; + } + elem_type = LLVMGetElementType(type); + buf += ret; + bufsize -= ret; + } + switch (LLVMGetTypeKind(elem_type)) { + default: break; + case LLVMIntegerTypeKind: + snprintf(buf, bufsize, "i%d", LLVMGetIntTypeWidth(elem_type)); + break; + case LLVMFloatTypeKind: + snprintf(buf, bufsize, "f32"); + break; + case LLVMDoubleTypeKind: + snprintf(buf, bufsize, "f64"); + break; + } } static void build_tex_intrinsic(const struct lp_build_tgsi_action *action, @@ -3744,7 +3766,7 @@ static void get_image_intr_name(const char *base_name, { char coords_type_name[8]; - build_int_type_name(coords_type, coords_type_name, + build_type_name_for_intr(coords_type, coords_type_name, sizeof(coords_type_name)); snprintf(out_name, out_len, "%s.%s", base_name, coords_type_name); @@ -4144,7 +4166,7 @@ static void atomic_emit( } else { char coords_type[8]; - build_int_type_name(LLVMTypeOf(emit_data->args[1]), + build_type_name_for_intr(LLVMTypeOf(emit_data->args[1]), coords_type, sizeof(coords_type)); snprintf(intrinsic_name, sizeof(intrinsic_name), "llvm.amdgcn.image.atomic.%s.%s", @@ -4918,7 +4940,7 @@ static void build_tex_intrinsic(const struct lp_build_tgsi_action *action, } /* Add the type and suffixes .c, .o if needed. */ - build_int_type_name(LLVMTypeOf(emit_data->args[0]), type, sizeof(type)); + build_type_name_for_intr(LLVMTypeOf(emit_data->args[0]), type, sizeof(type)); sprintf(intr_name, "%s%s%s%s.%s", name, is_shadow ? ".c" : "", infix, has_offset ? ".o" : "", type); ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): radeonsi/compute: Add some more debug printfs
Module: Mesa Branch: master Commit: a2b8346fa6c96af6b3d83b9f9ebb1f500e0da5f1 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=a2b8346fa6c96af6b3d83b9f9ebb1f500e0da5f1 Author: Tom Stellard Date: Tue Jul 19 15:25:06 2016 + radeonsi/compute: Add some more debug printfs --- src/gallium/drivers/radeonsi/si_compute.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/gallium/drivers/radeonsi/si_compute.c b/src/gallium/drivers/radeonsi/si_compute.c index d988214..56b5118 100644 --- a/src/gallium/drivers/radeonsi/si_compute.c +++ b/src/gallium/drivers/radeonsi/si_compute.c @@ -298,6 +298,9 @@ static bool si_switch_compute_shader(struct si_context *sctx, radeon_emit(cs, config->rsrc1); radeon_emit(cs, config->rsrc2); + COMPUTE_DBG(sctx->screen, "COMPUTE_PGM_RSRC1: 0x%08x " + "COMPUTE_PGM_RSRC2: 0x%08x\n", config->rsrc1, config->rsrc2); + radeon_set_sh_reg(cs, R_00B860_COMPUTE_TMPRING_SIZE, S_00B860_WAVES(sctx->scratch_waves) | S_00B860_WAVESIZE(config->scratch_bytes_per_wave >> 10)); ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): radeonsi/compute: Use the HSA abi for non-TGSI compute shaders v3
Module: Mesa Branch: master Commit: 91ec6e5664979382f3cb18ba91edc4af99f93471 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=91ec6e5664979382f3cb18ba91edc4af99f93471 Author: Tom Stellard Date: Wed Jul 20 14:32:59 2016 + radeonsi/compute: Use the HSA abi for non-TGSI compute shaders v3 This patch switches non-TGSI compute shaders over to using the HSA ABI described here: https://github.com/RadeonOpenCompute/ROCm-Docs/blob/master/AMDGPU-ABI.md The HSA ABI provides a much cleaner interface for compute shaders and allows us to share more code in the compiler with the HSA stack. The main changes in this patch are: - We now pass the scratch buffer resource into the shader via user sgprs rather than using relocations. - Grid/Block sizes are now passed to the shader via the dispatch packet rather than at the beginning of the kernel arguments. Typically for HSA, the CP firmware will create the dispatch packet and set up the user sgprs automatically. However, in Mesa we let the driver do this work. The main reason for this is that I haven't researched how to get the CP to do all these things, and I'm not sure if it is supported for all GPUs. v2: - Add comments explaining why we are setting certain bits of the scratch resource descriptor. v3: - Use amdgcn-mesa-mesa3d triple instead of amdgcn--mesa3d. Reviewed-by: Nicolai Hähnle --- src/amd/common/amd_kernel_code_t.h| 534 ++ src/gallium/drivers/radeon/r600_pipe_common.c | 6 +- src/gallium/drivers/radeonsi/si_compute.c | 239 +++- 3 files changed, 761 insertions(+), 18 deletions(-) diff --git a/src/amd/common/amd_kernel_code_t.h b/src/amd/common/amd_kernel_code_t.h new file mode 100644 index 000..d0d7809 --- /dev/null +++ b/src/amd/common/amd_kernel_code_t.h @@ -0,0 +1,534 @@ +/* + * Copyright 2015,2016 Advanced Micro Devices, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * on the rights to use, copy, modify, merge, publish, distribute, sub + * license, and/or sell copies of the Software, and to permit persons to whom + * the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + * USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +#ifndef AMDKERNELCODET_H +#define AMDKERNELCODET_H + +//---// +// AMD Kernel Code, and its dependencies // +//---// + +// Sets val bits for specified mask in specified dst packed instance. +#define AMD_HSA_BITS_SET(dst, mask, val) \ + dst &= (~(1 << mask ## _SHIFT) & ~mask); \ + dst |= (((val) << mask ## _SHIFT) & mask) + +// Gets bits for specified mask from specified src packed instance. +#define AMD_HSA_BITS_GET(src, mask) \ + ((src & mask) >> mask ## _SHIFT) \ + +/* Every amd_*_code_t has the following properties, which are composed of + * a number of bit fields. Every bit field has a mask (AMD_CODE_PROPERTY_*), + * bit width (AMD_CODE_PROPERTY_*_WIDTH, and bit shift amount + * (AMD_CODE_PROPERTY_*_SHIFT) for convenient access. Unused bits must be 0. + * + * (Note that bit fields cannot be used as their layout is + * implementation defined in the C standard and so cannot be used to + * specify an ABI) + */ +enum amd_code_property_mask_t { + + /* Enable the setup of the SGPR user data registers + * (AMD_CODE_PROPERTY_ENABLE_SGPR_*), see documentation of amd_kernel_code_t + * for initial register state. + * + * The total number of SGPRuser data registers requested must not + * exceed 16. Any requests beyond 16 will be ignored. + * + * Used to set COMPUTE_PGM_RSRC2.USER_SGPR (set to total count of + * SGPR user data registers enabled up to 16). + */ + + AMD_CODE_PROPERTY_ENABLE_SGPR_PRIVATE_SEGMENT_BUFFER_SHIFT = 0, + AMD_CODE_PROPERTY_ENABLE_SGPR_PRIVATE_SEGMENT_BUFFER_WIDTH =
Mesa (master): radeonsi: Don't use global variables for tess lds
Module: Mesa Branch: master Commit: 63ed11cde9987e438bf28ef74879e2700971eb26 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=63ed11cde9987e438bf28ef74879e2700971eb26 Author: Tom Stellard Date: Fri Aug 26 19:49:13 2016 + radeonsi: Don't use global variables for tess lds We were allocating global variables for the maximum LDS size which made the compiler think we were using all of LDS, which isn't the case. Reviewed-By: Edward O'Callaghan Reviewed-by: Marek Olšák --- src/gallium/drivers/radeonsi/si_shader.c | 15 ++- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index a5b566e..12f2df9 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -5413,16 +5413,13 @@ static unsigned llvm_get_type_size(LLVMTypeRef type) static void declare_tess_lds(struct si_shader_context *ctx) { struct gallivm_state *gallivm = &ctx->radeon_bld.gallivm; - LLVMTypeRef i32 = ctx->radeon_bld.soa.bld_base.uint_bld.elem_type; - unsigned lds_size = ctx->screen->b.chip_class >= CIK ? 65536 : 32768; + struct lp_build_tgsi_context *bld_base = &ctx->radeon_bld.soa.bld_base; + struct lp_build_context *uint = &bld_base->uint_bld; - /* The actual size is computed outside of the shader to reduce -* the number of shader variants. */ - ctx->lds = - LLVMAddGlobalInAddressSpace(gallivm->module, - LLVMArrayType(i32, lds_size / 4), - "tess_lds", - LOCAL_ADDR_SPACE); + unsigned lds_size = ctx->screen->b.chip_class >= CIK ? 65536 : 32768; + ctx->lds = LLVMBuildIntToPtr(gallivm->builder, uint->zero, + LLVMPointerType(LLVMArrayType(ctx->i32, lds_size / 4), LOCAL_ADDR_SPACE), + "tess_lds"); } static void create_function(struct si_shader_context *ctx) ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): clover: Add missing include v2
Module: Mesa Branch: master Commit: a73bf11a63ea93640c26b5701c533b06d3a6f3e9 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=a73bf11a63ea93640c26b5701c533b06d3a6f3e9 Author: Tom Stellard Date: Tue Jul 19 15:05:34 2016 + clover: Add missing include v2 clang commit r275822 removed unnecessary includes from header files, so we now need to explicitly include clang/Lex/PreprocessorOptions.h v2: - Use <> instead of "" for the include path. Reviewed-by: Francisco Jerez Reviewed-by: Vedran Miletić --- src/gallium/state_trackers/clover/llvm/invocation.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/gallium/state_trackers/clover/llvm/invocation.cpp b/src/gallium/state_trackers/clover/llvm/invocation.cpp index 4b7de26..43f5e73 100644 --- a/src/gallium/state_trackers/clover/llvm/invocation.cpp +++ b/src/gallium/state_trackers/clover/llvm/invocation.cpp @@ -39,6 +39,7 @@ #include #include +#include #include #include #include ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): clover: Re-order includes in invocation.cpp to fix build
Module: Mesa Branch: master Commit: 106946153fb237e0867d65d53fb3a8461f3a13ee URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=106946153fb237e0867d65d53fb3a8461f3a13ee Author: Tom Stellard Date: Tue Jul 19 15:07:23 2016 + clover: Re-order includes in invocation.cpp to fix build The build was failing because the official CL headers have a few defines, like: # define cl_khr_gl_sharing 1 Which have the same name as some class members of clang's OpenCLOptions class. If we include the cl headers first, this breaks the build because the member names of this class are replaced by the literal 1. Reviewed-by: Francisco Jerez Reviewed-by: Vedran Miletić --- .../state_trackers/clover/llvm/invocation.cpp | 24 +++--- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/src/gallium/state_trackers/clover/llvm/invocation.cpp b/src/gallium/state_trackers/clover/llvm/invocation.cpp index 43f5e73..5490d72 100644 --- a/src/gallium/state_trackers/clover/llvm/invocation.cpp +++ b/src/gallium/state_trackers/clover/llvm/invocation.cpp @@ -24,13 +24,6 @@ // OTHER DEALINGS IN THE SOFTWARE. // -#include "llvm/codegen.hpp" -#include "llvm/compat.hpp" -#include "llvm/invocation.hpp" -#include "llvm/metadata.hpp" -#include "llvm/util.hpp" -#include "util/algorithm.hpp" - #include #include #include @@ -44,6 +37,23 @@ #include #include +// We need to include internal headers last, because the internal headers +// include CL headers which have #define's like: +// +//#define cl_khr_gl_sharing 1 +//#define cl_khr_icd 1 +// +// Which will break the compilation of clang/Basic/OpenCLOptions.h + +#include "core/error.hpp" +#include "llvm/codegen.hpp" +#include "llvm/compat.hpp" +#include "llvm/invocation.hpp" +#include "llvm/metadata.hpp" +#include "llvm/util.hpp" +#include "util/algorithm.hpp" + + using namespace clover; using namespace clover::llvm; ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): radeonsi: Implement ddx/ddy on VI using ds_bpermute
Module: Mesa Branch: master Commit: 9f110a9e10694f31653b41b49845cb7c77b9a4c4 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=9f110a9e10694f31653b41b49845cb7c77b9a4c4 Author: Tom Stellard Date: Fri Apr 15 23:42:10 2016 + radeonsi: Implement ddx/ddy on VI using ds_bpermute The ds_bpermute instruction allows threads to transfer data directly to or from the vgprs of other threads. These instructions use the LDS hardware to transfer data, but do not read or write LDS memory. DDX BEFORE:| DDX AFTER: | v_mbcnt_lo_u32_b32_e64 v2, -1, 0 | v_mbcnt_lo_u32_b32_e64 v2, -1, 0 v_mbcnt_hi_u32_b32_e64 v2, -1, v2 | v_mbcnt_hi_u32_b32_e64 v2, -1, v2 v_lshlrev_b32_e32 v4, 2, v2| v_and_b32_e32 v2, 60, v2 v_and_b32_e32 v2, 60, v2 | v_lshlrev_b32_e32 v2, 2, v2 v_lshlrev_b32_e32 v3, 2, v2| ds_bpermute_b32 v3, v2, v0 s_mov_b32 m0, -1 | ds_bpermute_b32 v0, v2, v0 offset:4 ds_write_b32 v4, v0| s_waitcnt lgkmcnt(0) s_waitcnt lgkmcnt(0) | v_or_b32_e32 v0, 1, v2 | v_lshlrev_b32_e32 v0, 2, v0| ds_read_b32 v1, v3 | ds_read_b32 v0, v0 | s_waitcnt lgkmcnt(0) | | LDS: 1 blocks | LDS: 0 blocks Reviewed-by: Michel Dänzer Acked-by: Marek Olšák --- src/gallium/drivers/radeonsi/si_shader.c | 42 +++- 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index 9b3f591..5e09061 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -4404,6 +4404,7 @@ static void si_llvm_emit_ddxy( LLVMValueRef indices[2]; LLVMValueRef store_ptr, load_ptr0, load_ptr1; LLVMValueRef tl, trbl, result[4]; + LLVMValueRef tl_tid, trbl_tid; unsigned swizzle[4]; unsigned c; int idx; @@ -4421,20 +4422,24 @@ static void si_llvm_emit_ddxy( else mask = TID_MASK_TOP_LEFT; - indices[1] = LLVMBuildAnd(gallivm->builder, indices[1], - lp_build_const_int32(gallivm, mask), ""); + tl_tid = LLVMBuildAnd(gallivm->builder, indices[1], + lp_build_const_int32(gallivm, mask), ""); + indices[1] = tl_tid; load_ptr0 = LLVMBuildGEP(gallivm->builder, ctx->lds, indices, 2, ""); /* for DDX we want to next X pixel, DDY next Y pixel. */ idx = (opcode == TGSI_OPCODE_DDX || opcode == TGSI_OPCODE_DDX_FINE) ? 1 : 2; - indices[1] = LLVMBuildAdd(gallivm->builder, indices[1], + trbl_tid = LLVMBuildAdd(gallivm->builder, indices[1], lp_build_const_int32(gallivm, idx), ""); + indices[1] = trbl_tid; load_ptr1 = LLVMBuildGEP(gallivm->builder, ctx->lds, indices, 2, ""); for (c = 0; c < 4; ++c) { unsigned i; + LLVMValueRef val; + LLVMValueRef args[2]; swizzle[c] = tgsi_util_get_full_src_register_swizzle(&inst->Src[0], c); for (i = 0; i < c; ++i) { @@ -4446,18 +4451,31 @@ static void si_llvm_emit_ddxy( if (i != c) continue; - LLVMBuildStore(gallivm->builder, - LLVMBuildBitCast(gallivm->builder, - lp_build_emit_fetch(bld_base, inst, 0, c), - ctx->i32, ""), - store_ptr); + val = LLVMBuildBitCast(gallivm->builder, + lp_build_emit_fetch(bld_base, inst, 0, c), + ctx->i32, ""); - tl = LLVMBuildLoad(gallivm->builder, load_ptr0, ""); - tl = LLVMBuildBitCast(gallivm->builder, tl, ctx->f32, ""); + if ((HAVE_LLVM >= 0x0309) && ctx->screen->b.family >= CHIP_TONGA) { - trbl = LLVMBuildLoad(gallivm->builder, load_ptr1, ""); - trbl = LLVMBuildBitCast(gallivm->builder, trbl, ctx->f32, ""); + args[0] = LLVMBuildMul(gallivm->builder, tl_tid, +lp_build_const_int32(gallivm, 4), ""); + args[1] = val; + tl = lp_build_intrinsic(gallivm->builder, + "llvm.amdgcn.ds.bpermute", ctx->i32, + args, 2, LLVMReadNoneAttrib
Mesa (master): radeonsi: Use llvm.amdgcn.mbcnt.* intrinsics instead of llvm.SI.tid
Module: Mesa Branch: master Commit: 128267d781ffa9cb986cb3d79a356492abc21df4 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=128267d781ffa9cb986cb3d79a356492abc21df4 Author: Tom Stellard Date: Fri Apr 15 22:53:38 2016 + radeonsi: Use llvm.amdgcn.mbcnt.* intrinsics instead of llvm.SI.tid We're trying to move to more of the new style intrinsics with include the correct target name, and map directly to ISA instructions. v2: - Only do this with LLVM 3.8 and newer. Reviewed-by: Michel Dänzer Reviewed-by: Marek Olšák --- src/gallium/drivers/radeonsi/si_shader.c | 17 - 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index cd6725e..9b3f591 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -1141,8 +1141,23 @@ static void set_range_metadata(LLVMValueRef value, unsigned lo, unsigned hi) static LLVMValueRef get_thread_id(struct si_shader_context *ctx) { struct gallivm_state *gallivm = &ctx->radeon_bld.gallivm; - LLVMValueRef tid = lp_build_intrinsic(gallivm->builder, "llvm.SI.tid", + LLVMValueRef tid; + + if (HAVE_LLVM < 0x0308) { + tid = lp_build_intrinsic(gallivm->builder, "llvm.SI.tid", ctx->i32, NULL, 0, LLVMReadNoneAttribute); + } else { + LLVMValueRef tid_args[2]; + tid_args[0] = lp_build_const_int32(gallivm, 0x); + tid_args[1] = lp_build_const_int32(gallivm, 0); + tid_args[1] = lp_build_intrinsic(gallivm->builder, + "llvm.amdgcn.mbcnt.lo", ctx->i32, + tid_args, 2, LLVMReadNoneAttribute); + + tid = lp_build_intrinsic(gallivm->builder, + "llvm.amdgcn.mbcnt.hi", ctx->i32, + tid_args, 2, LLVMReadNoneAttribute); + } set_range_metadata(tid, 0, 64); return tid; } ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): radeonsi: Set range metadata on calls to llvm.SI.tid
Module: Mesa Branch: master Commit: d3427412a335ec64d05e09e040a2ddb2b9552563 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=d3427412a335ec64d05e09e040a2ddb2b9552563 Author: Tom Stellard Date: Mon Apr 18 14:33:43 2016 -0400 radeonsi: Set range metadata on calls to llvm.SI.tid The range metadata tells LLVM the range of expected values for this intrinsic, so it can do some additional optimizations on the result. Reviewed-by: Michel Dänzer Reviewed-by: Marek Olšák --- src/gallium/drivers/radeonsi/si_shader.c | 29 ++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index a8749e4..cd6725e 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -1116,12 +1116,35 @@ static LLVMValueRef get_sample_id(struct radeon_llvm_context *radeon_bld) SI_PARAM_ANCILLARY, 8, 4); } +/** + * Set range metadata on an instruction. This can only be used on load and + * call instructions. If you know an instruction can only produce the values + * 0, 1, 2, you would do set_range_metadata(value, 0, 3); + * \p lo is the minimum value inclusive. + * \p hi is the maximum value exclusive. + */ +static void set_range_metadata(LLVMValueRef value, unsigned lo, unsigned hi) +{ + const char *range_md_string = "range"; + LLVMValueRef range_md, md_args[2]; + LLVMTypeRef type = LLVMTypeOf(value); + LLVMContextRef context = LLVMGetTypeContext(type); + unsigned md_range_id = LLVMGetMDKindIDInContext(context, + range_md_string, strlen(range_md_string)); + + md_args[0] = LLVMConstInt(type, lo, false); + md_args[1] = LLVMConstInt(type, hi, false); + range_md = LLVMMDNodeInContext(context, md_args, 2); + LLVMSetMetadata(value, md_range_id, range_md); +} + static LLVMValueRef get_thread_id(struct si_shader_context *ctx) { struct gallivm_state *gallivm = &ctx->radeon_bld.gallivm; - - return lp_build_intrinsic(gallivm->builder, "llvm.SI.tid", ctx->i32, - NULL, 0, LLVMReadNoneAttribute); + LLVMValueRef tid = lp_build_intrinsic(gallivm->builder, "llvm.SI.tid", + ctx->i32, NULL, 0, LLVMReadNoneAttribute); + set_range_metadata(tid, 0, 64); + return tid; } /** ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): radeonsi: Create a helper function for computing the thread id
Module: Mesa Branch: master Commit: b31422d970848c4f0925bdd83850393fa3f0ab8c URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=b31422d970848c4f0925bdd83850393fa3f0ab8c Author: Tom Stellard Date: Mon Apr 18 13:10:10 2016 -0400 radeonsi: Create a helper function for computing the thread id Reviewed-by: Michel Dänzer Reviewed-by: Marek Olšák --- src/gallium/drivers/radeonsi/si_shader.c | 17 +++-- 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index c6efbc1..a8749e4 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -1116,6 +1116,14 @@ static LLVMValueRef get_sample_id(struct radeon_llvm_context *radeon_bld) SI_PARAM_ANCILLARY, 8, 4); } +static LLVMValueRef get_thread_id(struct si_shader_context *ctx) +{ + struct gallivm_state *gallivm = &ctx->radeon_bld.gallivm; + + return lp_build_intrinsic(gallivm->builder, "llvm.SI.tid", ctx->i32, + NULL, 0, LLVMReadNoneAttribute); +} + /** * Load a dword from a constant buffer. */ @@ -1863,8 +1871,7 @@ static void si_llvm_emit_streamout(struct si_shader_context *ctx, LLVMValueRef so_vtx_count = unpack_param(ctx, ctx->param_streamout_config, 16, 7); - LLVMValueRef tid = lp_build_intrinsic(builder, "llvm.SI.tid", ctx->i32, - NULL, 0, LLVMReadNoneAttribute); + LLVMValueRef tid = get_thread_id(ctx); /* can_emit = tid < so_vtx_count; */ LLVMValueRef can_emit = @@ -4365,8 +4372,7 @@ static void si_llvm_emit_ddxy( unsigned mask; indices[0] = bld_base->uint_bld.zero; - indices[1] = lp_build_intrinsic(gallivm->builder, "llvm.SI.tid", ctx->i32, -NULL, 0, LLVMReadNoneAttribute); + indices[1] = get_thread_id(ctx); store_ptr = LLVMBuildGEP(gallivm->builder, ctx->lds, indices, 2, ""); @@ -4437,8 +4443,7 @@ static LLVMValueRef si_llvm_emit_ddxy_interp( unsigned c; indices[0] = bld_base->uint_bld.zero; - indices[1] = lp_build_intrinsic(gallivm->builder, "llvm.SI.tid", ctx->i32, - NULL, 0, LLVMReadNoneAttribute); + indices[1] = get_thread_id(ctx); store_ptr = LLVMBuildGEP(gallivm->builder, ctx->lds, indices, 2, ""); ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): clover: Fix build against clang SVN >= r265359
Module: Mesa Branch: master Commit: 0daab9878d2b96356cf667591a2c877d912be52d URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=0daab9878d2b96356cf667591a2c877d912be52d Author: Michel Dänzer Date: Tue Apr 5 15:43:35 2016 +0900 clover: Fix build against clang SVN >= r265359 Signed-off-by: Michel Dänzer Reviewed-by: Tom Stellard --- src/gallium/state_trackers/clover/llvm/invocation.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/gallium/state_trackers/clover/llvm/invocation.cpp b/src/gallium/state_trackers/clover/llvm/invocation.cpp index 4d11c24..3fb3596 100644 --- a/src/gallium/state_trackers/clover/llvm/invocation.cpp +++ b/src/gallium/state_trackers/clover/llvm/invocation.cpp @@ -206,6 +206,9 @@ namespace { // http://www.llvm.org/bugs/show_bug.cgi?id=19735 c.getDiagnosticOpts().ShowCarets = false; c.getInvocation().setLangDefaults(c.getLangOpts(), clang::IK_OpenCL, +#if HAVE_LLVM >= 0x0309 +llvm::Triple(triple), +#endif clang::LangStandard::lang_opencl11); c.createDiagnostics( new clang::TextDiagnosticPrinter( ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): radeon/llvm: Set the target triple on the module
Module: Mesa Branch: master Commit: 4f351a6cb1cc5ac6dfb9005c386fcbce7e61ac03 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=4f351a6cb1cc5ac6dfb9005c386fcbce7e61ac03 Author: Tom Stellard Date: Thu Feb 4 02:34:55 2016 + radeon/llvm: Set the target triple on the module Tested-by: Michel Dänzer Reviewed-by: Marek Olšák --- src/gallium/drivers/r600/r600_llvm.c| 2 +- src/gallium/drivers/radeon/radeon_llvm.h| 3 ++- src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c | 9 - src/gallium/drivers/radeonsi/si_shader.c| 2 +- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/gallium/drivers/r600/r600_llvm.c b/src/gallium/drivers/r600/r600_llvm.c index 0fe7c74..981bb12 100644 --- a/src/gallium/drivers/r600/r600_llvm.c +++ b/src/gallium/drivers/r600/r600_llvm.c @@ -784,7 +784,7 @@ LLVMModuleRef r600_tgsi_llvm( { struct tgsi_shader_info shader_info; struct lp_build_tgsi_context * bld_base = &ctx->soa.bld_base; - radeon_llvm_context_init(ctx); + radeon_llvm_context_init(ctx, "r600--"); LLVMTypeRef Arguments[32]; unsigned ArgumentsCount = 0; for (unsigned i = 0; i < ctx->inputs_count; i++) diff --git a/src/gallium/drivers/radeon/radeon_llvm.h b/src/gallium/drivers/radeon/radeon_llvm.h index e967ad2..9f7d039 100644 --- a/src/gallium/drivers/radeon/radeon_llvm.h +++ b/src/gallium/drivers/radeon/radeon_llvm.h @@ -158,7 +158,8 @@ void radeon_llvm_emit_prepare_cube_coords(struct lp_build_tgsi_context * bld_bas LLVMValueRef *coords_arg, LLVMValueRef *derivs_arg); -void radeon_llvm_context_init(struct radeon_llvm_context * ctx); +void radeon_llvm_context_init(struct radeon_llvm_context * ctx, + const char *triple); void radeon_llvm_create_func(struct radeon_llvm_context * ctx, LLVMTypeRef *ParamTypes, unsigned ParamCount); diff --git a/src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c b/src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c index f5e3f6a..73bc849 100644 --- a/src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c +++ b/src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c @@ -1520,7 +1520,7 @@ static void emit_up2h(const struct lp_build_tgsi_action *action, } } -void radeon_llvm_context_init(struct radeon_llvm_context * ctx) +void radeon_llvm_context_init(struct radeon_llvm_context * ctx, const char *triple) { struct lp_type type; @@ -1534,6 +1534,13 @@ void radeon_llvm_context_init(struct radeon_llvm_context * ctx) ctx->gallivm.context = LLVMContextCreate(); ctx->gallivm.module = LLVMModuleCreateWithNameInContext("tgsi", ctx->gallivm.context); + LLVMSetTarget(ctx->gallivm.module, + +#if HAVE_LLVM < 0x0306 + "r600--"); +#else + triple); +#endif ctx->gallivm.builder = LLVMCreateBuilderInContext(ctx->gallivm.context); struct lp_build_tgsi_context * bld_base = &ctx->soa.bld_base; diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index 19c427a..d1482de 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -4323,7 +4323,7 @@ static void si_init_shader_ctx(struct si_shader_context *ctx, struct lp_build_tgsi_context *bld_base; memset(ctx, 0, sizeof(*ctx)); - radeon_llvm_context_init(&ctx->radeon_bld); + radeon_llvm_context_init(&ctx->radeon_bld, "amdgcn--"); ctx->tm = tm; ctx->screen = sscreen; if (shader && shader->selector) ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): gallivm: Add helpers for creating and destroying TargetLibraryInfo
Module: Mesa Branch: master Commit: 77f4e1c7ffeb9c98957f0f22c872f8ca7f93970d URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=77f4e1c7ffeb9c98957f0f22c872f8ca7f93970d Author: Tom Stellard Date: Thu Feb 4 19:36:50 2016 + gallivm: Add helpers for creating and destroying TargetLibraryInfo This functionality is not exposed via the LLVM C API. Tested-by: Michel Dänzer Reviewed-by: Marek Olšák --- src/gallium/auxiliary/gallivm/lp_bld_misc.cpp | 30 +++ src/gallium/auxiliary/gallivm/lp_bld_misc.h | 7 +++ 2 files changed, 37 insertions(+) diff --git a/src/gallium/auxiliary/gallivm/lp_bld_misc.cpp b/src/gallium/auxiliary/gallivm/lp_bld_misc.cpp index 3ee708f..30ef37c 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_misc.cpp +++ b/src/gallium/auxiliary/gallivm/lp_bld_misc.cpp @@ -61,6 +61,11 @@ #include #include #include +#if HAVE_LLVM >= 0x0307 +#include +#else +#include +#endif #if HAVE_LLVM < 0x0306 #include #else @@ -147,6 +152,31 @@ lp_set_target_options(void) gallivm_init_llvm_targets(); } +extern "C" +LLVMTargetLibraryInfoRef +gallivm_create_target_library_info(const char *triple) +{ + return reinterpret_cast( +#if HAVE_LLVM < 0x0307 + new llvm::TargetLibraryInfo( +#else + new llvm::TargetLibraryInfoImpl( +#endif + llvm::Triple(triple))); +} + +extern "C" +void +gallivm_dispose_target_library_info(LLVMTargetLibraryInfoRef library_info) +{ + delete reinterpret_cast< +#if HAVE_LLVM < 0x0307 + llvm::TargetLibraryInfo +#else + llvm::TargetLibraryInfoImpl +#endif + *>(library_info); +} extern "C" LLVMValueRef diff --git a/src/gallium/auxiliary/gallivm/lp_bld_misc.h b/src/gallium/auxiliary/gallivm/lp_bld_misc.h index 86d2f86..30b7b16 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_misc.h +++ b/src/gallium/auxiliary/gallivm/lp_bld_misc.h @@ -32,6 +32,7 @@ #include "lp_bld.h" #include +#include #ifdef __cplusplus @@ -44,6 +45,12 @@ struct lp_generated_code; extern void gallivm_init_llvm_targets(void); +extern LLVMTargetLibraryInfoRef +gallivm_create_target_library_info(const char *triple); + +extern void +gallivm_dispose_target_library_info(LLVMTargetLibraryInfoRef library_info); + extern void lp_set_target_options(void); ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): radeon/llvm: Add TargetLibraryInfo to the pass manager
Module: Mesa Branch: master Commit: dc7cf07af354ccae040d533b1c46aee61872e39a URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=dc7cf07af354ccae040d533b1c46aee61872e39a Author: Tom Stellard Date: Thu Feb 4 19:37:31 2016 + radeon/llvm: Add TargetLibraryInfo to the pass manager This will prevent optimization passes from introducing unsupported library calls. Tested-by: Michel Dänzer Reviewed-by: Marek Olšák --- src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c | 8 +++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c b/src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c index 73bc849..076d70e 100644 --- a/src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c +++ b/src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c @@ -30,6 +30,7 @@ #include "gallivm/lp_bld_flow.h" #include "gallivm/lp_bld_init.h" #include "gallivm/lp_bld_intr.h" +#include "gallivm/lp_bld_misc.h" #include "gallivm/lp_bld_swizzle.h" #include "tgsi/tgsi_info.h" #include "tgsi/tgsi_parse.h" @@ -1717,11 +1718,16 @@ void radeon_llvm_create_func(struct radeon_llvm_context * ctx, void radeon_llvm_finalize_module(struct radeon_llvm_context * ctx) { struct gallivm_state * gallivm = ctx->soa.bld_base.base.gallivm; + const char *triple = LLVMGetTarget(gallivm->module); + LLVMTargetLibraryInfoRef target_library_info; /* Create the pass manager */ gallivm->passmgr = LLVMCreateFunctionPassManagerForModule( gallivm->module); + target_library_info = gallivm_create_target_library_info(triple); + LLVMAddTargetLibraryInfo(target_library_info, gallivm->passmgr); + /* This pass should eliminate all the load and store instructions */ LLVMAddPromoteMemoryToRegisterPass(gallivm->passmgr); @@ -1737,7 +1743,7 @@ void radeon_llvm_finalize_module(struct radeon_llvm_context * ctx) LLVMDisposeBuilder(gallivm->builder); LLVMDisposePassManager(gallivm->passmgr); - + gallivm_dispose_target_library_info(target_library_info); } void radeon_llvm_dispose(struct radeon_llvm_context * ctx) ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): clover: Handle NULL devices returned by pipe_loader_probe() v2
Module: Mesa Branch: master Commit: 9adbb9e7134fdc40766710592e81cbc9c09c7aaa URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=9adbb9e7134fdc40766710592e81cbc9c09c7aaa Author: Tom Stellard Date: Sat Nov 28 02:40:24 2015 + clover: Handle NULL devices returned by pipe_loader_probe() v2 When probing for devices, clover will call pipe_loader_probe() twice. The first time to retrieve the number of devices, and then second time to retrieve the device structures. We currently assume that the return value of both calls will be the same, but this will not be the case if a device happens to disappear between the two calls. When a device disappears, the pipe_loader_probe() will add a NULL device to the device list, so we need to handle this. v2: - Keep range for loop Reviewed-by: Francisco Jerez Acked-by: Emil Velikov CC: --- src/gallium/state_trackers/clover/core/platform.cpp |3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/gallium/state_trackers/clover/core/platform.cpp b/src/gallium/state_trackers/clover/core/platform.cpp index 328b71c..489e8dc 100644 --- a/src/gallium/state_trackers/clover/core/platform.cpp +++ b/src/gallium/state_trackers/clover/core/platform.cpp @@ -32,7 +32,8 @@ platform::platform() : adaptor_range(evals(), devs) { for (pipe_loader_device *ldev : ldevs) { try { - devs.push_back(create(*this, ldev)); + if (ldev) +devs.push_back(create(*this, ldev)); } catch (error &) { pipe_loader_release(&ldev, 1); } ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): radeonsi/compute: Use the compiler' s COMPUTE_PGM_RSRC* register values
Module: Mesa Branch: master Commit: 89851a296536b89364fe6104d13330975788f960 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=89851a296536b89364fe6104d13330975788f960 Author: Tom Stellard Date: Mon Nov 16 20:00:12 2015 + radeonsi/compute: Use the compiler's COMPUTE_PGM_RSRC* register values The compiler has more information and is able to optimize the bits it sets in these registers. Reviewed-by: Marek Olšák CC: --- src/gallium/drivers/radeonsi/si_compute.c | 36 - src/gallium/drivers/radeonsi/si_shader.c |2 ++ 2 files changed, 7 insertions(+), 31 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_compute.c b/src/gallium/drivers/radeonsi/si_compute.c index 2d551dd..e134b37 100644 --- a/src/gallium/drivers/radeonsi/si_compute.c +++ b/src/gallium/drivers/radeonsi/si_compute.c @@ -34,11 +34,6 @@ #define MAX_GLOBAL_BUFFERS 20 -/* XXX: Even though we don't pass the scratch buffer via user sgprs any more - * LLVM still expects that we specify 4 USER_SGPRS so it can remain compatible - * with older mesa. */ -#define NUM_USER_SGPRS 4 - struct si_compute { struct si_context *ctx; @@ -238,7 +233,6 @@ static void si_launch_grid( uint64_t kernel_args_va; uint64_t scratch_buffer_va = 0; uint64_t shader_va; - unsigned arg_user_sgpr_count = NUM_USER_SGPRS; unsigned i; struct si_shader *shader = &program->shader; unsigned lds_blocks; @@ -366,20 +360,7 @@ static void si_launch_grid( si_pm4_set_reg(pm4, R_00B830_COMPUTE_PGM_LO, shader_va >> 8); si_pm4_set_reg(pm4, R_00B834_COMPUTE_PGM_HI, shader_va >> 40); - si_pm4_set_reg(pm4, R_00B848_COMPUTE_PGM_RSRC1, - /* We always use at least 3 VGPRS, these come from -* TIDIG_COMP_CNT. -* XXX: The compiler should account for this. -*/ - S_00B848_VGPRS((MAX2(3, shader->num_vgprs) - 1) / 4) - /* We always use at least 4 + arg_user_sgpr_count. The 4 extra -* sgprs are from TGID_X_EN, TGID_Y_EN, TGID_Z_EN, TG_SIZE_EN -* XXX: The compiler should account for this. -*/ - | S_00B848_SGPRS(((MAX2(4 + arg_user_sgpr_count, - shader->num_sgprs)) - 1) / 8) - | S_00B028_FLOAT_MODE(shader->float_mode)) - ; + si_pm4_set_reg(pm4, R_00B848_COMPUTE_PGM_RSRC1, shader->rsrc1); lds_blocks = shader->lds_size; /* XXX: We are over allocating LDS. For SI, the shader reports LDS in @@ -395,17 +376,10 @@ static void si_launch_grid( assert(lds_blocks <= 0xFF); - si_pm4_set_reg(pm4, R_00B84C_COMPUTE_PGM_RSRC2, - S_00B84C_SCRATCH_EN(shader->scratch_bytes_per_wave > 0) - | S_00B84C_USER_SGPR(arg_user_sgpr_count) - | S_00B84C_TGID_X_EN(1) - | S_00B84C_TGID_Y_EN(1) - | S_00B84C_TGID_Z_EN(1) - | S_00B84C_TG_SIZE_EN(1) - | S_00B84C_TIDIG_COMP_CNT(2) - | S_00B84C_LDS_SIZE(lds_blocks) - | S_00B84C_EXCP_EN(0)) - ; + shader->rsrc2 &= C_00B84C_LDS_SIZE; + shader->rsrc2 |= S_00B84C_LDS_SIZE(lds_blocks); + + si_pm4_set_reg(pm4, R_00B84C_COMPUTE_PGM_RSRC2, shader->rsrc2); si_pm4_set_reg(pm4, R_00B854_COMPUTE_RESOURCE_LIMITS, 0); si_pm4_set_reg(pm4, R_00B858_COMPUTE_STATIC_THREAD_MGMT_SE0, diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index 354d064..14f12df 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -3745,12 +3745,14 @@ void si_shader_binary_read_config(const struct si_screen *sscreen, shader->num_sgprs = MAX2(shader->num_sgprs, (G_00B028_SGPRS(value) + 1) * 8); shader->num_vgprs = MAX2(shader->num_vgprs, (G_00B028_VGPRS(value) + 1) * 4); shader->float_mode = G_00B028_FLOAT_MODE(value); + shader->rsrc1 = value; break; case R_00B02C_SPI_SHADER_PGM_RSRC2_PS: shader->lds_size = MAX2(shader->lds_size, G_00B02C_EXTRA_LDS_SIZE(value)); break; case R_00B84C_COMPUTE_PGM_RSRC2: shader->lds_size = MAX2(shader->lds_size, G_00B84C_LDS_SIZE(value)); + shader->rsrc2 = value; break; case R_0286CC_SPI_PS_INPUT_ENA: shader->spi_ps_input_ena = value; ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): radeonsi: Rename si_shader::ls_rsrc{1, 2} to si_shader:: rsrc{1,2}
Module: Mesa Branch: master Commit: 95e051091676584fd7bfba9d0316c3747bf17f35 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=95e051091676584fd7bfba9d0316c3747bf17f35 Author: Tom Stellard Date: Mon Nov 16 19:58:32 2015 + radeonsi: Rename si_shader::ls_rsrc{1,2} to si_shader::rsrc{1,2} In the future, these will be used by other shaders types. Reviewed-by: Marek Olšák --- src/gallium/drivers/radeonsi/si_shader.h|4 ++-- src/gallium/drivers/radeonsi/si_state_draw.c|4 ++-- src/gallium/drivers/radeonsi/si_state_shaders.c |4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_shader.h b/src/gallium/drivers/radeonsi/si_shader.h index 3400a03..f089dc7 100644 --- a/src/gallium/drivers/radeonsi/si_shader.h +++ b/src/gallium/drivers/radeonsi/si_shader.h @@ -290,8 +290,8 @@ struct si_shader { boolis_gs_copy_shader; booldx10_clamp_mode; /* convert NaNs to 0 */ - unsignedls_rsrc1; - unsignedls_rsrc2; + unsignedrsrc1; + unsignedrsrc2; }; static inline struct tgsi_shader_info *si_get_vs_info(struct si_context *sctx) diff --git a/src/gallium/drivers/radeonsi/si_state_draw.c b/src/gallium/drivers/radeonsi/si_state_draw.c index 753abc8..771d206 100644 --- a/src/gallium/drivers/radeonsi/si_state_draw.c +++ b/src/gallium/drivers/radeonsi/si_state_draw.c @@ -163,7 +163,7 @@ static void si_emit_derived_tess_state(struct si_context *sctx, perpatch_output_offset = output_patch0_offset + pervertex_output_patch_size; lds_size = output_patch0_offset + output_patch_size * *num_patches; - ls_rsrc2 = ls->current->ls_rsrc2; + ls_rsrc2 = ls->current->rsrc2; if (sctx->b.chip_class >= CIK) { assert(lds_size <= 65536); @@ -178,7 +178,7 @@ static void si_emit_derived_tess_state(struct si_context *sctx, if (sctx->b.chip_class == CIK && sctx->b.family != CHIP_HAWAII) radeon_set_sh_reg(cs, R_00B52C_SPI_SHADER_PGM_RSRC2_LS, ls_rsrc2); radeon_set_sh_reg_seq(cs, R_00B528_SPI_SHADER_PGM_RSRC1_LS, 2); - radeon_emit(cs, ls->current->ls_rsrc1); + radeon_emit(cs, ls->current->rsrc1); radeon_emit(cs, ls_rsrc2); /* Compute userdata SGPRs. */ diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c b/src/gallium/drivers/radeonsi/si_state_shaders.c index 7f6511c..ca6b4be 100644 --- a/src/gallium/drivers/radeonsi/si_state_shaders.c +++ b/src/gallium/drivers/radeonsi/si_state_shaders.c @@ -121,11 +121,11 @@ static void si_shader_ls(struct si_shader *shader) si_pm4_set_reg(pm4, R_00B520_SPI_SHADER_PGM_LO_LS, va >> 8); si_pm4_set_reg(pm4, R_00B524_SPI_SHADER_PGM_HI_LS, va >> 40); - shader->ls_rsrc1 = S_00B528_VGPRS((shader->num_vgprs - 1) / 4) | + shader->rsrc1 = S_00B528_VGPRS((shader->num_vgprs - 1) / 4) | S_00B528_SGPRS((num_sgprs - 1) / 8) | S_00B528_VGPR_COMP_CNT(vgpr_comp_cnt) | S_00B528_DX10_CLAMP(shader->dx10_clamp_mode); - shader->ls_rsrc2 = S_00B52C_USER_SGPR(num_user_sgprs) | + shader->rsrc2 = S_00B52C_USER_SGPR(num_user_sgprs) | S_00B52C_SCRATCH_EN(shader->scratch_bytes_per_wave > 0); } ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): gallivm: Allow drivers and state trackers to initialize gallivm LLVM targets v2
Module: Mesa Branch: master Commit: 76cfd6f1da3748effb480e4f1151910af59fb88a URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=76cfd6f1da3748effb480e4f1151910af59fb88a Author: Tom Stellard Date: Thu Sep 24 15:57:02 2015 + gallivm: Allow drivers and state trackers to initialize gallivm LLVM targets v2 Drivers and state trackers that use LLVM for generating code, must register the targets they use with LLVM's global TargetRegistry. The TargetRegistry is not thread-safe, so all targets must be added to the registry before it can be queried for target information. When drivers and state trackers initialize their own targets, they need a way to force gallivm to initialize its targets at the same time. Otherwise, there can be a race condition in some multi-threaded applications (e.g. glx-multihreaded-shader-compile in piglit), when one thread creates a context for a driver that uses LLVM (e.g. radeonsi) and another thread creates a gallivm context (glxContextCreate does this). The race happens when the driver thread initializes its LLVM targets and then starts using the registry before the gallivm thread has a chance to register its targets. This patch allows users to force gallivm to register its targets by calling the gallivm_init_llvm_targets() function. v2: - Use call_once and remove mutexes and static initializations. - Replace gallivm_init_llvm_{begin,end}() with gallivm_init_llvm_targets(). Reviewed-by: Marek Olšák Reviewed-by: Mathias Fröhlich Reviewed-by: Emil Velikov CC: "10.6 11.0" --- src/gallium/auxiliary/gallivm/lp_bld_misc.cpp | 37 - src/gallium/auxiliary/gallivm/lp_bld_misc.h |2 ++ src/gallium/targets/opencl/Makefile.am|3 +- 3 files changed, 34 insertions(+), 8 deletions(-) diff --git a/src/gallium/auxiliary/gallivm/lp_bld_misc.cpp b/src/gallium/auxiliary/gallivm/lp_bld_misc.cpp index 5e25819..72fab8c 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_misc.cpp +++ b/src/gallium/auxiliary/gallivm/lp_bld_misc.cpp @@ -81,6 +81,8 @@ # pragma pop_macro("DEBUG") #endif +#include "c11/threads.h" +#include "os/os_thread.h" #include "pipe/p_config.h" #include "util/u_debug.h" #include "util/u_cpu_detect.h" @@ -103,6 +105,33 @@ static LLVMEnsureMultithreaded lLVMEnsureMultithreaded; } +static once_flag init_native_targets_once_flag; + +static void init_native_targets() +{ + // If we have a native target, initialize it to ensure it is linked in and + // usable by the JIT. + llvm::InitializeNativeTarget(); + + llvm::InitializeNativeTargetAsmPrinter(); + + llvm::InitializeNativeTargetDisassembler(); +} + +/** + * The llvm target registry is not thread-safe, so drivers and state-trackers + * that want to initialize targets should use the gallivm_init_llvm_targets() + * function to safely initialize targets. + * + * LLVM targets should be initialized before the driver or state-tracker tries + * to access the registry. + */ +extern "C" void +gallivm_init_llvm_targets(void) +{ + call_once(&init_native_targets_once_flag, init_native_targets); +} + extern "C" void lp_set_target_options(void) { @@ -115,13 +144,7 @@ lp_set_target_options(void) llvm::DisablePrettyStackTrace = true; #endif - // If we have a native target, initialize it to ensure it is linked in and - // usable by the JIT. - llvm::InitializeNativeTarget(); - - llvm::InitializeNativeTargetAsmPrinter(); - - llvm::InitializeNativeTargetDisassembler(); + gallivm_init_llvm_targets(); } diff --git a/src/gallium/auxiliary/gallivm/lp_bld_misc.h b/src/gallium/auxiliary/gallivm/lp_bld_misc.h index 36923aa..86d2f86 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_misc.h +++ b/src/gallium/auxiliary/gallivm/lp_bld_misc.h @@ -41,6 +41,8 @@ extern "C" { struct lp_generated_code; +extern void +gallivm_init_llvm_targets(void); extern void lp_set_target_options(void); diff --git a/src/gallium/targets/opencl/Makefile.am b/src/gallium/targets/opencl/Makefile.am index 4ab706e..c78b268 100644 --- a/src/gallium/targets/opencl/Makefile.am +++ b/src/gallium/targets/opencl/Makefile.am @@ -35,7 +35,8 @@ lib@OPENCL_LIBNAME@_la_LIBADD = \ -lclangEdit \ -lclangLex \ -lclangBasic \ - $(LLVM_LIBS) + $(LLVM_LIBS) \ + $(PTHREAD_LIBS) nodist_EXTRA_lib@OPENCL_LIBNAME@_la_SOURCES = dummy.cpp lib@OPENCL_LIBNAME@_la_SOURCES = ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): radeon/llvm: Initialize gallivm targets when initializing the AMDGPU target v2
Module: Mesa Branch: master Commit: a2e1e3d325a70604151ef093ed741e60d078a21a URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=a2e1e3d325a70604151ef093ed741e60d078a21a Author: Tom Stellard Date: Thu Sep 24 16:29:56 2015 + radeon/llvm: Initialize gallivm targets when initializing the AMDGPU target v2 This fixes a race condition in the glx-multithreaded-shader-compile test. v2: - Replace gallivm_init_llvm_{begin,end}() with gallivm_init_llvm_targets(). Reviewed-by: Marek Olšák Reviewed-by: Mathias Fröhlich Reviewed-by: Emil Velikov CC: "10.6 11.0" --- src/gallium/drivers/radeon/radeon_llvm_emit.c |2 ++ 1 file changed, 2 insertions(+) diff --git a/src/gallium/drivers/radeon/radeon_llvm_emit.c b/src/gallium/drivers/radeon/radeon_llvm_emit.c index ff30a14..6b2ebde 100644 --- a/src/gallium/drivers/radeon/radeon_llvm_emit.c +++ b/src/gallium/drivers/radeon/radeon_llvm_emit.c @@ -26,6 +26,7 @@ #include "radeon_llvm_emit.h" #include "radeon_elf_util.h" #include "c11/threads.h" +#include "gallivm/lp_bld_misc.h" #include "util/u_memory.h" #include "pipe/p_shader_tokens.h" @@ -87,6 +88,7 @@ void radeon_llvm_shader_type(LLVMValueRef F, unsigned type) static void init_r600_target() { + gallivm_init_llvm_targets(); #if HAVE_LLVM < 0x0307 LLVMInitializeR600TargetInfo(); LLVMInitializeR600Target(); ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): gallium/radeon: Use call_once() when initailizing LLVM targets
Module: Mesa Branch: master Commit: 3219b48ae5a5b1288bf1fc1325ebbc7ac9e236df URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=3219b48ae5a5b1288bf1fc1325ebbc7ac9e236df Author: Tom Stellard Date: Wed Sep 30 15:00:39 2015 + gallium/radeon: Use call_once() when initailizing LLVM targets Reviewed-by: Marek Olšák Reviewed-by: Mathias Fröhlich Reviewed-by: Emil Velikov CC: "10.6 11.0" --- src/gallium/drivers/radeon/radeon_llvm_emit.c | 25 - 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/src/gallium/drivers/radeon/radeon_llvm_emit.c b/src/gallium/drivers/radeon/radeon_llvm_emit.c index 3acbd02..ff30a14 100644 --- a/src/gallium/drivers/radeon/radeon_llvm_emit.c +++ b/src/gallium/drivers/radeon/radeon_llvm_emit.c @@ -25,6 +25,7 @@ */ #include "radeon_llvm_emit.h" #include "radeon_elf_util.h" +#include "c11/threads.h" #include "util/u_memory.h" #include "pipe/p_shader_tokens.h" @@ -86,30 +87,28 @@ void radeon_llvm_shader_type(LLVMValueRef F, unsigned type) static void init_r600_target() { - static unsigned initialized = 0; - if (!initialized) { #if HAVE_LLVM < 0x0307 - LLVMInitializeR600TargetInfo(); - LLVMInitializeR600Target(); - LLVMInitializeR600TargetMC(); - LLVMInitializeR600AsmPrinter(); + LLVMInitializeR600TargetInfo(); + LLVMInitializeR600Target(); + LLVMInitializeR600TargetMC(); + LLVMInitializeR600AsmPrinter(); #else - LLVMInitializeAMDGPUTargetInfo(); - LLVMInitializeAMDGPUTarget(); - LLVMInitializeAMDGPUTargetMC(); - LLVMInitializeAMDGPUAsmPrinter(); + LLVMInitializeAMDGPUTargetInfo(); + LLVMInitializeAMDGPUTarget(); + LLVMInitializeAMDGPUTargetMC(); + LLVMInitializeAMDGPUAsmPrinter(); #endif - initialized = 1; - } } +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; - init_r600_target(); + call_once(&init_r600_target_once_flag, init_r600_target); if (LLVMGetTargetFromTriple(triple, &target, &err_message)) { fprintf(stderr, "Cannot find target for triple %s ", triple); ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): clover: make dispatch matches functions def
Module: Mesa Branch: master Commit: a40179f47ba11e78097ae1a839df6f3911a6749f URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=a40179f47ba11e78097ae1a839df6f3911a6749f Author: EdB Date: Fri Jul 31 19:14:45 2015 +0200 clover: make dispatch matches functions def Reviewed-by: Francisco Jerez --- src/gallium/state_trackers/clover/api/dispatch.hpp | 23 +++- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/gallium/state_trackers/clover/api/dispatch.hpp b/src/gallium/state_trackers/clover/api/dispatch.hpp index ffae1ae..7f62282 100644 --- a/src/gallium/state_trackers/clover/api/dispatch.hpp +++ b/src/gallium/state_trackers/clover/api/dispatch.hpp @@ -693,7 +693,13 @@ struct _cl_icd_dispatch { CL_API_ENTRY cl_int (CL_API_CALL *clUnloadPlatformCompiler)( cl_platform_id platform); - void *clGetKernelArgInfo; + CL_API_ENTRY cl_int (CL_API_CALL *clGetKernelArgInfo)( + cl_kernel kernel, + cl_uint arg_indx, + cl_kernel_arg_info param_name, + size_t param_value_size, + void *param_value, + size_t *param_value_size_ret); CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueFillBuffer)( cl_command_queue command_queue, @@ -701,7 +707,7 @@ struct _cl_icd_dispatch { const void *pattern, size_t pattern_size, size_t offset, - size_t cb, + size_t size, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event); @@ -710,13 +716,20 @@ struct _cl_icd_dispatch { cl_command_queue command_queue, cl_mem image, const void *fill_color, - const size_t origin[3], - const size_t region[3], + const size_t *origin, + const size_t *region, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event); - void *clEnqueueMigrateMemObjects; + CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueMigrateMemObjects)( + cl_command_queue command_queue, + cl_uint num_mem_objects, + const cl_mem *mem_objects, + cl_mem_migration_flags flags, + cl_uint num_events_in_wait_list, + const cl_event *event_wait_list, + cl_event *event); CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueMarkerWithWaitList)( cl_command_queue command_queue, ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): gallivm: Don't use raw_debug_ostream for dissasembling
Module: Mesa Branch: master Commit: 9f7a68feafc86a51a7c5165672b29cb7182da738 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=9f7a68feafc86a51a7c5165672b29cb7182da738 Author: Tom Stellard Date: Mon Jul 20 06:49:05 2015 -0700 gallivm: Don't use raw_debug_ostream for dissasembling All LLVM API calls that require an ostream object have been removed from the disassemble() function, so we don't need to use this class to wrap _debug_printf() we can just call this function directly. Reviewed-by: Jose Fonseca --- src/gallium/auxiliary/gallivm/lp_bld_debug.cpp | 27 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/src/gallium/auxiliary/gallivm/lp_bld_debug.cpp b/src/gallium/auxiliary/gallivm/lp_bld_debug.cpp index 405e648..ec88f33 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_debug.cpp +++ b/src/gallium/auxiliary/gallivm/lp_bld_debug.cpp @@ -123,7 +123,7 @@ lp_debug_dump_value(LLVMValueRef value) * - http://blog.llvm.org/2010/04/intro-to-llvm-mc-project.html */ static size_t -disassemble(const void* func, llvm::raw_ostream & Out) +disassemble(const void* func) { const uint8_t *bytes = (const uint8_t *)func; @@ -141,7 +141,8 @@ disassemble(const void* func, llvm::raw_ostream & Out) char outline[1024]; if (!D) { - Out << "error: couldn't create disassembler for triple " << Triple << "\n"; + _debug_printf("error: couldn't create disassembler for triple %s\n", +Triple.c_str()); return 0; } @@ -155,13 +156,13 @@ disassemble(const void* func, llvm::raw_ostream & Out) * so that between runs. */ - Out << llvm::format("%6lu:\t", (unsigned long)pc); + _debug_printf("%6lu:\t", (unsigned long)pc); Size = LLVMDisasmInstruction(D, (uint8_t *)bytes + pc, extent - pc, 0, outline, sizeof outline); if (!Size) { - Out << "invalid\n"; + _debug_printf("invalid\n"); pc += 1; break; } @@ -173,10 +174,10 @@ disassemble(const void* func, llvm::raw_ostream & Out) if (0) { unsigned i; for (i = 0; i < Size; ++i) { -Out << llvm::format("%02x ", bytes[pc + i]); +_debug_printf("%02x ", bytes[pc + i]); } for (; i < 16; ++i) { -Out << " "; +_debug_printf(" "); } } @@ -184,9 +185,9 @@ disassemble(const void* func, llvm::raw_ostream & Out) * Print the instruction. */ - Out << outline; + _debug_printf("%*s", Size, outline); - Out << "\n"; + _debug_printf("\n"); /* * Stop disassembling on return statements, if there is no record of a @@ -206,13 +207,12 @@ disassemble(const void* func, llvm::raw_ostream & Out) pc += Size; if (pc >= extent) { - Out << "disassembly larger than " << extent << "bytes, aborting\n"; + _debug_printf("disassembly larger than %ull bytes, aborting\n", extent); break; } } - Out << "\n"; - Out.flush(); + _debug_printf("\n"); LLVMDisasmDispose(D); @@ -229,9 +229,8 @@ disassemble(const void* func, llvm::raw_ostream & Out) extern "C" void lp_disassemble(LLVMValueRef func, const void *code) { - raw_debug_ostream Out; - Out << LLVMGetValueName(func) << ":\n"; - disassemble(code, Out); + _debug_printf("%s:\n", LLVMGetValueName(func)); + disassemble(code); } ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): gallivm: Add ifdefs so raw_debug_stream is only defined when used
Module: Mesa Branch: master Commit: a3b53beaa0351cf1322c6e1a580dc7cc3d0cad0c URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=a3b53beaa0351cf1322c6e1a580dc7cc3d0cad0c Author: Tom Stellard Date: Mon Jul 20 11:24:13 2015 -0400 gallivm: Add ifdefs so raw_debug_stream is only defined when used Its only use is to implement a custom version of LLVMDumpValue on some Windows and embedded platforms. Reviewed-by: Jose Fonseca --- src/gallium/auxiliary/gallivm/lp_bld_debug.cpp |2 ++ 1 file changed, 2 insertions(+) diff --git a/src/gallium/auxiliary/gallivm/lp_bld_debug.cpp b/src/gallium/auxiliary/gallivm/lp_bld_debug.cpp index ec88f33..0a5c2cc 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_debug.cpp +++ b/src/gallium/auxiliary/gallivm/lp_bld_debug.cpp @@ -61,6 +61,7 @@ lp_check_alignment(const void *ptr, unsigned alignment) return ((uintptr_t)ptr & (alignment - 1)) == 0; } +#if (defined(PIPE_OS_WINDOWS) && !defined(PIPE_CC_MSVC)) || defined(PIPE_OS_EMBEDDED) class raw_debug_ostream : public llvm::raw_ostream @@ -91,6 +92,7 @@ raw_debug_ostream::write_impl(const char *Ptr, size_t Size) } } +#endif extern "C" const char * lp_get_module_id(LLVMModuleRef module) ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): gallivm: Initialize LLVM Modules' s DataLayout to an empty string.
Module: Mesa Branch: master Commit: 4be30fcd058209966fc72fbfa51bbe881c307ed5 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=4be30fcd058209966fc72fbfa51bbe881c307ed5 Author: Tom Stellard Date: Mon Jul 20 15:12:56 2015 + gallivm: Initialize LLVM Modules's DataLayout to an empty string. This fixes crashes in llvmpipe with LLVM 3.8 and also some piglit tests on radeonsi that use the draw module. This is just a temporary solution. The correct solution will require creating a TargetMachine during gallivm initialization and pulling the DataLayout from there. This will be a somewhat invasive change, and it will need to be validatated on multiple LLVM versions. https://llvm.org/bugs/show_bug.cgi?id=24172 Reviewed-by: Roland Scheidegger --- src/gallium/auxiliary/gallivm/lp_bld_init.c | 28 ++- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/src/gallium/auxiliary/gallivm/lp_bld_init.c b/src/gallium/auxiliary/gallivm/lp_bld_init.c index 384ea86..017d075 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_init.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_init.c @@ -106,7 +106,6 @@ enum LLVM_CodeGenOpt_Level { static boolean create_pass_manager(struct gallivm_state *gallivm) { - char *td_str; assert(!gallivm->passmgr); assert(gallivm->target); @@ -122,10 +121,29 @@ create_pass_manager(struct gallivm_state *gallivm) // Old versions of LLVM get the DataLayout from the pass manager. LLVMAddTargetData(gallivm->target, gallivm->passmgr); - // New ones from the Module. - td_str = LLVMCopyStringRepOfTargetData(gallivm->target); - LLVMSetDataLayout(gallivm->module, td_str); - free(td_str); + /* Setting the module's DataLayout to an empty string will cause the +* ExecutionEngine to copy to the DataLayout string from its target +* machine to the module. As of LLVM 3.8 the module and the execution +* engine are required to have the same DataLayout. +* +* TODO: This is just a temporary work-around. The correct solution is +* for gallivm_init_state() to create a TargetMachine and pull the +* DataLayout from there. Currently, the TargetMachine used by llvmpipe +* is being implicitly created by the EngineBuilder in +* lp_build_create_jit_compiler_for_module() +*/ + +#if HAVE_LLVM < 0x0308 + { + char *td_str; + // New ones from the Module. + td_str = LLVMCopyStringRepOfTargetData(gallivm->target); + LLVMSetDataLayout(gallivm->module, td_str); + free(td_str); + } +#else + LLVMSetDataLayout(gallivm->module, ""); +#endif if ((gallivm_debug & GALLIVM_DEBUG_NO_OPT) == 0) { /* These are the passes currently listed in llvm-c/Transforms/Scalar.h, ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): radeon/llvm: Handle LLVM backend rename from R600 to AMDGPU
Module: Mesa Branch: master Commit: 4d35eef326e49cc8da50879d30a1c5088d4775e1 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=4d35eef326e49cc8da50879d30a1c5088d4775e1 Author: Tom Stellard Date: Thu Jun 11 15:42:25 2015 + radeon/llvm: Handle LLVM backend rename from R600 to AMDGPU Reviewed-by: Marek Olšák --- configure.ac | 13 - src/gallium/drivers/radeon/radeon_llvm_emit.c |8 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/configure.ac b/configure.ac index be0cd7d..34d1ac9 100644 --- a/configure.ac +++ b/configure.ac @@ -2048,16 +2048,19 @@ require_egl_drm() { } radeon_llvm_check() { +if test ${LLVM_VERSION_INT} -lt 307; then +amdgpu_llvm_target_name='r600' +else +amdgpu_llvm_target_name='amdgpu' +fi if test "x$enable_gallium_llvm" != "xyes"; then AC_MSG_ERROR([--enable-gallium-llvm is required when building $1]) fi llvm_check_version_for "3" "4" "2" $1 -if test true && $LLVM_CONFIG --targets-built | grep -qvw 'R600' ; then -AC_MSG_ERROR([LLVM R600 Target not enabled. You can enable it when building the LLVM - sources with the --enable-experimental-targets=R600 - configure flag]) +if test true && $LLVM_CONFIG --targets-built | grep -iqvw $amdgpu_llvm_target_name ; then +AC_MSG_ERROR([LLVM $amdgpu_llvm_target_name not enabled in your LLVM build.]) fi -LLVM_COMPONENTS="${LLVM_COMPONENTS} r600 bitreader ipo" +LLVM_COMPONENTS="${LLVM_COMPONENTS} $amdgpu_llvm_target_name bitreader ipo" NEED_RADEON_LLVM=yes if test "x$have_libelf" != xyes; then AC_MSG_ERROR([$1 requires libelf when using llvm]) diff --git a/src/gallium/drivers/radeon/radeon_llvm_emit.c b/src/gallium/drivers/radeon/radeon_llvm_emit.c index 624077c..25580b6 100644 --- a/src/gallium/drivers/radeon/radeon_llvm_emit.c +++ b/src/gallium/drivers/radeon/radeon_llvm_emit.c @@ -86,10 +86,18 @@ static void init_r600_target() { static unsigned initialized = 0; if (!initialized) { +#if HAVE_LLVM < 0x0307 LLVMInitializeR600TargetInfo(); LLVMInitializeR600Target(); LLVMInitializeR600TargetMC(); LLVMInitializeR600AsmPrinter(); +#else + LLVMInitializeAMDGPUTargetInfo(); + LLVMInitializeAMDGPUTarget(); + LLVMInitializeAMDGPUTargetMC(); + LLVMInitializeAMDGPUAsmPrinter(); + +#endif initialized = 1; } } ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): gallivm: Only build lp_profile() body when PROFILE is defined
Module: Mesa Branch: master Commit: 3e7412233739c882548f50fe01d9f6c5f0dd4bbb URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=3e7412233739c882548f50fe01d9f6c5f0dd4bbb Author: Tom Stellard Date: Wed May 27 16:51:43 2015 -0700 gallivm: Only build lp_profile() body when PROFILE is defined The only use of lp_profile() is wrapped in #if defined(PROFILE), so there is no reason to build it unless this macro is defined. Reviewed-by: Jose Fonseca --- src/gallium/auxiliary/gallivm/lp_bld_debug.cpp |2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gallium/auxiliary/gallivm/lp_bld_debug.cpp b/src/gallium/auxiliary/gallivm/lp_bld_debug.cpp index 9a85248..405e648 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_debug.cpp +++ b/src/gallium/auxiliary/gallivm/lp_bld_debug.cpp @@ -246,7 +246,7 @@ lp_disassemble(LLVMValueRef func, const void *code) { extern "C" void lp_profile(LLVMValueRef func, const void *code) { -#if defined(__linux__) && (defined(DEBUG) || defined(PROFILE)) +#if defined(__linux__) && defined(PROFILE) static boolean first_time = TRUE; static FILE *perf_map_file = NULL; static int perf_asm_fd = -1; ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): clover: Add a mutex to guard queue::queued_events
Module: Mesa Branch: master Commit: f546902d9597429713c83e2caf6b69856bd7ba4d URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=f546902d9597429713c83e2caf6b69856bd7ba4d Author: Tom Stellard Date: Thu May 7 13:57:14 2015 + clover: Add a mutex to guard queue::queued_events This fixes a potential crash where on a sequence like this: Thread 0: Check if queue is not empty. Thread 1: Remove item from queue, making it empty. Thread 0: Do something assuming queue is not empty. CC: 10.5 Reviewed-by: Francisco Jerez --- src/gallium/state_trackers/clover/core/queue.cpp |2 ++ src/gallium/state_trackers/clover/core/queue.hpp |2 ++ 2 files changed, 4 insertions(+) diff --git a/src/gallium/state_trackers/clover/core/queue.cpp b/src/gallium/state_trackers/clover/core/queue.cpp index 24f9326..87f9dcc 100644 --- a/src/gallium/state_trackers/clover/core/queue.cpp +++ b/src/gallium/state_trackers/clover/core/queue.cpp @@ -44,6 +44,7 @@ command_queue::flush() { pipe_screen *screen = device().pipe; pipe_fence_handle *fence = NULL; + std::lock_guard lock(queued_events_mutex); if (!queued_events.empty()) { pipe->flush(pipe, &fence, 0); @@ -69,6 +70,7 @@ command_queue::profiling_enabled() const { void command_queue::sequence(hard_event &ev) { + std::lock_guard lock(queued_events_mutex); if (!queued_events.empty()) queued_events.back()().chain(ev); diff --git a/src/gallium/state_trackers/clover/core/queue.hpp b/src/gallium/state_trackers/clover/core/queue.hpp index b7166e6..bddb86c 100644 --- a/src/gallium/state_trackers/clover/core/queue.hpp +++ b/src/gallium/state_trackers/clover/core/queue.hpp @@ -24,6 +24,7 @@ #define CLOVER_CORE_QUEUE_HPP #include +#include #include "core/object.hpp" #include "core/context.hpp" @@ -69,6 +70,7 @@ namespace clover { cl_command_queue_properties props; pipe_context *pipe; + std::mutex queued_events_mutex; std::deque> queued_events; }; } ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): clover: Fix a bug with multi-threaded events v2
Module: Mesa Branch: master Commit: 9c4dc98b298c74015f2a7c21571bccf0a5b6cc98 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=9c4dc98b298c74015f2a7c21571bccf0a5b6cc98 Author: Tom Stellard Date: Thu Mar 26 19:33:24 2015 + clover: Fix a bug with multi-threaded events v2 It was possible for some events never to get triggered if one thread was creating events and another threads was waiting for them. This patch consolidates soft_event::wait() and hard_event::wait() into event::wait() so that hard_event objects will now wait for all their dependencies to be submitted before flushing the command queue. v2: - Rename variables - Use mutable varibales so we can keep event::wait() const - Open code signalled() call so mutex can be atted to signalled without deadlocking. CC: 10.5 Reviewed-by: Francisco Jerez --- src/gallium/state_trackers/clover/core/event.cpp | 15 +-- src/gallium/state_trackers/clover/core/event.hpp |5 - 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/gallium/state_trackers/clover/core/event.cpp b/src/gallium/state_trackers/clover/core/event.cpp index 58de888..5579303 100644 --- a/src/gallium/state_trackers/clover/core/event.cpp +++ b/src/gallium/state_trackers/clover/core/event.cpp @@ -39,6 +39,7 @@ event::~event() { void event::trigger() { if (!--wait_count) { + cv.notify_all(); action_ok(*this); while (!_chain.empty()) { @@ -73,6 +74,15 @@ event::chain(event &ev) { ev.deps.push_back(*this); } +void +event::wait() const { + for (event &ev : deps) + ev.wait(); + + std::unique_lock lock(mutex); + cv.wait(lock, [=]{ return !wait_count; }); +} + hard_event::hard_event(command_queue &q, cl_command_type command, const ref_vector &deps, action action) : event(q.context(), deps, profile(q, action), [](event &ev){}), @@ -120,6 +130,8 @@ void hard_event::wait() const { pipe_screen *screen = queue()->device().pipe; + event::wait(); + if (status() == CL_QUEUED) queue()->flush(); @@ -207,8 +219,7 @@ soft_event::command() const { void soft_event::wait() const { - for (event &ev : deps) - ev.wait(); + event::wait(); if (status() != CL_COMPLETE) throw error(CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST); diff --git a/src/gallium/state_trackers/clover/core/event.hpp b/src/gallium/state_trackers/clover/core/event.hpp index d407c80..0914842 100644 --- a/src/gallium/state_trackers/clover/core/event.hpp +++ b/src/gallium/state_trackers/clover/core/event.hpp @@ -23,6 +23,7 @@ #ifndef CLOVER_CORE_EVENT_HPP #define CLOVER_CORE_EVENT_HPP +#include #include #include "core/object.hpp" @@ -68,7 +69,7 @@ namespace clover { virtual cl_int status() const = 0; virtual command_queue *queue() const = 0; virtual cl_command_type command() const = 0; - virtual void wait() const = 0; + virtual void wait() const; virtual struct pipe_fence_handle *fence() const { return NULL; @@ -87,6 +88,8 @@ namespace clover { action action_ok; action action_fail; std::vector> _chain; + mutable std::condition_variable cv; + mutable std::mutex mutex; }; /// ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): clover: remove util/compat
Module: Mesa Branch: master Commit: d8f817ae7f4241a9ea23140805aaeb724a0ac851 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=d8f817ae7f4241a9ea23140805aaeb724a0ac851 Author: EdB Date: Thu Apr 23 20:13:51 2015 +0200 clover: remove util/compat Acked-by: Francisco Jerez Reviewed-by: Tom Stellard --- src/gallium/state_trackers/clover/Makefile.sources |1 - src/gallium/state_trackers/clover/api/program.cpp | 14 +- .../state_trackers/clover/core/compiler.hpp|4 +- src/gallium/state_trackers/clover/core/error.hpp |2 - src/gallium/state_trackers/clover/core/kernel.cpp |2 +- src/gallium/state_trackers/clover/core/module.cpp | 39 +-- src/gallium/state_trackers/clover/core/module.hpp | 19 +- src/gallium/state_trackers/clover/core/program.cpp |2 +- src/gallium/state_trackers/clover/core/program.hpp |2 +- .../state_trackers/clover/llvm/invocation.cpp | 20 +- .../state_trackers/clover/tgsi/compiler.cpp|5 +- src/gallium/state_trackers/clover/util/compat.hpp | 313 12 files changed, 56 insertions(+), 367 deletions(-) diff --git a/src/gallium/state_trackers/clover/Makefile.sources b/src/gallium/state_trackers/clover/Makefile.sources index 03eb754..fa96774 100644 --- a/src/gallium/state_trackers/clover/Makefile.sources +++ b/src/gallium/state_trackers/clover/Makefile.sources @@ -45,7 +45,6 @@ CPP_SOURCES := \ util/adaptor.hpp \ util/algebra.hpp \ util/algorithm.hpp \ - util/compat.hpp \ util/factor.hpp \ util/functional.hpp \ util/lazy.hpp \ diff --git a/src/gallium/state_trackers/clover/api/program.cpp b/src/gallium/state_trackers/clover/api/program.cpp index 913d195..e9b1f38 100644 --- a/src/gallium/state_trackers/clover/api/program.cpp +++ b/src/gallium/state_trackers/clover/api/program.cpp @@ -23,6 +23,8 @@ #include "api/util.hpp" #include "core/program.hpp" +#include + using namespace clover; namespace { @@ -94,12 +96,12 @@ clCreateProgramWithBinary(cl_context d_ctx, cl_uint n, return { CL_INVALID_VALUE, {} }; try { -compat::istream::buffer_t bin(p, l); -compat::istream s(bin); +std::stringbuf bin( { (char*)p, l } ); +std::istream s(&bin); return { CL_SUCCESS, module::deserialize(s) }; - } catch (compat::istream::error &e) { + } catch (std::istream::failure &e) { return { CL_INVALID_BINARY, {} }; } }, @@ -279,10 +281,10 @@ clGetProgramInfo(cl_program d_prog, cl_program_info param, case CL_PROGRAM_BINARIES: buf.as_matrix() = map([&](const device &dev) { -compat::ostream::buffer_t bin; -compat::ostream s(bin); +std::stringbuf bin; +std::ostream s(&bin); prog.binary(dev).serialize(s); -return bin; +return bin.str(); }, prog.devices()); break; diff --git a/src/gallium/state_trackers/clover/core/compiler.hpp b/src/gallium/state_trackers/clover/core/compiler.hpp index 62c0f47..c68aa39 100644 --- a/src/gallium/state_trackers/clover/core/compiler.hpp +++ b/src/gallium/state_trackers/clover/core/compiler.hpp @@ -23,14 +23,12 @@ #ifndef CLOVER_CORE_COMPILER_HPP #define CLOVER_CORE_COMPILER_HPP -#include "util/compat.hpp" #include "core/error.hpp" #include "core/module.hpp" #include "pipe/p_defines.h" namespace clover { - typedef compat::vector > header_map; + typedef std::vector > header_map; module compile_program_llvm(const std::string &source, const header_map &headers, diff --git a/src/gallium/state_trackers/clover/core/error.hpp b/src/gallium/state_trackers/clover/core/error.hpp index 805a0ec..eb65d62 100644 --- a/src/gallium/state_trackers/clover/core/error.hpp +++ b/src/gallium/state_trackers/clover/core/error.hpp @@ -27,8 +27,6 @@ #include -#include "util/compat.hpp" - namespace clover { class command_queue; class context; diff --git a/src/gallium/state_trackers/clover/core/kernel.cpp b/src/gallium/state_trackers/clover/core/kernel.cpp index 442762c..0756f06 100644 --- a/src/gallium/state_trackers/clover/core/kernel.cpp +++ b/src/gallium/state_trackers/clover/core/kernel.cpp @@ -192,7 +192,7 @@ kernel::exec_context::bind(intrusive_ptr _q, if (st) _q->pipe->delete_compute_state(_q->pipe, st); - cs.prog = msec.data.begin(); + cs.prog = &(msec.data[0]); cs.req_local_mem = mem_local; cs.req_input_mem = input.size(); st = q->pipe->create_compute_state(q->pipe, &cs); diff --git a/src/gallium/state_trackers/clover/core/module.cpp b/src/gallium/state_trackers/clover/core/module.cpp index f098b05..a6c5b98 100644 --- a/src/gallium/stat
Mesa (master): clover: remove compat::string
Module: Mesa Branch: master Commit: 5ca9b23319db66d9768d46c0a7504b7bb079164a URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=5ca9b23319db66d9768d46c0a7504b7bb079164a Author: EdB Date: Fri Apr 24 12:59:55 2015 +0200 clover: remove compat::string Acked-by: Francisco Jerez Reviewed-by: Tom Stellard --- src/gallium/state_trackers/clover/api/program.cpp |2 +- .../state_trackers/clover/core/compiler.hpp| 14 +-- src/gallium/state_trackers/clover/core/error.hpp |4 +- src/gallium/state_trackers/clover/core/program.cpp |2 +- .../state_trackers/clover/llvm/invocation.cpp | 22 ++--- .../state_trackers/clover/tgsi/compiler.cpp|7 +- src/gallium/state_trackers/clover/util/compat.hpp | 104 7 files changed, 26 insertions(+), 129 deletions(-) diff --git a/src/gallium/state_trackers/clover/api/program.cpp b/src/gallium/state_trackers/clover/api/program.cpp index c985690..b3be2b8 100644 --- a/src/gallium/state_trackers/clover/api/program.cpp +++ b/src/gallium/state_trackers/clover/api/program.cpp @@ -216,7 +216,7 @@ clCompileProgram(cl_program d_prog, cl_uint num_devs, throw error(CL_INVALID_OPERATION); if (!any_of(key_equals(name), headers)) -headers.push_back(std::pair( +headers.push_back(std::pair( name, header.source())); }, range(header_names, num_headers), diff --git a/src/gallium/state_trackers/clover/core/compiler.hpp b/src/gallium/state_trackers/clover/core/compiler.hpp index bec8aac..62c0f47 100644 --- a/src/gallium/state_trackers/clover/core/compiler.hpp +++ b/src/gallium/state_trackers/clover/core/compiler.hpp @@ -29,17 +29,17 @@ #include "pipe/p_defines.h" namespace clover { - typedef compat::vector > header_map; + typedef compat::vector > header_map; - module compile_program_llvm(const compat::string &source, + module compile_program_llvm(const std::string &source, const header_map &headers, pipe_shader_ir ir, - const compat::string &target, - const compat::string &opts, - compat::string &r_log); + const std::string &target, + const std::string &opts, + std::string &r_log); - module compile_program_tgsi(const compat::string &source); + module compile_program_tgsi(const std::string &source); } #endif diff --git a/src/gallium/state_trackers/clover/core/error.hpp b/src/gallium/state_trackers/clover/core/error.hpp index 45a38c1..805a0ec 100644 --- a/src/gallium/state_trackers/clover/core/error.hpp +++ b/src/gallium/state_trackers/clover/core/error.hpp @@ -54,7 +54,7 @@ namespace clover { /// class error : public std::runtime_error { public: - error(cl_int code, compat::string what = "") : + error(cl_int code, std::string what = "") : std::runtime_error(what), code(code) { } @@ -68,7 +68,7 @@ namespace clover { class build_error : public error { public: - build_error(const compat::string &what = "") : + build_error(const std::string &what = "") : error(CL_COMPILE_PROGRAM_FAILURE, what) { } }; diff --git a/src/gallium/state_trackers/clover/core/program.cpp b/src/gallium/state_trackers/clover/core/program.cpp index c07548c..50ac01b 100644 --- a/src/gallium/state_trackers/clover/core/program.cpp +++ b/src/gallium/state_trackers/clover/core/program.cpp @@ -52,7 +52,7 @@ program::build(const ref_vector &devs, const char *opts, _opts.insert({ &dev, opts }); - compat::string log; + std::string log; try { auto module = (dev.ir_format() == PIPE_SHADER_IR_TGSI ? diff --git a/src/gallium/state_trackers/clover/llvm/invocation.cpp b/src/gallium/state_trackers/clover/llvm/invocation.cpp index e07d95b..2157909 100644 --- a/src/gallium/state_trackers/clover/llvm/invocation.cpp +++ b/src/gallium/state_trackers/clover/llvm/invocation.cpp @@ -136,7 +136,7 @@ namespace { const std::string &name, const std::string &triple, const std::string &processor, const std::string &opts, clang::LangAS::Map& address_spaces, unsigned &optimization_level, -compat::string &r_log) { +std::string &r_log) { clang::CompilerInstance c; clang::EmitLLVMOnlyAction act(&llvm_ctx); @@ -470,7 +470,7 @@ namespace { emit_code(LLVMTargetMachineRef tm, LLVMModuleRef mod, LLVMCodeGenFileType file_type, LLVMMemoryBufferRef *out_buffer, - compat::string &r_log) { +
Mesa (master): clover: remove compat classes that match std one
Module: Mesa Branch: master Commit: 1b4a1d0049646e574565bab38b8ae935c1c45fae URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=1b4a1d0049646e574565bab38b8ae935c1c45fae Author: EdB Date: Fri Apr 24 12:59:54 2015 +0200 clover: remove compat classes that match std one Acked-by: Francisco Jerez Reviewed-by: Tom Stellard --- src/gallium/state_trackers/clover/Makefile.sources |1 - src/gallium/state_trackers/clover/api/program.cpp |2 +- .../state_trackers/clover/core/compiler.hpp|2 +- src/gallium/state_trackers/clover/core/error.hpp |6 ++-- src/gallium/state_trackers/clover/util/compat.cpp | 38 src/gallium/state_trackers/clover/util/compat.hpp | 27 -- 6 files changed, 6 insertions(+), 70 deletions(-) diff --git a/src/gallium/state_trackers/clover/Makefile.sources b/src/gallium/state_trackers/clover/Makefile.sources index 5b3344c..03eb754 100644 --- a/src/gallium/state_trackers/clover/Makefile.sources +++ b/src/gallium/state_trackers/clover/Makefile.sources @@ -45,7 +45,6 @@ CPP_SOURCES := \ util/adaptor.hpp \ util/algebra.hpp \ util/algorithm.hpp \ - util/compat.cpp \ util/compat.hpp \ util/factor.hpp \ util/functional.hpp \ diff --git a/src/gallium/state_trackers/clover/api/program.cpp b/src/gallium/state_trackers/clover/api/program.cpp index 60184ed..c985690 100644 --- a/src/gallium/state_trackers/clover/api/program.cpp +++ b/src/gallium/state_trackers/clover/api/program.cpp @@ -216,7 +216,7 @@ clCompileProgram(cl_program d_prog, cl_uint num_devs, throw error(CL_INVALID_OPERATION); if (!any_of(key_equals(name), headers)) -headers.push_back(compat::pair( +headers.push_back(std::pair( name, header.source())); }, range(header_names, num_headers), diff --git a/src/gallium/state_trackers/clover/core/compiler.hpp b/src/gallium/state_trackers/clover/core/compiler.hpp index 7210d1e..bec8aac 100644 --- a/src/gallium/state_trackers/clover/core/compiler.hpp +++ b/src/gallium/state_trackers/clover/core/compiler.hpp @@ -29,7 +29,7 @@ #include "pipe/p_defines.h" namespace clover { - typedef compat::vector > header_map; module compile_program_llvm(const compat::string &source, diff --git a/src/gallium/state_trackers/clover/core/error.hpp b/src/gallium/state_trackers/clover/core/error.hpp index 7b010f1..45a38c1 100644 --- a/src/gallium/state_trackers/clover/core/error.hpp +++ b/src/gallium/state_trackers/clover/core/error.hpp @@ -25,6 +25,8 @@ #include "CL/cl.h" +#include + #include "util/compat.hpp" namespace clover { @@ -50,10 +52,10 @@ namespace clover { /// Class that represents an error that can be converted to an /// OpenCL status code. /// - class error : public compat::runtime_error { + class error : public std::runtime_error { public: error(cl_int code, compat::string what = "") : - compat::runtime_error(what), code(code) { + std::runtime_error(what), code(code) { } cl_int get() const { diff --git a/src/gallium/state_trackers/clover/util/compat.cpp b/src/gallium/state_trackers/clover/util/compat.cpp deleted file mode 100644 index 80d5b3e..000 --- a/src/gallium/state_trackers/clover/util/compat.cpp +++ /dev/null @@ -1,38 +0,0 @@ -// -// Copyright 2013 Francisco Jerez -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the "Software"), -// to deal in the Software without restriction, including without limitation -// the rights to use, copy, modify, merge, publish, distribute, sublicense, -// and/or sell copies of the Software, and to permit persons to whom the -// Software is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR -// OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -// OTHER DEALINGS IN THE SOFTWARE. -// - -#include "util/compat.hpp" - -using namespace clover::compat; - -exception::~exception() { -} - -const char * -exception::what() const { - return ""; -} - -const char * -runtime_error::what() const { - return _what.c_str(); -} diff --git a/src/gallium/state_trackers/clover/util/compat.hpp b/src/gallium/state_trackers/clover/util/compat.hpp index 735994f..e
Mesa (master): clover: make module::symbol::name a string
Module: Mesa Branch: master Commit: 2d112ed96152bc62e5417472270f29966c8feece URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=2d112ed96152bc62e5417472270f29966c8feece Author: EdB Date: Fri Apr 24 12:59:56 2015 +0200 clover: make module::symbol::name a string Acked-by: Francisco Jerez Reviewed-by: Tom Stellard --- src/gallium/state_trackers/clover/api/program.cpp |3 +-- src/gallium/state_trackers/clover/core/module.cpp | 21 + src/gallium/state_trackers/clover/core/module.hpp |4 ++-- 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/gallium/state_trackers/clover/api/program.cpp b/src/gallium/state_trackers/clover/api/program.cpp index b3be2b8..913d195 100644 --- a/src/gallium/state_trackers/clover/api/program.cpp +++ b/src/gallium/state_trackers/clover/api/program.cpp @@ -293,8 +293,7 @@ clGetProgramInfo(cl_program d_prog, cl_program_info param, case CL_PROGRAM_KERNEL_NAMES: buf.as_string() = fold([](const std::string &a, const module::symbol &s) { -return ((a.empty() ? "" : a + ";") + -std::string(s.name.begin(), s.name.size())); +return ((a.empty() ? "" : a + ";") + s.name); }, std::string(), prog.symbols()); break; diff --git a/src/gallium/state_trackers/clover/core/module.cpp b/src/gallium/state_trackers/clover/core/module.cpp index be10e35..f098b05 100644 --- a/src/gallium/state_trackers/clover/core/module.cpp +++ b/src/gallium/state_trackers/clover/core/module.cpp @@ -133,6 +133,27 @@ namespace { } }; + /// (De)serialize a string. + template<> + struct _serializer { + static void + proc(compat::ostream &os, const std::string &s) { + _proc(os, s.size()); + os.write(&s[0], s.size() * sizeof(std::string::value_type)); + } + + static void + proc(compat::istream &is, std::string &s) { + s.resize(_proc(is)); + is.read(&s[0], s.size() * sizeof(std::string::value_type)); + } + + static void + proc(module::size_t &sz, const std::string &s) { + sz += sizeof(uint32_t) + sizeof(std::string::value_type) * s.size(); + } + }; + /// (De)serialize a module::section. template<> struct _serializer { diff --git a/src/gallium/state_trackers/clover/core/module.hpp b/src/gallium/state_trackers/clover/core/module.hpp index ee6caf9..46112a3 100644 --- a/src/gallium/state_trackers/clover/core/module.hpp +++ b/src/gallium/state_trackers/clover/core/module.hpp @@ -100,12 +100,12 @@ namespace clover { }; struct symbol { - symbol(const compat::vector &name, resource_id section, + symbol(const std::string &name, resource_id section, size_t offset, const compat::vector &args) : name(name), section(section), offset(offset), args(args) { } symbol() : name(), section(0), offset(0), args() { } - compat::vector name; + std::string name; resource_id section; size_t offset; compat::vector args; ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): clover: compile all sources with c++11
Module: Mesa Branch: master Commit: 3c61ff0d89da4a8cc921d131ce0c2480ddb111a0 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=3c61ff0d89da4a8cc921d131ce0c2480ddb111a0 Author: EdB Date: Tue Apr 21 15:49:09 2015 +0200 clover: compile all sources with c++11 Later we can remove the compat code Reviewed-by: Francisco Jerez Reviewed-by: Tom Stellard --- src/gallium/state_trackers/clover/Makefile.am |3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/gallium/state_trackers/clover/Makefile.am b/src/gallium/state_trackers/clover/Makefile.am index 62c13fa..f46d9ef 100644 --- a/src/gallium/state_trackers/clover/Makefile.am +++ b/src/gallium/state_trackers/clover/Makefile.am @@ -35,12 +35,13 @@ endif noinst_LTLIBRARIES = libclover.la libcltgsi.la libclllvm.la libcltgsi_la_CXXFLAGS = \ - -std=c++0x \ + -std=c++11 \ $(VISIBILITY_CXXFLAGS) libcltgsi_la_SOURCES = $(TGSI_SOURCES) libclllvm_la_CXXFLAGS = \ + -std=c++11 \ $(VISIBILITY_CXXFLAGS) \ $(LLVM_CXXFLAGS) \ $(DEFINES) \ ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): clover: make llvm >= 3.5.0 and c++11 mandatory
Module: Mesa Branch: master Commit: f39cd716189f4b025f9c04cb3426c6b25b9eaf46 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=f39cd716189f4b025f9c04cb3426c6b25b9eaf46 Author: EdB Date: Mon Apr 20 20:28:09 2015 +0200 clover: make llvm >= 3.5.0 and c++11 mandatory Clover not longer compile with llvm <= 3.5.0 since e1d363b3. e1d363b3 implies c++11 and llvm 3.5.0 CXXFLAGS provided it. No one seems to have noticed it, it's now official. Acked-by: Francisco Jerez Reviewed-by: Tom Stellard --- configure.ac | 32 +++- 1 file changed, 11 insertions(+), 21 deletions(-) diff --git a/configure.ac b/configure.ac index 325b936..095e23e 100644 --- a/configure.ac +++ b/configure.ac @@ -1865,6 +1865,13 @@ strip_unwanted_llvm_flags() { -e 's/-fstack-protector-strong\>//g' } +llvm_check_version_for() { +if test "${LLVM_VERSION_INT}${LLVM_VERSION_PATCH}" -lt "${1}0${2}${3}"; then +AC_MSG_ERROR([LLVM $1.$2.$3 or newer is required for $4]) +fi +} + + if test -z "$with_gallium_drivers"; then enable_gallium_llvm=no @@ -1919,22 +1926,10 @@ if test "x$enable_gallium_llvm" = xyes; then fi if test "x$enable_opencl" = xyes; then +llvm_check_version_for "3" "5" "0" "opencl" + LLVM_COMPONENTS="${LLVM_COMPONENTS} all-targets ipo linker instrumentation" -# LLVM 3.3 >= 177971 requires IRReader -if $LLVM_CONFIG --components | grep -qw 'irreader'; then -LLVM_COMPONENTS="${LLVM_COMPONENTS} irreader" -fi -# LLVM 3.4 requires Option -if $LLVM_CONFIG --components | grep -qw 'option'; then -LLVM_COMPONENTS="${LLVM_COMPONENTS} option" -fi -# Current OpenCL/Clover and LLVM 3.5 require ObjCARCOpts and ProfileData -if $LLVM_CONFIG --components | grep -qw 'objcarcopts'; then -LLVM_COMPONENTS="${LLVM_COMPONENTS} objcarcopts" -fi -if $LLVM_CONFIG --components | grep -qw 'profiledata'; then -LLVM_COMPONENTS="${LLVM_COMPONENTS} profiledata" -fi +LLVM_COMPONENTS="${LLVM_COMPONENTS} irreader option objcarcopts profiledata" fi DEFINES="${DEFINES} -DHAVE_LLVM=0x0$LLVM_VERSION_INT -DLLVM_VERSION_PATCH=$LLVM_VERSION_PATCH" MESA_LLVM=1 @@ -2058,12 +2053,7 @@ radeon_llvm_check() { if test "x$enable_gallium_llvm" != "xyes"; then AC_MSG_ERROR([--enable-gallium-llvm is required when building $1]) fi -LLVM_REQUIRED_VERSION_MAJOR="3" -LLVM_REQUIRED_VERSION_MINOR="4" -LLVM_REQUIRED_VERSION_PATCH="2" -if test "${LLVM_VERSION_INT}${LLVM_VERSION_PATCH}" -lt "${LLVM_REQUIRED_VERSION_MAJOR}0${LLVM_REQUIRED_VERSION_MINOR}${LLVM_REQUIRED_VERSION_PATCH}"; then -AC_MSG_ERROR([LLVM $LLVM_REQUIRED_VERSION_MAJOR.$LLVM_REQUIRED_VERSION_MINOR.$LLVM_REQUIRED_VERSION_PATCH or newer is required for $1]) -fi +llvm_check_version_for "3" "4" "2" $1 if test true && $LLVM_CONFIG --targets-built | grep -qvw 'R600' ; then AC_MSG_ERROR([LLVM R600 Target not enabled. You can enable it when building the LLVM sources with the --enable-experimental-targets=R600 ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): clover: remove pre llvm 3.5.0 compatibility code
Module: Mesa Branch: master Commit: c1485f4b7d044724b3dbc1011f3c3a8a53132010 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=c1485f4b7d044724b3dbc1011f3c3a8a53132010 Author: EdB Date: Sun Apr 19 10:50:19 2015 +0200 clover: remove pre llvm 3.5.0 compatibility code Acked-by: Francisco Jerez Reviewed-by: Tom Stellard --- .../state_trackers/clover/llvm/invocation.cpp | 23 ++-- 1 file changed, 2 insertions(+), 21 deletions(-) diff --git a/src/gallium/state_trackers/clover/llvm/invocation.cpp b/src/gallium/state_trackers/clover/llvm/invocation.cpp index 4da62b9..e07d95b 100644 --- a/src/gallium/state_trackers/clover/llvm/invocation.cpp +++ b/src/gallium/state_trackers/clover/llvm/invocation.cpp @@ -29,21 +29,14 @@ #include #include #include -#if HAVE_LLVM < 0x0305 -#include -#else #include #include #include -#endif #include #include #include #include #include -#if HAVE_LLVM < 0x0305 -#include -#endif #if HAVE_LLVM >= 0x0307 #include #else @@ -328,9 +321,7 @@ namespace { llvm::Function *kernel = *I; export_list.push_back(kernel->getName().data()); } -#if HAVE_LLVM < 0x0305 - PM.add(new llvm::DataLayout(mod)); -#elif HAVE_LLVM < 0x0306 +#if HAVE_LLVM < 0x0306 PM.add(new llvm::DataLayoutPass(mod)); #elif HAVE_LLVM < 0x0307 PM.add(new llvm::DataLayoutPass()); @@ -356,11 +347,7 @@ namespace { compat::vector args; llvm::Function *kernel_func = mod->getFunction(kernel_name); -#if HAVE_LLVM < 0x0305 - llvm::DataLayout TD(kernel_func->getParent()->getDataLayout()); -#else - llvm::DataLayout TD(mod); -#endif + llvm::DataLayout TD(mod); for (llvm::Function::const_arg_iterator I = kernel_func->arg_begin(), E = kernel_func->arg_end(); I != E; ++I) { @@ -651,8 +638,6 @@ namespace { return m; } -#if HAVE_LLVM >= 0x0305 - void diagnostic_handler(const llvm::DiagnosticInfo &di, void *data) { if (di.getSeverity() == llvm::DS_Error) { @@ -667,8 +652,6 @@ namespace { } } -#endif - void init_targets() { static bool targets_initialized = false; @@ -721,9 +704,7 @@ clover::compile_program_llvm(const compat::string &source, llvm::LLVMContext llvm_ctx; unsigned optimization_level; -#if HAVE_LLVM >= 0x0305 llvm_ctx.setDiagnosticHandler(diagnostic_handler, &r_log); -#endif if (get_debug_flags() & DBG_CLC) debug_log(source, ".cl"); ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): radeonsi: Add header and footer to shader stat dump
Module: Mesa Branch: master Commit: 2569c7109d466137ac2b9964db3427ccf2bbf49e URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=2569c7109d466137ac2b9964db3427ccf2bbf49e Author: Tom Stellard Date: Mon Apr 13 12:56:37 2015 + radeonsi: Add header and footer to shader stat dump This makes it easier to parse. Reviewed-by: Marek Olšák --- src/gallium/drivers/radeonsi/si_shader.c |6 -- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index b4709ac..89f02ab 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -2669,8 +2669,10 @@ int si_shader_binary_read(struct si_screen *sscreen, binary->code[i]); } } - fprintf(stderr, "SGPRS: %d\nVGPRS: %d\nCode Size: %d bytes\nLDS: %d blocks\n" - "Scratch: %d bytes per wave\n", + + fprintf(stderr, "*** SHADER STATS ***\n" + "SGPRS: %d\nVGPRS: %d\nCode Size: %d bytes\nLDS: %d blocks\n" + "Scratch: %d bytes per wave\n\n", shader->num_sgprs, shader->num_vgprs, binary->code_size, shader->lds_size, shader->scratch_bytes_per_wave); } ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): radeon/llvm: Improve codegen for KILL_IF
Module: Mesa Branch: master Commit: e0994e0f97a2078735f0b5e86cbad9f74c565c05 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=e0994e0f97a2078735f0b5e86cbad9f74c565c05 Author: Tom Stellard Date: Mon Apr 13 13:25:41 2015 + radeon/llvm: Improve codegen for KILL_IF Rather than emitting one kill instruction per component of KILL_IF's src reg, we now or the components of the src register together and use the result as a condition for just one kill instruction. shader-db stats (bonaire): 979 shaders Totals: SGPRS: 34872 -> 34848 (-0.07 %) VGPRS: 20696 -> 20676 (-0.10 %) Code Size: 749032 -> 748452 (-0.08 %) bytes LDS: 11 -> 11 (0.00 %) blocks Scratch: 12288 -> 12288 (0.00 %) bytes per wave Totals from affected shaders: SGPRS: 1184 -> 1160 (-2.03 %) VGPRS: 600 -> 580 (-3.33 %) Code Size: 13200 -> 12620 (-4.39 %) bytes LDS: 0 -> 0 (0.00 %) blocks Scratch: 0 -> 0 (0.00 %) bytes per wave Increases: SGPRS: 2 (0.00 %) VGPRS: 0 (0.00 %) Code Size: 0 (0.00 %) LDS: 0 (0.00 %) Scratch: 0 (0.00 %) Decreases: SGPRS: 5 (0.01 %) VGPRS: 5 (0.01 %) Code Size: 25 (0.03 %) LDS: 0 (0.00 %) Scratch: 0 (0.00 %) *** BY PERCENTAGE *** Max Increase: SGPRS: 32 -> 40 (25.00 %) VGPRS: 0 -> 0 (0.00 %) Code Size: 0 -> 0 (0.00 %) bytes LDS: 0 -> 0 (0.00 %) blocks Scratch: 0 -> 0 (0.00 %) bytes per wave Max Decrease: SGPRS: 32 -> 24 (-25.00 %) VGPRS: 16 -> 12 (-25.00 %) Code Size: 116 -> 96 (-17.24 %) bytes LDS: 0 -> 0 (0.00 %) blocks Scratch: 0 -> 0 (0.00 %) bytes per wave *** BY UNIT *** Max Increase: SGPRS: 64 -> 72 (12.50 %) VGPRS: 0 -> 0 (0.00 %) Code Size: 0 -> 0 (0.00 %) bytes LDS: 0 -> 0 (0.00 %) blocks Scratch: 0 -> 0 (0.00 %) bytes per wave Max Decrease: SGPRS: 32 -> 24 (-25.00 %) VGPRS: 16 -> 12 (-25.00 %) Code Size: 424 -> 356 (-16.04 %) bytes LDS: 0 -> 0 (0.00 %) blocks Scratch: 0 -> 0 (0.00 %) bytes per wave Reviewed-by: Marek Olšák --- .../drivers/radeon/radeon_setup_tgsi_llvm.c| 29 1 file changed, 29 insertions(+) diff --git a/src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c b/src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c index 91c56a3..18afbcb 100644 --- a/src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c +++ b/src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c @@ -637,6 +637,34 @@ static void uif_emit( if_cond_emit(action, bld_base, emit_data, cond); } +static void kill_if_fetch_args( + struct lp_build_tgsi_context * bld_base, + struct lp_build_emit_data * emit_data) +{ + const struct tgsi_full_instruction * inst = emit_data->inst; + struct gallivm_state *gallivm = bld_base->base.gallivm; + LLVMBuilderRef builder = gallivm->builder; + unsigned i; + LLVMValueRef conds[TGSI_NUM_CHANNELS]; + + for (i = 0; i < TGSI_NUM_CHANNELS; i++) { + LLVMValueRef value = lp_build_emit_fetch(bld_base, inst, 0, i); + conds[i] = LLVMBuildFCmp(builder, LLVMRealOLT, value, + bld_base->base.zero, ""); + } + + /* Or the conditions together */ + for (i = TGSI_NUM_CHANNELS - 1; i > 0; i--) { + conds[i - 1] = LLVMBuildOr(builder, conds[i], conds[i - 1], ""); + } + + emit_data->dst_type = LLVMVoidTypeInContext(gallivm->context); + emit_data->arg_count = 1; + emit_data->args[0] = LLVMBuildSelect(builder, conds[0], + lp_build_const_float(gallivm, -1.0f), + bld_base->base.zero, ""); +} + static void kil_emit( const struct lp_build_tgsi_action * action, struct lp_build_tgsi_context * bld_base, @@ -1467,6 +1495,7 @@ void radeon_llvm_context_init(struct radeon_llvm_context * ctx) bld_base->op_actions[TGSI_OPCODE_ISLT].emit = emit_icmp; bld_base->op_actions[TGSI_OPCODE_ISSG].emit = emit_ssg; bld_base->op_actions[TGSI_OPCODE_I2F].emit = emit_i2f; + bld_base->op_actions[TGSI_OPCODE_KILL_IF].fetch_args = kill_if_fetch_args; bld_base->op_actions[TGSI_OPCODE_KILL_IF].emit = kil_emit; bld_base->op_actions[TGSI_OPCODE_KILL_IF].intr_name = "llvm.AMDGPU.kill"; bld_base->op_actions[TGSI_OPCODE_KILL].emit = lp_build_tgsi_intrinsic; ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): radeon/llvm: Run LLVM's instruction combining pass
Module: Mesa Branch: master Commit: c6d79ed289a75f13c65f011be870f7e43a0fedc7 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=c6d79ed289a75f13c65f011be870f7e43a0fedc7 Author: Tom Stellard Date: Fri Apr 10 17:07:16 2015 + radeon/llvm: Run LLVM's instruction combining pass This should improve code quality in general and will help with some future changes to how we emit kill instructions. shader-db shows a few regressions, but these don't seem to be the result of deficiencies in instcombine. They're mostly caused by the scheduler making different decisions than before. shader-db stats (bonaire): 979 shaders Totals: SGPRS: 35056 -> 34872 (-0.52 %) VGPRS: 20624 -> 20696 (0.35 %) Code Size: 764372 -> 749032 (-2.01 %) bytes LDS: 11 -> 11 (0.00 %) blocks Scratch: 12288 -> 12288 (0.00 %) bytes per wave Totals from affected shaders: SGPRS: 13264 -> 13072 (-1.45 %) VGPRS: 8248 -> 8316 (0.82 %) Code Size: 486320 -> 470992 (-3.15 %) bytes LDS: 11 -> 11 (0.00 %) blocks Scratch: 11264 -> 11264 (0.00 %) bytes per wave Increases: SGPRS: 6 (0.01 %) VGPRS: 20 (0.02 %) Code Size: 14 (0.01 %) LDS: 0 (0.00 %) Scratch: 0 (0.00 %) Decreases: SGPRS: 32 (0.03 %) VGPRS: 8 (0.01 %) Code Size: 244 (0.25 %) LDS: 0 (0.00 %) Scratch: 0 (0.00 %) *** BY PERCENTAGE *** Max Increase: SGPRS: 32 -> 48 (50.00 %) VGPRS: 12 -> 20 (66.67 %) Code Size: 216 -> 224 (3.70 %) bytes LDS: 0 -> 0 (0.00 %) blocks Scratch: 0 -> 0 (0.00 %) bytes per wave Max Decrease: SGPRS: 40 -> 32 (-20.00 %) VGPRS: 16 -> 12 (-25.00 %) Code Size: 368 -> 280 (-23.91 %) bytes LDS: 0 -> 0 (0.00 %) blocks Scratch: 0 -> 0 (0.00 %) bytes per wave *** BY UNIT *** Max Increase: SGPRS: 32 -> 48 (50.00 %) VGPRS: 28 -> 36 (28.57 %) Code Size: 39320 -> 40132 (2.07 %) bytes LDS: 0 -> 0 (0.00 %) blocks Scratch: 0 -> 0 (0.00 %) bytes per wave Max Decrease: SGPRS: 72 -> 64 (-11.11 %) VGPRS: 48 -> 40 (-16.67 %) Code Size: 6272 -> 5852 (-6.70 %) bytes LDS: 0 -> 0 (0.00 %) blocks Scratch: 0 -> 0 (0.00 %) bytes per wave Reviewed-by: Marek Olšák --- src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c |1 + 1 file changed, 1 insertion(+) diff --git a/src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c b/src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c index 1690194..91c56a3 100644 --- a/src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c +++ b/src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c @@ -1579,6 +1579,7 @@ void radeon_llvm_finalize_module(struct radeon_llvm_context * ctx) LLVMAddLICMPass(gallivm->passmgr); LLVMAddAggressiveDCEPass(gallivm->passmgr); LLVMAddCFGSimplificationPass(gallivm->passmgr); + LLVMAddInstructionCombiningPass(gallivm->passmgr); /* Run the pass */ LLVMRunFunctionPassManager(gallivm->passmgr, ctx->main_fn); ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): clover: Return CL_BUILD_ERROR for CL_PROGRAM_BUILD_STATUS when compilation fails v2
Module: Mesa Branch: master Commit: fda7558057a301a5a0ee1cb4d68f09ea39b03bb3 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=fda7558057a301a5a0ee1cb4d68f09ea39b03bb3 Author: Tom Stellard Date: Tue Mar 24 17:17:22 2015 + clover: Return CL_BUILD_ERROR for CL_PROGRAM_BUILD_STATUS when compilation fails v2 v2: - Don't use _errs map Cc: 10.5 10.4 Reviewed-by: Francisco Jerez --- src/gallium/state_trackers/clover/core/program.cpp |2 ++ 1 file changed, 2 insertions(+) diff --git a/src/gallium/state_trackers/clover/core/program.cpp b/src/gallium/state_trackers/clover/core/program.cpp index 8553ca7..c07548c 100644 --- a/src/gallium/state_trackers/clover/core/program.cpp +++ b/src/gallium/state_trackers/clover/core/program.cpp @@ -90,6 +90,8 @@ cl_build_status program::build_status(const device &dev) const { if (_binaries.count(&dev)) return CL_BUILD_SUCCESS; + else if (_logs.count(&dev)) + return CL_BUILD_ERROR; else return CL_BUILD_NONE; } ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): radeonsi/compute: Default to the same PIPE_SHADER_CAP values as other shader types v2
Module: Mesa Branch: master Commit: 4c53d2acbb8b6fa48e91d7edaa81d95e19c2c40d URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=4c53d2acbb8b6fa48e91d7edaa81d95e19c2c40d Author: Tom Stellard Date: Sat Mar 21 00:27:16 2015 + radeonsi/compute: Default to the same PIPE_SHADER_CAP values as other shader types v2 v2: - Fix typo Reviewed-by: Marek Olšák --- src/gallium/drivers/radeonsi/si_pipe.c |6 +- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/gallium/drivers/radeonsi/si_pipe.c b/src/gallium/drivers/radeonsi/si_pipe.c index 0eada72..ae96b6b 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.c +++ b/src/gallium/drivers/radeonsi/si_pipe.c @@ -398,8 +398,12 @@ static int si_get_shader_param(struct pipe_screen* pscreen, unsigned shader, enu return max_const_buffer_size; } default: - return 0; + /* If compute shaders don't require a special value +* for this cap, we can return the same value we +* do for other shader types. */ + break; } + break; default: /* TODO: support tessellation */ return 0; ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): clover: Return 0 as storage size for local kernel args that are not set v2
Module: Mesa Branch: master Commit: dfb1ae9d914b7723ef50fdd2efe811feebc045ad URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=dfb1ae9d914b7723ef50fdd2efe811feebc045ad Author: Tom Stellard Date: Fri Mar 20 22:19:43 2015 + clover: Return 0 as storage size for local kernel args that are not set v2 The storage size for local kernel args can be queried before the arguments are set by using the CL_KERNEL_LOCAL_MEM_SIZE param of clGetKernelWorkGroupInfo(). The spec says that if local kernel arguments have not been specified, then we should assume their size is 0. v2: - Implement using c++11 member initialization. Reviewed-by: Jan Vesely Reviewed-by: Francisco Jerez Cc: 10.5 10.4 --- src/gallium/state_trackers/clover/core/kernel.hpp |2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gallium/state_trackers/clover/core/kernel.hpp b/src/gallium/state_trackers/clover/core/kernel.hpp index bf5998d..d6432a4 100644 --- a/src/gallium/state_trackers/clover/core/kernel.hpp +++ b/src/gallium/state_trackers/clover/core/kernel.hpp @@ -175,7 +175,7 @@ namespace clover { virtual void unbind(exec_context &ctx); private: - size_t _storage; + size_t _storage = 0; }; class constant_argument : public argument { ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): gallivm: Use MCInstrInfo in the disassembler for querying instruction info
Module: Mesa Branch: master Commit: 769b366b83dcc12bfe06935f816023cdcfbdf578 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=769b366b83dcc12bfe06935f816023cdcfbdf578 Author: Tom Stellard Date: Mon Mar 23 14:37:24 2015 + gallivm: Use MCInstrInfo in the disassembler for querying instruction info This fixes the build since llvm r232885 and also simplifies the code. --- src/gallium/auxiliary/gallivm/lp_bld_debug.cpp |8 +--- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/gallium/auxiliary/gallivm/lp_bld_debug.cpp b/src/gallium/auxiliary/gallivm/lp_bld_debug.cpp index 2c4ed21..bf6268b 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_debug.cpp +++ b/src/gallium/auxiliary/gallivm/lp_bld_debug.cpp @@ -276,12 +276,6 @@ disassemble(const void* func, llvm::raw_ostream & Out) #endif OwningPtr TM(T->createTargetMachine(Triple, sys::getHostCPUName(), "", options)); -#if HAVE_LLVM >= 0x0306 - const TargetInstrInfo *TII = TM->getSubtargetImpl()->getInstrInfo(); -#else - const TargetInstrInfo *TII = TM->getInstrInfo(); -#endif - /* * Wrap the data in a MemoryObject */ @@ -336,7 +330,7 @@ disassemble(const void* func, llvm::raw_ostream & Out) pc += Size; - const MCInstrDesc &TID = TII->get(Inst.getOpcode()); + const MCInstrDesc &TID = MII->get(Inst.getOpcode()); /* * Keep track of forward jumps to a nearby address. ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): gallium: remove trailing whitespace in p_screen.h
Module: Mesa Branch: master Commit: 9280f17e823cbdbddf30a4ae5e2de9f2d327d33c URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=9280f17e823cbdbddf30a4ae5e2de9f2d327d33c Author: Giuseppe Bilotta Date: Sun Mar 22 07:20:59 2015 +0100 gallium: remove trailing whitespace in p_screen.h Signed-off-by: Giuseppe Bilotta Reviewed-by: Michel Dänzer --- src/gallium/include/pipe/p_screen.h |2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gallium/include/pipe/p_screen.h b/src/gallium/include/pipe/p_screen.h index ac88506..4018f8a 100644 --- a/src/gallium/include/pipe/p_screen.h +++ b/src/gallium/include/pipe/p_screen.h @@ -147,7 +147,7 @@ struct pipe_screen { */ boolean (*can_create_resource)(struct pipe_screen *screen, const struct pipe_resource *templat); - + /** * Create a new texture object, using the given template info. */ ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): clover: The unit for CL_DEVICE_MEM_BASE_ADDR_ALIGN is bits not bytes
Module: Mesa Branch: master Commit: 6e17936bf84c286c3540fe559838bc2a4d975539 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=6e17936bf84c286c3540fe559838bc2a4d975539 Author: Tom Stellard Date: Sat Mar 21 00:44:47 2015 + clover: The unit for CL_DEVICE_MEM_BASE_ADDR_ALIGN is bits not bytes Reviewed-by: Jan Vesely Reviewed-by: Francisco Jerez --- src/gallium/state_trackers/clover/api/device.cpp |3 +++ 1 file changed, 3 insertions(+) diff --git a/src/gallium/state_trackers/clover/api/device.cpp b/src/gallium/state_trackers/clover/api/device.cpp index 43e7475..bc93f91 100644 --- a/src/gallium/state_trackers/clover/api/device.cpp +++ b/src/gallium/state_trackers/clover/api/device.cpp @@ -196,6 +196,9 @@ clGetDeviceInfo(cl_device_id d_dev, cl_device_info param, break; case CL_DEVICE_MEM_BASE_ADDR_ALIGN: + buf.as_scalar() = 128 * 8; + break; + case CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE: buf.as_scalar() = 128; break; ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): clover: use get_device_vendor instead of get_vendor
Module: Mesa Branch: master Commit: 7932b30892ef898ec4c74ac1f972cb462f19962b URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=7932b30892ef898ec4c74ac1f972cb462f19962b Author: Giuseppe Bilotta Date: Sun Mar 22 07:21:02 2015 +0100 clover: use get_device_vendor instead of get_vendor The pipe's get_vendor method returns something more akin to a driver vendor string in most cases, instead of the actual device vendor. Use get_device_vendor instead, which was introduced specifically for this purpose. Signed-off-by: Giuseppe Bilotta Reviewed-by: Michel Dänzer Reviewed-by: Francisco Jerez --- src/gallium/state_trackers/clover/core/device.cpp |2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gallium/state_trackers/clover/core/device.cpp b/src/gallium/state_trackers/clover/core/device.cpp index c3f3b4e..42b45b7 100644 --- a/src/gallium/state_trackers/clover/core/device.cpp +++ b/src/gallium/state_trackers/clover/core/device.cpp @@ -192,7 +192,7 @@ device::device_name() const { std::string device::vendor_name() const { - return pipe->get_vendor(pipe); + return pipe->get_device_vendor(pipe); } enum pipe_shader_ir ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): clover: Add all the mandatory 1.1 extensions to the extension string
Module: Mesa Branch: master Commit: 2b12b1752ae18c468cb01e94c78544ca5783dc44 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=2b12b1752ae18c468cb01e94c78544ca5783dc44 Author: Tom Stellard Date: Sat Mar 21 00:25:34 2015 + clover: Add all the mandatory 1.1 extensions to the extension string Reviewed-by: Jan Vesely Reviewed-by: Francisco Jerez --- src/gallium/state_trackers/clover/api/device.cpp |8 +++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/gallium/state_trackers/clover/api/device.cpp b/src/gallium/state_trackers/clover/api/device.cpp index 04f293d..43e7475 100644 --- a/src/gallium/state_trackers/clover/api/device.cpp +++ b/src/gallium/state_trackers/clover/api/device.cpp @@ -301,7 +301,13 @@ clGetDeviceInfo(cl_device_id d_dev, cl_device_info param, break; case CL_DEVICE_EXTENSIONS: - buf.as_string() = dev.has_doubles() ? "cl_khr_fp64" : ""; + buf.as_string() = + "cl_khr_global_int32_base_atomics" + " cl_khr_global_int32_extended_atomics" + " cl_khr_local_int32_base_atomics" + " cl_khr_local_int32_extended_atomics" + " cl_khr_byte_addressable_store" + + std::string(dev.has_doubles() ? " cl_khr_fp64" : ""); break; case CL_DEVICE_PLATFORM: ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): gallium: introduce get_device_vendor() entrypoint for pipes
Module: Mesa Branch: master Commit: 31d4e6fbffb0c5bcaf92e2c2953f58dc072295d6 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=31d4e6fbffb0c5bcaf92e2c2953f58dc072295d6 Author: Giuseppe Bilotta Date: Sun Mar 22 07:21:00 2015 +0100 gallium: introduce get_device_vendor() entrypoint for pipes This will be needed by Clover to return the correct information to CL_DEVICE_VENDOR info queries. Signed-off-by: Giuseppe Bilotta Reviewed-by: Michel Dänzer --- src/gallium/docs/source/screen.rst |6 ++ src/gallium/include/pipe/p_screen.h |8 2 files changed, 14 insertions(+) diff --git a/src/gallium/docs/source/screen.rst b/src/gallium/docs/source/screen.rst index 26cc9ff..4386bcf 100644 --- a/src/gallium/docs/source/screen.rst +++ b/src/gallium/docs/source/screen.rst @@ -462,6 +462,12 @@ get_vendor Returns the screen vendor. +get_device_vendor +^ + +Returns the actual vendor of the device driving the screen +(as opposed to the driver vendor). + .. _get_param: get_param diff --git a/src/gallium/include/pipe/p_screen.h b/src/gallium/include/pipe/p_screen.h index 4018f8a..21e7dd3 100644 --- a/src/gallium/include/pipe/p_screen.h +++ b/src/gallium/include/pipe/p_screen.h @@ -72,6 +72,14 @@ struct pipe_screen { const char *(*get_vendor)( struct pipe_screen * ); /** +* Returns the device vendor. +* +* The returned value should return the actual device vendor/manufacturer, +* rather than a potentially generic driver string. +*/ + const char *(*get_device_vendor)( struct pipe_screen * ); + + /** * Query an integer-valued capability/parameter/limit * \param param one of PIPE_CAP_x */ ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): gallium: implement get_device_vendor() for existing drivers
Module: Mesa Branch: master Commit: 76039b38f0ef54ca61cbe72b899dfcf0f0c724e4 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=76039b38f0ef54ca61cbe72b899dfcf0f0c724e4 Author: Giuseppe Bilotta Date: Sun Mar 22 07:21:01 2015 +0100 gallium: implement get_device_vendor() for existing drivers The only hackish ones are llvmpipe and softpipe, which currently return the same string as for get_vendor(), while ideally they should return the CPU vendor. Signed-off-by: Giuseppe Bilotta Reviewed-by: Tom Stellard --- src/gallium/drivers/freedreno/freedreno_screen.c |8 src/gallium/drivers/i915/i915_screen.c |7 +++ src/gallium/drivers/ilo/ilo_screen.c |7 +++ src/gallium/drivers/llvmpipe/lp_screen.c |1 + src/gallium/drivers/noop/noop_pipe.c |6 ++ src/gallium/drivers/nouveau/nouveau_screen.c |7 +++ src/gallium/drivers/r300/r300_screen.c |6 ++ src/gallium/drivers/radeon/r600_pipe_common.c|6 ++ src/gallium/drivers/rbug/rbug_screen.c | 10 ++ src/gallium/drivers/softpipe/sp_screen.c |1 + src/gallium/drivers/svga/svga_screen.c |1 + src/gallium/drivers/trace/tr_screen.c| 22 ++ src/gallium/drivers/vc4/vc4_screen.c |1 + 13 files changed, 83 insertions(+) diff --git a/src/gallium/drivers/freedreno/freedreno_screen.c b/src/gallium/drivers/freedreno/freedreno_screen.c index cdcc0da..1e47089 100644 --- a/src/gallium/drivers/freedreno/freedreno_screen.c +++ b/src/gallium/drivers/freedreno/freedreno_screen.c @@ -95,6 +95,13 @@ fd_screen_get_vendor(struct pipe_screen *pscreen) return "freedreno"; } +static const char * +fd_screen_get_device_vendor(struct pipe_screen *pscreen) +{ + return "Qualcomm"; +} + + static uint64_t fd_screen_get_timestamp(struct pipe_screen *pscreen) { @@ -531,6 +538,7 @@ fd_screen_create(struct fd_device *dev) pscreen->get_name = fd_screen_get_name; pscreen->get_vendor = fd_screen_get_vendor; + pscreen->get_device_vendor = fd_screen_get_device_vendor; pscreen->get_timestamp = fd_screen_get_timestamp; diff --git a/src/gallium/drivers/i915/i915_screen.c b/src/gallium/drivers/i915/i915_screen.c index 50847e2..7216160 100644 --- a/src/gallium/drivers/i915/i915_screen.c +++ b/src/gallium/drivers/i915/i915_screen.c @@ -55,6 +55,12 @@ i915_get_vendor(struct pipe_screen *screen) } static const char * +i915_get_device_vendor(struct pipe_screen *screen) +{ + return "Intel"; +} + +static const char * i915_get_name(struct pipe_screen *screen) { static char buffer[128]; @@ -548,6 +554,7 @@ i915_screen_create(struct i915_winsys *iws) is->base.get_name = i915_get_name; is->base.get_vendor = i915_get_vendor; + is->base.get_device_vendor = i915_get_device_vendor; is->base.get_param = i915_get_param; is->base.get_shader_param = i915_get_shader_param; is->base.get_paramf = i915_get_paramf; diff --git a/src/gallium/drivers/ilo/ilo_screen.c b/src/gallium/drivers/ilo/ilo_screen.c index bf0a84a..80ea4c7 100644 --- a/src/gallium/drivers/ilo/ilo_screen.c +++ b/src/gallium/drivers/ilo/ilo_screen.c @@ -515,6 +515,12 @@ ilo_get_vendor(struct pipe_screen *screen) } static const char * +ilo_get_device_vendor(struct pipe_screen *screen) +{ + return "Intel"; +} + +static const char * ilo_get_name(struct pipe_screen *screen) { struct ilo_screen *is = ilo_screen(screen); @@ -844,6 +850,7 @@ ilo_screen_create(struct intel_winsys *ws) is->base.destroy = ilo_screen_destroy; is->base.get_name = ilo_get_name; is->base.get_vendor = ilo_get_vendor; + is->base.get_device_vendor = ilo_get_device_vendor; is->base.get_param = ilo_get_param; is->base.get_paramf = ilo_get_paramf; is->base.get_shader_param = ilo_get_shader_param; diff --git a/src/gallium/drivers/llvmpipe/lp_screen.c b/src/gallium/drivers/llvmpipe/lp_screen.c index 3387d3a..4b45725 100644 --- a/src/gallium/drivers/llvmpipe/lp_screen.c +++ b/src/gallium/drivers/llvmpipe/lp_screen.c @@ -589,6 +589,7 @@ llvmpipe_create_screen(struct sw_winsys *winsys) screen->base.get_name = llvmpipe_get_name; screen->base.get_vendor = llvmpipe_get_vendor; + screen->base.get_device_vendor = llvmpipe_get_vendor; // TODO should be the CPU vendor screen->base.get_param = llvmpipe_get_param; screen->base.get_shader_param = llvmpipe_get_shader_param; screen->base.get_paramf = llvmpipe_get_paramf; diff --git a/src/gallium/drivers/noop/noop_pipe.c b/src/gallium/drivers/noop/noop_pipe.c index 8cb8c70..6fb2277 100644 --- a/src/gallium/drivers/noop/noop_pipe.c +++ b/src/gallium/drivers/noop/noop_pipe.c @@ -305,6 +305,11 @@ static const char *noop_get_vendor(struct pipe_screen* pscreen) return
Mesa (master): clover: Add a space at the end of CL_DEVICE_OPENCL_C_VERSION
Module: Mesa Branch: master Commit: 96f9cc9181403a93208cb44786c485ce44492eda URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=96f9cc9181403a93208cb44786c485ce44492eda Author: Tom Stellard Date: Fri Mar 20 23:55:58 2015 + clover: Add a space at the end of CL_DEVICE_OPENCL_C_VERSION This is required by the spec. Reviewed-by: Jan Vesely Reviewed-by: Francisco Jerez --- src/gallium/state_trackers/clover/api/device.cpp |2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gallium/state_trackers/clover/api/device.cpp b/src/gallium/state_trackers/clover/api/device.cpp index 5d1f4ab..04f293d 100644 --- a/src/gallium/state_trackers/clover/api/device.cpp +++ b/src/gallium/state_trackers/clover/api/device.cpp @@ -341,7 +341,7 @@ clGetDeviceInfo(cl_device_id d_dev, cl_device_info param, break; case CL_DEVICE_OPENCL_C_VERSION: - buf.as_string() = "OpenCL C 1.1"; + buf.as_string() = "OpenCL C 1.1 "; break; case CL_DEVICE_PARENT_DEVICE: ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): clover: Return the minimum required value for CL_DEVICE_SINGLE_FP_CONFIG v2
Module: Mesa Branch: master Commit: a646b00cfc42fecdf4f853a6fe3ddf12d7801881 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=a646b00cfc42fecdf4f853a6fe3ddf12d7801881 Author: Tom Stellard Date: Thu Mar 5 14:30:57 2015 + clover: Return the minimum required value for CL_DEVICE_SINGLE_FP_CONFIG v2 This means dropping CL_FP_DENORM from the current return value. v2: - Add comments about minimum values for OpenCL 1.2. Reviewed-by: Francisco Jerez Reviewed-by: Jan Vesely --- src/gallium/state_trackers/clover/api/device.cpp |5 - 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/gallium/state_trackers/clover/api/device.cpp b/src/gallium/state_trackers/clover/api/device.cpp index b1f556f..5d1f4ab 100644 --- a/src/gallium/state_trackers/clover/api/device.cpp +++ b/src/gallium/state_trackers/clover/api/device.cpp @@ -201,8 +201,11 @@ clGetDeviceInfo(cl_device_id d_dev, cl_device_info param, break; case CL_DEVICE_SINGLE_FP_CONFIG: + // This is the "mandated minimum single precision floating-point + // capability" for OpenCL 1.1. In OpenCL 1.2, nothing is required for + // custom devices. buf.as_scalar() = - CL_FP_DENORM | CL_FP_INF_NAN | CL_FP_ROUND_TO_NEAREST; + CL_FP_INF_NAN | CL_FP_ROUND_TO_NEAREST; break; case CL_DEVICE_DOUBLE_FP_CONFIG: ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): radeonsi/compute: Use value from compiler for COMPUTE_PGM_RSRC1.FLOAT_MODE
Module: Mesa Branch: master Commit: bbfa1c323917cc54162a64e7882cec9a7b70 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=bbfa1c323917cc54162a64e7882cec9a7b70 Author: Tom Stellard Date: Fri Mar 6 14:53:00 2015 + radeonsi/compute: Use value from compiler for COMPUTE_PGM_RSRC1.FLOAT_MODE Reviewed-by: Marek Olšák --- src/gallium/drivers/radeonsi/si_compute.c |3 ++- src/gallium/drivers/radeonsi/si_shader.c |1 + src/gallium/drivers/radeonsi/si_shader.h |1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/gallium/drivers/radeonsi/si_compute.c b/src/gallium/drivers/radeonsi/si_compute.c index 5009f69..8609b89 100644 --- a/src/gallium/drivers/radeonsi/si_compute.c +++ b/src/gallium/drivers/radeonsi/si_compute.c @@ -377,7 +377,8 @@ static void si_launch_grid( * XXX: The compiler should account for this. */ | S_00B848_SGPRS(((MAX2(4 + arg_user_sgpr_count, - shader->num_sgprs)) - 1) / 8)) + shader->num_sgprs)) - 1) / 8) + | S_00B028_FLOAT_MODE(shader->float_mode)) ; lds_blocks = shader->lds_size; diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index b0417ed..87aef4d 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -2546,6 +2546,7 @@ void si_shader_binary_read_config(const struct si_screen *sscreen, case R_00B848_COMPUTE_PGM_RSRC1: shader->num_sgprs = MAX2(shader->num_sgprs, (G_00B028_SGPRS(value) + 1) * 8); shader->num_vgprs = MAX2(shader->num_vgprs, (G_00B028_VGPRS(value) + 1) * 4); + shader->float_mode = G_00B028_FLOAT_MODE(value); break; case R_00B02C_SPI_SHADER_PGM_RSRC2_PS: shader->lds_size = MAX2(shader->lds_size, G_00B02C_EXTRA_LDS_SIZE(value)); diff --git a/src/gallium/drivers/radeonsi/si_shader.h b/src/gallium/drivers/radeonsi/si_shader.h index 551c7dc..4f2bb91 100644 --- a/src/gallium/drivers/radeonsi/si_shader.h +++ b/src/gallium/drivers/radeonsi/si_shader.h @@ -149,6 +149,7 @@ struct si_shader { unsignednum_vgprs; unsignedlds_size; unsignedspi_ps_input_ena; + unsignedfloat_mode; unsignedscratch_bytes_per_wave; unsignedspi_shader_col_format; unsignedspi_shader_z_format; ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): radeonsi: Add additional information to shader dumps
Module: Mesa Branch: master Commit: 51b43c559f40eed2d02a35014c86b6a3e232c6fa URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=51b43c559f40eed2d02a35014c86b6a3e232c6fa Author: Tom Stellard Date: Thu Feb 26 21:27:27 2015 -0500 radeonsi: Add additional information to shader dumps This adds SGPR count, VGPR count, shader size, LDS size, and scratch usage to shader dumps. Reviewed-by: Marek Olšák --- src/gallium/drivers/radeonsi/si_shader.c | 18 -- 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index 87aef4d..0ef58a7 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -2605,17 +2605,23 @@ int si_shader_binary_read(struct si_screen *sscreen, bool dump = r600_can_dump_shader(&sscreen->b, shader->selector ? shader->selector->tokens : NULL); - if (dump && !binary->disassembled) { - fprintf(stderr, "SI CODE:\n"); - for (i = 0; i < binary->code_size; i+=4 ) { - fprintf(stderr, "@0x%x: %02x%02x%02x%02x\n", i, binary->code[i + 3], + si_shader_binary_read_config(sscreen, shader, 0); + + if (dump) { + if (!binary->disassembled) { + fprintf(stderr, "SI CODE:\n"); + for (i = 0; i < binary->code_size; i+=4 ) { + fprintf(stderr, "@0x%x: %02x%02x%02x%02x\n", i, binary->code[i + 3], binary->code[i + 2], binary->code[i + 1], binary->code[i]); + } } + fprintf(stderr, "SGPRS: %d\nVGPRS: %d\nCode Size: %d bytes\nLDS: %d blocks\n" + "Scratch: %d bytes per wave\n", + shader->num_sgprs, shader->num_vgprs, binary->code_size, + shader->lds_size, shader->scratch_bytes_per_wave); } - si_shader_binary_read_config(sscreen, shader, 0); - /* copy new shader */ code_size = binary->code_size + binary->rodata_size; r600_resource_reference(&shader->bo, NULL); ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): clover: Enable cl_khr_fp64 for devices that support doubles v4
Module: Mesa Branch: master Commit: c97e902a1a69892147e7649581951747f03afaee URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=c97e902a1a69892147e7649581951747f03afaee Author: Tom Stellard Date: Wed Jul 2 15:42:43 2014 -0400 clover: Enable cl_khr_fp64 for devices that support doubles v4 v2: - Report correct values for CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE and CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE. - Only define cl_khr_fp64 if the extension is supported. - Remove trailing space from extension string. - Rename device query function from cl_khr_fp64() to has_doubles(). v3: - Return 0 for device::doubled_fp_confg() when doubles aren't supported. v4: - Remove device query for double fp_config. Reviewed-by: Francisco Jerez --- src/gallium/state_trackers/clover/api/device.cpp | 21 ++--- src/gallium/state_trackers/clover/core/device.cpp |6 ++ src/gallium/state_trackers/clover/core/device.hpp |1 + 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/gallium/state_trackers/clover/api/device.cpp b/src/gallium/state_trackers/clover/api/device.cpp index e825468..b1f556f 100644 --- a/src/gallium/state_trackers/clover/api/device.cpp +++ b/src/gallium/state_trackers/clover/api/device.cpp @@ -145,7 +145,7 @@ clGetDeviceInfo(cl_device_id d_dev, cl_device_info param, break; case CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE: - buf.as_scalar() = 2; + buf.as_scalar() = dev.has_doubles() ? 2 : 0; break; case CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF: @@ -205,6 +205,21 @@ clGetDeviceInfo(cl_device_id d_dev, cl_device_info param, CL_FP_DENORM | CL_FP_INF_NAN | CL_FP_ROUND_TO_NEAREST; break; + case CL_DEVICE_DOUBLE_FP_CONFIG: + if (dev.has_doubles()) + // This is the "mandated minimum double precision floating-point + // capability" + buf.as_scalar() = + CL_FP_FMA + | CL_FP_ROUND_TO_NEAREST + | CL_FP_ROUND_TO_ZERO + | CL_FP_ROUND_TO_INF + | CL_FP_INF_NAN + | CL_FP_DENORM; + else + buf.as_scalar() = 0; + break; + case CL_DEVICE_GLOBAL_MEM_CACHE_TYPE: buf.as_scalar() = CL_NONE; break; @@ -283,7 +298,7 @@ clGetDeviceInfo(cl_device_id d_dev, cl_device_info param, break; case CL_DEVICE_EXTENSIONS: - buf.as_string() = ""; + buf.as_string() = dev.has_doubles() ? "cl_khr_fp64" : ""; break; case CL_DEVICE_PLATFORM: @@ -315,7 +330,7 @@ clGetDeviceInfo(cl_device_id d_dev, cl_device_info param, break; case CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE: - buf.as_scalar() = 2; + buf.as_scalar() = dev.has_doubles() ? 2 : 0; break; case CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF: diff --git a/src/gallium/state_trackers/clover/core/device.cpp b/src/gallium/state_trackers/clover/core/device.cpp index 688a7dd..c3f3b4e 100644 --- a/src/gallium/state_trackers/clover/core/device.cpp +++ b/src/gallium/state_trackers/clover/core/device.cpp @@ -173,6 +173,12 @@ device::image_support() const { PIPE_COMPUTE_CAP_IMAGES_SUPPORTED)[0]; } +bool +device::has_doubles() const { + return pipe->get_shader_param(pipe, PIPE_SHADER_COMPUTE, + PIPE_SHADER_CAP_DOUBLES); +} + std::vector device::max_block_size() const { auto v = get_compute_param(pipe, PIPE_COMPUTE_CAP_MAX_BLOCK_SIZE); diff --git a/src/gallium/state_trackers/clover/core/device.hpp b/src/gallium/state_trackers/clover/core/device.hpp index 2201700..de5fc6b 100644 --- a/src/gallium/state_trackers/clover/core/device.hpp +++ b/src/gallium/state_trackers/clover/core/device.hpp @@ -64,6 +64,7 @@ namespace clover { cl_uint max_clock_frequency() const; cl_uint max_compute_units() const; bool image_support() const; + bool has_doubles() const; std::vector max_block_size() const; std::string device_name() const; ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): clover: Fix build since llvm r231270
Module: Mesa Branch: master Commit: a398168f7238b42c2fbecf940e09fc5ebef71f62 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=a398168f7238b42c2fbecf940e09fc5ebef71f62 Author: Tom Stellard Date: Wed Mar 4 13:09:50 2015 -0800 clover: Fix build since llvm r231270 --- src/gallium/state_trackers/clover/llvm/invocation.cpp |2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gallium/state_trackers/clover/llvm/invocation.cpp b/src/gallium/state_trackers/clover/llvm/invocation.cpp index 9354812..4da62b9 100644 --- a/src/gallium/state_trackers/clover/llvm/invocation.cpp +++ b/src/gallium/state_trackers/clover/llvm/invocation.cpp @@ -332,7 +332,7 @@ namespace { PM.add(new llvm::DataLayout(mod)); #elif HAVE_LLVM < 0x0306 PM.add(new llvm::DataLayoutPass(mod)); -#else +#elif HAVE_LLVM < 0x0307 PM.add(new llvm::DataLayoutPass()); #endif PM.add(llvm::createInternalizePass(export_list)); ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): egl: Take alpha bits into account when selecting GBM formats
Module: Mesa Branch: master Commit: 65c8965d033cf9ade5e6f3c88bda6d247d46af9d URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=65c8965d033cf9ade5e6f3c88bda6d247d46af9d Author: Daniel Stone Date: Mon Mar 2 13:52:59 2015 + egl: Take alpha bits into account when selecting GBM formats This fixes piglit when using PIGLIT_PLATFORM=gbm Tom Stellard: - Fix ARGB2101010 format Cc: "10.4 10.5" Reviewed-by: Alex Deucher Reviewed-by: Chad Versace --- src/egl/drivers/dri2/platform_drm.c | 16 +++- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/egl/drivers/dri2/platform_drm.c b/src/egl/drivers/dri2/platform_drm.c index 02e87f7..bf205be 100644 --- a/src/egl/drivers/dri2/platform_drm.c +++ b/src/egl/drivers/dri2/platform_drm.c @@ -668,15 +668,21 @@ dri2_initialize_drm(_EGLDriver *drv, _EGLDisplay *disp) for (i = 0; dri2_dpy->driver_configs[i]; i++) { EGLint format, attr_list[3]; - unsigned int mask; + unsigned int red, alpha; dri2_dpy->core->getConfigAttrib(dri2_dpy->driver_configs[i], - __DRI_ATTRIB_RED_MASK, &mask); - if (mask == 0x3ff0) + __DRI_ATTRIB_RED_MASK, &red); + dri2_dpy->core->getConfigAttrib(dri2_dpy->driver_configs[i], + __DRI_ATTRIB_ALPHA_MASK, &alpha); + if (red == 0x3ff0 && alpha == 0x) format = GBM_FORMAT_XRGB2101010; - else if (mask == 0x00ff) + else if (red == 0x3ff0 && alpha == 0xc000) + format = GBM_FORMAT_ARGB2101010; + else if (red == 0x00ff && alpha == 0x) format = GBM_FORMAT_XRGB; - else if (mask == 0xf800) + else if (red == 0x00ff && alpha == 0xff00) + format = GBM_FORMAT_ARGB; + else if (red == 0xf800) format = GBM_FORMAT_RGB565; else continue; ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): clover: Don't unconditionally define cl_khr_fp64
Module: Mesa Branch: master Commit: 75514555aa0061299034bf15b5df31ab6746c0e5 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=75514555aa0061299034bf15b5df31ab6746c0e5 Author: Tom Stellard Date: Thu Feb 26 18:20:06 2015 -0500 clover: Don't unconditionally define cl_khr_fp64 This should be done by the frontend for devices that support this extension. Reviewed-by: Francisco Jerez --- src/gallium/state_trackers/clover/llvm/invocation.cpp |1 - 1 file changed, 1 deletion(-) diff --git a/src/gallium/state_trackers/clover/llvm/invocation.cpp b/src/gallium/state_trackers/clover/llvm/invocation.cpp index 508979a..9354812 100644 --- a/src/gallium/state_trackers/clover/llvm/invocation.cpp +++ b/src/gallium/state_trackers/clover/llvm/invocation.cpp @@ -203,7 +203,6 @@ namespace { // clc.h requires that this macro be defined: c.getPreprocessorOpts().addMacroDef("cl_clang_storage_class_specifiers"); - c.getPreprocessorOpts().addMacroDef("cl_khr_fp64"); c.getLangOpts().NoBuiltin = true; c.getTargetOpts().Triple = triple; ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): pipe-loader: Fix build with dri drivers enabled, and vl state trackers disabled
Module: Mesa Branch: master Commit: ed07255149d7cffac07615e946289b3d683faa4b URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=ed07255149d7cffac07615e946289b3d683faa4b Author: Tom Stellard Date: Tue Feb 24 19:43:43 2015 -0500 pipe-loader: Fix build with dri drivers enabled, and vl state trackers disabled Configure arguments: ./configure --disable-dri3 --disable-xvmc --enable-opencl --with-gallium-drivers=r300,r600,radeonsi --with-egl-platforms=drm Build error: make[3]: *** No rule to make target `../../../../src/gallium/auxiliary/libgalliumvlwinsys.la', needed by `pipe_r300.la'. Stop. Cc: "10.5" Reviewed-by: Emil Velikov --- src/gallium/targets/pipe-loader/Makefile.am |6 +- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/gallium/targets/pipe-loader/Makefile.am b/src/gallium/targets/pipe-loader/Makefile.am index 94658f8..fe40f5b 100644 --- a/src/gallium/targets/pipe-loader/Makefile.am +++ b/src/gallium/targets/pipe-loader/Makefile.am @@ -40,13 +40,17 @@ PIPE_LIBS = if NEED_GALLIUM_VL PIPE_LIBS += \ - $(top_builddir)/src/gallium/auxiliary/libgalliumvlwinsys.la \ $(top_builddir)/src/gallium/auxiliary/libgalliumvl.la else PIPE_LIBS += \ $(top_builddir)/src/gallium/auxiliary/libgalliumvl_stub.la endif +if NEED_GALLIUM_VL_WINSYS +PIPE_LIBS+= \ + $(top_builddir)/src/gallium/auxiliary/libgalliumvlwinsys.la +endif + PIPE_LIBS += \ $(top_builddir)/src/gallium/auxiliary/libgallium.la \ $(top_builddir)/src/util/libmesautil.la \ ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): radeonsi/compute: Enable PIPE_SHADER_CAP_DOUBLES v2
Module: Mesa Branch: master Commit: da85ab4b655a28cec33a81dae78ebe375fef9aa1 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=da85ab4b655a28cec33a81dae78ebe375fef9aa1 Author: Tom Stellard Date: Thu Feb 26 23:25:14 2015 + radeonsi/compute: Enable PIPE_SHADER_CAP_DOUBLES v2 v2: - Simplify ifdef Reviewed-by: Michel Dänzer --- src/gallium/drivers/radeonsi/si_pipe.c |4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_pipe.c b/src/gallium/drivers/radeonsi/si_pipe.c index f8fd3fa..f1a5388 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.c +++ b/src/gallium/drivers/radeonsi/si_pipe.c @@ -363,8 +363,8 @@ static int si_get_shader_param(struct pipe_screen* pscreen, unsigned shader, enu return PIPE_SHADER_IR_NATIVE; #endif case PIPE_SHADER_CAP_DOUBLES: - return 0; /* XXX: Enable doubles once the compiler can -handle them. */ + return HAVE_LLVM >= 0x0307; + case PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE: { uint64_t max_const_buffer_size; pscreen->get_compute_param(pscreen, ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): clover: Use Legacy PassManager for LLVM trunk (3.7)
Module: Mesa Branch: master Commit: 7df256add2ae9fb916c3e0f80c879e42d1c8a7a0 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=7df256add2ae9fb916c3e0f80c879e42d1c8a7a0 Author: Shawn Starr Date: Fri Feb 13 21:16:17 2015 -0500 clover: Use Legacy PassManager for LLVM trunk (3.7) Reviewed-by: Tom Stellard Signed-off-by: Shawn Starr --- src/gallium/state_trackers/clover/llvm/invocation.cpp |9 + 1 file changed, 9 insertions(+) diff --git a/src/gallium/state_trackers/clover/llvm/invocation.cpp b/src/gallium/state_trackers/clover/llvm/invocation.cpp index 0794e61..508979a 100644 --- a/src/gallium/state_trackers/clover/llvm/invocation.cpp +++ b/src/gallium/state_trackers/clover/llvm/invocation.cpp @@ -44,7 +44,11 @@ #if HAVE_LLVM < 0x0305 #include #endif +#if HAVE_LLVM >= 0x0307 +#include +#else #include +#endif #include #include #include @@ -298,7 +302,12 @@ namespace { optimize(llvm::Module *mod, unsigned optimization_level, const std::vector &kernels) { +#if HAVE_LLVM >= 0x0307 + llvm::legacy::PassManager PM; +#else llvm::PassManager PM; +#endif + // Add a function internalizer pass. // // By default, the function internalizer pass will look for a function ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): radeonsi: Avoid leaking memory when rebuilding shader states
Module: Mesa Branch: master Commit: 5935edd47c3b2a7a3047da5ad03c4d82e082628b URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=5935edd47c3b2a7a3047da5ad03c4d82e082628b Author: Marek Olšák Date: Tue Jan 27 14:52:37 2015 + radeonsi: Avoid leaking memory when rebuilding shader states Reviewed-by: Michel Dänzer --- src/gallium/drivers/radeonsi/si_pm4.c | 12 src/gallium/drivers/radeonsi/si_pm4.h |1 + src/gallium/drivers/radeonsi/si_state_shaders.c |4 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_pm4.c b/src/gallium/drivers/radeonsi/si_pm4.c index 5edf152..e9b9a5f 100644 --- a/src/gallium/drivers/radeonsi/si_pm4.c +++ b/src/gallium/drivers/radeonsi/si_pm4.c @@ -103,6 +103,13 @@ void si_pm4_add_bo(struct si_pm4_state *state, state->bo_priority[idx] = priority; } +void si_pm4_free_state_simple(struct si_pm4_state *state) +{ + for (int i = 0; i < state->nbo; ++i) + r600_resource_reference(&state->bo[i], NULL); + FREE(state); +} + void si_pm4_free_state(struct si_context *sctx, struct si_pm4_state *state, unsigned idx) @@ -114,10 +121,7 @@ void si_pm4_free_state(struct si_context *sctx, sctx->emitted.array[idx] = NULL; } - for (int i = 0; i < state->nbo; ++i) { - r600_resource_reference(&state->bo[i], NULL); - } - FREE(state); + si_pm4_free_state_simple(state); } unsigned si_pm4_dirty_dw(struct si_context *sctx) diff --git a/src/gallium/drivers/radeonsi/si_pm4.h b/src/gallium/drivers/radeonsi/si_pm4.h index 8680a9e..bfb5562 100644 --- a/src/gallium/drivers/radeonsi/si_pm4.h +++ b/src/gallium/drivers/radeonsi/si_pm4.h @@ -71,6 +71,7 @@ void si_pm4_add_bo(struct si_pm4_state *state, enum radeon_bo_usage usage, enum radeon_bo_priority priority); +void si_pm4_free_state_simple(struct si_pm4_state *state); void si_pm4_free_state(struct si_context *sctx, struct si_pm4_state *state, unsigned idx); diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c b/src/gallium/drivers/radeonsi/si_state_shaders.c index 887680f..3249bcc 100644 --- a/src/gallium/drivers/radeonsi/si_state_shaders.c +++ b/src/gallium/drivers/radeonsi/si_state_shaders.c @@ -316,6 +316,10 @@ static void si_shader_ps(struct si_shader *shader) static void si_shader_init_pm4_state(struct si_shader *shader) { + + if (shader->pm4) + si_pm4_free_state_simple(shader->pm4); + switch (shader->selector->type) { case PIPE_SHADER_VERTEX: if (shader->key.vs.as_es) ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): radeonsi: Add radeon_shader_binary member to struct si_shader
Module: Mesa Branch: master Commit: 32206c5e560cea8c992ec983e7f5324493385ead URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=32206c5e560cea8c992ec983e7f5324493385ead Author: Tom Stellard Date: Fri Jan 23 22:54:43 2015 + radeonsi: Add radeon_shader_binary member to struct si_shader Reviewed-by: Michel Dänzer --- src/gallium/drivers/radeonsi/si_compute.c | 11 +-- src/gallium/drivers/radeonsi/si_shader.h |1 + 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_compute.c b/src/gallium/drivers/radeonsi/si_compute.c index ba63afd..840d21f 100644 --- a/src/gallium/drivers/radeonsi/si_compute.c +++ b/src/gallium/drivers/radeonsi/si_compute.c @@ -54,7 +54,6 @@ struct si_compute { unsigned local_size; unsigned private_size; unsigned input_size; - struct radeon_shader_binary binary; struct si_shader shader; unsigned num_user_sgprs; @@ -102,8 +101,8 @@ static void *si_create_compute_state( } #else - radeon_elf_read(code, header->num_bytes, &program->binary, true); - si_shader_binary_read(sctx->screen, &program->shader, &program->binary); + radeon_elf_read(code, header->num_bytes, &program->shader.binary, true); + si_shader_binary_read(sctx->screen, &program->shader, &program->shader.binary); #endif program->input_buffer = si_resource_create_custom(sctx->b.b.screen, @@ -256,7 +255,7 @@ static void si_launch_grid( #if HAVE_LLVM >= 0x0306 /* Read the config information */ - si_shader_binary_read_config(&program->binary, shader, pc); + si_shader_binary_read_config(&program->shader.binary, shader, pc); #endif /* Upload the kernel arguments */ @@ -296,7 +295,7 @@ static void si_launch_grid( /* Patch the shader with the scratch buffer address. */ apply_scratch_relocs(sctx->screen, - &program->binary, shader, scratch_buffer_va); + &program->shader.binary, shader, scratch_buffer_va); } @@ -481,7 +480,7 @@ static void si_delete_compute_state(struct pipe_context *ctx, void* state){ pipe_resource_reference( (struct pipe_resource **)&program->input_buffer, NULL); - radeon_shader_binary_free_members(&program->binary, true); + radeon_shader_binary_free_members(&program->shader.binary, true); FREE(program); } diff --git a/src/gallium/drivers/radeonsi/si_shader.h b/src/gallium/drivers/radeonsi/si_shader.h index 08e344a..6def5c7 100644 --- a/src/gallium/drivers/radeonsi/si_shader.h +++ b/src/gallium/drivers/radeonsi/si_shader.h @@ -142,6 +142,7 @@ struct si_shader { struct si_pm4_state *pm4; struct r600_resource*bo; struct r600_resource*scratch_bo; + struct radeon_shader_binary binary; unsignednum_sgprs; unsignednum_vgprs; unsignedlds_size; ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): radeonsi: Enable VGPR spilling for all shader types v5
Module: Mesa Branch: master Commit: 2397a721291457c146c7f4bcd48adcb3b2d979bd URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=2397a721291457c146c7f4bcd48adcb3b2d979bd Author: Tom Stellard Date: Wed Dec 10 09:13:59 2014 -0500 radeonsi: Enable VGPR spilling for all shader types v5 v2: - Only emit write SPI_TMPRING_SIZE once per packet. - Use context global scratch buffer. v3: - Patch shaders using WRITE_DATA packet instead of map/unmap. - Emit ICACHE_FLUSH, CS_PARTIAL_FLUSH, PS_PARTIAL_FLUSH, and VS_PARTIAL_FLUSH when patching shaders. v4: - Code cleanups. - Remove unnecessary multiplies. v5: - Patch shaders in system memory and re-upload to vram. Reviewed-by: Michel Dänzer --- src/gallium/drivers/radeonsi/si_compute.c | 44 ++-- src/gallium/drivers/radeonsi/si_hw_context.c|1 + src/gallium/drivers/radeonsi/si_pipe.c |9 +- src/gallium/drivers/radeonsi/si_pipe.h |6 ++ src/gallium/drivers/radeonsi/si_shader.c| 59 -- src/gallium/drivers/radeonsi/si_shader.h|6 +- src/gallium/drivers/radeonsi/si_state_draw.c| 14 +++ src/gallium/drivers/radeonsi/si_state_shaders.c | 130 ++- 8 files changed, 217 insertions(+), 52 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_compute.c b/src/gallium/drivers/radeonsi/si_compute.c index 12b91db..5009f69 100644 --- a/src/gallium/drivers/radeonsi/si_compute.c +++ b/src/gallium/drivers/radeonsi/si_compute.c @@ -42,12 +42,6 @@ #define NUM_USER_SGPRS 4 #endif -static const char *scratch_rsrc_dword0_symbol = - "SCRATCH_RSRC_DWORD0"; - -static const char *scratch_rsrc_dword1_symbol = - "SCRATCH_RSRC_DWORD1"; - struct si_compute { struct si_context *ctx; @@ -67,8 +61,6 @@ struct si_compute { #endif }; -static void apply_scratch_relocs(const struct si_screen *sscreen, - struct si_shader *shader, uint64_t scratch_va); static void init_scratch_buffer(struct si_context *sctx, struct si_compute *program) { unsigned scratch_bytes = 0; @@ -83,7 +75,7 @@ static void init_scratch_buffer(struct si_context *sctx, struct si_compute *prog program->shader.binary.global_symbol_offsets[i]; unsigned scratch_bytes_needed; - si_shader_binary_read_config(&program->shader.binary, + si_shader_binary_read_config(sctx->screen, &program->shader, offset); scratch_bytes_needed = program->shader.scratch_bytes_per_wave; scratch_bytes = MAX2(scratch_bytes, scratch_bytes_needed); @@ -106,8 +98,8 @@ static void init_scratch_buffer(struct si_context *sctx, struct si_compute *prog program->shader.scratch_bytes_per_wave = scratch_bytes; /* Patch the shader with the scratch buffer address. */ - apply_scratch_relocs(sctx->screen, &program->shader, scratch_buffer_va); - + si_shader_apply_scratch_relocs(sctx, + &program->shader, scratch_buffer_va); } static void *si_create_compute_state( @@ -231,30 +223,6 @@ static unsigned compute_num_waves_for_scratch( return scratch_waves; } -static void apply_scratch_relocs(const struct si_screen *sscreen, - struct si_shader *shader, uint64_t scratch_va) { - unsigned i; - uint32_t scratch_rsrc_dword0 = scratch_va & 0x; - uint32_t scratch_rsrc_dword1 = - S_008F04_BASE_ADDRESS_HI(scratch_va >> 32) - | S_008F04_STRIDE(shader->scratch_bytes_per_wave / 64); - - if (!shader->binary.reloc_count) { - return; - } - - for (i = 0 ; i < shader->binary.reloc_count; i++) { - const struct radeon_shader_reloc *reloc = &shader->binary.relocs[i]; - if (!strcmp(scratch_rsrc_dword0_symbol, reloc->name)) { - util_memcpy_cpu_to_le32(shader->binary.code + reloc->offset, - &scratch_rsrc_dword0, 4); - } else if (!strcmp(scratch_rsrc_dword1_symbol, reloc->name)) { - util_memcpy_cpu_to_le32(shader->binary.code + reloc->offset, - &scratch_rsrc_dword1, 4); - } - } -} - static void si_launch_grid( struct pipe_context *ctx, const uint *block_layout, const uint *grid_layout, @@ -299,7 +267,7 @@ static void si_launch_grid( #if HAVE_LLVM >= 0x0306 /* Read the config information */ - si_shader_binary_read_config(&program->shader.binary, shader, pc); + si_shader_binary_read_config(sctx->screen, shader, pc); #endif /* Upload the kernel arguments */ @@ -510,13 +478,15 @@ static void si_delete_compute_state(st
Mesa (master): radeonsi/compute: Rename si_compute::program to si_compute: :shader
Module: Mesa Branch: master Commit: 37559f8dfcaa9bcbfff2d9fa0a0bd2fe4564e635 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=37559f8dfcaa9bcbfff2d9fa0a0bd2fe4564e635 Author: Tom Stellard Date: Fri Jan 23 22:54:08 2015 + radeonsi/compute: Rename si_compute::program to si_compute::shader Reviewed-by: Michel Dänzer --- src/gallium/drivers/radeonsi/si_compute.c | 10 +- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_compute.c b/src/gallium/drivers/radeonsi/si_compute.c index 4427d3b..ba63afd 100644 --- a/src/gallium/drivers/radeonsi/si_compute.c +++ b/src/gallium/drivers/radeonsi/si_compute.c @@ -55,7 +55,7 @@ struct si_compute { unsigned private_size; unsigned input_size; struct radeon_shader_binary binary; - struct si_shader program; + struct si_shader shader; unsigned num_user_sgprs; struct r600_resource *input_buffer; @@ -103,7 +103,7 @@ static void *si_create_compute_state( #else radeon_elf_read(code, header->num_bytes, &program->binary, true); - si_shader_binary_read(sctx->screen, &program->program, &program->binary); + si_shader_binary_read(sctx->screen, &program->shader, &program->binary); #endif program->input_buffer = si_resource_create_custom(sctx->b.b.screen, @@ -231,7 +231,7 @@ static void si_launch_grid( uint64_t shader_va; unsigned arg_user_sgpr_count = NUM_USER_SGPRS; unsigned i; - struct si_shader *shader = &program->program; + struct si_shader *shader = &program->shader; unsigned lds_blocks; unsigned num_waves_for_scratch; @@ -256,7 +256,7 @@ static void si_launch_grid( #if HAVE_LLVM >= 0x0306 /* Read the config information */ - si_shader_binary_read_config(&program->binary, &program->program, pc); + si_shader_binary_read_config(&program->binary, shader, pc); #endif /* Upload the kernel arguments */ @@ -475,7 +475,7 @@ static void si_delete_compute_state(struct pipe_context *ctx, void* state){ LLVMContextDispose(program->llvm_ctx); } #else - si_shader_destroy(ctx, &program->program); + si_shader_destroy(ctx, &program->shader); #endif pipe_resource_reference( ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): radeonsi/compute: Allocate the scratch buffer during state creation
Module: Mesa Branch: master Commit: 5dcd97f25c217450c9e3e0441246187219a01eca URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=5dcd97f25c217450c9e3e0441246187219a01eca Author: Tom Stellard Date: Tue Jan 27 16:35:21 2015 + radeonsi/compute: Allocate the scratch buffer during state creation This moves scratch buffer allocation from si_launch_grid() to si_create_compute_state(). This helps to reduce the overhead of launching a kernel and also fixes a bug in the code that would cause the scratch buffer to be too small if a kernel with smaller scratch size was launched before a kernel with a larger scratch size. Reviewed-by: Michel Dänzer --- src/gallium/drivers/radeonsi/si_compute.c | 82 + src/gallium/drivers/radeonsi/si_shader.c |4 +- 2 files changed, 62 insertions(+), 24 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_compute.c b/src/gallium/drivers/radeonsi/si_compute.c index 840d21f..12b91db 100644 --- a/src/gallium/drivers/radeonsi/si_compute.c +++ b/src/gallium/drivers/radeonsi/si_compute.c @@ -67,6 +67,49 @@ struct si_compute { #endif }; +static void apply_scratch_relocs(const struct si_screen *sscreen, + struct si_shader *shader, uint64_t scratch_va); +static void init_scratch_buffer(struct si_context *sctx, struct si_compute *program) +{ + unsigned scratch_bytes = 0; + uint64_t scratch_buffer_va; + unsigned i; + + /* Compute the scratch buffer size using the maximum number of waves. +* This way we don't need to recompute it for each kernel launch. */ + unsigned scratch_waves = 32 * sctx->screen->b.info.max_compute_units; + for (i = 0; i < program->shader.binary.global_symbol_count; i++) { + unsigned offset = + program->shader.binary.global_symbol_offsets[i]; + unsigned scratch_bytes_needed; + + si_shader_binary_read_config(&program->shader.binary, + &program->shader, offset); + scratch_bytes_needed = program->shader.scratch_bytes_per_wave; + scratch_bytes = MAX2(scratch_bytes, scratch_bytes_needed); + } + + if (scratch_bytes == 0) + return; + + program->shader.scratch_bo = (struct r600_resource*) + si_resource_create_custom(sctx->b.b.screen, + PIPE_USAGE_DEFAULT, + scratch_bytes * scratch_waves); + + scratch_buffer_va = program->shader.scratch_bo->gpu_address; + + /* apply_scratch_relocs needs scratch_bytes_per_wave to be set +* to the maximum bytes needed, so it can compute the stride +* correctly. +*/ + program->shader.scratch_bytes_per_wave = scratch_bytes; + + /* Patch the shader with the scratch buffer address. */ + apply_scratch_relocs(sctx->screen, &program->shader, scratch_buffer_va); + +} + static void *si_create_compute_state( struct pipe_context *ctx, const struct pipe_compute_state *cso) @@ -102,6 +145,12 @@ static void *si_create_compute_state( #else radeon_elf_read(code, header->num_bytes, &program->shader.binary, true); + + /* init_scratch_buffer patches the shader code with the scratch address, +* so we need to call it before si_shader_binary_read() which uploads +* the shader code to the GPU. +*/ + init_scratch_buffer(sctx, program); si_shader_binary_read(sctx->screen, &program->shader, &program->shader.binary); #endif @@ -183,32 +232,27 @@ static unsigned compute_num_waves_for_scratch( } static void apply_scratch_relocs(const struct si_screen *sscreen, - const struct radeon_shader_binary *binary, struct si_shader *shader, uint64_t scratch_va) { unsigned i; - char *ptr; uint32_t scratch_rsrc_dword0 = scratch_va & 0x; uint32_t scratch_rsrc_dword1 = S_008F04_BASE_ADDRESS_HI(scratch_va >> 32) | S_008F04_STRIDE(shader->scratch_bytes_per_wave / 64); - if (!binary->reloc_count) { + if (!shader->binary.reloc_count) { return; } - ptr = sscreen->b.ws->buffer_map(shader->bo->cs_buf, NULL, - PIPE_TRANSFER_READ_WRITE); - for (i = 0 ; i < binary->reloc_count; i++) { - const struct radeon_shader_reloc *reloc = &binary->relocs[i]; + for (i = 0 ; i < shader->binary.reloc_count; i++) { + const struct radeon_shader_reloc *reloc = &shader->binary.relocs[i]; if (!strcmp(scratch_rsrc_dword0_symbol, reloc->name)) { -
Mesa (master): clover: Fix build with llvm after r226981
Module: Mesa Branch: master Commit: 9cbb9165b9454ccc7f2a6702ce71bc5cd9faba02 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=9cbb9165b9454ccc7f2a6702ce71bc5cd9faba02 Author: Jan Vesely Date: Sun Jan 25 16:11:40 2015 -0500 clover: Fix build with llvm after r226981 Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=88783 Signed-off-by: Jan Vesely --- src/gallium/state_trackers/clover/llvm/invocation.cpp |4 1 file changed, 4 insertions(+) diff --git a/src/gallium/state_trackers/clover/llvm/invocation.cpp b/src/gallium/state_trackers/clover/llvm/invocation.cpp index 6cc07b2..7a0be53 100644 --- a/src/gallium/state_trackers/clover/llvm/invocation.cpp +++ b/src/gallium/state_trackers/clover/llvm/invocation.cpp @@ -331,7 +331,11 @@ namespace { llvm::PassManagerBuilder PMB; PMB.OptLevel = optimization_level; +#if HAVE_LLVM < 0x0307 PMB.LibraryInfo = new llvm::TargetLibraryInfo( +#else + PMB.LibraryInfo = new llvm::TargetLibraryInfoImpl( +#endif llvm::Triple(mod->getTargetTriple())); PMB.populateModulePassManager(PM); PM.run(*mod); ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): radeonsi/compute: Use relocs for scratch pointer rather than user sgprs v2
Module: Mesa Branch: master Commit: 73bc0fdb6f65ddb481cf525bf354e1a16bea4d75 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=73bc0fdb6f65ddb481cf525bf354e1a16bea4d75 Author: Tom Stellard Date: Tue Dec 9 20:05:44 2014 -0500 radeonsi/compute: Use relocs for scratch pointer rather than user sgprs v2 Instead of passing a pointer to the scratch buffer via user sgprs, we now patch the shader with the buffer address using reloc information from the LLVM generated ELF. v2: - Make sure not to break older LLVM. --- src/gallium/drivers/radeonsi/si_compute.c | 42 + 1 file changed, 42 insertions(+) diff --git a/src/gallium/drivers/radeonsi/si_compute.c b/src/gallium/drivers/radeonsi/si_compute.c index 20fec84..4427d3b 100644 --- a/src/gallium/drivers/radeonsi/si_compute.c +++ b/src/gallium/drivers/radeonsi/si_compute.c @@ -36,9 +36,18 @@ #if HAVE_LLVM < 0x0305 #define NUM_USER_SGPRS 2 #else +/* XXX: Even though we don't pass the scratch buffer via user sgprs any more + * LLVM still expects that we specify 4 USER_SGPRS so it can remain compatible + * with older mesa. */ #define NUM_USER_SGPRS 4 #endif +static const char *scratch_rsrc_dword0_symbol = + "SCRATCH_RSRC_DWORD0"; + +static const char *scratch_rsrc_dword1_symbol = + "SCRATCH_RSRC_DWORD1"; + struct si_compute { struct si_context *ctx; @@ -174,6 +183,35 @@ static unsigned compute_num_waves_for_scratch( return scratch_waves; } +static void apply_scratch_relocs(const struct si_screen *sscreen, + const struct radeon_shader_binary *binary, + struct si_shader *shader, uint64_t scratch_va) { + unsigned i; + char *ptr; + uint32_t scratch_rsrc_dword0 = scratch_va & 0x; + uint32_t scratch_rsrc_dword1 = + S_008F04_BASE_ADDRESS_HI(scratch_va >> 32) + | S_008F04_STRIDE(shader->scratch_bytes_per_wave / 64); + + if (!binary->reloc_count) { + return; + } + + ptr = sscreen->b.ws->buffer_map(shader->bo->cs_buf, NULL, + PIPE_TRANSFER_READ_WRITE); + for (i = 0 ; i < binary->reloc_count; i++) { + const struct radeon_shader_reloc *reloc = &binary->relocs[i]; + if (!strcmp(scratch_rsrc_dword0_symbol, reloc->name)) { + util_memcpy_cpu_to_le32(ptr + reloc->offset, + &scratch_rsrc_dword0, 4); + } else if (!strcmp(scratch_rsrc_dword1_symbol, reloc->name)) { + util_memcpy_cpu_to_le32(ptr + reloc->offset, + &scratch_rsrc_dword1, 4); + } + } + sscreen->b.ws->buffer_unmap(shader->bo->cs_buf); +} + static void si_launch_grid( struct pipe_context *ctx, const uint *block_layout, const uint *grid_layout, @@ -256,6 +294,10 @@ static void si_launch_grid( RADEON_USAGE_READWRITE, RADEON_PRIO_SHADER_RESOURCE_RW); + /* Patch the shader with the scratch buffer address. */ + apply_scratch_relocs(sctx->screen, + &program->binary, shader, scratch_buffer_va); + } for (i = 0; i < (kernel_args_size / 4); i++) { ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): radeon: Add a helper function for freeing members of radeon_shader_binary
Module: Mesa Branch: master Commit: 5667aa58c49221a919526db08aab7da5bd2b3a5d URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=5667aa58c49221a919526db08aab7da5bd2b3a5d Author: Tom Stellard Date: Wed Jan 14 10:01:29 2015 -0500 radeon: Add a helper function for freeing members of radeon_shader_binary --- src/gallium/drivers/radeon/radeon_elf_util.c |6 ++ src/gallium/drivers/radeon/radeon_elf_util.h |5 + src/gallium/drivers/radeonsi/si_compute.c|4 +--- src/gallium/drivers/radeonsi/si_shader.c |4 +--- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/gallium/drivers/radeon/radeon_elf_util.c b/src/gallium/drivers/radeon/radeon_elf_util.c index ec39a89..8cda57a 100644 --- a/src/gallium/drivers/radeon/radeon_elf_util.c +++ b/src/gallium/drivers/radeon/radeon_elf_util.c @@ -161,3 +161,9 @@ const unsigned char *radeon_shader_binary_config_start( } return binary->config; } + +void radeon_shader_binary_free_members(struct radeon_shader_binary *binary) { + FREE(binary->code); + FREE(binary->config); + FREE(binary->rodata); +} diff --git a/src/gallium/drivers/radeon/radeon_elf_util.h b/src/gallium/drivers/radeon/radeon_elf_util.h index 8095e2f..ccac563 100644 --- a/src/gallium/drivers/radeon/radeon_elf_util.h +++ b/src/gallium/drivers/radeon/radeon_elf_util.h @@ -46,4 +46,9 @@ const unsigned char *radeon_shader_binary_config_start( const struct radeon_shader_binary *binary, uint64_t symbol_offset); +/** + * Free all memory allocated for members of \p binary. This function does + * not free \p binary. + */ +void radeon_shader_binary_free_members(struct radeon_shader_binary *binary); #endif /* RADEON_ELF_UTIL_H */ diff --git a/src/gallium/drivers/radeonsi/si_compute.c b/src/gallium/drivers/radeonsi/si_compute.c index 4b335bb..f911e1f 100644 --- a/src/gallium/drivers/radeonsi/si_compute.c +++ b/src/gallium/drivers/radeonsi/si_compute.c @@ -439,9 +439,7 @@ static void si_delete_compute_state(struct pipe_context *ctx, void* state){ pipe_resource_reference( (struct pipe_resource **)&program->input_buffer, NULL); - FREE(program->binary.code); - FREE(program->binary.config); - FREE(program->binary.rodata); + radeon_shader_binary_free_members(&program->binary); FREE(program); } diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index cf28860..a891bc6 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -2621,9 +2621,7 @@ int si_compile_llvm(struct si_screen *sscreen, struct si_shader *shader, return r; } r = si_shader_binary_read(sscreen, shader, &binary); - FREE(binary.code); - FREE(binary.config); - FREE(binary.rodata); + radeon_shader_binary_free_members(&binary); return r; } ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): radeonsi: Re-enable LLVM IR dumps
Module: Mesa Branch: master Commit: 17a2f11a06026f931112d21a9808b04287d16546 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=17a2f11a06026f931112d21a9808b04287d16546 Author: Tom Stellard Date: Wed Jan 7 15:51:48 2015 -0500 radeonsi: Re-enable LLVM IR dumps This was inadvertently disabled by 761e36b4caab4e8e09a4c2b1409a825902fc7d2c. --- src/gallium/drivers/radeon/radeon_llvm_emit.c |4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/gallium/drivers/radeon/radeon_llvm_emit.c b/src/gallium/drivers/radeon/radeon_llvm_emit.c index b98afb2..0f9dbab 100644 --- a/src/gallium/drivers/radeon/radeon_llvm_emit.c +++ b/src/gallium/drivers/radeon/radeon_llvm_emit.c @@ -162,7 +162,6 @@ unsigned radeon_llvm_compile(LLVMModuleRef M, struct radeon_shader_binary *binar strncpy(cpu, gpu_family, CPU_STRING_LEN); memset(fs, 0, sizeof(fs)); if (dump) { - LLVMDumpModule(M); strncpy(fs, "+DumpCode", FS_STRING_LEN); } tm = LLVMCreateTargetMachine(target, triple, cpu, fs, @@ -170,6 +169,9 @@ unsigned radeon_llvm_compile(LLVMModuleRef M, struct radeon_shader_binary *binar LLVMCodeModelDefault); dispose_tm = true; } + if (dump) { + LLVMDumpModule(M); + } /* Setup Diagnostic Handler*/ llvm_ctx = LLVMGetModuleContext(M); ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): radeon: Teach radeon_elf_read() how to parse reloc information v3
Module: Mesa Branch: master Commit: dfdaf3eb7edac939f5d1a32db2968944852b28fa URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=dfdaf3eb7edac939f5d1a32db2968944852b28fa Author: Tom Stellard Date: Tue Dec 9 20:03:50 2014 -0500 radeon: Teach radeon_elf_read() how to parse reloc information v3 v2: - Use strdup for copying reloc names. - Free reloc memory. v3: - Add free_relocs parameter to radeon_shader_binary_free_members() --- src/gallium/drivers/radeon/r600_pipe_common.h |8 src/gallium/drivers/radeon/radeon_elf_util.c | 61 +++-- src/gallium/drivers/radeon/radeon_elf_util.h | 12 - src/gallium/drivers/radeonsi/si_compute.c |2 +- src/gallium/drivers/radeonsi/si_shader.c |2 +- 5 files changed, 78 insertions(+), 7 deletions(-) diff --git a/src/gallium/drivers/radeon/r600_pipe_common.h b/src/gallium/drivers/radeon/r600_pipe_common.h index 60b8fae..6224668 100644 --- a/src/gallium/drivers/radeon/r600_pipe_common.h +++ b/src/gallium/drivers/radeon/r600_pipe_common.h @@ -89,6 +89,11 @@ struct r600_common_context; +struct radeon_shader_reloc { + char *name; + uint64_t offset; +}; + struct radeon_shader_binary { /** Shader code */ unsigned char *code; @@ -113,6 +118,9 @@ struct radeon_shader_binary { uint64_t *global_symbol_offsets; unsigned global_symbol_count; + struct radeon_shader_reloc *relocs; + unsigned reloc_count; + /** Set to 1 if the disassembly for this binary has been dumped to * stderr. */ int disassembled; diff --git a/src/gallium/drivers/radeon/radeon_elf_util.c b/src/gallium/drivers/radeon/radeon_elf_util.c index 8cda57a..fd0632b 100644 --- a/src/gallium/drivers/radeon/radeon_elf_util.c +++ b/src/gallium/drivers/radeon/radeon_elf_util.c @@ -53,7 +53,8 @@ static void parse_symbol_table(Elf_Data *symbol_table_data, while (gelf_getsym(symbol_table_data, i++, &symbol)) { unsigned i; - if (GELF_ST_BIND(symbol.st_info) != STB_GLOBAL) { + if (GELF_ST_BIND(symbol.st_info) != STB_GLOBAL || + symbol.st_shndx == 0 /* Undefined symbol */) { continue; } @@ -75,6 +76,32 @@ static void parse_symbol_table(Elf_Data *symbol_table_data, } } +static void parse_relocs(Elf *elf, Elf_Data *relocs, Elf_Data *symbols, + unsigned symbol_sh_link, + struct radeon_shader_binary *binary) +{ + unsigned i; + + if (!relocs || !symbols || !binary->reloc_count) { + return; + } + binary->relocs = CALLOC(binary->reloc_count, + sizeof(struct radeon_shader_reloc)); + for (i = 0; i < binary->reloc_count; i++) { + GElf_Sym symbol; + GElf_Rel rel; + char *symbol_name; + struct radeon_shader_reloc *reloc = &binary->relocs[i]; + + gelf_getrel(relocs, i, &rel); + gelf_getsym(symbols, GELF_R_SYM(rel.r_info), &symbol); + symbol_name = elf_strptr(elf, symbol_sh_link, symbol.st_name); + + reloc->offset = rel.r_offset; + reloc->name = strdup(symbol_name); + } +} + void radeon_elf_read(const char *elf_data, unsigned elf_size, struct radeon_shader_binary *binary, unsigned debug) @@ -82,7 +109,9 @@ void radeon_elf_read(const char *elf_data, unsigned elf_size, char *elf_buffer; Elf *elf; Elf_Scn *section = NULL; + Elf_Data *symbols = NULL, *relocs = NULL; size_t section_str_index; + unsigned symbol_sh_link; /* One of the libelf implementations * (http://www.mr511.de/software/english.htm) requires calling @@ -128,11 +157,18 @@ void radeon_elf_read(const char *elf_data, unsigned elf_size, binary->rodata = MALLOC(binary->rodata_size * sizeof(unsigned char)); memcpy(binary->rodata, section_data->d_buf, binary->rodata_size); } else if (!strncmp(name, ".symtab", 7)) { - section_data = elf_getdata(section, section_data); - parse_symbol_table(section_data, §ion_header, binary); + symbols = elf_getdata(section, section_data); + symbol_sh_link = section_header.sh_link; + parse_symbol_table(symbols, §ion_header, binary); + } else if (!strcmp(name, ".rel.text")) { + relocs = elf_getdata(section, section_data); + binary->reloc_count = section_header.sh_size / + section_header.sh_entsize; } } +
Mesa (master): radeonsi: Fix crash when destroying si_screen
Module: Mesa Branch: master Commit: e28f9d0e60468db429e75a27443f7df52da224a2 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=e28f9d0e60468db429e75a27443f7df52da224a2 Author: Tom Stellard Date: Wed Jan 7 13:49:12 2015 -0500 radeonsi: Fix crash when destroying si_screen We were invalidating si_screen:tm by calling r600_destroy_common_screen() which frees the si_screen object. This caused the driver to crash in LLVMDisposeTargetMachine() since we were passing it an invalid pointer. https://bugs.freedesktop.org/show_bug.cgi?id=88170 --- src/gallium/drivers/radeonsi/si_pipe.c |6 -- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_pipe.c b/src/gallium/drivers/radeonsi/si_pipe.c index 38bff31..e3f8fcf 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.c +++ b/src/gallium/drivers/radeonsi/si_pipe.c @@ -424,11 +424,13 @@ static void si_destroy_screen(struct pipe_screen* pscreen) if (!sscreen->b.ws->unref(sscreen->b.ws)) return; - r600_destroy_common_screen(&sscreen->b); - #if HAVE_LLVM >= 0x0306 + // r600_destroy_common_screen() frees sscreen, so we need to make + // sure to dispose the TargetMachine before we call it. LLVMDisposeTargetMachine(sscreen->tm); #endif + + r600_destroy_common_screen(&sscreen->b); } #define SI_TILE_MODE_COLOR_2D_8BPP 14 ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): radeonsi: Cache LLVMTargetMachine object in si_screen
Module: Mesa Branch: master Commit: 761e36b4caab4e8e09a4c2b1409a825902fc7d2c URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=761e36b4caab4e8e09a4c2b1409a825902fc7d2c Author: Tom Stellard Date: Wed Oct 15 12:24:30 2014 -0400 radeonsi: Cache LLVMTargetMachine object in si_screen Rather than building a new one every compile. This should reduce some of the overhead of compiling shaders. One consequence of this change is that we lose the MachineInstrs dumps when dumping the shaders via R600_DEBUG. The LLVM IR and assembly is still dumped, and if you still want to see the MachineInstr dump, you can run the dumped LLVM IR through llc. --- src/gallium/drivers/r600/r600_llvm.c |2 +- src/gallium/drivers/radeon/radeon_llvm_emit.c | 47 + src/gallium/drivers/radeon/radeon_llvm_emit.h |6 +++- src/gallium/drivers/radeonsi/si_pipe.c| 17 + src/gallium/drivers/radeonsi/si_pipe.h|3 ++ src/gallium/drivers/radeonsi/si_shader.c |2 +- 6 files changed, 51 insertions(+), 26 deletions(-) diff --git a/src/gallium/drivers/r600/r600_llvm.c b/src/gallium/drivers/r600/r600_llvm.c index a928fb8..af46044 100644 --- a/src/gallium/drivers/r600/r600_llvm.c +++ b/src/gallium/drivers/r600/r600_llvm.c @@ -881,7 +881,7 @@ unsigned r600_llvm_compile( const char * gpu_family = r600_get_llvm_processor_name(family); memset(&binary, 0, sizeof(struct radeon_shader_binary)); - r = radeon_llvm_compile(mod, &binary, gpu_family, dump); + r = radeon_llvm_compile(mod, &binary, gpu_family, dump, NULL); r = r600_create_shader(bc, &binary, use_kill); diff --git a/src/gallium/drivers/radeon/radeon_llvm_emit.c b/src/gallium/drivers/radeon/radeon_llvm_emit.c index dc871d7..4f288e4 100644 --- a/src/gallium/drivers/radeon/radeon_llvm_emit.c +++ b/src/gallium/drivers/radeon/radeon_llvm_emit.c @@ -98,9 +98,10 @@ static void init_r600_target() } } -static LLVMTargetRef get_r600_target() +LLVMTargetRef radeon_llvm_get_r600_target() { LLVMTargetRef target = NULL; + init_r600_target(); for (target = LLVMGetFirstTarget(); target; target = LLVMGetNextTarget(target)) { @@ -138,14 +139,13 @@ 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, unsigned dump, LLVMTargetMachineRef tm) { - LLVMTargetRef target; - LLVMTargetMachineRef tm; 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; @@ -154,22 +154,23 @@ unsigned radeon_llvm_compile(LLVMModuleRef M, struct radeon_shader_binary *binar char triple[TRIPLE_STRING_LEN]; LLVMBool mem_err; - /* initialise */ - init_r600_target(); - - target = get_r600_target(); - if (!target) { - return 1; - } - - strncpy(cpu, gpu_family, CPU_STRING_LEN); - memset(fs, 0, sizeof(fs)); - if (dump) { - LLVMDumpModule(M); - strncpy(fs, "+DumpCode", FS_STRING_LEN); + if (!tm) { + LLVMTargetRef target = radeon_llvm_get_r600_target(); + if (!target) { + return 1; + } + strncpy(cpu, gpu_family, CPU_STRING_LEN); + memset(fs, 0, sizeof(fs)); + if (dump) { + LLVMDumpModule(M); + strncpy(fs, "+DumpCode", FS_STRING_LEN); + } + strncpy(triple, "r600--", TRIPLE_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); @@ -179,9 +180,6 @@ unsigned radeon_llvm_compile(LLVMModuleRef M, struct radeon_shader_binary *binar rval = 0; /* Compile IR*/ - tm = LLVMCreateTargetMachine(target, triple, cpu, fs, - LLVMCodeGenLevelDefault, LLVMRelocDefault, - LLVMCodeModelDefault); mem_err = LLVMTargetMachineEmitToMemoryBuffer(tm, M, LLVMObjectFile, &err, &out_buffer); @@ -205,6 +203,9 @@ unsigned radeon_l
Mesa (master): radeon/llvm: Use amdgcn triple for SI+ on LLVM >= 3.6
Module: Mesa Branch: master Commit: a8ef880a1b38cbcfc26e9f829338739d16cece99 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=a8ef880a1b38cbcfc26e9f829338739d16cece99 Author: Tom Stellard Date: Tue Dec 23 10:26:23 2014 -0500 radeon/llvm: Use amdgcn triple for SI+ on LLVM >= 3.6 --- src/gallium/drivers/radeon/r600_pipe_common.c | 11 +-- src/gallium/drivers/radeon/radeon_llvm_emit.c | 21 ++--- src/gallium/drivers/radeon/radeon_llvm_emit.h |2 +- src/gallium/drivers/radeonsi/si_pipe.c|9 +++-- 4 files changed, 27 insertions(+), 16 deletions(-) diff --git a/src/gallium/drivers/radeon/r600_pipe_common.c b/src/gallium/drivers/radeon/r600_pipe_common.c index d4133d8..d46b3b3 100644 --- a/src/gallium/drivers/radeon/r600_pipe_common.c +++ b/src/gallium/drivers/radeon/r600_pipe_common.c @@ -499,6 +499,12 @@ static int r600_get_compute_param(struct pipe_screen *screen, switch (param) { case PIPE_COMPUTE_CAP_IR_TARGET: { const char *gpu; + const char *triple; + if (rscreen->family <= CHIP_ARUBA || HAVE_LLVM < 0x0306) { + triple = "r600--"; + } else { + triple = "amdgcn--"; + } switch(rscreen->family) { /* Clang < 3.6 is missing Hainan in its list of * GPUs, so we need to use the name of a similar GPU. @@ -513,9 +519,10 @@ static int r600_get_compute_param(struct pipe_screen *screen, break; } if (ret) { - sprintf(ret, "%s-r600--", gpu); + sprintf(ret, "%s-%s", gpu, triple); + } - return (8 + strlen(gpu)) * sizeof(char); + return (strlen(triple) + strlen(gpu)) * sizeof(char); } case PIPE_COMPUTE_CAP_GRID_DIMENSION: if (ret) { diff --git a/src/gallium/drivers/radeon/radeon_llvm_emit.c b/src/gallium/drivers/radeon/radeon_llvm_emit.c index 4f288e4..b98afb2 100644 --- a/src/gallium/drivers/radeon/radeon_llvm_emit.c +++ b/src/gallium/drivers/radeon/radeon_llvm_emit.c @@ -98,20 +98,19 @@ static void init_r600_target() } } -LLVMTargetRef radeon_llvm_get_r600_target() +LLVMTargetRef radeon_llvm_get_r600_target(const char *triple) { LLVMTargetRef target = NULL; + char *err_message = NULL; + init_r600_target(); - for (target = LLVMGetFirstTarget(); target; - target = LLVMGetNextTarget(target)) { - if (!strncmp(LLVMGetTargetName(target), "r600", 4)) { - break; + if (LLVMGetTargetFromTriple(triple, &target, &err_message)) { + fprintf(stderr, "Cannot find target for triple %s ", triple); + if (err_message) { + fprintf(stderr, "%s\n", err_message); } - } - - if (!target) { - fprintf(stderr, "Can't find target r600\n"); + LLVMDisposeMessage(err_message); return NULL; } return target; @@ -155,7 +154,8 @@ unsigned radeon_llvm_compile(LLVMModuleRef M, struct radeon_shader_binary *binar LLVMBool mem_err; if (!tm) { - LLVMTargetRef target = radeon_llvm_get_r600_target(); + strncpy(triple, "r600--", TRIPLE_STRING_LEN); + LLVMTargetRef target = radeon_llvm_get_r600_target(triple); if (!target) { return 1; } @@ -165,7 +165,6 @@ unsigned radeon_llvm_compile(LLVMModuleRef M, struct radeon_shader_binary *binar LLVMDumpModule(M); strncpy(fs, "+DumpCode", FS_STRING_LEN); } - strncpy(triple, "r600--", TRIPLE_STRING_LEN); tm = LLVMCreateTargetMachine(target, triple, cpu, fs, LLVMCodeGenLevelDefault, LLVMRelocDefault, LLVMCodeModelDefault); diff --git a/src/gallium/drivers/radeon/radeon_llvm_emit.h b/src/gallium/drivers/radeon/radeon_llvm_emit.h index 66217b5..3ccef78 100644 --- a/src/gallium/drivers/radeon/radeon_llvm_emit.h +++ b/src/gallium/drivers/radeon/radeon_llvm_emit.h @@ -34,7 +34,7 @@ struct radeon_shader_binary; void radeon_llvm_shader_type(LLVMValueRef F, unsigned type); -LLVMTargetRef radeon_llvm_get_r600_target(void); +LLVMTargetRef radeon_llvm_get_r600_target(const char *triple); unsigned radeon_llvm_compile( LLVMModuleRef M, diff --git a/src/gallium/drivers/radeonsi/si_pipe.c b/src/gallium/drivers/radeonsi/si_pipe.c index 4b71561..02c02ab 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.c +++ b/src/ga
Mesa (master): radeonsi/compute: Clamp COMPUTE_TMPRING_SIZE.WAVES to: num_cu * 32
Module: Mesa Branch: master Commit: c16436149c1ca78f86ba992977fe6083b732bc1d URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=c16436149c1ca78f86ba992977fe6083b732bc1d Author: Tom Stellard Date: Fri Dec 5 23:59:11 2014 + radeonsi/compute: Clamp COMPUTE_TMPRING_SIZE.WAVES to: num_cu * 32 This is the maximum value allowed for this field. --- src/gallium/drivers/radeonsi/si_compute.c |3 +++ 1 file changed, 3 insertions(+) diff --git a/src/gallium/drivers/radeonsi/si_compute.c b/src/gallium/drivers/radeonsi/si_compute.c index 6ddb478..bf935dc 100644 --- a/src/gallium/drivers/radeonsi/si_compute.c +++ b/src/gallium/drivers/radeonsi/si_compute.c @@ -371,6 +371,9 @@ static void si_launch_grid( | S_00B85C_SH1_CU_EN(0x /* Default value */)) ; + num_waves_for_scratch = + MIN2(num_waves_for_scratch, +32 * sctx->screen->b.info.max_compute_units); si_pm4_set_reg(pm4, R_00B860_COMPUTE_TMPRING_SIZE, /* The maximum value for WAVES is 32 * num CU. * If you program this value incorrectly, the GPU will hang if ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): winsys/radeon: Always report at least 1 compute unit
Module: Mesa Branch: master Commit: 0e1c085f17fdd774ff6b060dd03422e74ea3e2cc URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=0e1c085f17fdd774ff6b060dd03422e74ea3e2cc Author: Tom Stellard Date: Fri Dec 5 23:59:10 2014 + winsys/radeon: Always report at least 1 compute unit All uses of this require that the value be at least one, so it's easier to report at least one than having to wrap all uses in MAX2(max_compute_units, 1). Reviewed-by: Marek Olšák --- src/gallium/drivers/radeon/r600_pipe_common.c |2 +- src/gallium/winsys/radeon/drm/radeon_drm_winsys.c |2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/gallium/drivers/radeon/r600_pipe_common.c b/src/gallium/drivers/radeon/r600_pipe_common.c index 8aad178..cb17e54 100644 --- a/src/gallium/drivers/radeon/r600_pipe_common.c +++ b/src/gallium/drivers/radeon/r600_pipe_common.c @@ -607,7 +607,7 @@ static int r600_get_compute_param(struct pipe_screen *screen, case PIPE_COMPUTE_CAP_MAX_COMPUTE_UNITS: if (ret) { uint32_t *max_compute_units = ret; - *max_compute_units = MAX2(rscreen->info.max_compute_units, 1); + *max_compute_units = rscreen->info.max_compute_units; } return sizeof(uint32_t); diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c b/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c index 3974034..75fc80f 100644 --- a/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c +++ b/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c @@ -387,6 +387,8 @@ static boolean do_winsys_init(struct radeon_drm_winsys *ws) radeon_get_drm_value(ws->fd, RADEON_INFO_MAX_PIPES, NULL, &ws->info.r600_max_pipes); +/* All GPUs have at least one compute unit */ +ws->info.max_compute_units = 1; radeon_get_drm_value(ws->fd, RADEON_INFO_ACTIVE_CU_COUNT, NULL, &ws->info.max_compute_units); ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): radeonsi: Program RASTER_CONFIG for harvested GPUs v5
Module: Mesa Branch: master Commit: 67dcbcd92cb9877a04747d6cf7fef14c2b8af8b3 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=67dcbcd92cb9877a04747d6cf7fef14c2b8af8b3 Author: Tom Stellard Date: Tue Sep 9 15:18:57 2014 -0400 radeonsi: Program RASTER_CONFIG for harvested GPUs v5 Harvested GPUs have some of their render backends disabled, so in order to prevent the hardware from trying to render things with these disabled backends we need to correctly program the PA_SC_RASTER_CONFIG register. v2: - Write RASTER_CONFIG for all SEs. v3: - Set GRBM_GFX_INDEX.INSTANCE_BROADCAST_WRITES bit. - Set GRBM_GFX_INFEX.SH_BROADCAST_WRITES bit when done setting PA_SC_RASTER_CONFIG. - Get num_se and num_sh_per_se from kernel. v4: - Get correct value for num_se - Remove loop for setting PA_SC_RASTER_CONFIG - Only compute raster config when a backend has been disabled. v5: Michel Dänzer - Fix computation for chips with multiple SEs https://bugs.freedesktop.org/show_bug.cgi?id=60879 CC: "10.4 10.3" --- src/gallium/drivers/radeonsi/si_state.c | 128 - src/gallium/drivers/radeonsi/sid.h|8 +- src/gallium/winsys/radeon/drm/radeon_drm_winsys.c |3 + src/gallium/winsys/radeon/drm/radeon_winsys.h |1 + 4 files changed, 134 insertions(+), 6 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c index ea8e61a..f24c28e 100644 --- a/src/gallium/drivers/radeonsi/si_state.c +++ b/src/gallium/drivers/radeonsi/si_state.c @@ -3081,6 +3081,110 @@ void si_init_state_functions(struct si_context *sctx) sctx->b.b.draw_vbo = si_draw_vbo; } +static void +si_write_harvested_raster_configs(struct si_context *sctx, + struct si_pm4_state *pm4, + unsigned raster_config) +{ + unsigned sh_per_se = MAX2(sctx->screen->b.info.max_sh_per_se, 1); + unsigned num_se = MAX2(sctx->screen->b.info.max_se, 1); + unsigned rb_mask = sctx->screen->b.info.si_backend_enabled_mask; + unsigned num_rb = sctx->screen->b.info.r600_num_backends; + unsigned rb_per_pkr = num_rb / num_se / sh_per_se; + unsigned rb_per_se = num_rb / num_se; + unsigned se0_mask = (1 << rb_per_se) - 1; + unsigned se1_mask = se0_mask << rb_per_se; + unsigned se; + + assert(num_se == 1 || num_se == 2); + assert(sh_per_se == 1 || sh_per_se == 2); + assert(rb_per_pkr == 1 || rb_per_pkr == 2); + + /* XXX: I can't figure out what the *_XSEL and *_YSEL +* fields are for, so I'm leaving them as their default +* values. */ + + se0_mask &= rb_mask; + se1_mask &= rb_mask; + if (num_se == 2 && (!se0_mask || !se1_mask)) { + raster_config &= C_028350_SE_MAP; + + if (!se0_mask) { + raster_config |= + S_028350_SE_MAP(V_028350_RASTER_CONFIG_SE_MAP_3); + } else { + raster_config |= + S_028350_SE_MAP(V_028350_RASTER_CONFIG_SE_MAP_0); + } + } + + for (se = 0; se < num_se; se++) { + unsigned raster_config_se = raster_config; + unsigned pkr0_mask = ((1 << rb_per_pkr) - 1) << (se * rb_per_se); + unsigned pkr1_mask = pkr0_mask << rb_per_pkr; + + pkr0_mask &= rb_mask; + pkr1_mask &= rb_mask; + if (sh_per_se == 2 && (!pkr0_mask || !pkr1_mask)) { + raster_config_se &= C_028350_PKR_MAP; + + if (!pkr0_mask) { + raster_config_se |= + S_028350_PKR_MAP(V_028350_RASTER_CONFIG_PKR_MAP_3); + } else { + raster_config_se |= + S_028350_PKR_MAP(V_028350_RASTER_CONFIG_PKR_MAP_0); + } + } + + if (rb_per_pkr == 2) { + unsigned rb0_mask = 1 << (se * rb_per_se); + unsigned rb1_mask = rb0_mask << 1; + + rb0_mask &= rb_mask; + rb1_mask &= rb_mask; + if (!rb0_mask || !rb1_mask) { + raster_config_se &= C_028350_RB_MAP_PKR0; + + if (!rb0_mask) { + raster_config_se |= + S_028350_RB_MAP_PKR0(V_028350_RASTER_CONFIG_RB_MAP_3); + } else { + raster_config_se |= + S_028350_RB_MAP
Mesa (master): r600, llvm: Don't leak global symbol offsets
Module: Mesa Branch: master Commit: 02cc9e9f9e48795371298dcf25a9de6215138880 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=02cc9e9f9e48795371298dcf25a9de6215138880 Author: Jan Vesely Date: Tue Dec 2 14:47:53 2014 -0500 r600, llvm: Don't leak global symbol offsets Signed-off-by: Jan Vesely Reviewed-by: Tom Stellard --- src/gallium/drivers/r600/r600_llvm.c |1 + 1 file changed, 1 insertion(+) diff --git a/src/gallium/drivers/r600/r600_llvm.c b/src/gallium/drivers/r600/r600_llvm.c index 3a3ee3a..a928fb8 100644 --- a/src/gallium/drivers/r600/r600_llvm.c +++ b/src/gallium/drivers/r600/r600_llvm.c @@ -888,6 +888,7 @@ unsigned r600_llvm_compile( FREE(binary.code); FREE(binary.config); FREE(binary.rodata); + FREE(binary.global_symbol_offsets); return r; } ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): r600, llvm: Fix mem leak
Module: Mesa Branch: master Commit: ca0616f17e2ed16d44a7105c02f761ec353a39cb URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=ca0616f17e2ed16d44a7105c02f761ec353a39cb Author: Jan Vesely Date: Mon Nov 3 20:29:36 2014 -0500 r600, llvm: Fix mem leak Signed-off-by: Jan Vesely Reviewed-by: Tom Stellard --- src/gallium/drivers/r600/r600_llvm.c |1 + 1 file changed, 1 insertion(+) diff --git a/src/gallium/drivers/r600/r600_llvm.c b/src/gallium/drivers/r600/r600_llvm.c index e8cae00..3a3ee3a 100644 --- a/src/gallium/drivers/r600/r600_llvm.c +++ b/src/gallium/drivers/r600/r600_llvm.c @@ -887,6 +887,7 @@ unsigned r600_llvm_compile( FREE(binary.code); FREE(binary.config); + FREE(binary.rodata); return r; } ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): clover: clCompileProgram CL_INVALID_COMPILER_OPTIONS
Module: Mesa Branch: master Commit: 745b1f550339b3adbf272a28b9d0c767a86ff2fb URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=745b1f550339b3adbf272a28b9d0c767a86ff2fb Author: EdB Date: Fri Nov 7 10:30:40 2014 +0100 clover: clCompileProgram CL_INVALID_COMPILER_OPTIONS clCompileProgram should return CL_INVALID_COMPILER_OPTIONS instead of CL_INVALID_BUILD_OPTIONS Reviewed-by: Francisco Jerez --- src/gallium/state_trackers/clover/api/program.cpp |2 ++ src/gallium/state_trackers/clover/llvm/invocation.cpp |2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/gallium/state_trackers/clover/api/program.cpp b/src/gallium/state_trackers/clover/api/program.cpp index 3a6c054..60184ed 100644 --- a/src/gallium/state_trackers/clover/api/program.cpp +++ b/src/gallium/state_trackers/clover/api/program.cpp @@ -182,6 +182,8 @@ clBuildProgram(cl_program d_prog, cl_uint num_devs, prog.build(devs, opts); return CL_SUCCESS; } catch (error &e) { + if (e.get() == CL_INVALID_COMPILER_OPTIONS) + return CL_INVALID_BUILD_OPTIONS; if (e.get() == CL_COMPILE_PROGRAM_FAILURE) return CL_BUILD_PROGRAM_FAILURE; return e.get(); diff --git a/src/gallium/state_trackers/clover/llvm/invocation.cpp b/src/gallium/state_trackers/clover/llvm/invocation.cpp index e953822..cda447d 100644 --- a/src/gallium/state_trackers/clover/llvm/invocation.cpp +++ b/src/gallium/state_trackers/clover/llvm/invocation.cpp @@ -177,7 +177,7 @@ namespace { opts_carray.data() + opts_carray.size(), Diags); if (!Success) { - throw error(CL_INVALID_BUILD_OPTIONS); + throw error(CL_INVALID_COMPILER_OPTIONS); } c.getFrontendOpts().ProgramAction = clang::frontend::EmitLLVMOnly; c.getHeaderSearchOpts().UseBuiltinIncludes = true; ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): Revert "clover: Fix build after llvm r221375"
Module: Mesa Branch: master Commit: 0cae7ea2719a939cf91de03a1bfeeeca08ec98a4 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=0cae7ea2719a939cf91de03a1bfeeeca08ec98a4 Author: Tom Stellard Date: Wed Nov 12 12:28:34 2014 -0500 Revert "clover: Fix build after llvm r221375" This reverts commit cd93d82ba9ec8cd8e4f54bbee16d7b47c542de71. llvm r221375 was reverted, so this commit needs to be too. --- src/gallium/state_trackers/clover/llvm/invocation.cpp |4 1 file changed, 4 deletions(-) diff --git a/src/gallium/state_trackers/clover/llvm/invocation.cpp b/src/gallium/state_trackers/clover/llvm/invocation.cpp index 3a4fcf0..e953822 100644 --- a/src/gallium/state_trackers/clover/llvm/invocation.cpp +++ b/src/gallium/state_trackers/clover/llvm/invocation.cpp @@ -282,11 +282,7 @@ namespace { for (unsigned i = 0; i < kernel_node->getNumOperands(); ++i) { kernels.push_back(llvm::dyn_cast( -#if HAVE_LLVM >= 0x0306 - kernel_node->getOperandAsMDNode(i)->getOperand(0))); -#else kernel_node->getOperand(i)->getOperand(0))); -#endif } } ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): clover: Fix build after llvm r221375
Module: Mesa Branch: master Commit: cd93d82ba9ec8cd8e4f54bbee16d7b47c542de71 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=cd93d82ba9ec8cd8e4f54bbee16d7b47c542de71 Author: Jan Vesely Date: Thu Nov 6 11:46:41 2014 -0500 clover: Fix build after llvm r221375 Reviewed-by: Tom Stellard Signed-off-by: Jan Vesely --- src/gallium/state_trackers/clover/llvm/invocation.cpp |4 1 file changed, 4 insertions(+) diff --git a/src/gallium/state_trackers/clover/llvm/invocation.cpp b/src/gallium/state_trackers/clover/llvm/invocation.cpp index e953822..3a4fcf0 100644 --- a/src/gallium/state_trackers/clover/llvm/invocation.cpp +++ b/src/gallium/state_trackers/clover/llvm/invocation.cpp @@ -282,7 +282,11 @@ namespace { for (unsigned i = 0; i < kernel_node->getNumOperands(); ++i) { kernels.push_back(llvm::dyn_cast( +#if HAVE_LLVM >= 0x0306 + kernel_node->getOperandAsMDNode(i)->getOperand(0))); +#else kernel_node->getOperand(i)->getOperand(0))); +#endif } } ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): clover: Fix clBuildProgram piglit regression
Module: Mesa Branch: master Commit: 263eb7fa39a16bcce7d64a4b8343c6adbc3e916c URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=263eb7fa39a16bcce7d64a4b8343c6adbc3e916c Author: Tom Stellard Date: Mon Nov 3 09:14:01 2014 -0500 clover: Fix clBuildProgram piglit regression Should trigger CL_INVALID_VALUE if device_list is NULL and num_devices is greater than zero. Introduced by e5468dfa523be2a7a0d04bb9efcf8ae780957563 Reported by: EdB Reviewed-by: Francisco Jerez --- src/gallium/state_trackers/clover/api/program.cpp |8 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/gallium/state_trackers/clover/api/program.cpp b/src/gallium/state_trackers/clover/api/program.cpp index 64c4a43..3a6c054 100644 --- a/src/gallium/state_trackers/clover/api/program.cpp +++ b/src/gallium/state_trackers/clover/api/program.cpp @@ -27,7 +27,7 @@ using namespace clover; namespace { void validate_build_program_common(const program &prog, cl_uint num_devs, - const ref_vector &devs, + const cl_device_id *d_devs, void (*pfn_notify)(cl_program, void *), void *user_data) { @@ -39,7 +39,7 @@ namespace { if (any_of([&](const device &dev) { return !count(dev, prog.context().devices()); -}, devs)) +}, objs(d_devs, num_devs))) throw error(CL_INVALID_DEVICE); } } @@ -177,7 +177,7 @@ clBuildProgram(cl_program d_prog, cl_uint num_devs, ref_vector(prog.context().devices())); auto opts = (p_opts ? p_opts : ""); - validate_build_program_common(prog, num_devs, devs, pfn_notify, user_data); + validate_build_program_common(prog, num_devs, d_devs, pfn_notify, user_data); prog.build(devs, opts); return CL_SUCCESS; @@ -200,7 +200,7 @@ clCompileProgram(cl_program d_prog, cl_uint num_devs, auto opts = (p_opts ? p_opts : ""); header_map headers; - validate_build_program_common(prog, num_devs, devs, pfn_notify, user_data); + validate_build_program_common(prog, num_devs, d_devs, pfn_notify, user_data); if (bool(num_headers) != bool(header_names)) throw error(CL_INVALID_VALUE); ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): r600g: Fix build with opencl and radeonsi disabled
Module: Mesa Branch: master Commit: b9e41b587fb15458c9b0c21b10d421d882083e27 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=b9e41b587fb15458c9b0c21b10d421d882083e27 Author: Tom Stellard Date: Fri Oct 31 16:26:52 2014 -0400 r600g: Fix build with opencl and radeonsi disabled --- src/gallium/drivers/r600/evergreen_compute.c | 12 ++-- 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/gallium/drivers/r600/evergreen_compute.c b/src/gallium/drivers/r600/evergreen_compute.c index 7a17d1e..90fdd79 100644 --- a/src/gallium/drivers/r600/evergreen_compute.c +++ b/src/gallium/drivers/r600/evergreen_compute.c @@ -47,9 +47,9 @@ #include "compute_memory_pool.h" #include "sb/sb_public.h" #ifdef HAVE_OPENCL -#include "radeon_llvm_util.h" +#include "radeon/radeon_llvm_util.h" #endif -#include "radeon_elf_util.h" +#include "radeon/radeon_elf_util.h" #include /** @@ -199,6 +199,7 @@ void *evergreen_create_compute_state( { struct r600_context *ctx = (struct r600_context *)ctx_; struct r600_pipe_compute *shader = CALLOC_STRUCT(r600_pipe_compute); +#ifdef HAVE_OPENCL const struct pipe_llvm_program_header * header; const char *code; void *p; @@ -208,7 +209,6 @@ void *evergreen_create_compute_state( header = cso->prog; code = cso->prog + sizeof(struct pipe_llvm_program_header); #if HAVE_LLVM < 0x0306 -#ifdef HAVE_OPENCL (void)use_kill; (void)p; shader->llvm_ctx = LLVMContextCreate(); @@ -224,7 +224,6 @@ void *evergreen_create_compute_state( shader->llvm_ctx, i, code, header->num_bytes); } } -#endif #else memset(&shader->binary, 0, sizeof(shader->binary)); radeon_elf_read(code, header->num_bytes, &shader->binary, true); @@ -236,6 +235,7 @@ void *evergreen_create_compute_state( memcpy(p, shader->bc.bytecode, shader->bc.ndw * 4); ctx->b.ws->buffer_unmap(shader->code_bo->cs_buf); #endif +#endif shader->ctx = (struct r600_context*)ctx; shader->local_size = cso->req_local_mem; @@ -569,11 +569,11 @@ static void evergreen_launch_grid( uint32_t pc, const void *input) { struct r600_context *ctx = (struct r600_context *)ctx_; +#ifdef HAVE_OPENCL struct r600_pipe_compute *shader = ctx->cs_shader_state.shader; boolean use_kill; #if HAVE_LLVM < 0x0306 -#ifdef HAVE_OPENCL struct r600_kernel *kernel = &shader->kernels[pc]; (void)use_kill; if (!kernel->code_bo) { @@ -605,7 +605,6 @@ static void evergreen_launch_grid( memcpy(p, kernel->bc.bytecode, kernel->bc.ndw * 4); ctx->b.ws->buffer_unmap(kernel->code_bo->cs_buf); } -#endif shader->active_kernel = kernel; ctx->cs_shader_state.kernel_index = pc; #else @@ -613,6 +612,7 @@ static void evergreen_launch_grid( /* Get the config information for this kernel. */ r600_shader_binary_read_config(&shader->binary, &shader->bc, pc, &use_kill); #endif +#endif COMPUTE_DBG(ctx->screen, "*** evergreen_launch_grid: pc = %u\n", pc); ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): clover: Factor input validation of clCompileProgram into a new function v2
Module: Mesa Branch: master Commit: e5468dfa523be2a7a0d04bb9efcf8ae780957563 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=e5468dfa523be2a7a0d04bb9efcf8ae780957563 Author: Tom Stellard Date: Tue Oct 21 10:31:56 2014 -0400 clover: Factor input validation of clCompileProgram into a new function v2 This factors out the validation that is common with clBuildProgram(). v2: - Code cleanups. Reviewed-by: Francisco Jerez --- src/gallium/state_trackers/clover/api/program.cpp | 33 ++--- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/src/gallium/state_trackers/clover/api/program.cpp b/src/gallium/state_trackers/clover/api/program.cpp index a8a6291..e32312e 100644 --- a/src/gallium/state_trackers/clover/api/program.cpp +++ b/src/gallium/state_trackers/clover/api/program.cpp @@ -25,6 +25,25 @@ using namespace clover; +namespace { + void validate_build_program_common(const program &prog, cl_uint num_devs, + const ref_vector &devs, + void (*pfn_notify)(cl_program, void *), + void *user_data) { + + if ((!pfn_notify && user_data)) + throw error(CL_INVALID_VALUE); + + if (prog.kernel_ref_count()) + throw error(CL_INVALID_OPERATION); + + if (any_of([&](const device &dev) { + return !count(dev, prog.context().devices()); +}, devs)) + throw error(CL_INVALID_DEVICE); + } +} + CLOVER_API cl_program clCreateProgramWithSource(cl_context d_ctx, cl_uint count, const char **strings, const size_t *lengths, @@ -173,18 +192,12 @@ clCompileProgram(cl_program d_prog, cl_uint num_devs, auto opts = (p_opts ? p_opts : ""); header_map headers; - if (bool(num_devs) != bool(d_devs) || - (!pfn_notify && user_data) || - bool(num_headers) != bool(header_names)) - throw error(CL_INVALID_VALUE); + validate_build_program_common(prog, num_devs, devs, pfn_notify, user_data); - if (any_of([&](const device &dev) { -return !count(dev, prog.context().devices()); - }, devs)) - throw error(CL_INVALID_DEVICE); + if (bool(num_headers) != bool(header_names)) + throw error(CL_INVALID_VALUE); - if (prog.kernel_ref_count() || - !prog.has_source) + if (!prog.has_source) throw error(CL_INVALID_OPERATION); ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): gallium/radeon: Add query for symbol specific config information
Module: Mesa Branch: master Commit: e91735a641b71bc2bccabd0c779a626fa412b314 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=e91735a641b71bc2bccabd0c779a626fa412b314 Author: Tom Stellard Date: Mon Sep 29 09:36:42 2014 -0700 gallium/radeon: Add query for symbol specific config information This adds a query which allows drivers to access the config information of a specific function within the LLVM generated ELF binary. This makes it possible for the driver to handle ELF binaries with multiple kernels / global functions. --- src/gallium/drivers/radeon/r600_pipe_common.h |8 +++ src/gallium/drivers/radeon/radeon_elf_util.c | 68 + src/gallium/drivers/radeon/radeon_elf_util.h | 10 3 files changed, 86 insertions(+) diff --git a/src/gallium/drivers/radeon/r600_pipe_common.h b/src/gallium/drivers/radeon/r600_pipe_common.h index dfd8fff..a699f45 100644 --- a/src/gallium/drivers/radeon/r600_pipe_common.h +++ b/src/gallium/drivers/radeon/r600_pipe_common.h @@ -120,11 +120,19 @@ struct radeon_shader_binary { unsigned char *config; unsigned config_size; + /** The number of bytes of config information for each global symbol. +*/ + unsigned config_size_per_symbol; + /** Constant data accessed by the shader. This will be uploaded * into a constant buffer. */ unsigned char *rodata; unsigned rodata_size; + /** List of symbol offsets for the shader */ + uint64_t *global_symbol_offsets; + unsigned global_symbol_count; + /** Set to 1 if the disassembly for this binary has been dumped to * stderr. */ int disassembled; diff --git a/src/gallium/drivers/radeon/radeon_elf_util.c b/src/gallium/drivers/radeon/radeon_elf_util.c index 7c5f93e..ec39a89 100644 --- a/src/gallium/drivers/radeon/radeon_elf_util.c +++ b/src/gallium/drivers/radeon/radeon_elf_util.c @@ -33,6 +33,48 @@ #include #include +static void parse_symbol_table(Elf_Data *symbol_table_data, + const GElf_Shdr *symbol_table_header, + struct radeon_shader_binary *binary) +{ + GElf_Sym symbol; + unsigned i = 0; + unsigned symbol_count = + symbol_table_header->sh_size / symbol_table_header->sh_entsize; + + /* We are over allocating this list, because symbol_count gives the +* total number of symbols, and we will only be filling the list +* with offsets of global symbols. The memory savings from +* allocating the correct size of this list will be small, and +* I don't think it is worth the cost of pre-computing the number +* of global symbols. +*/ + binary->global_symbol_offsets = CALLOC(symbol_count, sizeof(uint64_t)); + + while (gelf_getsym(symbol_table_data, i++, &symbol)) { + unsigned i; + if (GELF_ST_BIND(symbol.st_info) != STB_GLOBAL) { + continue; + } + + binary->global_symbol_offsets[binary->global_symbol_count] = + symbol.st_value; + + /* Sort the list using bubble sort. This list will usually +* be small. */ + for (i = binary->global_symbol_count; i > 0; --i) { + uint64_t lhs = binary->global_symbol_offsets[i - 1]; + uint64_t rhs = binary->global_symbol_offsets[i]; + if (lhs < rhs) { + break; + } + binary->global_symbol_offsets[i] = lhs; + binary->global_symbol_offsets[i - 1] = rhs; + } + ++binary->global_symbol_count; + } +} + void radeon_elf_read(const char *elf_data, unsigned elf_size, struct radeon_shader_binary *binary, unsigned debug) @@ -85,6 +127,9 @@ void radeon_elf_read(const char *elf_data, unsigned elf_size, binary->rodata_size = section_data->d_size; binary->rodata = MALLOC(binary->rodata_size * sizeof(unsigned char)); memcpy(binary->rodata, section_data->d_buf, binary->rodata_size); + } else if (!strncmp(name, ".symtab", 7)) { + section_data = elf_getdata(section, section_data); + parse_symbol_table(section_data, §ion_header, binary); } } @@ -92,4 +137,27 @@ void radeon_elf_read(const char *elf_data, unsigned elf_size, elf_end(elf); } FREE(elf_buffer); + + /* Cache the config size per symbol */ + if (binary->global_symbol_count) { + binary->config_size_per_symbol = +
Mesa (master): radeonsi/compute: Enable PIPE_SHADER_IR_NATIVE for compute shaders v2
Module: Mesa Branch: master Commit: 1f4e48d5b53e73605832971f3fb06cb3402f97a5 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=1f4e48d5b53e73605832971f3fb06cb3402f97a5 Author: Tom Stellard Date: Thu Sep 25 18:11:24 2014 -0700 radeonsi/compute: Enable PIPE_SHADER_IR_NATIVE for compute shaders v2 v2: - Drop dependency on LLVM >= 3.5.1 - Rename si_create_shader() to si_shader_binary_read() --- src/gallium/drivers/radeonsi/si_compute.c | 71 ++-- src/gallium/drivers/radeonsi/si_pipe.c|4 ++ src/gallium/drivers/radeonsi/si_shader.c | 104 ++--- src/gallium/drivers/radeonsi/si_shader.h |7 ++ 4 files changed, 127 insertions(+), 59 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_compute.c b/src/gallium/drivers/radeonsi/si_compute.c index be64418..6ddb478 100644 --- a/src/gallium/drivers/radeonsi/si_compute.c +++ b/src/gallium/drivers/radeonsi/si_compute.c @@ -23,14 +23,15 @@ */ #include "util/u_memory.h" +#include "radeon/r600_pipe_common.h" +#include "radeon/radeon_elf_util.h" +#include "radeon/radeon_llvm_util.h" #include "radeon/r600_cs.h" #include "si_pipe.h" #include "si_shader.h" #include "sid.h" -#include "radeon/radeon_llvm_util.h" - #define MAX_GLOBAL_BUFFERS 20 #if HAVE_LLVM < 0x0305 #define NUM_USER_SGPRS 2 @@ -44,14 +45,18 @@ struct si_compute { unsigned local_size; unsigned private_size; unsigned input_size; - unsigned num_kernels; - struct si_shader *kernels; + struct radeon_shader_binary binary; + struct si_shader program; unsigned num_user_sgprs; struct r600_resource *input_buffer; struct pipe_resource *global_buffers[MAX_GLOBAL_BUFFERS]; +#if HAVE_LLVM < 0x0306 + unsigned num_kernels; + struct si_shader *kernels; LLVMContextRef llvm_ctx; +#endif }; static void *si_create_compute_state( @@ -61,10 +66,7 @@ static void *si_create_compute_state( struct si_context *sctx = (struct si_context *)ctx; struct si_compute *program = CALLOC_STRUCT(si_compute); const struct pipe_llvm_program_header *header; - const unsigned char *code; - unsigned i; - - program->llvm_ctx = LLVMContextCreate(); + const char *code; header = cso->prog; code = cso->prog + sizeof(struct pipe_llvm_program_header); @@ -74,17 +76,27 @@ static void *si_create_compute_state( program->private_size = cso->req_private_mem; program->input_size = cso->req_input_mem; - program->num_kernels = radeon_llvm_get_num_kernels(program->llvm_ctx, code, - header->num_bytes); - program->kernels = CALLOC(sizeof(struct si_shader), - program->num_kernels); - for (i = 0; i < program->num_kernels; i++) { - LLVMModuleRef mod = radeon_llvm_get_kernel_module(program->llvm_ctx, i, - code, header->num_bytes); - si_compile_llvm(sctx->screen, &program->kernels[i], mod); - LLVMDisposeModule(mod); +#if HAVE_LLVM < 0x0306 + { + unsigned i; + program->llvm_ctx = LLVMContextCreate(); + program->num_kernels = radeon_llvm_get_num_kernels(program->llvm_ctx, + code, header->num_bytes); + program->kernels = CALLOC(sizeof(struct si_shader), +program->num_kernels); + for (i = 0; i < program->num_kernels; i++) { + LLVMModuleRef mod = radeon_llvm_get_kernel_module(program->llvm_ctx, i, +code, header->num_bytes); + si_compile_llvm(sctx->screen, &program->kernels[i], mod); + LLVMDisposeModule(mod); + } } +#else + radeon_elf_read(code, header->num_bytes, &program->binary, true); + si_shader_binary_read(sctx->screen, &program->program, &program->binary); + +#endif program->input_buffer = si_resource_create_custom(sctx->b.b.screen, PIPE_USAGE_IMMUTABLE, program->input_size); @@ -181,10 +193,15 @@ static void si_launch_grid( uint64_t shader_va; unsigned arg_user_sgpr_count = NUM_USER_SGPRS; unsigned i; - struct si_shader *shader = &program->kernels[pc]; + struct si_shader *shader = &program->program; unsigned lds_blocks; unsigned num_waves_for_scratch; +#if HAVE_LLVM < 0x0306 + shader = &program->kernels[pc];
Mesa (master): clover: Fix bug when binary programs are passed to clBuildProgram() v2
Module: Mesa Branch: master Commit: 64b0fac5e25370224b383c748f1a56b4ef1eb2d6 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=64b0fac5e25370224b383c748f1a56b4ef1eb2d6 Author: Tom Stellard Date: Tue Oct 21 10:33:21 2014 -0400 clover: Fix bug when binary programs are passed to clBuildProgram() v2 This was a regression introduced by 611d66fe4513e53bde052dd2bab95d448c909a2a Passing a binary program to clBuildProgram() is legal, but passing one to clCompileProgram() is not. v2: - Code cleanups. Reviewed-by: Francisco Jerez --- src/gallium/state_trackers/clover/api/program.cpp | 18 +- src/gallium/state_trackers/clover/core/program.hpp |2 +- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/gallium/state_trackers/clover/api/program.cpp b/src/gallium/state_trackers/clover/api/program.cpp index e32312e..64c4a43 100644 --- a/src/gallium/state_trackers/clover/api/program.cpp +++ b/src/gallium/state_trackers/clover/api/program.cpp @@ -171,12 +171,20 @@ CLOVER_API cl_int clBuildProgram(cl_program d_prog, cl_uint num_devs, const cl_device_id *d_devs, const char *p_opts, void (*pfn_notify)(cl_program, void *), - void *user_data) { - cl_int ret = clCompileProgram(d_prog, num_devs, d_devs, p_opts, - 0, NULL, NULL, pfn_notify, user_data); + void *user_data) try { + auto &prog = obj(d_prog); + auto devs = (d_devs ? objs(d_devs, num_devs) : +ref_vector(prog.context().devices())); + auto opts = (p_opts ? p_opts : ""); - return (ret == CL_COMPILE_PROGRAM_FAILURE ? - CL_BUILD_PROGRAM_FAILURE : ret); + validate_build_program_common(prog, num_devs, devs, pfn_notify, user_data); + + prog.build(devs, opts); + return CL_SUCCESS; +} catch (error &e) { + if (e.get() == CL_COMPILE_PROGRAM_FAILURE) + return CL_BUILD_PROGRAM_FAILURE; + return e.get(); } CLOVER_API cl_int diff --git a/src/gallium/state_trackers/clover/core/program.hpp b/src/gallium/state_trackers/clover/core/program.hpp index b5aae7e..661fa03 100644 --- a/src/gallium/state_trackers/clover/core/program.hpp +++ b/src/gallium/state_trackers/clover/core/program.hpp @@ -48,7 +48,7 @@ namespace clover { operator=(const program &prog) = delete; void build(const ref_vector &devs, const char *opts, - const header_map &headers); + const header_map &headers = {}); const bool has_source; const std::string &source() const; ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): r600g/compute: Enable PIPE_SHADER_IR_NATIVE for compute shaders v2
Module: Mesa Branch: master Commit: fa07f4b68a20e54e1766876203b11a8b90ff120f URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=fa07f4b68a20e54e1766876203b11a8b90ff120f Author: Tom Stellard Date: Thu Sep 25 18:10:44 2014 -0700 r600g/compute: Enable PIPE_SHADER_IR_NATIVE for compute shaders v2 v2: - Drop dependency on LLVM >= 3.5.1 --- src/gallium/drivers/r600/evergreen_compute.c | 167 .../drivers/r600/evergreen_compute_internal.h | 12 +- src/gallium/drivers/r600/r600_llvm.c | 71 ++--- src/gallium/drivers/r600/r600_llvm.h | 10 ++ src/gallium/drivers/r600/r600_pipe.c |4 + src/gallium/drivers/r600/r600_pipe.h |1 + src/gallium/drivers/radeon/radeon_llvm_util.c |6 +- src/gallium/drivers/radeon/radeon_llvm_util.h |6 +- 8 files changed, 180 insertions(+), 97 deletions(-) diff --git a/src/gallium/drivers/r600/evergreen_compute.c b/src/gallium/drivers/r600/evergreen_compute.c index 38b78c7..7a17d1e 100644 --- a/src/gallium/drivers/r600/evergreen_compute.c +++ b/src/gallium/drivers/r600/evergreen_compute.c @@ -49,6 +49,7 @@ #ifdef HAVE_OPENCL #include "radeon_llvm_util.h" #endif +#include "radeon_elf_util.h" #include /** @@ -198,18 +199,42 @@ void *evergreen_create_compute_state( { struct r600_context *ctx = (struct r600_context *)ctx_; struct r600_pipe_compute *shader = CALLOC_STRUCT(r600_pipe_compute); - -#ifdef HAVE_OPENCL const struct pipe_llvm_program_header * header; - const unsigned char * code; - unsigned i; - - shader->llvm_ctx = LLVMContextCreate(); + const char *code; + void *p; + boolean use_kill; COMPUTE_DBG(ctx->screen, "*** evergreen_create_compute_state\n"); - header = cso->prog; code = cso->prog + sizeof(struct pipe_llvm_program_header); +#if HAVE_LLVM < 0x0306 +#ifdef HAVE_OPENCL +(void)use_kill; + (void)p; + shader->llvm_ctx = LLVMContextCreate(); + shader->num_kernels = radeon_llvm_get_num_kernels(shader->llvm_ctx, + code, header->num_bytes); + shader->kernels = CALLOC(sizeof(struct r600_kernel), + shader->num_kernels); + { + unsigned i; + for (i = 0; i < shader->num_kernels; i++) { + struct r600_kernel *kernel = &shader->kernels[i]; + kernel->llvm_module = radeon_llvm_get_kernel_module( + shader->llvm_ctx, i, code, header->num_bytes); + } + } +#endif +#else + memset(&shader->binary, 0, sizeof(shader->binary)); + radeon_elf_read(code, header->num_bytes, &shader->binary, true); + r600_create_shader(&shader->bc, &shader->binary, &use_kill); + + shader->code_bo = r600_compute_buffer_alloc_vram(ctx->screen, + shader->bc.ndw * 4); + p = r600_buffer_map_sync_with_rings(&ctx->b, shader->code_bo, PIPE_TRANSFER_WRITE); + memcpy(p, shader->bc.bytecode, shader->bc.ndw * 4); + ctx->b.ws->buffer_unmap(shader->code_bo->cs_buf); #endif shader->ctx = (struct r600_context*)ctx; @@ -217,17 +242,6 @@ void *evergreen_create_compute_state( shader->private_size = cso->req_private_mem; shader->input_size = cso->req_input_mem; -#ifdef HAVE_OPENCL - shader->num_kernels = radeon_llvm_get_num_kernels(shader->llvm_ctx, code, - header->num_bytes); - shader->kernels = CALLOC(sizeof(struct r600_kernel), shader->num_kernels); - - for (i = 0; i < shader->num_kernels; i++) { - struct r600_kernel *kernel = &shader->kernels[i]; - kernel->llvm_module = radeon_llvm_get_kernel_module(shader->llvm_ctx, i, - code, header->num_bytes); - } -#endif return shader; } @@ -238,14 +252,6 @@ void evergreen_delete_compute_state(struct pipe_context *ctx, void* state) if (!shader) return; - FREE(shader->kernels); - -#ifdef HAVE_OPENCL - if (shader->llvm_ctx){ - LLVMContextDispose(shader->llvm_ctx); - } -#endif - FREE(shader); } @@ -347,7 +353,13 @@ static void evergreen_emit_direct_dispatch( unsigned wave_divisor = (16 * num_pipes); int group_size = 1; int grid_size = 1; - unsigned lds_size = shader->local_size / 4 + shader->active_kernel->bc.nlds_dw; + unsigned lds_size = shader->local_size / 4 + +#if HAVE_LLVM < 0x0306 +
Mesa (master): clover: Add environment variables for dumping kernel code v2
Module: Mesa Branch: master Commit: e1d363b3ffbfb85133a6871c63068a4ba841b2cd URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=e1d363b3ffbfb85133a6871c63068a4ba841b2cd Author: Tom Stellard Date: Tue Sep 30 10:32:33 2014 -0400 clover: Add environment variables for dumping kernel code v2 There are two debug variables: CLOVER_DEBUG which you can set to any combination of llvm,clc,asm (separated by commas) to dump llvm IR, OpenCL C, and native assembly. CLOVER_DEBUG_FILE which you can set to a file name for dumping output instead of stderr. If you set this variable, the output will be split into three separate files with different suffixes: .cl for OpenCL C, .ll for LLVM IR, and .asm for native assembly. Note that when data is written, it is always appended to the files. v2: - Code cleanups - Add CLOVER_DEBUG_FILE environment variable for dumping to a file. Reviewed-by: Francisco Jerez --- .../state_trackers/clover/llvm/invocation.cpp | 86 +--- 1 file changed, 75 insertions(+), 11 deletions(-) diff --git a/src/gallium/state_trackers/clover/llvm/invocation.cpp b/src/gallium/state_trackers/clover/llvm/invocation.cpp index 5660761..3cdf883 100644 --- a/src/gallium/state_trackers/clover/llvm/invocation.cpp +++ b/src/gallium/state_trackers/clover/llvm/invocation.cpp @@ -61,6 +61,8 @@ #include #include #include +#include + #if HAVE_LLVM < 0x0302 #include @@ -132,6 +134,15 @@ namespace { return module::deserialize(cs); } #endif + void debug_log(const std::string &msg, const std::string &suffix) { + const char *dbg_file = debug_get_option("CLOVER_DEBUG_FILE", "stderr"); + if (!strcmp("stderr", dbg_file)) { + std::cerr << msg; + } else { +std::ofstream file(dbg_file + suffix, std::ios::app); +file << msg; + } + } llvm::Module * compile_llvm(llvm::LLVMContext &llvm_ctx, const std::string &source, @@ -456,9 +467,32 @@ namespace { return m; } + void + emit_code(LLVMTargetMachineRef tm, LLVMModuleRef mod, + LLVMCodeGenFileType file_type, + LLVMMemoryBufferRef *out_buffer, + compat::string &r_log) { + LLVMBool err; + char *err_message = NULL; + + err = LLVMTargetMachineEmitToMemoryBuffer(tm, mod, file_type, +&err_message, out_buffer); + + if (err) { + r_log = std::string(err_message); + } + + LLVMDisposeMessage(err_message); + + if (err) { + throw build_error(); + } + } + std::vector compile_native(const llvm::Module *mod, const std::string &triple, - const std::string &processor, compat::string &r_log) { + const std::string &processor, unsigned dump_asm, + compat::string &r_log) { std::string log; LLVMTargetRef target; @@ -466,7 +500,6 @@ namespace { LLVMMemoryBufferRef out_buffer; unsigned buffer_size; const char *buffer_data; - LLVMBool err; LLVMModuleRef mod_ref = wrap(mod); if (LLVMGetTargetFromTriple(triple.c_str(), &target, &error_message)) { @@ -484,16 +517,21 @@ namespace { throw build_error(); } - err = LLVMTargetMachineEmitToMemoryBuffer(tm, mod_ref, LLVMObjectFile, -&error_message, &out_buffer); - - if (err) { - LLVMDisposeTargetMachine(tm); - r_log = std::string(error_message); - LLVMDisposeMessage(error_message); - throw build_error(); + if (dump_asm) { + LLVMSetTargetMachineAsmVerbosity(tm, true); + LLVMModuleRef debug_mod = wrap(llvm::CloneModule(mod)); + emit_code(tm, debug_mod, LLVMAssemblyFile, &out_buffer, r_log); + buffer_size = LLVMGetBufferSize(out_buffer); + buffer_data = LLVMGetBufferStart(out_buffer); + debug_log(std::string(buffer_data, buffer_size), ".asm"); + + LLVMSetTargetMachineAsmVerbosity(tm, false); + LLVMDisposeMemoryBuffer(out_buffer); + LLVMDisposeModule(debug_mod); } + emit_code(tm, mod_ref, LLVMObjectFile, &out_buffer, r_log); + buffer_size = LLVMGetBufferSize(out_buffer); buffer_data = LLVMGetBufferStart(out_buffer); @@ -632,6 +670,18 @@ namespace { } } // End anonymous namespace +#define DBG_CLC (1 << 0) +#define DBG_LLVM (1 << 1) +#define DBG_ASM (1 << 2) + +static const struct debug_named_value debug_options[] = { + {"clc", DBG_CLC, "Dump the OpenCL C code for all kernels."}, + {"llvm", DBG_LLVM, "Dump the generated LLVM IR for all kernels."}, + {"asm", DBG_ASM, "Dump kernel assembly code for targets specifying " +"PIPE_SHAD
Mesa (master): clover: Factor kernel argument parsing into its own function v2
Module: Mesa Branch: master Commit: dc39b32c9bc967a26f745e7ebebcbc4c44c83f20 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=dc39b32c9bc967a26f745e7ebebcbc4c44c83f20 Author: Tom Stellard Date: Thu Sep 25 09:04:25 2014 -0400 clover: Factor kernel argument parsing into its own function v2 v2: - Code cleanups. Reviewed-by: Francisco Jerez --- .../state_trackers/clover/llvm/invocation.cpp | 173 +++- 1 file changed, 92 insertions(+), 81 deletions(-) diff --git a/src/gallium/state_trackers/clover/llvm/invocation.cpp b/src/gallium/state_trackers/clover/llvm/invocation.cpp index 212b4e4..41f1d6a 100644 --- a/src/gallium/state_trackers/clover/llvm/invocation.cpp +++ b/src/gallium/state_trackers/clover/llvm/invocation.cpp @@ -293,23 +293,13 @@ namespace { PM.run(*mod); } - module - build_module_llvm(llvm::Module *mod, - const std::vector &kernels, - clang::LangAS::Map& address_spaces) { + compat::vector + get_kernel_args(const llvm::Module *mod, const std::string &kernel_name, + const clang::LangAS::Map &address_spaces) { - module m; - struct pipe_llvm_program_header header; - - llvm::SmallVector llvm_bitcode; - llvm::raw_svector_ostream bitcode_ostream(llvm_bitcode); - llvm::BitstreamWriter writer(llvm_bitcode); - llvm::WriteBitcodeToFile(mod, bitcode_ostream); - bitcode_ostream.flush(); + compat::vector args; + llvm::Function *kernel_func = mod->getFunction(kernel_name); - for (unsigned i = 0; i < kernels.size(); ++i) { - llvm::Function *kernel_func = kernels[i]; - const std::string kernel_name = kernel_func->getName(); #if HAVE_LLVM < 0x0302 llvm::TargetData TD(kernel_func->getParent()); #elif HAVE_LLVM < 0x0305 @@ -317,88 +307,109 @@ namespace { #else llvm::DataLayout TD(mod); #endif - compat::vector args; - for (llvm::Function::arg_iterator I = kernel_func->arg_begin(), + for (llvm::Function::const_arg_iterator I = kernel_func->arg_begin(), E = kernel_func->arg_end(); I != E; ++I) { -llvm::Argument &arg = *I; -llvm::Type *arg_type = arg.getType(); -const unsigned arg_store_size = TD.getTypeStoreSize(arg_type); - -// OpenCL 1.2 specification, Ch. 6.1.5: "A built-in data -// type that is not a power of two bytes in size must be -// aligned to the next larger power of two". We need this -// alignment for three element vectors, which have -// non-power-of-2 store size. -const unsigned arg_api_size = - util_next_power_of_two(arg_store_size); - -llvm::Type *target_type = arg_type->isIntegerTy() ? + const llvm::Argument &arg = *I; + + llvm::Type *arg_type = arg.getType(); + const unsigned arg_store_size = TD.getTypeStoreSize(arg_type); + + // OpenCL 1.2 specification, Ch. 6.1.5: "A built-in data + // type that is not a power of two bytes in size must be + // aligned to the next larger power of two". We need this + // alignment for three element vectors, which have + // non-power-of-2 store size. + const unsigned arg_api_size = util_next_power_of_two(arg_store_size); + + llvm::Type *target_type = arg_type->isIntegerTy() ? TD.getSmallestLegalIntType(mod->getContext(), arg_store_size * 8) : arg_type; -unsigned target_size = TD.getTypeStoreSize(target_type); -unsigned target_align = TD.getABITypeAlignment(target_type); + unsigned target_size = TD.getTypeStoreSize(target_type); + unsigned target_align = TD.getABITypeAlignment(target_type); -if (llvm::isa(arg_type) && arg.hasByValAttr()) { - arg_type = + if (llvm::isa(arg_type) && arg.hasByValAttr()) { +arg_type = llvm::dyn_cast(arg_type)->getElementType(); -} + } -if (arg_type->isPointerTy()) { - unsigned address_space = llvm::cast(arg_type)->getAddressSpace(); - if (address_space == address_spaces[clang::LangAS::opencl_local + if (arg_type->isPointerTy()) { +unsigned address_space = llvm::cast(arg_type)->getAddressSpace(); +if (address_space == address_spaces[clang::LangAS::opencl_local - clang::LangAS::Offset]) { - args.push_back(module::argument(module::argument::local, - arg_api_size, target_size, - target_align, - modu