Mesa (master): gallivm: Make sure module has the correct data layout when pass manager runs

2017-05-18 Thread Tom Stellard
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

2017-01-31 Thread Tom Stellard
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

2017-01-31 Thread Tom Stellard
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

2016-12-06 Thread Tom Stellard
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

2016-11-17 Thread Tom Stellard
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

2016-11-14 Thread Tom Stellard
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

2016-11-11 Thread Tom Stellard
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

2016-11-09 Thread Tom Stellard
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

2016-11-09 Thread Tom Stellard
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

2016-10-12 Thread Tom Stellard
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

2016-10-12 Thread Tom Stellard
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

2016-10-12 Thread Tom Stellard
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

2016-09-16 Thread Tom Stellard
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

2016-09-16 Thread Tom Stellard
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

2016-08-29 Thread Tom Stellard
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

2016-07-20 Thread Tom Stellard
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

2016-07-20 Thread Tom Stellard
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

2016-04-22 Thread Tom Stellard
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

2016-04-22 Thread Tom Stellard
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

2016-04-22 Thread Tom Stellard
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

2016-04-22 Thread Tom Stellard
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

2016-04-05 Thread Tom Stellard
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

2016-02-17 Thread Tom Stellard
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

2016-02-17 Thread Tom Stellard
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

2016-02-17 Thread Tom Stellard
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

2015-12-01 Thread Tom Stellard
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

2015-11-25 Thread Tom Stellard
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}

2015-11-25 Thread Tom Stellard
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

2015-10-02 Thread Tom Stellard
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

2015-10-02 Thread Tom Stellard
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

2015-10-02 Thread Tom Stellard
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

2015-07-31 Thread Tom Stellard
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

2015-07-23 Thread Tom Stellard
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

2015-07-23 Thread Tom Stellard
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.

2015-07-20 Thread Tom Stellard
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

2015-06-12 Thread Tom Stellard
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

2015-06-12 Thread Tom Stellard
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

2015-05-11 Thread Tom Stellard
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

2015-05-11 Thread Tom Stellard
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

2015-04-29 Thread Tom Stellard
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

2015-04-29 Thread Tom Stellard
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

2015-04-29 Thread Tom Stellard
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

2015-04-29 Thread Tom Stellard
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

2015-04-29 Thread Tom Stellard
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

2015-04-20 Thread Tom Stellard
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

2015-04-20 Thread Tom Stellard
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

2015-04-14 Thread Tom Stellard
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

2015-04-14 Thread Tom Stellard
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

2015-04-14 Thread Tom Stellard
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

2015-03-31 Thread Tom Stellard
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

2015-03-31 Thread Tom Stellard
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

2015-03-23 Thread Tom Stellard
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

2015-03-23 Thread Tom Stellard
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

2015-03-23 Thread Tom Stellard
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

2015-03-23 Thread Tom Stellard
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

2015-03-23 Thread Tom Stellard
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

2015-03-23 Thread Tom Stellard
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

2015-03-23 Thread Tom Stellard
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

2015-03-23 Thread Tom Stellard
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

2015-03-23 Thread Tom Stellard
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

2015-03-09 Thread Tom Stellard
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

2015-03-09 Thread Tom Stellard
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

2015-03-09 Thread Tom Stellard
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

2015-03-05 Thread Tom Stellard
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

2015-03-04 Thread Tom Stellard
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

2015-03-04 Thread Tom Stellard
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

2015-02-27 Thread Tom Stellard
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

2015-02-27 Thread Tom Stellard
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

2015-02-27 Thread Tom Stellard
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)

2015-02-13 Thread Tom Stellard
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

2015-01-28 Thread Tom Stellard
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

2015-01-28 Thread Tom Stellard
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

2015-01-28 Thread Tom Stellard
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

2015-01-28 Thread Tom Stellard
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

2015-01-28 Thread Tom Stellard
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

2015-01-26 Thread Tom Stellard
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

2015-01-20 Thread Tom Stellard
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

2015-01-20 Thread Tom Stellard
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

2015-01-20 Thread Tom Stellard
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

2015-01-20 Thread Tom Stellard
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

2015-01-07 Thread Tom Stellard
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

2015-01-06 Thread Tom Stellard
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

2015-01-06 Thread Tom Stellard
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

2014-12-08 Thread Tom Stellard
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

2014-12-08 Thread Tom Stellard
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

2014-12-08 Thread Tom Stellard
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

2014-12-02 Thread Tom Stellard
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

2014-12-02 Thread Tom Stellard
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

2014-12-02 Thread Tom Stellard
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"

2014-11-12 Thread Tom Stellard
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

2014-11-06 Thread Tom Stellard
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

2014-11-03 Thread Tom Stellard
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

2014-10-31 Thread Tom Stellard
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

2014-10-31 Thread Tom Stellard
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

2014-10-31 Thread Tom Stellard
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

2014-10-31 Thread Tom Stellard
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

2014-10-31 Thread Tom Stellard
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

2014-10-31 Thread Tom Stellard
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

2014-10-16 Thread Tom Stellard
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

2014-10-16 Thread Tom Stellard
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

  1   2   3   4   5   6   7   8   9   >