Re: [Mesa-dev] [RFC] Fix for clang compiler issue as reported in Bug 91826

2015-09-01 Thread Serge Martin (EdB)
On Tuesday 01 September 2015 17:10:33 Albert Freeman wrote:
> Clang tryed to declare the non type member of struct module (enum type type)
> (in clover/core/module.hpp) instead of a variable of type enum (enum type).
> 
> Signed-off-by: Albert Freeman <albertwdfree...@gmail.com>

Reviewed by Serge Martin <edb+m...@sigluy.net>

Can it be pushed to master, and if so, can it also be pushed to 11.0 branch?

   Serge
> ---
>  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
> 7c23a27..d74b50d 100644
> --- a/src/gallium/state_trackers/clover/llvm/invocation.cpp
> +++ b/src/gallium/state_trackers/clover/llvm/invocation.cpp
> @@ -465,7 +465,7 @@ namespace {
>  const bool is_write_only = access_qual == "write_only";
>  const bool is_read_only = access_qual == "read_only";
> 
> -typename module::argument::type marg_type;
> +enum module::argument::type marg_type;
>  if (is_image2d && is_read_only) {
> marg_type = module::argument::image2d_rd;
>  } else if (is_image2d && is_write_only) {

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH] clover: fix llvm 3.5 build error

2015-08-21 Thread Serge Martin (EdB)
On Wednesday 19 August 2015 11:56:08 Zoltan Gilian wrote:
 There is no MDOperand in llvm 3.5.
 
 v2: Check if kernel metadata is present to avoid crash (EdB).
 v3: Second attempt to avoid crash: switch off metadata query for llvm  3.6.

Since the change you made for image support won't be backport to llvm 3.5 this 
is good for me. And it no longer make clover crash.

Reviewed-by: Serge Martin (EdB) edb+m...@sigluy.net

But since I don't have commit access, not sure what my r-b worth.

Could it be pushed before the branch point?

 ---
  .../state_trackers/clover/llvm/invocation.cpp  | 33
 ++ 1 file changed, 21 insertions(+), 12 deletions(-)
 
 diff --git a/src/gallium/state_trackers/clover/llvm/invocation.cpp
 b/src/gallium/state_trackers/clover/llvm/invocation.cpp index
 8eb0469..908a296 100644
 --- a/src/gallium/state_trackers/clover/llvm/invocation.cpp
 +++ b/src/gallium/state_trackers/clover/llvm/invocation.cpp
 @@ -346,6 +346,15 @@ namespace {
 
 // Kernel metadata
 
 +   struct kernel_arg_md {
 +  llvm::StringRef type_name;
 +  llvm::StringRef access_qual;
 +  kernel_arg_md(llvm::StringRef type_name_, llvm::StringRef
 access_qual_): + type_name(type_name_), access_qual(access_qual_)
 {}
 +   };
 +
 +#if HAVE_LLVM = 0x0306
 +
 const llvm::MDNode *
 get_kernel_metadata(const llvm::Function *kernel_func) {
auto mod = kernel_func-getParent();
 @@ -356,12 +365,8 @@ namespace {
 
const llvm::MDNode *kernel_node = nullptr;
for (unsigned i = 0; i  kernels_node-getNumOperands(); ++i) {
 -#if HAVE_LLVM = 0x0306
   auto func = llvm::mdconst::dyn_extractllvm::Function(
 -#else
 - auto func = llvm::dyn_castllvm::Function(
 -#endif
 -   
 kernels_node-getOperand(i)-getOperand(0)); +  
 kernels_node-getOperand(i)-getOperand(0));
   if (func == kernel_func) {
  kernel_node = kernels_node-getOperand(i);
  break;
 @@ -387,13 +392,6 @@ namespace {
return node;
 }
 
 -   struct kernel_arg_md {
 -  llvm::StringRef type_name;
 -  llvm::StringRef access_qual;
 -  kernel_arg_md(llvm::StringRef type_name_, llvm::StringRef
 access_qual_): - type_name(type_name_), access_qual(access_qual_)
 {}
 -   };
 -
 std::vectorkernel_arg_md
 get_kernel_arg_md(const llvm::Function *kernel_func) {
auto num_args = kernel_func-getArgumentList().size();
 @@ -415,6 +413,17 @@ namespace {
return res;
 }
 
 +#else
 +
 +   std::vectorkernel_arg_md
 +   get_kernel_arg_md(const llvm::Function *kernel_func) {
 +  return std::vectorkernel_arg_md(
 +kernel_func-getArgumentList().size(),
 +kernel_arg_md(, ));
 +   }
 +
 +#endif // HAVE_LLVM = 0x0306
 +
 std::vectormodule::argument
 get_kernel_args(const llvm::Module *mod, const std::string kernel_name,
 const clang::LangAS::Map address_spaces) {

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH] clover: fix llvm 3.5 build error

2015-08-16 Thread Serge Martin (EdB)
On Sunday 09 August 2015 11:52:13 orome wrote:
 On Sun, 2015-08-09 at 15:39 +0200, Zoltan Gilian wrote:
  There is no MDOperand in llvm 3.5.
  
  v2: Check if kernel metadata is present to avoid crash (EdB).
 
 still builds for me.

Sadly, it's still crashing for me.

auto kernel_node = get_kernel_metadata(kernel_func);
kernel_node is always set

but 
auto node = llvm::castllvm::MDNode(parent-getOperand(op_idx));
return NULL

 
 thanks,
 Jan
 
  ---
  
   .../state_trackers/clover/llvm/invocation.cpp  | 22
  
  +-
  
   1 file changed, 13 insertions(+), 9 deletions(-)
  
  diff --git a/src/gallium/state_trackers/clover/llvm/invocation.cpp
  b/src/gallium/state_trackers/clover/llvm/invocation.cpp
  index 50c4557..8fd5807 100644
  --- a/src/gallium/state_trackers/clover/llvm/invocation.cpp
  +++ b/src/gallium/state_trackers/clover/llvm/invocation.cpp
  @@ -371,12 +371,13 @@ namespace {
  
 return kernel_node;
  
  }
  
  -   llvm::MDNode*
  -   node_from_op_checked(const llvm::MDOperand md_operand,
  -llvm::StringRef expect_name,
  -unsigned expect_num_args)
  +   const llvm::MDNode *
  +   get_operand_checked(const llvm::MDNode *parent,
  +   const unsigned op_idx,
  +   const llvm::StringRef expect_name,
  +   const unsigned expect_num_args)
  
  {
  
  -  auto node = llvm::castllvm::MDNode(md_operand);
  +  auto node = llvm::castllvm::MDNode(parent
  -getOperand(op_idx));
  
 assert(node-getNumOperands() == expect_num_args 
 
Wrong number of operands.);
  
  @@ -399,10 +400,13 @@ namespace {
  
 auto num_args = kernel_func-getArgumentList().size();
 
 auto kernel_node = get_kernel_metadata(kernel_func);
  
  -  auto aq = node_from_op_checked(kernel_node-getOperand(2),
  - kernel_arg_access_qual,
  num_args + 1);
  -  auto ty = node_from_op_checked(kernel_node-getOperand(3),
  - kernel_arg_type, num_args +
  1);
  +  if (!kernel_node)
  + return std::vectorkernel_arg_md(num_args,
  kernel_arg_md(, ));
  +
  +  auto aq = get_operand_checked(kernel_node, 2,
  kernel_arg_access_qual,
  +num_args + 1);
  +  auto ty = get_operand_checked(kernel_node, 3,
  kernel_arg_type,
  +num_args + 1);
  
 std::vectorkernel_arg_md res;
 res.reserve(num_args);

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH] clover: block on transfer api calls when requested

2015-08-15 Thread Serge Martin (EdB)
Hello

This looks like what I've send a few weeks ago [0]. It's seems we should come 
with something a little different as explain by curro in [1]

[0] http://lists.freedesktop.org/archives/mesa-dev/2015-August/090479.html
[1] http://lists.freedesktop.org/archives/mesa-dev/2015-June/086110.html

   EdB

On Saturday 15 August 2015 16:28:55 Zoltan Gilian wrote:
 ---
  src/gallium/state_trackers/clover/api/transfer.cpp | 17 +
  1 file changed, 17 insertions(+)
 
 diff --git a/src/gallium/state_trackers/clover/api/transfer.cpp
 b/src/gallium/state_trackers/clover/api/transfer.cpp index cd3bd00..c2c8af2
 100644
 --- a/src/gallium/state_trackers/clover/api/transfer.cpp
 +++ b/src/gallium/state_trackers/clover/api/transfer.cpp
 @@ -311,6 +311,9 @@ clEnqueueReadBuffer(cl_command_queue d_q, cl_mem d_mem,
 cl_bool blocking, mem, obj_origin, obj_pitch,
 region));
 
 +   if (blocking)
 +  hev().wait();
 +
 ret_object(rd_ev, hev);
 return CL_SUCCESS;
 
 @@ -341,6 +344,9 @@ clEnqueueWriteBuffer(cl_command_queue d_q, cl_mem d_mem,
 cl_bool blocking, ptr, {}, obj_pitch,
 region));
 
 +   if (blocking)
 +  hev().wait();
 +
 ret_object(rd_ev, hev);
 return CL_SUCCESS;
 
 @@ -378,6 +384,9 @@ clEnqueueReadBufferRect(cl_command_queue d_q, cl_mem
 d_mem, cl_bool blocking, mem, obj_origin, obj_pitch,
 region));
 
 +   if (blocking)
 +  hev().wait();
 +
 ret_object(rd_ev, hev);
 return CL_SUCCESS;
 
 @@ -415,6 +424,9 @@ clEnqueueWriteBufferRect(cl_command_queue d_q, cl_mem
 d_mem, cl_bool blocking, ptr, host_origin, host_pitch,
 region));
 
 +   if (blocking)
 +  hev().wait();
 +
 ret_object(rd_ev, hev);
 return CL_SUCCESS;
 
 @@ -520,6 +532,9 @@ clEnqueueReadImage(cl_command_queue d_q, cl_mem d_mem,
 cl_bool blocking, img, src_origin, src_pitch,
 region));
 
 +   if (blocking)
 +  hev().wait();
 +
 ret_object(rd_ev, hev);
 return CL_SUCCESS;
 
 @@ -553,6 +568,8 @@ clEnqueueWriteImage(cl_command_queue d_q, cl_mem d_mem,
 cl_bool blocking, soft_copy_op(q, img, dst_origin, dst_pitch,
 ptr, {}, src_pitch,
 region));
 +   if (blocking)
 +  hev().wait();
 
 ret_object(rd_ev, hev);
 return CL_SUCCESS;

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH v4] clover: stub missing CL 1.2 functions

2015-08-07 Thread Serge Martin (EdB)
As sugested by Tom a long time ago
and in order to be able to create Piglit tests

v2:
replace NOT_SUPPORTED_BY_CL_1_1 macro with an inline function
remove extra space in clLinkProgram arg

v3:
use __func__

v4:
back to a macro, it make more sense to use it with __func__
---
 src/gallium/state_trackers/clover/api/dispatch.cpp | 10 -
 src/gallium/state_trackers/clover/api/kernel.cpp   |  8 +++
 src/gallium/state_trackers/clover/api/memory.cpp   | 25 --
 src/gallium/state_trackers/clover/api/program.cpp  | 10 +
 src/gallium/state_trackers/clover/api/transfer.cpp | 12 +++
 src/gallium/state_trackers/clover/api/util.hpp |  7 ++
 6 files changed, 65 insertions(+), 7 deletions(-)

diff --git a/src/gallium/state_trackers/clover/api/dispatch.cpp 
b/src/gallium/state_trackers/clover/api/dispatch.cpp
index b5a4094..f10babe 100644
--- a/src/gallium/state_trackers/clover/api/dispatch.cpp
+++ b/src/gallium/state_trackers/clover/api/dispatch.cpp
@@ -123,12 +123,12 @@ namespace clover {
   clCreateImage,
   clCreateProgramWithBuiltInKernels,
   clCompileProgram,
-  NULL, // clLinkProgram
+  clLinkProgram,
   clUnloadPlatformCompiler,
-  NULL, // clGetKernelArgInfo
-  NULL, // clEnqueueFillBuffer
-  NULL, // clEnqueueFillImage
-  NULL, // clEnqueueMigrateMemObjects
+  clGetKernelArgInfo,
+  clEnqueueFillBuffer,
+  clEnqueueFillImage,
+  clEnqueueMigrateMemObjects,
   clEnqueueMarkerWithWaitList,
   clEnqueueBarrierWithWaitList,
   NULL, // clGetExtensionFunctionAddressForPlatform
diff --git a/src/gallium/state_trackers/clover/api/kernel.cpp 
b/src/gallium/state_trackers/clover/api/kernel.cpp
index 857a152..de3e300 100644
--- a/src/gallium/state_trackers/clover/api/kernel.cpp
+++ b/src/gallium/state_trackers/clover/api/kernel.cpp
@@ -189,6 +189,14 @@ clGetKernelWorkGroupInfo(cl_kernel d_kern, cl_device_id 
d_dev,
return CL_INVALID_DEVICE;
 }
 
+CLOVER_API cl_int
+clGetKernelArgInfo(cl_kernel d_kern,
+   cl_uint idx, cl_kernel_arg_info param,
+   size_t size, void *r_buf, size_t *r_size) {
+   CLOVER_NOT_SUPPORTED_BY(1.1);
+   return CL_KERNEL_ARG_INFO_NOT_AVAILABLE;
+}
+
 namespace {
///
/// Common argument checking shared by kernel invocation commands.
diff --git a/src/gallium/state_trackers/clover/api/memory.cpp 
b/src/gallium/state_trackers/clover/api/memory.cpp
index 3ff6ba0..42e8c30 100644
--- a/src/gallium/state_trackers/clover/api/memory.cpp
+++ b/src/gallium/state_trackers/clover/api/memory.cpp
@@ -358,8 +358,29 @@ clCreateImage(cl_context d_ctx, cl_mem_flags flags,
   const cl_image_desc *image_desc,
   void *host_ptr, cl_int *r_errcode) {
// This function was added in OpenCL 1.2
-   std::cerr  CL user error: clCreateImage() not supported by OpenCL 1.1. 

-std::endl;
+   CLOVER_NOT_SUPPORTED_BY(1.1);
ret_error(r_errcode, CL_INVALID_OPERATION);
return NULL;
 }
+
+CLOVER_API cl_int
+clEnqueueFillBuffer(cl_command_queue command_queue, cl_mem buffer,
+const void *pattern, size_t pattern_size,
+size_t offset, size_t size,
+cl_uint num_events_in_wait_list,
+const cl_event *event_wait_list,
+cl_event *event) {
+   CLOVER_NOT_SUPPORTED_BY(1.1);
+   return CL_INVALID_VALUE;
+}
+
+CLOVER_API cl_int
+clEnqueueFillImage(cl_command_queue command_queue, cl_mem image,
+   const void *fill_color,
+   const size_t *origin, const size_t *region,
+   cl_uint num_events_in_wait_list,
+   const cl_event *event_wait_list,
+   cl_event *event) {
+   CLOVER_NOT_SUPPORTED_BY(1.1);
+   return CL_INVALID_VALUE;
+}
diff --git a/src/gallium/state_trackers/clover/api/program.cpp 
b/src/gallium/state_trackers/clover/api/program.cpp
index e9b1f38..0110789 100644
--- a/src/gallium/state_trackers/clover/api/program.cpp
+++ b/src/gallium/state_trackers/clover/api/program.cpp
@@ -231,6 +231,16 @@ clCompileProgram(cl_program d_prog, cl_uint num_devs,
return e.get();
 }
 
+CLOVER_API cl_program
+clLinkProgram(cl_context d_ctx, cl_uint num_devs, const cl_device_id *d_devs,
+  const char *p_opts, cl_uint num_progs, const cl_program *d_progs,
+  void (*pfn_notify)(cl_program, void *), void *user_data,
+  cl_int *r_errcode) {
+   CLOVER_NOT_SUPPORTED_BY(1.1);
+   ret_error(r_errcode, CL_LINKER_NOT_AVAILABLE);
+   return NULL;
+}
+
 CLOVER_API cl_int
 clUnloadCompiler() {
return CL_SUCCESS;
diff --git a/src/gallium/state_trackers/clover/api/transfer.cpp 
b/src/gallium/state_trackers/clover/api/transfer.cpp
index fdb9405..f5b8e2b 100644
--- a/src/gallium/state_trackers/clover/api/transfer.cpp
+++ b/src/gallium/state_trackers/clover/api/transfer.cpp
@@ -726,3 +726,15 @@ clEnqueueUnmapMemObject(cl_command_queue d_q, cl_mem 

[Mesa-dev] [PATCH v2] clover: stub missing CL 1.2 functions

2015-08-05 Thread EdB
As sugested by Tom a long time ago
and in order to be able to create Piglit tests

v2:
replace NOT_SUPPORTED_BY_CL_1_1 macro with an inline function
remove extra space in clLinkProgram arg

---
 src/gallium/state_trackers/clover/api/dispatch.cpp | 10 -
 src/gallium/state_trackers/clover/api/kernel.cpp   |  8 +++
 src/gallium/state_trackers/clover/api/memory.cpp   | 25 --
 src/gallium/state_trackers/clover/api/program.cpp  | 10 +
 src/gallium/state_trackers/clover/api/transfer.cpp | 12 +++
 src/gallium/state_trackers/clover/api/util.hpp |  9 
 6 files changed, 67 insertions(+), 7 deletions(-)

diff --git a/src/gallium/state_trackers/clover/api/dispatch.cpp 
b/src/gallium/state_trackers/clover/api/dispatch.cpp
index b5a4094..f10babe 100644
--- a/src/gallium/state_trackers/clover/api/dispatch.cpp
+++ b/src/gallium/state_trackers/clover/api/dispatch.cpp
@@ -123,12 +123,12 @@ namespace clover {
   clCreateImage,
   clCreateProgramWithBuiltInKernels,
   clCompileProgram,
-  NULL, // clLinkProgram
+  clLinkProgram,
   clUnloadPlatformCompiler,
-  NULL, // clGetKernelArgInfo
-  NULL, // clEnqueueFillBuffer
-  NULL, // clEnqueueFillImage
-  NULL, // clEnqueueMigrateMemObjects
+  clGetKernelArgInfo,
+  clEnqueueFillBuffer,
+  clEnqueueFillImage,
+  clEnqueueMigrateMemObjects,
   clEnqueueMarkerWithWaitList,
   clEnqueueBarrierWithWaitList,
   NULL, // clGetExtensionFunctionAddressForPlatform
diff --git a/src/gallium/state_trackers/clover/api/kernel.cpp 
b/src/gallium/state_trackers/clover/api/kernel.cpp
index 857a152..8def01f 100644
--- a/src/gallium/state_trackers/clover/api/kernel.cpp
+++ b/src/gallium/state_trackers/clover/api/kernel.cpp
@@ -189,6 +189,14 @@ clGetKernelWorkGroupInfo(cl_kernel d_kern, cl_device_id 
d_dev,
return CL_INVALID_DEVICE;
 }
 
+CLOVER_API cl_int
+clGetKernelArgInfo(cl_kernel d_kern,
+   cl_uint idx, cl_kernel_arg_info param,
+   size_t size, void *r_buf, size_t *r_size) {
+   not_supported_by(1.1, clGetKernelArgInfo);
+   return CL_KERNEL_ARG_INFO_NOT_AVAILABLE;
+}
+
 namespace {
///
/// Common argument checking shared by kernel invocation commands.
diff --git a/src/gallium/state_trackers/clover/api/memory.cpp 
b/src/gallium/state_trackers/clover/api/memory.cpp
index 3ff6ba0..e44461f 100644
--- a/src/gallium/state_trackers/clover/api/memory.cpp
+++ b/src/gallium/state_trackers/clover/api/memory.cpp
@@ -358,8 +358,29 @@ clCreateImage(cl_context d_ctx, cl_mem_flags flags,
   const cl_image_desc *image_desc,
   void *host_ptr, cl_int *r_errcode) {
// This function was added in OpenCL 1.2
-   std::cerr  CL user error: clCreateImage() not supported by OpenCL 1.1. 

-std::endl;
+   not_supported_by(1.1, clCreateImage);
ret_error(r_errcode, CL_INVALID_OPERATION);
return NULL;
 }
+
+CLOVER_API cl_int
+clEnqueueFillBuffer(cl_command_queue command_queue, cl_mem buffer,
+const void *pattern, size_t pattern_size,
+size_t offset, size_t size,
+cl_uint num_events_in_wait_list,
+const cl_event *event_wait_list,
+cl_event *event) {
+   not_supported_by(1.1, clEnqueueFillBuffer);
+   return CL_INVALID_VALUE;
+}
+
+CLOVER_API cl_int
+clEnqueueFillImage(cl_command_queue command_queue, cl_mem image,
+   const void *fill_color,
+   const size_t *origin, const size_t *region,
+   cl_uint num_events_in_wait_list,
+   const cl_event *event_wait_list,
+   cl_event *event) {
+   not_supported_by(1.1, clEnqueueFillImage);
+   return CL_INVALID_VALUE;
+}
diff --git a/src/gallium/state_trackers/clover/api/program.cpp 
b/src/gallium/state_trackers/clover/api/program.cpp
index e9b1f38..f8e771e 100644
--- a/src/gallium/state_trackers/clover/api/program.cpp
+++ b/src/gallium/state_trackers/clover/api/program.cpp
@@ -231,6 +231,16 @@ clCompileProgram(cl_program d_prog, cl_uint num_devs,
return e.get();
 }
 
+CLOVER_API cl_program
+clLinkProgram(cl_context d_ctx, cl_uint num_devs, const cl_device_id *d_devs,
+  const char *p_opts, cl_uint num_progs, const cl_program *d_progs,
+  void (*pfn_notify)(cl_program, void *), void *user_data,
+  cl_int *r_errcode) {
+   not_supported_by(1.1, clLinkProgram);
+   ret_error(r_errcode, CL_LINKER_NOT_AVAILABLE);
+   return NULL;
+}
+
 CLOVER_API cl_int
 clUnloadCompiler() {
return CL_SUCCESS;
diff --git a/src/gallium/state_trackers/clover/api/transfer.cpp 
b/src/gallium/state_trackers/clover/api/transfer.cpp
index fdb9405..ec5f97d 100644
--- a/src/gallium/state_trackers/clover/api/transfer.cpp
+++ b/src/gallium/state_trackers/clover/api/transfer.cpp
@@ -726,3 +726,15 @@ clEnqueueUnmapMemObject(cl_command_queue d_q, cl_mem 
d_mem, void *ptr,
 } 

[Mesa-dev] [PATCH v3] clover: stub missing CL 1.2 functions

2015-08-05 Thread EdB
As sugested by Tom a long time ago
and in order to be able to create Piglit tests

v2:
replace NOT_SUPPORTED_BY_CL_1_1 macro with an inline function
remove extra space in clLinkProgram arg

v3:
use __func__

---
 src/gallium/state_trackers/clover/api/dispatch.cpp | 10 -
 src/gallium/state_trackers/clover/api/kernel.cpp   |  8 +++
 src/gallium/state_trackers/clover/api/memory.cpp   | 25 --
 src/gallium/state_trackers/clover/api/program.cpp  | 10 +
 src/gallium/state_trackers/clover/api/transfer.cpp | 12 +++
 src/gallium/state_trackers/clover/api/util.hpp |  9 
 6 files changed, 67 insertions(+), 7 deletions(-)

diff --git a/src/gallium/state_trackers/clover/api/dispatch.cpp 
b/src/gallium/state_trackers/clover/api/dispatch.cpp
index b5a4094..f10babe 100644
--- a/src/gallium/state_trackers/clover/api/dispatch.cpp
+++ b/src/gallium/state_trackers/clover/api/dispatch.cpp
@@ -123,12 +123,12 @@ namespace clover {
   clCreateImage,
   clCreateProgramWithBuiltInKernels,
   clCompileProgram,
-  NULL, // clLinkProgram
+  clLinkProgram,
   clUnloadPlatformCompiler,
-  NULL, // clGetKernelArgInfo
-  NULL, // clEnqueueFillBuffer
-  NULL, // clEnqueueFillImage
-  NULL, // clEnqueueMigrateMemObjects
+  clGetKernelArgInfo,
+  clEnqueueFillBuffer,
+  clEnqueueFillImage,
+  clEnqueueMigrateMemObjects,
   clEnqueueMarkerWithWaitList,
   clEnqueueBarrierWithWaitList,
   NULL, // clGetExtensionFunctionAddressForPlatform
diff --git a/src/gallium/state_trackers/clover/api/kernel.cpp 
b/src/gallium/state_trackers/clover/api/kernel.cpp
index 857a152..8def01f 100644
--- a/src/gallium/state_trackers/clover/api/kernel.cpp
+++ b/src/gallium/state_trackers/clover/api/kernel.cpp
@@ -189,6 +189,14 @@ clGetKernelWorkGroupInfo(cl_kernel d_kern, cl_device_id 
d_dev,
return CL_INVALID_DEVICE;
 }
 
+CLOVER_API cl_int
+clGetKernelArgInfo(cl_kernel d_kern,
+   cl_uint idx, cl_kernel_arg_info param,
+   size_t size, void *r_buf, size_t *r_size) {
+   not_supported_by(1.1, __func__);
+   return CL_KERNEL_ARG_INFO_NOT_AVAILABLE;
+}
+
 namespace {
///
/// Common argument checking shared by kernel invocation commands.
diff --git a/src/gallium/state_trackers/clover/api/memory.cpp 
b/src/gallium/state_trackers/clover/api/memory.cpp
index 3ff6ba0..e44461f 100644
--- a/src/gallium/state_trackers/clover/api/memory.cpp
+++ b/src/gallium/state_trackers/clover/api/memory.cpp
@@ -358,8 +358,29 @@ clCreateImage(cl_context d_ctx, cl_mem_flags flags,
   const cl_image_desc *image_desc,
   void *host_ptr, cl_int *r_errcode) {
// This function was added in OpenCL 1.2
-   std::cerr  CL user error: clCreateImage() not supported by OpenCL 1.1. 

-std::endl;
+   not_supported_by(1.1, __func__);
ret_error(r_errcode, CL_INVALID_OPERATION);
return NULL;
 }
+
+CLOVER_API cl_int
+clEnqueueFillBuffer(cl_command_queue command_queue, cl_mem buffer,
+const void *pattern, size_t pattern_size,
+size_t offset, size_t size,
+cl_uint num_events_in_wait_list,
+const cl_event *event_wait_list,
+cl_event *event) {
+   not_supported_by(1.1, __func__);
+   return CL_INVALID_VALUE;
+}
+
+CLOVER_API cl_int
+clEnqueueFillImage(cl_command_queue command_queue, cl_mem image,
+   const void *fill_color,
+   const size_t *origin, const size_t *region,
+   cl_uint num_events_in_wait_list,
+   const cl_event *event_wait_list,
+   cl_event *event) {
+   not_supported_by(1.1, __func__);
+   return CL_INVALID_VALUE;
+}
diff --git a/src/gallium/state_trackers/clover/api/program.cpp 
b/src/gallium/state_trackers/clover/api/program.cpp
index e9b1f38..f8e771e 100644
--- a/src/gallium/state_trackers/clover/api/program.cpp
+++ b/src/gallium/state_trackers/clover/api/program.cpp
@@ -231,6 +231,16 @@ clCompileProgram(cl_program d_prog, cl_uint num_devs,
return e.get();
 }
 
+CLOVER_API cl_program
+clLinkProgram(cl_context d_ctx, cl_uint num_devs, const cl_device_id *d_devs,
+  const char *p_opts, cl_uint num_progs, const cl_program *d_progs,
+  void (*pfn_notify)(cl_program, void *), void *user_data,
+  cl_int *r_errcode) {
+   not_supported_by(1.1, __func__);
+   ret_error(r_errcode, CL_LINKER_NOT_AVAILABLE);
+   return NULL;
+}
+
 CLOVER_API cl_int
 clUnloadCompiler() {
return CL_SUCCESS;
diff --git a/src/gallium/state_trackers/clover/api/transfer.cpp 
b/src/gallium/state_trackers/clover/api/transfer.cpp
index fdb9405..ec5f97d 100644
--- a/src/gallium/state_trackers/clover/api/transfer.cpp
+++ b/src/gallium/state_trackers/clover/api/transfer.cpp
@@ -726,3 +726,15 @@ clEnqueueUnmapMemObject(cl_command_queue d_q, cl_mem 
d_mem, void *ptr,
 } catch (error e) {

[Mesa-dev] [PATCH] clover: clEnqueue* should block when asked for

2015-08-02 Thread EdB
As a side effect, this fix clRetain/ReleaseEvent Piglit test
---
 src/gallium/state_trackers/clover/api/transfer.cpp | 29 --
 1 file changed, 27 insertions(+), 2 deletions(-)

diff --git a/src/gallium/state_trackers/clover/api/transfer.cpp 
b/src/gallium/state_trackers/clover/api/transfer.cpp
index fdb9405..c2f4f13 100644
--- a/src/gallium/state_trackers/clover/api/transfer.cpp
+++ b/src/gallium/state_trackers/clover/api/transfer.cpp
@@ -295,6 +295,9 @@ clEnqueueReadBuffer(cl_command_queue d_q, cl_mem d_mem, 
cl_bool blocking,
mem, obj_origin, obj_pitch,
region));
 
+   if (blocking)
+  hev().wait();
+
ret_object(rd_ev, hev);
return CL_SUCCESS;
 
@@ -325,6 +328,9 @@ clEnqueueWriteBuffer(cl_command_queue d_q, cl_mem d_mem, 
cl_bool blocking,
ptr, {}, obj_pitch,
region));
 
+   if (blocking)
+  hev().wait();
+
ret_object(rd_ev, hev);
return CL_SUCCESS;
 
@@ -362,6 +368,9 @@ clEnqueueReadBufferRect(cl_command_queue d_q, cl_mem d_mem, 
cl_bool blocking,
mem, obj_origin, obj_pitch,
region));
 
+   if (blocking)
+  hev().wait();
+
ret_object(rd_ev, hev);
return CL_SUCCESS;
 
@@ -398,6 +407,8 @@ clEnqueueWriteBufferRect(cl_command_queue d_q, cl_mem 
d_mem, cl_bool blocking,
   soft_copy_op(q, mem, obj_origin, obj_pitch,
ptr, host_origin, host_pitch,
region));
+   if (blocking)
+  hev().wait();
 
ret_object(rd_ev, hev);
return CL_SUCCESS;
@@ -504,6 +515,9 @@ clEnqueueReadImage(cl_command_queue d_q, cl_mem d_mem, 
cl_bool blocking,
img, src_origin, src_pitch,
region));
 
+   if (blocking)
+  hev().wait();
+
ret_object(rd_ev, hev);
return CL_SUCCESS;
 
@@ -537,6 +551,8 @@ clEnqueueWriteImage(cl_command_queue d_q, cl_mem d_mem, 
cl_bool blocking,
   soft_copy_op(q, img, dst_origin, dst_pitch,
ptr, {}, src_pitch,
region));
+   if (blocking)
+  hev().wait();
 
ret_object(rd_ev, hev);
return CL_SUCCESS;
@@ -666,8 +682,12 @@ clEnqueueMapBuffer(cl_command_queue d_q, cl_mem d_mem, 
cl_bool blocking,
validate_map_flags(mem, flags);
 
void *map = mem.resource(q).add_map(q, flags, blocking, obj_origin, region);
+   auto hev = createhard_event(q, CL_COMMAND_MAP_BUFFER, deps);
+
+   if (blocking)
+  hev().wait();
 
-   ret_object(rd_ev, createhard_event(q, CL_COMMAND_MAP_BUFFER, deps));
+   ret_object(rd_ev, hev);
ret_error(r_errcode, CL_SUCCESS);
return map;
 
@@ -695,7 +715,12 @@ clEnqueueMapImage(cl_command_queue d_q, cl_mem d_mem, 
cl_bool blocking,
 
void *map = img.resource(q).add_map(q, flags, blocking, origin, region);
 
-   ret_object(rd_ev, createhard_event(q, CL_COMMAND_MAP_IMAGE, deps));
+   auto hev = createhard_event(q, CL_COMMAND_MAP_IMAGE, deps);
+
+   if (blocking)
+  hev().wait();
+
+   ret_object(rd_ev, hev);
ret_error(r_errcode, CL_SUCCESS);
return map;
 
-- 
2.1.0

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 1/2 v1.1] clover: make dispatch matches functions def

2015-07-31 Thread EdB
---
 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..781b54e 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,
-- 
2.5.0

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 1/2] clover: make dispatch matches functions def

2015-07-27 Thread EdB
---
 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..781b54e 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,
-- 
2.5.0.rc2

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 0/2] clover: allow the creation of Piglit tests for the missing CL 1.2 fonction

2015-07-27 Thread EdB
EdB (2):
  clover: make dispatch matches functions defs
  clover: stub missing CL 1.2 functions 

 src/gallium/state_trackers/clover/api/dispatch.cpp | 10 -
 src/gallium/state_trackers/clover/api/dispatch.hpp | 23 +++-
 src/gallium/state_trackers/clover/api/kernel.cpp   |  8 +++
 src/gallium/state_trackers/clover/api/memory.cpp   | 25 --
 src/gallium/state_trackers/clover/api/program.cpp  | 10 +
 src/gallium/state_trackers/clover/api/transfer.cpp | 12 +++
 src/gallium/state_trackers/clover/api/util.hpp |  4 
 7 files changed, 80 insertions(+), 12 deletions(-)

-- 
2.5.0.rc2

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 2/2] clover: stub missing CL 1.2 functions

2015-07-27 Thread EdB
As sugested by Tom a long time ago
and in order to be able to create Piglit tests
---
 src/gallium/state_trackers/clover/api/dispatch.cpp | 10 -
 src/gallium/state_trackers/clover/api/kernel.cpp   |  8 +++
 src/gallium/state_trackers/clover/api/memory.cpp   | 25 --
 src/gallium/state_trackers/clover/api/program.cpp  | 10 +
 src/gallium/state_trackers/clover/api/transfer.cpp | 12 +++
 src/gallium/state_trackers/clover/api/util.hpp |  4 
 6 files changed, 62 insertions(+), 7 deletions(-)

diff --git a/src/gallium/state_trackers/clover/api/dispatch.cpp 
b/src/gallium/state_trackers/clover/api/dispatch.cpp
index b5a4094..f10babe 100644
--- a/src/gallium/state_trackers/clover/api/dispatch.cpp
+++ b/src/gallium/state_trackers/clover/api/dispatch.cpp
@@ -123,12 +123,12 @@ namespace clover {
   clCreateImage,
   clCreateProgramWithBuiltInKernels,
   clCompileProgram,
-  NULL, // clLinkProgram
+  clLinkProgram,
   clUnloadPlatformCompiler,
-  NULL, // clGetKernelArgInfo
-  NULL, // clEnqueueFillBuffer
-  NULL, // clEnqueueFillImage
-  NULL, // clEnqueueMigrateMemObjects
+  clGetKernelArgInfo,
+  clEnqueueFillBuffer,
+  clEnqueueFillImage,
+  clEnqueueMigrateMemObjects,
   clEnqueueMarkerWithWaitList,
   clEnqueueBarrierWithWaitList,
   NULL, // clGetExtensionFunctionAddressForPlatform
diff --git a/src/gallium/state_trackers/clover/api/kernel.cpp 
b/src/gallium/state_trackers/clover/api/kernel.cpp
index 857a152..0011b9f 100644
--- a/src/gallium/state_trackers/clover/api/kernel.cpp
+++ b/src/gallium/state_trackers/clover/api/kernel.cpp
@@ -189,6 +189,14 @@ clGetKernelWorkGroupInfo(cl_kernel d_kern, cl_device_id 
d_dev,
return CL_INVALID_DEVICE;
 }
 
+CLOVER_API cl_int
+clGetKernelArgInfo(cl_kernel d_kern,
+   cl_uint idx, cl_kernel_arg_info param,
+   size_t size, void *r_buf, size_t *r_size) {
+   NOT_SUPPORTED_BY_CL_1_1(clGetKernelArgInfo)
+   return CL_KERNEL_ARG_INFO_NOT_AVAILABLE;
+}
+
 namespace {
///
/// Common argument checking shared by kernel invocation commands.
diff --git a/src/gallium/state_trackers/clover/api/memory.cpp 
b/src/gallium/state_trackers/clover/api/memory.cpp
index 3ff6ba0..ca6c669 100644
--- a/src/gallium/state_trackers/clover/api/memory.cpp
+++ b/src/gallium/state_trackers/clover/api/memory.cpp
@@ -358,8 +358,29 @@ clCreateImage(cl_context d_ctx, cl_mem_flags flags,
   const cl_image_desc *image_desc,
   void *host_ptr, cl_int *r_errcode) {
// This function was added in OpenCL 1.2
-   std::cerr  CL user error: clCreateImage() not supported by OpenCL 1.1. 

-std::endl;
+   NOT_SUPPORTED_BY_CL_1_1(clCreateImage)
ret_error(r_errcode, CL_INVALID_OPERATION);
return NULL;
 }
+
+CLOVER_API cl_int
+clEnqueueFillBuffer(cl_command_queue command_queue, cl_mem buffer,
+const void *pattern, size_t pattern_size,
+size_t offset, size_t size,
+cl_uint num_events_in_wait_list,
+const cl_event *event_wait_list,
+cl_event *event) {
+   NOT_SUPPORTED_BY_CL_1_1(clEnqueueFillBuffer)
+   return CL_INVALID_VALUE;
+}
+
+CLOVER_API cl_int
+clEnqueueFillImage(cl_command_queue command_queue, cl_mem image,
+   const void *fill_color,
+   const size_t *origin, const size_t *region,
+   cl_uint num_events_in_wait_list,
+   const cl_event *event_wait_list,
+   cl_event *event) {
+   NOT_SUPPORTED_BY_CL_1_1(clEnqueueFillImage)
+   return CL_INVALID_VALUE;
+}
diff --git a/src/gallium/state_trackers/clover/api/program.cpp 
b/src/gallium/state_trackers/clover/api/program.cpp
index e9b1f38..1de5e29 100644
--- a/src/gallium/state_trackers/clover/api/program.cpp
+++ b/src/gallium/state_trackers/clover/api/program.cpp
@@ -231,6 +231,16 @@ clCompileProgram(cl_program d_prog, cl_uint num_devs,
return e.get();
 }
 
+CLOVER_API cl_program
+clLinkProgram(cl_context d_ctx, cl_uint num_devs, const cl_device_id *d_devs,
+  const char *p_opts, cl_uint num_progs, const cl_program *d_progs,
+  void (*pfn_notify) (cl_program, void *), void *user_data,
+  cl_int *r_errcode) {
+   NOT_SUPPORTED_BY_CL_1_1(clLinkProgram)
+   ret_error(r_errcode, CL_LINKER_NOT_AVAILABLE);
+   return NULL;
+}
+
 CLOVER_API cl_int
 clUnloadCompiler() {
return CL_SUCCESS;
diff --git a/src/gallium/state_trackers/clover/api/transfer.cpp 
b/src/gallium/state_trackers/clover/api/transfer.cpp
index fdb9405..fb1790a 100644
--- a/src/gallium/state_trackers/clover/api/transfer.cpp
+++ b/src/gallium/state_trackers/clover/api/transfer.cpp
@@ -726,3 +726,15 @@ clEnqueueUnmapMemObject(cl_command_queue d_q, cl_mem 
d_mem, void *ptr,
 } catch (error e) {
return e.get();
 }
+
+CLOVER_API cl_int
+clEnqueueMigrateMemObjects(cl_command_queue 

[Mesa-dev] [PATCH 3/3 v4.2] clover: add clLinkProgramm (CL 1.2)

2015-07-26 Thread EdB
---
 src/gallium/state_trackers/clover/api/program.cpp  | 33 ++
 src/gallium/state_trackers/clover/core/program.hpp |  4 +--
 2 files changed, 35 insertions(+), 2 deletions(-)

diff --git a/src/gallium/state_trackers/clover/api/program.cpp 
b/src/gallium/state_trackers/clover/api/program.cpp
index 553bc83..4176562 100644
--- a/src/gallium/state_trackers/clover/api/program.cpp
+++ b/src/gallium/state_trackers/clover/api/program.cpp
@@ -238,6 +238,39 @@ clCompileProgram(cl_program d_prog, cl_uint num_devs,
return e.get();
 }
 
+CLOVER_API cl_program
+clLinkProgram(cl_context d_ctx, cl_uint num_devs, const cl_device_id *d_devs,
+  const char *p_opts, cl_uint num_progs, const cl_program *d_progs,
+  void (*pfn_notify) (cl_program, void *), void *user_data,
+  cl_int *r_errcode) try {
+   auto ctx = obj(d_ctx);
+   auto devs = (d_devs ? objs(d_devs, num_devs) :
+ref_vectordevice(ctx.devices()));
+   auto opts = (p_opts ? p_opts : );
+   auto progs = objs(d_progs, num_progs);
+
+   if (!pfn_notify  user_data)
+ throw error(CL_INVALID_VALUE);
+
+   if (any_of([](const device dev) {
+return !count(dev, ctx.devices());
+ }, objsallow_empty_tag(d_devs, num_devs)))
+  throw error(CL_INVALID_DEVICE);
+
+   auto prog = createprogram(ctx);
+   try {
+  prog().link(devs, opts, progs);
+  ret_error(r_errcode, CL_SUCCESS);
+   } catch (link_error e) {
+  ret_error(r_errcode, CL_LINK_PROGRAM_FAILURE);
+   }
+
+   return ret_object(prog);
+} catch (error e) {
+   ret_error(r_errcode, e);
+   return NULL;
+}
+
 CLOVER_API cl_int
 clUnloadCompiler() {
return CL_SUCCESS;
diff --git a/src/gallium/state_trackers/clover/core/program.hpp 
b/src/gallium/state_trackers/clover/core/program.hpp
index 7d86018..a70ed08 100644
--- a/src/gallium/state_trackers/clover/core/program.hpp
+++ b/src/gallium/state_trackers/clover/core/program.hpp
@@ -40,8 +40,8 @@ namespace clover {
   program(clover::context ctx,
   const std::string source);
   program(clover::context ctx,
-  const ref_vectordevice devs,
-  const std::vectormodule binaries);
+  const ref_vectordevice devs = {},
+  const std::vectormodule binaries = {});
 
   program(const program prog) = delete;
   program 
-- 
2.5.0.rc2

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 3/3 v4.1] clover: add clLinkProgramm (CL 1.2)

2015-07-25 Thread EdB
---
 src/gallium/state_trackers/clover/api/program.cpp | 33 +++
 1 file changed, 33 insertions(+)

diff --git a/src/gallium/state_trackers/clover/api/program.cpp 
b/src/gallium/state_trackers/clover/api/program.cpp
index 553bc83..086f952 100644
--- a/src/gallium/state_trackers/clover/api/program.cpp
+++ b/src/gallium/state_trackers/clover/api/program.cpp
@@ -238,6 +238,39 @@ clCompileProgram(cl_program d_prog, cl_uint num_devs,
return e.get();
 }
 
+CLOVER_API cl_program
+clLinkProgram(cl_context d_ctx, cl_uint num_devs, const cl_device_id *d_devs,
+  const char *p_opts, cl_uint num_progs, const cl_program *d_progs,
+  void (*pfn_notify) (cl_program, void *), void *user_data,
+  cl_int *r_errcode) try {
+   auto ctx = obj(d_ctx);
+   auto devs = (d_devs ? objs(d_devs, num_devs) :
+ref_vectordevice(ctx.devices()));
+   auto opts = (p_opts ? p_opts : );
+   auto progs = objs(d_progs, num_progs);
+
+   if (!pfn_notify  user_data)
+ throw error(CL_INVALID_VALUE);
+
+   if (any_of([](const device dev) {
+return !count(dev, ctx.devices());
+ }, objsallow_empty_tag(d_devs, num_devs)))
+  throw error(CL_INVALID_DEVICE);
+
+   auto prog = intrusive_refprogram(*(new program(ctx, {}, {})));
+   try {
+  prog().link(devs, opts, progs);
+  ret_error(r_errcode, CL_SUCCESS);;
+   } catch (link_error e) {
+  ret_error(r_errcode, CL_LINK_PROGRAM_FAILURE);
+   }
+
+   return ret_object(prog);
+} catch (error e) {
+   ret_error(r_errcode, e);
+   return NULL;
+}
+
 CLOVER_API cl_int
 clUnloadCompiler() {
return CL_SUCCESS;
-- 
2.5.0.rc2

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 3/3] clover: add clLinkProgramm (CL 1.2)

2015-07-18 Thread EdB
---
 src/gallium/state_trackers/clover/api/program.cpp  | 35 ++
 src/gallium/state_trackers/clover/core/error.hpp   |  7 +
 src/gallium/state_trackers/clover/core/program.cpp |  4 +++
 src/gallium/state_trackers/clover/core/program.hpp |  1 +
 .../state_trackers/clover/llvm/invocation.cpp  |  2 +-
 5 files changed, 48 insertions(+), 1 deletion(-)

diff --git a/src/gallium/state_trackers/clover/api/program.cpp 
b/src/gallium/state_trackers/clover/api/program.cpp
index 553bc83..7573933 100644
--- a/src/gallium/state_trackers/clover/api/program.cpp
+++ b/src/gallium/state_trackers/clover/api/program.cpp
@@ -238,6 +238,41 @@ clCompileProgram(cl_program d_prog, cl_uint num_devs,
return e.get();
 }
 
+CLOVER_API cl_program
+clLinkProgram (cl_context d_ctx, cl_uint num_devs, const cl_device_id *d_devs,
+   const char *p_opts, cl_uint num_progs, const cl_program 
*d_progs,
+   void (*pfn_notify) (cl_program, void *), void *user_data,
+   cl_int *r_errcode) try {
+   auto ctx = obj(d_ctx);
+   auto devs = (d_devs ? objs(d_devs, num_devs) :
+ref_vectordevice(ctx.devices()));
+   auto opts = (p_opts ? p_opts : );
+   auto progs = objs(d_progs, num_progs);
+
+   if ((!pfn_notify  user_data))
+ throw error(CL_INVALID_VALUE);
+
+   if (any_of([](const device dev) {
+return !count(dev, ctx.devices());
+ }, objsallow_empty_tag(d_devs, num_devs)))
+  throw error(CL_INVALID_DEVICE);
+
+   auto prog = createprogram(ctx);
+   try {
+  prog().link(devs, opts, progs);
+  *r_errcode = CL_SUCCESS;
+   } catch (link_options_error e) {
+  throw;
+   } catch (error e) {
+  *r_errcode = CL_LINK_PROGRAM_FAILURE;
+   }
+
+   return ret_object(prog);
+} catch (error e) {
+   ret_error(r_errcode, e);
+   return NULL;
+}
+
 CLOVER_API cl_int
 clUnloadCompiler() {
return CL_SUCCESS;
diff --git a/src/gallium/state_trackers/clover/core/error.hpp 
b/src/gallium/state_trackers/clover/core/error.hpp
index 4ec619c..f6c55a3 100644
--- a/src/gallium/state_trackers/clover/core/error.hpp
+++ b/src/gallium/state_trackers/clover/core/error.hpp
@@ -79,6 +79,13 @@ namespace clover {
   }
};
 
+   class link_options_error : public error {
+   public:
+  link_options_error(const std::string what = ) :
+ error(CL_INVALID_LINKER_OPTIONS , what) {
+  }
+   };
+
templatetypename O
class invalid_object_error;
 
diff --git a/src/gallium/state_trackers/clover/core/program.cpp 
b/src/gallium/state_trackers/clover/core/program.cpp
index 4aa2622..61fb603 100644
--- a/src/gallium/state_trackers/clover/core/program.cpp
+++ b/src/gallium/state_trackers/clover/core/program.cpp
@@ -24,6 +24,10 @@
 
 using namespace clover;
 
+program::program(clover::context ctx) :
+   has_source(false), context(ctx), _kernel_ref_counter(0) {
+}
+
 program::program(clover::context ctx, const std::string source) :
has_source(true), context(ctx), _source(source), _kernel_ref_counter(0) {
 }
diff --git a/src/gallium/state_trackers/clover/core/program.hpp 
b/src/gallium/state_trackers/clover/core/program.hpp
index 7d86018..c24ad83 100644
--- a/src/gallium/state_trackers/clover/core/program.hpp
+++ b/src/gallium/state_trackers/clover/core/program.hpp
@@ -37,6 +37,7 @@ namespace clover {
  evals, const std::vectorintrusive_refdevice  device_range;
 
public:
+  program(clover::context ctx);
   program(clover::context ctx,
   const std::string source);
   program(clover::context ctx,
diff --git a/src/gallium/state_trackers/clover/llvm/invocation.cpp 
b/src/gallium/state_trackers/clover/llvm/invocation.cpp
index d115f15..2bf7775 100644
--- a/src/gallium/state_trackers/clover/llvm/invocation.cpp
+++ b/src/gallium/state_trackers/clover/llvm/invocation.cpp
@@ -782,7 +782,7 @@ clover::link_program_llvm(const std::vectormodule 
modules,
clang::CompilerInstance c;
if (!create_from_arg_llvm(c, target, options, s_log)) {
   r_log = log;
-  throw error(CL_INVALID_LINKER_OPTIONS);
+  throw link_options_error();
}
 
llvm::Module linked_mod(link, llvm_ctx);
-- 
2.5.0.rc2

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 1/3] clover: separate compile and link stages

2015-07-18 Thread EdB
---
 src/gallium/state_trackers/clover/api/program.cpp  |  19 +-
 .../state_trackers/clover/core/compiler.hpp|   7 +-
 src/gallium/state_trackers/clover/core/error.hpp   |   7 +
 src/gallium/state_trackers/clover/core/program.cpp |  41 +++-
 src/gallium/state_trackers/clover/core/program.hpp |   4 +-
 .../state_trackers/clover/llvm/invocation.cpp  | 270 +++--
 6 files changed, 257 insertions(+), 91 deletions(-)

diff --git a/src/gallium/state_trackers/clover/api/program.cpp 
b/src/gallium/state_trackers/clover/api/program.cpp
index e9b1f38..553bc83 100644
--- a/src/gallium/state_trackers/clover/api/program.cpp
+++ b/src/gallium/state_trackers/clover/api/program.cpp
@@ -181,13 +181,20 @@ clBuildProgram(cl_program d_prog, cl_uint num_devs,
 
validate_build_program_common(prog, num_devs, d_devs, pfn_notify, 
user_data);
 
-   prog.build(devs, opts);
+   if (prog.has_source) {
+  prog.compile(devs, opts);
+  prog.link(devs, opts, { prog });
+   }
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;
+   switch (e.get()) {
+  case CL_INVALID_COMPILER_OPTIONS:
+  case CL_INVALID_LINKER_OPTIONS:
+ return CL_INVALID_BUILD_OPTIONS;
+  case CL_COMPILE_PROGRAM_FAILURE:
+  case CL_LINK_PROGRAM_FAILURE:
+ return CL_BUILD_PROGRAM_FAILURE;
+   }
return e.get();
 }
 
@@ -224,7 +231,7 @@ clCompileProgram(cl_program d_prog, cl_uint num_devs,
   range(header_names, num_headers),
   objsallow_empty_tag(d_header_progs, num_headers));
 
-   prog.build(devs, opts, headers);
+   prog.compile(devs, opts, headers);
return CL_SUCCESS;
 
 } catch (error e) {
diff --git a/src/gallium/state_trackers/clover/core/compiler.hpp 
b/src/gallium/state_trackers/clover/core/compiler.hpp
index 2076417..0d6766a 100644
--- a/src/gallium/state_trackers/clover/core/compiler.hpp
+++ b/src/gallium/state_trackers/clover/core/compiler.hpp
@@ -32,11 +32,16 @@ namespace clover {
 
module compile_program_llvm(const std::string source,
const header_map headers,
-   pipe_shader_ir ir,
const std::string target,
const std::string opts,
std::string r_log);
 
+   module link_program_llvm(const std::vectormodule modules,
+enum pipe_shader_ir ir,
+const std::string target,
+const std::string opts,
+std::string r_log);
+
module compile_program_tgsi(const std::string source,
std::string r_log);
 }
diff --git a/src/gallium/state_trackers/clover/core/error.hpp 
b/src/gallium/state_trackers/clover/core/error.hpp
index 59a5af4..4ec619c 100644
--- a/src/gallium/state_trackers/clover/core/error.hpp
+++ b/src/gallium/state_trackers/clover/core/error.hpp
@@ -72,6 +72,13 @@ namespace clover {
   }
};
 
+   class link_error : public error {
+   public:
+  link_error(const std::string what = ) :
+ error(CL_LINK_PROGRAM_FAILURE , what) {
+  }
+   };
+
templatetypename O
class invalid_object_error;
 
diff --git a/src/gallium/state_trackers/clover/core/program.cpp 
b/src/gallium/state_trackers/clover/core/program.cpp
index 6eebd9c..4aa2622 100644
--- a/src/gallium/state_trackers/clover/core/program.cpp
+++ b/src/gallium/state_trackers/clover/core/program.cpp
@@ -40,8 +40,8 @@ program::program(clover::context ctx,
 }
 
 void
-program::build(const ref_vectordevice devs, const char *opts,
-   const header_map headers) {
+program::compile(const ref_vectordevice devs, const std::string opts,
+ const header_map headers) {
if (has_source) {
   _devices = devs;
 
@@ -58,9 +58,7 @@ program::build(const ref_vectordevice devs, const char 
*opts,
 auto module = (dev.ir_format() == PIPE_SHADER_IR_TGSI ?
compile_program_tgsi(_source, log) :
compile_program_llvm(_source, headers,
-dev.ir_format(),
-dev.ir_target(), 
build_opts(dev),
-log));
+dev.ir_target(), opts, log));
 _binaries.insert({ dev, module });
 _logs.insert({ dev, log });
  } catch (const error ) {
@@ -71,6 +69,39 @@ program::build(const ref_vectordevice devs, const char 
*opts,
}
 }
 
+void
+program::link(const ref_vectordevice devs, const std::string opts,
+  const ref_vectorprogram progs) {
+   _devices = devs;
+
+   for (auto dev : devs) {
+  if (dev.ir_format() == PIPE_SHADER_IR_TGSI)
+ 

[Mesa-dev] [PATCH 0/3 v4] add clLinkProgram

2015-07-18 Thread EdB
This serie add OpenCL 1.2 clLinkProgram.
However, it lacks the binary type part that is mandatory for input validation
and also for CL_PROGRAM_BINARY_TYPE query. This will be adressed
in another serie once we agree on the way to store it.

EdB (3):
  clover: separate compile and link stages
  clover: override ret_object
  clover: add clLinkProgramm (CL 1.2)

 src/gallium/state_trackers/clover/api/program.cpp  |  54 -
 src/gallium/state_trackers/clover/api/util.hpp |  12 +
 .../state_trackers/clover/core/compiler.hpp|   7 +-
 src/gallium/state_trackers/clover/core/error.hpp   |  14 ++
 src/gallium/state_trackers/clover/core/program.cpp |  45 +++-
 src/gallium/state_trackers/clover/core/program.hpp |   5 +-
 .../state_trackers/clover/llvm/invocation.cpp  | 270 +++--
 7 files changed, 316 insertions(+), 91 deletions(-)

-- 
2.5.0.rc2

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 2/3] clover: override ret_object

2015-07-18 Thread EdB
Return an API object from an intrusive reference to a Clover object,
incrementing the reference count of the object.

Reviewed-by: Francisco Jerez curroje...@riseup.net
---
 src/gallium/state_trackers/clover/api/util.hpp | 12 
 1 file changed, 12 insertions(+)

diff --git a/src/gallium/state_trackers/clover/api/util.hpp 
b/src/gallium/state_trackers/clover/api/util.hpp
index 918df61..cb80a17 100644
--- a/src/gallium/state_trackers/clover/api/util.hpp
+++ b/src/gallium/state_trackers/clover/api/util.hpp
@@ -61,6 +61,18 @@ namespace clover {
  *p = desc(v());
   }
}
+
+   ///
+   /// Return an API object from an intrusive reference to a Clover object,
+   /// incrementing the reference count of the object.
+   ///
+   templatetypename T
+   typename T::descriptor_type *
+   ret_object(const intrusive_refT v) {
+  v().retain();
+  return desc(v());
+   }
+
 }
 
 #endif
-- 
2.5.0.rc2

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH] clover: replace --enable-opencl-icd with --with-opencl-icd

2015-07-12 Thread EdB
Hello

Would you prefer --enable-opencl-icd that install in 
$sysconfdir/OpenCL/vendors by default and can be forced to /etc/OpenCL/vendors 
with something like --enable-opencl-icd=standard-path?

EdB

On Wednesday 06 May 2015 23:34:26 EdB wrote:
 The standard ICD file path is /etc/OpenCL/vendor/.
 However it doesn't fit well with custom build.
 This option allow ICD vendor file installation path override
 ---
  configure.ac   | 46
 +++--- src/gallium/targets/opencl/Makefile.am |
  2 +-
  2 files changed, 33 insertions(+), 15 deletions(-)
 
 diff --git a/configure.ac b/configure.ac
 index 095e23e..90dba4e 100644
 --- a/configure.ac
 +++ b/configure.ac
 @@ -804,12 +804,6 @@ AC_ARG_ENABLE([opencl],
   [enable OpenCL library @:@default=disabled@:@])],
 [enable_opencl=$enableval],
 [enable_opencl=no])
 -AC_ARG_ENABLE([opencl_icd],
 -   [AS_HELP_STRING([--enable-opencl-icd],
 -  [Build an OpenCL ICD library to be loaded by an ICD
 implementation -   @:@default=disabled@:@])],
 -[enable_opencl_icd=$enableval],
 -[enable_opencl_icd=no])
  AC_ARG_ENABLE([xlib-glx],
  [AS_HELP_STRING([--enable-xlib-glx],
  [make GLX library Xlib-based instead of DRI-based
 @:@default=disabled@:@])], @@ -1689,19 +1683,11 @@ if test
 x$enable_opencl = xyes; then
  # XXX: Use $enable_shared_pipe_drivers once converted to use
 static/shared pipe-drivers enable_gallium_loader=yes
 
 -if test x$enable_opencl_icd = xyes; then
 -OPENCL_LIBNAME=MesaOpenCL
 -else
 -OPENCL_LIBNAME=OpenCL
 -fi
 -
  if test x$have_libelf != xyes; then
 AC_MSG_ERROR([Clover requires libelf])
  fi
  fi
  AM_CONDITIONAL(HAVE_CLOVER, test x$enable_opencl = xyes)
 -AM_CONDITIONAL(HAVE_CLOVER_ICD, test x$enable_opencl_icd = xyes)
 -AC_SUBST([OPENCL_LIBNAME])
 
  dnl
  dnl Gallium configuration
 @@ -2006,6 +1992,38 @@ AC_ARG_WITH([d3d-libdir],
  [D3D_DRIVER_INSTALL_DIR=${libdir}/d3d])
  AC_SUBST([D3D_DRIVER_INSTALL_DIR])
 
 +dnl OpenCL ICD
 +
 +AC_ARG_WITH([opencl-icd],
 +[AS_HELP_STRING([--with-opencl-icd=@:@no,standard,sysconfdir@:@],
 +[Build an OpenCL ICD library to be loaded by an ICD implementation.
 + If @:@standard@:@ the OpenCL ICD vendor file installs in
 /etc/OpenCL/vendors. + @:@sysconfdir@:@ installs the file in
 $sysconfdir/OpenCL/vendors + @:@default=no@:@])],
 +[OPENCL_ICD=$withval],
 +[OPENCL_ICD=no])
 +
 +case x$OPENCL_ICD in
 +xno)
 +OPENCL_LIBNAME=OpenCL
 +;;
 +xstandard)
 +OPENCL_LIBNAME=MesaOpenCL
 +ICD_FILE_DIR=/etc/OpenCL/vendors
 +;;
 +xsysconfdir)
 +OPENCL_LIBNAME=MesaOpenCL
 +ICD_FILE_DIR=$sysconfdir/OpenCL/vendors
 +;;
 +*)
 +AC_MSG_ERROR(['$OPENCL_ICD' is not a valid option for
 --with-opencl-icd]) +;;
 +esac
 +
 +AM_CONDITIONAL(HAVE_CLOVER_ICD, test x$OPENCL_ICD != xno)
 +AC_SUBST([OPENCL_LIBNAME])
 +AC_SUBST([ICD_FILE_DIR])
 +
  dnl
  dnl Gallium helper functions
  dnl
 diff --git a/src/gallium/targets/opencl/Makefile.am
 b/src/gallium/targets/opencl/Makefile.am index 5daf327..781daa0 100644
 --- a/src/gallium/targets/opencl/Makefile.am
 +++ b/src/gallium/targets/opencl/Makefile.am
 @@ -47,7 +47,7 @@ EXTRA_lib@OPENCL_LIBNAME@_la_DEPENDENCIES = opencl.sym
  EXTRA_DIST = mesa.icd opencl.sym
 
  if HAVE_CLOVER_ICD
 -icddir = /etc/OpenCL/vendors/
 +icddir = $(ICD_FILE_DIR)
  icd_DATA = mesa.icd
  endif

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH] clover: little OpenCL status code logging clean

2015-07-07 Thread EdB
s/build_error/compile_error in order to match the stored OpenCL status code.
Make program::build catch and log every OpenCL error.
Make tgsi error triggering uniform with the llvm one.
---
Note that compile_error class is keep for later use

 .../state_trackers/clover/core/compiler.hpp|  3 ++-
 src/gallium/state_trackers/clover/core/error.hpp   |  4 ++--
 src/gallium/state_trackers/clover/core/program.cpp |  4 ++--
 .../state_trackers/clover/llvm/invocation.cpp  | 18 +++---
 .../state_trackers/clover/tgsi/compiler.cpp| 28 +-
 5 files changed, 32 insertions(+), 25 deletions(-)

diff --git a/src/gallium/state_trackers/clover/core/compiler.hpp 
b/src/gallium/state_trackers/clover/core/compiler.hpp
index c68aa39..2076417 100644
--- a/src/gallium/state_trackers/clover/core/compiler.hpp
+++ b/src/gallium/state_trackers/clover/core/compiler.hpp
@@ -37,7 +37,8 @@ namespace clover {
const std::string opts,
std::string r_log);
 
-   module compile_program_tgsi(const std::string source);
+   module compile_program_tgsi(const std::string source,
+   std::string r_log);
 }
 
 #endif
diff --git a/src/gallium/state_trackers/clover/core/error.hpp 
b/src/gallium/state_trackers/clover/core/error.hpp
index 780b973..59a5af4 100644
--- a/src/gallium/state_trackers/clover/core/error.hpp
+++ b/src/gallium/state_trackers/clover/core/error.hpp
@@ -65,9 +65,9 @@ namespace clover {
   cl_int code;
};
 
-   class build_error : public error {
+   class compile_error : public error {
public:
-  build_error(const std::string what = ) :
+  compile_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 0d6cc40..6eebd9c 100644
--- a/src/gallium/state_trackers/clover/core/program.cpp
+++ b/src/gallium/state_trackers/clover/core/program.cpp
@@ -56,14 +56,14 @@ program::build(const ref_vectordevice devs, const char 
*opts,
 
  try {
 auto module = (dev.ir_format() == PIPE_SHADER_IR_TGSI ?
-   compile_program_tgsi(_source) :
+   compile_program_tgsi(_source, log) :
compile_program_llvm(_source, headers,
 dev.ir_format(),
 dev.ir_target(), 
build_opts(dev),
 log));
 _binaries.insert({ dev, module });
 _logs.insert({ dev, log });
- } catch (const build_error ) {
+ } catch (const error ) {
 _logs.insert({ dev, log });
 throw;
  }
diff --git a/src/gallium/state_trackers/clover/llvm/invocation.cpp 
b/src/gallium/state_trackers/clover/llvm/invocation.cpp
index 9b91fee..967284d 100644
--- a/src/gallium/state_trackers/clover/llvm/invocation.cpp
+++ b/src/gallium/state_trackers/clover/llvm/invocation.cpp
@@ -108,7 +108,7 @@ namespace {
  name, llvm::MemoryBuffer::getMemBuffer(source));
 
   if (!c.ExecuteAction(act))
- throw build_error(log);
+ throw compile_error(log);
}
 
module
@@ -256,7 +256,7 @@ namespace {
   r_log = log;
 
   if (!ExecSuccess)
- throw build_error();
+ throw compile_error();
 
   // Get address spaces map to be able to find kernel argument address 
space
   memcpy(address_spaces, c.getTarget().getAddressSpaceMap(),
@@ -485,7 +485,7 @@ namespace {
   LLVMDisposeMessage(err_message);
 
   if (err) {
- throw build_error();
+ throw compile_error();
   }
}
 
@@ -505,7 +505,7 @@ namespace {
   if (LLVMGetTargetFromTriple(triple.c_str(), target, error_message)) {
  r_log = std::string(error_message);
  LLVMDisposeMessage(error_message);
- throw build_error();
+ throw compile_error();
   }
 
   LLVMTargetMachineRef tm = LLVMCreateTargetMachine(
@@ -514,7 +514,7 @@ namespace {
 
   if (!tm) {
  r_log = Could not create TargetMachine:  + triple;
- throw build_error();
+ throw compile_error();
   }
 
   if (dump_asm) {
@@ -567,7 +567,7 @@ namespace {
 const char *name;
 if (gelf_getshdr(section, symtab_header) != symtab_header) {
r_log = Failed to read ELF section header.;
-   throw build_error();
+   throw compile_error();
 }
 name = elf_strptr(elf, section_str_index, symtab_header.sh_name);
if (!strcmp(name, .symtab)) {
@@ -577,9 +577,9 @@ namespace {
  }
  if (!symtab) {
 r_log = Unable to find symbol table.;
-throw build_error();
+throw compile_error();
  }
-  } 

[Mesa-dev] [PATCH 0/3 v3] clLinkProgram

2015-07-05 Thread EdB
This serie add OpenCL 1.2 clLinkProgram.
However, it lacks the binary type part that is mandatory for input validation
and also for CL_PROGRAM_BINARY_TYPE query. This will be adressed
in another serie once we agree on the way to store it.

EdB (3):
  clover: separate compile and link stages
  clover: override ret_object
  clover: add clLinkProgramm for CL 1.2

 src/gallium/state_trackers/clover/api/dispatch.cpp |   2 +-
 src/gallium/state_trackers/clover/api/program.cpp  |  37 ++-
 src/gallium/state_trackers/clover/api/util.hpp |  12 +
 .../state_trackers/clover/core/compiler.hpp|   7 +-
 src/gallium/state_trackers/clover/core/error.hpp   |  21 ++
 src/gallium/state_trackers/clover/core/program.cpp |  97 ++-
 src/gallium/state_trackers/clover/core/program.hpp |  11 +-
 .../state_trackers/clover/llvm/invocation.cpp  | 281 +++--
 8 files changed, 372 insertions(+), 96 deletions(-)

-- 
2.4.3

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 2/3] clover: override ret_object

2015-07-05 Thread EdB
Return an API object from an intrusive smart reference Clover object,
incrementing the reference count of the object.
---
 src/gallium/state_trackers/clover/api/util.hpp | 12 
 1 file changed, 12 insertions(+)

diff --git a/src/gallium/state_trackers/clover/api/util.hpp 
b/src/gallium/state_trackers/clover/api/util.hpp
index 918df61..6af28f2 100644
--- a/src/gallium/state_trackers/clover/api/util.hpp
+++ b/src/gallium/state_trackers/clover/api/util.hpp
@@ -61,6 +61,18 @@ namespace clover {
  *p = desc(v());
   }
}
+
+   ///
+   /// Return an API object from an intrusive smart reference Clover object,
+   /// incrementing the reference count of the object.
+   ///
+   templatetypename T
+   typename T::descriptor_type *
+   ret_object(const intrusive_refT v) {
+  v().retain();
+  return desc(v());
+   }
+
 }
 
 #endif
-- 
2.4.3

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 0/3 v3] clLinkProgram

2015-07-05 Thread EdB
(resending because git send-email crashed)

This serie add OpenCL 1.2 clLinkProgram.
However, it lacks the binary type part that is mandatory for input validation
and also for CL_PROGRAM_BINARY_TYPE query. This will be adressed
in another serie once we agree on the way to store it.

EdB (3):
  clover: separate compile and link stages
  clover: override ret_object
  clover: add clLinkProgramm for CL 1.2

 src/gallium/state_trackers/clover/api/dispatch.cpp |   2 +-
 src/gallium/state_trackers/clover/api/program.cpp  |  37 ++-
 src/gallium/state_trackers/clover/api/util.hpp |  12 +
 .../state_trackers/clover/core/compiler.hpp|   7 +-
 src/gallium/state_trackers/clover/core/error.hpp   |  21 ++
 src/gallium/state_trackers/clover/core/program.cpp |  97 ++-
 src/gallium/state_trackers/clover/core/program.hpp |  11 +-
 .../state_trackers/clover/llvm/invocation.cpp  | 281 +++--
 8 files changed, 372 insertions(+), 96 deletions(-)

-- 
2.4.3

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 1/3] clover: separate compile and link stages

2015-07-05 Thread EdB
---
 src/gallium/state_trackers/clover/api/program.cpp  |   6 +-
 .../state_trackers/clover/core/compiler.hpp|   7 +-
 src/gallium/state_trackers/clover/core/error.hpp   |  21 ++
 src/gallium/state_trackers/clover/core/program.cpp |  93 ++-
 src/gallium/state_trackers/clover/core/program.hpp |  10 +-
 .../state_trackers/clover/llvm/invocation.cpp  | 281 +++--
 6 files changed, 323 insertions(+), 95 deletions(-)

diff --git a/src/gallium/state_trackers/clover/api/program.cpp 
b/src/gallium/state_trackers/clover/api/program.cpp
index e9b1f38..2441d81 100644
--- a/src/gallium/state_trackers/clover/api/program.cpp
+++ b/src/gallium/state_trackers/clover/api/program.cpp
@@ -184,10 +184,6 @@ 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();
 }
 
@@ -224,7 +220,7 @@ clCompileProgram(cl_program d_prog, cl_uint num_devs,
   range(header_names, num_headers),
   objsallow_empty_tag(d_header_progs, num_headers));
 
-   prog.build(devs, opts, headers);
+   prog.compile(devs, opts, headers);
return CL_SUCCESS;
 
 } catch (error e) {
diff --git a/src/gallium/state_trackers/clover/core/compiler.hpp 
b/src/gallium/state_trackers/clover/core/compiler.hpp
index c68aa39..31fb6ee 100644
--- a/src/gallium/state_trackers/clover/core/compiler.hpp
+++ b/src/gallium/state_trackers/clover/core/compiler.hpp
@@ -32,11 +32,16 @@ namespace clover {
 
module compile_program_llvm(const std::string source,
const header_map headers,
-   pipe_shader_ir ir,
const std::string target,
const std::string opts,
std::string r_log);
 
+   module link_program_llvm(const std::vectormodule modules,
+enum pipe_shader_ir ir,
+const std::string target,
+const std::string opts,
+std::string r_log);
+
module compile_program_tgsi(const std::string source);
 }
 
diff --git a/src/gallium/state_trackers/clover/core/error.hpp 
b/src/gallium/state_trackers/clover/core/error.hpp
index 780b973..3c1bf90 100644
--- a/src/gallium/state_trackers/clover/core/error.hpp
+++ b/src/gallium/state_trackers/clover/core/error.hpp
@@ -68,10 +68,31 @@ namespace clover {
class build_error : public error {
public:
   build_error(const std::string what = ) :
+ error(CL_BUILD_PROGRAM_FAILURE, what) {
+  }
+   };
+
+   class compile_error : public error {
+   public:
+  compile_error(const std::string what = ) :
  error(CL_COMPILE_PROGRAM_FAILURE, what) {
   }
};
 
+   class link_error : public error {
+   public:
+  link_error(const std::string what = ) :
+ error(CL_LINK_PROGRAM_FAILURE, what) {
+  }
+   };
+
+   class link_option_error : public error {
+   public:
+  link_option_error(const std::string what = ) :
+ error(CL_INVALID_LINKER_OPTIONS , what) {
+  }
+   };
+
templatetypename O
class invalid_object_error;
 
diff --git a/src/gallium/state_trackers/clover/core/program.cpp 
b/src/gallium/state_trackers/clover/core/program.cpp
index 0d6cc40..21faf4e 100644
--- a/src/gallium/state_trackers/clover/core/program.cpp
+++ b/src/gallium/state_trackers/clover/core/program.cpp
@@ -40,15 +40,37 @@ program::program(clover::context ctx,
 }
 
 void
-program::build(const ref_vectordevice devs, const char *opts,
-   const header_map headers) {
+program::build(const ref_vectordevice devs, const char *opts) {
+
+   if (has_source) {
+  try {
+ compile(devs, opts, {});
+ if (!link(devs, opts, {*this}, true))
+throw error(CL_BUILD_PROGRAM_FAILURE);
+  } catch (error e) {
+ switch (e.get()) {
+case CL_INVALID_COMPILER_OPTIONS:
+case CL_INVALID_LINKER_OPTIONS:
+   e = error(CL_INVALID_BUILD_OPTIONS);
+   break;
+case CL_COMPILE_PROGRAM_FAILURE:
+case CL_LINK_PROGRAM_FAILURE:
+   e = error(CL_BUILD_PROGRAM_FAILURE);
+   break;
+ }
+ throw;
+  }
+   }
+}
+
+void
+program::compile(const ref_vectordevice devs, const char *opts,
+ const header_map headers) {
if (has_source) {
   _devices = devs;
 
   for (auto dev : devs) {
- _binaries.erase(dev);
- _logs.erase(dev);
- _opts.erase(dev);
+ clean(dev);
 
  _opts.insert({ dev, opts });
 
@@ -58,12 +80,11 @@ program::build(const ref_vectordevice devs, const char 
*opts,
 auto module = (dev.ir_format() == PIPE_SHADER_IR_TGSI ?
  

[Mesa-dev] [PATCH 3/3] clover: add clLinkProgramm for CL 1.2

2015-07-05 Thread EdB
---
 src/gallium/state_trackers/clover/api/dispatch.cpp |  2 +-
 src/gallium/state_trackers/clover/api/program.cpp  | 31 ++
 src/gallium/state_trackers/clover/core/program.cpp |  4 +++
 src/gallium/state_trackers/clover/core/program.hpp |  1 +
 4 files changed, 37 insertions(+), 1 deletion(-)

diff --git a/src/gallium/state_trackers/clover/api/dispatch.cpp 
b/src/gallium/state_trackers/clover/api/dispatch.cpp
index b5a4094..44bff4f 100644
--- a/src/gallium/state_trackers/clover/api/dispatch.cpp
+++ b/src/gallium/state_trackers/clover/api/dispatch.cpp
@@ -123,7 +123,7 @@ namespace clover {
   clCreateImage,
   clCreateProgramWithBuiltInKernels,
   clCompileProgram,
-  NULL, // clLinkProgram
+  clLinkProgram,
   clUnloadPlatformCompiler,
   NULL, // clGetKernelArgInfo
   NULL, // clEnqueueFillBuffer
diff --git a/src/gallium/state_trackers/clover/api/program.cpp 
b/src/gallium/state_trackers/clover/api/program.cpp
index 2441d81..d532b66 100644
--- a/src/gallium/state_trackers/clover/api/program.cpp
+++ b/src/gallium/state_trackers/clover/api/program.cpp
@@ -227,6 +227,37 @@ clCompileProgram(cl_program d_prog, cl_uint num_devs,
return e.get();
 }
 
+CLOVER_API cl_program
+clLinkProgram (cl_context d_ctx, cl_uint num_devs, const cl_device_id *d_devs,
+   const char *p_opts, cl_uint num_progs, const cl_program 
*d_progs,
+   void (*pfn_notify) (cl_program, void *), void *user_data,
+   cl_int *r_errcode) try {
+   auto ctx = obj(d_ctx);
+   auto devs = (d_devs ? objs(d_devs, num_devs) :
+ref_vectordevice(ctx.devices()));
+   auto opts = (p_opts ? p_opts : );
+   auto progs = objs(d_progs, num_progs);
+
+   if ((!pfn_notify  user_data))
+ throw error(CL_INVALID_VALUE);
+
+   if (any_of([](const device dev) {
+return !count(dev, ctx.devices());
+ }, objsallow_empty_tag(d_devs, num_devs)))
+  throw error(CL_INVALID_DEVICE);
+
+   auto prog = createprogram(ctx);
+   if (prog().link(devs, opts, progs))
+  *r_errcode = CL_SUCCESS;
+   else
+  *r_errcode = CL_LINK_PROGRAM_FAILURE;
+
+   return ret_object(prog);
+} catch (error e) {
+   ret_error(r_errcode, e);
+   return NULL;
+}
+
 CLOVER_API cl_int
 clUnloadCompiler() {
return CL_SUCCESS;
diff --git a/src/gallium/state_trackers/clover/core/program.cpp 
b/src/gallium/state_trackers/clover/core/program.cpp
index 21faf4e..825537f 100644
--- a/src/gallium/state_trackers/clover/core/program.cpp
+++ b/src/gallium/state_trackers/clover/core/program.cpp
@@ -24,6 +24,10 @@
 
 using namespace clover;
 
+program::program(clover::context ctx) :
+   has_source(false), context(ctx), _kernel_ref_counter(0) {
+}
+
 program::program(clover::context ctx, const std::string source) :
has_source(true), context(ctx), _source(source), _kernel_ref_counter(0) {
 }
diff --git a/src/gallium/state_trackers/clover/core/program.hpp 
b/src/gallium/state_trackers/clover/core/program.hpp
index 314979b..a1036b7 100644
--- a/src/gallium/state_trackers/clover/core/program.hpp
+++ b/src/gallium/state_trackers/clover/core/program.hpp
@@ -37,6 +37,7 @@ namespace clover {
  evals, const std::vectorintrusive_refdevice  device_range;
 
public:
+  program(clover::context ctx);
   program(clover::context ctx,
   const std::string source);
   program(clover::context ctx,
-- 
2.4.3

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH 1/3] clover: separate compile and link stages

2015-07-05 Thread EdB
On Sunday 05 July 2015 18:15:33 Francisco Jerez wrote:
 Hi EdB, a bunch of comments inline,

Hello

 
 EdB edb+m...@sigluy.net writes:
  ---
  
   src/gallium/state_trackers/clover/api/program.cpp  |   6 +-
   .../state_trackers/clover/core/compiler.hpp|   7 +-
   src/gallium/state_trackers/clover/core/error.hpp   |  21 ++
   src/gallium/state_trackers/clover/core/program.cpp |  93 ++-
   src/gallium/state_trackers/clover/core/program.hpp |  10 +-
   .../state_trackers/clover/llvm/invocation.cpp  | 281
   +++-- 6 files changed, 323 insertions(+), 95
   deletions(-)
  
  diff --git a/src/gallium/state_trackers/clover/api/program.cpp
  b/src/gallium/state_trackers/clover/api/program.cpp index
  e9b1f38..2441d81 100644
  --- a/src/gallium/state_trackers/clover/api/program.cpp
  +++ b/src/gallium/state_trackers/clover/api/program.cpp
  @@ -184,10 +184,6 @@ clBuildProgram(cl_program d_prog, cl_uint num_devs,
  
  prog.build(devs, opts);
 
 I don't think there's any reason to keep the program::build method
 around anymore, it's only going to be called from this entry point so
 you could as well make the two function calls to ::compile() and
 
 ::link() directly from here.

ok

 ::
  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();
   
   }
  
  @@ -224,7 +220,7 @@ clCompileProgram(cl_program d_prog, cl_uint num_devs,
  
 range(header_names, num_headers),
 objsallow_empty_tag(d_header_progs, num_headers));
  
  -   prog.build(devs, opts, headers);
  +   prog.compile(devs, opts, headers);
  
  return CL_SUCCESS;
   
   } catch (error e) {
  
  diff --git a/src/gallium/state_trackers/clover/core/compiler.hpp
  b/src/gallium/state_trackers/clover/core/compiler.hpp index
  c68aa39..31fb6ee 100644
  --- a/src/gallium/state_trackers/clover/core/compiler.hpp
  +++ b/src/gallium/state_trackers/clover/core/compiler.hpp
  @@ -32,11 +32,16 @@ namespace clover {
  
  module compile_program_llvm(const std::string source,
  
  const header_map headers,
  
  -   pipe_shader_ir ir,
  
  const std::string target,
  const std::string opts,
  std::string r_log);
  
  +   module link_program_llvm(const std::vectormodule modules,
  +enum pipe_shader_ir ir,
  +const std::string target,
  +const std::string opts,
  +std::string r_log);
  +
  
  module compile_program_tgsi(const std::string source);
   
   }
  
  diff --git a/src/gallium/state_trackers/clover/core/error.hpp
  b/src/gallium/state_trackers/clover/core/error.hpp index 780b973..3c1bf90
  100644
  --- a/src/gallium/state_trackers/clover/core/error.hpp
  +++ b/src/gallium/state_trackers/clover/core/error.hpp
  @@ -68,10 +68,31 @@ namespace clover {
  
  class build_error : public error {
  
  public:
 build_error(const std::string what = ) :
  + error(CL_BUILD_PROGRAM_FAILURE, what) {
  +  }
  +   };
  +
 
 This exception class now seems redundant -- With program::build() gone
 build is no longer a thing.

It's still needed by tgsi.
I plan to rework this part later to make it consistent with the way it's 
handle in llvm/invocation but first off I wanted to be done with clLink :/

 
  +   class compile_error : public error {
  +   public:
  
  +  compile_error(const std::string what = ) :
error(CL_COMPILE_PROGRAM_FAILURE, what) {
 
 }
  
  };
  
  +   class link_error : public error {
  +   public:
  +  link_error(const std::string what = ) :
  + error(CL_LINK_PROGRAM_FAILURE, what) {
  +  }
  +   };
  +
  +   class link_option_error : public error {
  +   public:
  +  link_option_error(const std::string what = ) :
  + error(CL_INVALID_LINKER_OPTIONS , what) {
  +  }
  +   };
  +
 
 I don't think you really need to special-case link_option_error against
 the less specific clover::error class?

clLinkProgram should not create a program if it failed to parse the given 
options, I will use this class to handle this case. Other case should create 
the said program.
That said, it could also have been created in later patch.

 
  templatetypename O
  class invalid_object_error;
  
  diff --git a/src/gallium/state_trackers/clover/core/program.cpp
  b/src/gallium/state_trackers/clover/core/program.cpp index
  0d6cc40..21faf4e 100644
  --- a/src/gallium/state_trackers/clover/core/program.cpp
  +++ b/src/gallium/state_trackers/clover/core/program.cpp
  @@ -40,15 +40,37 @@ program::program(clover::context ctx,
  
   }
   
   void

[Mesa-dev] [PATCH 3/3] clover: add clLinkProgram

2015-06-13 Thread EdB
---
 src/gallium/state_trackers/clover/api/dispatch.cpp |   2 +-
 src/gallium/state_trackers/clover/api/program.cpp  |  31 +++
 .../state_trackers/clover/core/compiler.hpp|   6 +
 src/gallium/state_trackers/clover/core/error.hpp   |   7 +
 src/gallium/state_trackers/clover/core/program.cpp |  48 +
 src/gallium/state_trackers/clover/core/program.hpp |   3 +
 .../state_trackers/clover/llvm/invocation.cpp  | 219 -
 7 files changed, 270 insertions(+), 46 deletions(-)

diff --git a/src/gallium/state_trackers/clover/api/dispatch.cpp 
b/src/gallium/state_trackers/clover/api/dispatch.cpp
index b5a4094..44bff4f 100644
--- a/src/gallium/state_trackers/clover/api/dispatch.cpp
+++ b/src/gallium/state_trackers/clover/api/dispatch.cpp
@@ -123,7 +123,7 @@ namespace clover {
   clCreateImage,
   clCreateProgramWithBuiltInKernels,
   clCompileProgram,
-  NULL, // clLinkProgram
+  clLinkProgram,
   clUnloadPlatformCompiler,
   NULL, // clGetKernelArgInfo
   NULL, // clEnqueueFillBuffer
diff --git a/src/gallium/state_trackers/clover/api/program.cpp 
b/src/gallium/state_trackers/clover/api/program.cpp
index 204d047..b8394f8 100644
--- a/src/gallium/state_trackers/clover/api/program.cpp
+++ b/src/gallium/state_trackers/clover/api/program.cpp
@@ -231,6 +231,37 @@ clCompileProgram(cl_program d_prog, cl_uint num_devs,
return e.get();
 }
 
+CLOVER_API cl_program
+clLinkProgram (cl_context d_ctx, cl_uint num_devs, const cl_device_id *d_devs,
+   const char *p_opts, cl_uint num_progs, const cl_program 
*d_progs,
+   void (*pfn_notify) (cl_program, void *), void *user_data,
+   cl_int *r_errcode) try {
+   auto ctx = obj(d_ctx);
+   auto devs = (d_devs ? objs(d_devs, num_devs) :
+ref_vectordevice(ctx.devices()));
+   auto opts = (p_opts ? p_opts : );
+   auto progs = objs(d_progs, num_progs);
+
+   if ((!pfn_notify  user_data))
+ throw error(CL_INVALID_VALUE);
+
+   if (any_of([](const device dev) {
+return !count(dev, ctx.devices());
+ }, objsallow_empty_tag(d_devs, num_devs)))
+  throw error(CL_INVALID_DEVICE);
+
+   auto prog = createprogram(ctx);
+   if (prog().link(devs, opts, progs))
+  *r_errcode = CL_SUCCESS;
+   else
+  *r_errcode = CL_LINK_PROGRAM_FAILURE;
+
+   return ret_object(prog);
+} catch (error e) {
+   ret_error(r_errcode, e);
+   return NULL;
+}
+
 CLOVER_API cl_int
 clUnloadCompiler() {
return CL_SUCCESS;
diff --git a/src/gallium/state_trackers/clover/core/compiler.hpp 
b/src/gallium/state_trackers/clover/core/compiler.hpp
index 9072ae3..faf110b 100644
--- a/src/gallium/state_trackers/clover/core/compiler.hpp
+++ b/src/gallium/state_trackers/clover/core/compiler.hpp
@@ -42,6 +42,12 @@ namespace clover {
const std::string opts,
std::string r_log);
 
+   module link_program_llvm(const std::vectormodule modules,
+  pipe_shader_ir ir,
+  const std::string target,
+  const std::string opts,
+  std::string r_log);
+
module build_program_tgsi(const std::string source);
 }
 
diff --git a/src/gallium/state_trackers/clover/core/error.hpp 
b/src/gallium/state_trackers/clover/core/error.hpp
index 780b973..abeb523 100644
--- a/src/gallium/state_trackers/clover/core/error.hpp
+++ b/src/gallium/state_trackers/clover/core/error.hpp
@@ -72,6 +72,13 @@ namespace clover {
   }
};
 
+   class link_option_error : public error {
+   public:
+  link_option_error(const std::string what = ) :
+ error(CL_INVALID_LINKER_OPTIONS, what) {
+  }
+   };
+
templatetypename O
class invalid_object_error;
 
diff --git a/src/gallium/state_trackers/clover/core/program.cpp 
b/src/gallium/state_trackers/clover/core/program.cpp
index f4bc6a9..45ec1c8 100644
--- a/src/gallium/state_trackers/clover/core/program.cpp
+++ b/src/gallium/state_trackers/clover/core/program.cpp
@@ -24,6 +24,10 @@
 
 using namespace clover;
 
+program::program(clover::context ctx) :
+   has_source(false), context(ctx), _kernel_ref_counter(0) {
+}
+
 program::program(clover::context ctx, const std::string source) :
has_source(true), context(ctx), _source(source), _kernel_ref_counter(0) {
 }
@@ -95,6 +99,50 @@ program::compile(const ref_vectordevice devs, const char 
*opts,
}
 }
 
+bool
+program::link(const ref_vectordevice devs, const char *opts,
+  const ref_vectorprogram progs) {
+   assert(!has_source);
+
+   bool r = true;
+
+   _devices = devs;
+
+   for (auto dev : devs) {
+  clean(dev);
+
+  _opts.insert({ dev, opts });
+
+  std::vectormodule mods;
+  mods.reserve(progs.size());
+  for (auto prog : progs)
+ mods.push_back(prog.binary(dev));
+
+  if (mods.size() == 0) {
+ _logs.insert({ dev, Nothing to link.});
+ r = false;
+ 

[Mesa-dev] [PATCH 1/3] clover: seperate build and compile stages

2015-06-13 Thread EdB
they shouldn't produce the same output
---
 src/gallium/state_trackers/clover/api/program.cpp  |  2 +-
 .../state_trackers/clover/core/compiler.hpp|  9 +++-
 src/gallium/state_trackers/clover/core/program.cpp | 46 +---
 src/gallium/state_trackers/clover/core/program.hpp |  5 +-
 .../state_trackers/clover/llvm/invocation.cpp  | 61 --
 .../state_trackers/clover/tgsi/compiler.cpp|  2 +-
 6 files changed, 110 insertions(+), 15 deletions(-)

diff --git a/src/gallium/state_trackers/clover/api/program.cpp 
b/src/gallium/state_trackers/clover/api/program.cpp
index e9b1f38..204d047 100644
--- a/src/gallium/state_trackers/clover/api/program.cpp
+++ b/src/gallium/state_trackers/clover/api/program.cpp
@@ -224,7 +224,7 @@ clCompileProgram(cl_program d_prog, cl_uint num_devs,
   range(header_names, num_headers),
   objsallow_empty_tag(d_header_progs, num_headers));
 
-   prog.build(devs, opts, headers);
+   prog.compile(devs, opts, headers);
return CL_SUCCESS;
 
 } catch (error e) {
diff --git a/src/gallium/state_trackers/clover/core/compiler.hpp 
b/src/gallium/state_trackers/clover/core/compiler.hpp
index c68aa39..9072ae3 100644
--- a/src/gallium/state_trackers/clover/core/compiler.hpp
+++ b/src/gallium/state_trackers/clover/core/compiler.hpp
@@ -30,14 +30,19 @@
 namespace clover {
typedef std::vectorstd::pairstd::string, std::string  header_map;
 
+   module build_program_llvm(const std::string source,
+   pipe_shader_ir ir,
+   const std::string target,
+   const std::string opts,
+   std::string r_log);
+
module compile_program_llvm(const std::string source,
const header_map headers,
-   pipe_shader_ir ir,
const std::string target,
const std::string opts,
std::string r_log);
 
-   module compile_program_tgsi(const std::string source);
+   module build_program_tgsi(const std::string source);
 }
 
 #endif
diff --git a/src/gallium/state_trackers/clover/core/program.cpp 
b/src/gallium/state_trackers/clover/core/program.cpp
index 0d6cc40..f4bc6a9 100644
--- a/src/gallium/state_trackers/clover/core/program.cpp
+++ b/src/gallium/state_trackers/clover/core/program.cpp
@@ -40,15 +40,12 @@ program::program(clover::context ctx,
 }
 
 void
-program::build(const ref_vectordevice devs, const char *opts,
-   const header_map headers) {
+program::build(const ref_vectordevice devs, const char *opts) {
if (has_source) {
   _devices = devs;
 
   for (auto dev : devs) {
- _binaries.erase(dev);
- _logs.erase(dev);
- _opts.erase(dev);
+ clean(dev);
 
  _opts.insert({ dev, opts });
 
@@ -56,8 +53,8 @@ program::build(const ref_vectordevice devs, const char 
*opts,
 
  try {
 auto module = (dev.ir_format() == PIPE_SHADER_IR_TGSI ?
-   compile_program_tgsi(_source) :
-   compile_program_llvm(_source, headers,
+   build_program_tgsi(_source) :
+   build_program_llvm(_source,
 dev.ir_format(),
 dev.ir_target(), 
build_opts(dev),
 log));
@@ -71,6 +68,41 @@ program::build(const ref_vectordevice devs, const char 
*opts,
}
 }
 
+void
+program::compile(const ref_vectordevice devs, const char *opts,
+ const header_map headers) {
+   if (has_source) {
+  _devices = devs;
+
+  for (auto dev : devs) {
+ clean(dev);
+
+ _opts.insert({ dev, opts });
+
+ std::string log;
+
+ try {
+auto module = compile_program_llvm(_source, headers,
+  dev.ir_target(), 
build_opts(dev),
+  log);
+_binaries.insert({ dev, module });
+_logs.insert({ dev, log });
+ } catch (const build_error ) {
+_logs.insert({ dev, log });
+throw;
+ }
+  }
+   }
+}
+
+
+void
+program::clean(const device *dev) {
+   _binaries.erase(dev);
+   _logs.erase(dev);
+   _opts.erase(dev);;
+}
+
 const std::string 
 program::source() const {
return _source;
diff --git a/src/gallium/state_trackers/clover/core/program.hpp 
b/src/gallium/state_trackers/clover/core/program.hpp
index 183145e..b8a06aa 100644
--- a/src/gallium/state_trackers/clover/core/program.hpp
+++ b/src/gallium/state_trackers/clover/core/program.hpp
@@ -47,7 +47,8 @@ namespace clover {
   program 
   operator=(const program prog) = delete;
 
-  void build(const ref_vectordevice devs, const char *opts,
+  void build(const 

[Mesa-dev] [PATCH 0/3] clLinkProgram

2015-06-13 Thread EdB
EdB (3):
  clover: seperate build and compile stages
  clover: override ret_object
  clover: add clLinkProgram

 src/gallium/state_trackers/clover/api/dispatch.cpp |   2 +-
 src/gallium/state_trackers/clover/api/program.cpp  |  33 ++-
 src/gallium/state_trackers/clover/api/util.hpp |  12 +
 .../state_trackers/clover/core/compiler.hpp|  15 +-
 src/gallium/state_trackers/clover/core/error.hpp   |   7 +
 src/gallium/state_trackers/clover/core/program.cpp |  94 +++-
 src/gallium/state_trackers/clover/core/program.hpp |   8 +-
 .../state_trackers/clover/llvm/invocation.cpp  | 266 +
 .../state_trackers/clover/tgsi/compiler.cpp|   2 +-
 9 files changed, 385 insertions(+), 54 deletions(-)

-- 
2.4.3

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 2/3] clover: override ret_object

2015-06-13 Thread EdB
Return an API object from an intrusive smart reference Clover object,
incrementing the reference count of the object.
---
 src/gallium/state_trackers/clover/api/util.hpp | 12 
 1 file changed, 12 insertions(+)

diff --git a/src/gallium/state_trackers/clover/api/util.hpp 
b/src/gallium/state_trackers/clover/api/util.hpp
index 918df61..6af28f2 100644
--- a/src/gallium/state_trackers/clover/api/util.hpp
+++ b/src/gallium/state_trackers/clover/api/util.hpp
@@ -61,6 +61,18 @@ namespace clover {
  *p = desc(v());
   }
}
+
+   ///
+   /// Return an API object from an intrusive smart reference Clover object,
+   /// incrementing the reference count of the object.
+   ///
+   templatetypename T
+   typename T::descriptor_type *
+   ret_object(const intrusive_refT v) {
+  v().retain();
+  return desc(v());
+   }
+
 }
 
 #endif
-- 
2.4.3

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH] clover: log build options when dumping clc source

2015-05-11 Thread EdB
---
 src/gallium/state_trackers/clover/llvm/invocation.cpp | 6 --
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/src/gallium/state_trackers/clover/llvm/invocation.cpp 
b/src/gallium/state_trackers/clover/llvm/invocation.cpp
index 7d2d941..fc7ab9c 100644
--- a/src/gallium/state_trackers/clover/llvm/invocation.cpp
+++ b/src/gallium/state_trackers/clover/llvm/invocation.cpp
@@ -708,8 +708,10 @@ clover::compile_program_llvm(const std::string source,
 
llvm_ctx.setDiagnosticHandler(diagnostic_handler, r_log);
 
-   if (get_debug_flags()  DBG_CLC)
-  debug_log(source, .cl);
+   if (get_debug_flags()  DBG_CLC) {
+  const std::string src = // Build options:  + opts + '\n' + source;
+  debug_log(src, .cl);
+   }
 
// The input file name must have the .cl extension in order for the
// CompilerInvocation class to recognize it as an OpenCL source file.
-- 
2.1.0

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH] clover: replace --enable-opencl-icd with --with-opencl-icd

2015-05-07 Thread EdB

Le 2015-05-07 18:55, Aaron Watry a écrit :

I'm not sure what the final consensus will be on how to do this, but
FWIW:
Tested-By: Aaron Watry awa...@gmail.com

I've tested this with 4 combinations:
no --with-opencl-icd option specified : libOpenCL.so gets installed in
${prefix}/lib
--with-opencl-icd=no : libOpenCL.so gets installed in ${prefix}/lib
--with-opencl-icd=standard : libMesaOpenCL.so installed in
${prefix}/lib, icd in /etc/OpenCL/vendors/mesa.icd
--with-opencl-icd=sysconfdir : libMesaOpenCL.so installed in
${prefix}/lib, icd in ${prefix}/etc//mesa.icd.  I only specified
--prefix, no other directories overridden in configure command.



thanks

  EdB


--Aaron

 

On Wed, May 6, 2015 at 4:34 PM, EdB edb+m...@sigluy.net wrote:


The standard ICD file path is /etc/OpenCL/vendor/.
However it doesn't fit well with custom build.
This option allow ICD vendor file installation path override
---
 configure.ac [1]                           | 46
+++---
 src/gallium/targets/opencl/Makefile.am |  2 +-
 2 files changed, 33 insertions(+), 15 deletions(-)

diff --git a/configure.ac [1] b/configure.ac [1]
index 095e23e..90dba4e 100644
--- a/configure.ac [1]
+++ b/configure.ac [1]
@@ -804,12 +804,6 @@ AC_ARG_ENABLE([opencl],
          [enable OpenCL library @:@default=disabled@:@])],
    [enable_opencl=$enableval],
    [enable_opencl=no])
-AC_ARG_ENABLE([opencl_icd],
-   [AS_HELP_STRING([--enable-opencl-icd],
-          [Build an OpenCL ICD library to be loaded by an ICD
implementation
-           @:@default=disabled@:@])],
-    [enable_opencl_icd=$enableval],
-    [enable_opencl_icd=no])
 AC_ARG_ENABLE([xlib-glx],
     [AS_HELP_STRING([--enable-xlib-glx],
         [make GLX library Xlib-based instead of DRI-based
@:@default=disabled@:@])],
@@ -1689,19 +1683,11 @@ if test x$enable_opencl = xyes; then
     # XXX: Use $enable_shared_pipe_drivers once converted to
use static/shared pipe-drivers
     enable_gallium_loader=yes

-    if test x$enable_opencl_icd = xyes; then
-        OPENCL_LIBNAME=MesaOpenCL
-    else
-        OPENCL_LIBNAME=OpenCL
-    fi
-
     if test x$have_libelf != xyes; then
        AC_MSG_ERROR([Clover requires libelf])
     fi
 fi
 AM_CONDITIONAL(HAVE_CLOVER, test x$enable_opencl = xyes)
-AM_CONDITIONAL(HAVE_CLOVER_ICD, test x$enable_opencl_icd = xyes)
-AC_SUBST([OPENCL_LIBNAME])

 dnl
 dnl Gallium configuration
@@ -2006,6 +1992,38 @@ AC_ARG_WITH([d3d-libdir],
     [D3D_DRIVER_INSTALL_DIR=${libdir}/d3d])
 AC_SUBST([D3D_DRIVER_INSTALL_DIR])

+dnl OpenCL ICD
+
+AC_ARG_WITH([opencl-icd],
+   
[AS_HELP_STRING([--with-opencl-icd=@:@no,standard,sysconfdir@:@],
+        [Build an OpenCL ICD library to be loaded by an ICD
implementation.
+         If @:@standard@:@ the OpenCL ICD vendor file
installs in /etc/OpenCL/vendors.
+         @:@sysconfdir@:@ installs the file in
$sysconfdir/OpenCL/vendors
+         @:@default=no@:@])],
+    [OPENCL_ICD=$withval],
+    [OPENCL_ICD=no])
+
+case x$OPENCL_ICD in
+xno)
+    OPENCL_LIBNAME=OpenCL
+    ;;
+xstandard)
+    OPENCL_LIBNAME=MesaOpenCL
+    ICD_FILE_DIR=/etc/OpenCL/vendors
+    ;;
+xsysconfdir)
+    OPENCL_LIBNAME=MesaOpenCL
+    ICD_FILE_DIR=$sysconfdir/OpenCL/vendors
+    ;;
+*)
+    AC_MSG_ERROR(['$OPENCL_ICD' is not a valid option for
--with-opencl-icd])
+    ;;
+esac
+
+AM_CONDITIONAL(HAVE_CLOVER_ICD, test x$OPENCL_ICD != xno)
+AC_SUBST([OPENCL_LIBNAME])
+AC_SUBST([ICD_FILE_DIR])
+
 dnl
 dnl Gallium helper functions
 dnl
diff --git a/src/gallium/targets/opencl/Makefile.am
b/src/gallium/targets/opencl/Makefile.am
index 5daf327..781daa0 100644
--- a/src/gallium/targets/opencl/Makefile.am
+++ b/src/gallium/targets/opencl/Makefile.am
@@ -47,7 +47,7 @@ EXTRA_lib@OPENCL_LIBNAME@_la_DEPENDENCIES =
opencl.sym
 EXTRA_DIST = mesa.icd opencl.sym

 if HAVE_CLOVER_ICD
-icddir = /etc/OpenCL/vendors/
+icddir = $(ICD_FILE_DIR)
 icd_DATA = mesa.icd
 endif

--
2.1.0

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev [2]




Links:
--
[1] http://configure.ac
[2] http://lists.freedesktop.org/mailman/listinfo/mesa-dev

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH] clover: replace --enable-opencl-icd with --with-opencl-icd

2015-05-06 Thread EdB
The standard ICD file path is /etc/OpenCL/vendor/.
However it doesn't fit well with custom build.
This option allow ICD vendor file installation path override
---
 configure.ac   | 46 +++---
 src/gallium/targets/opencl/Makefile.am |  2 +-
 2 files changed, 33 insertions(+), 15 deletions(-)

diff --git a/configure.ac b/configure.ac
index 095e23e..90dba4e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -804,12 +804,6 @@ AC_ARG_ENABLE([opencl],
  [enable OpenCL library @:@default=disabled@:@])],
[enable_opencl=$enableval],
[enable_opencl=no])
-AC_ARG_ENABLE([opencl_icd],
-   [AS_HELP_STRING([--enable-opencl-icd],
-  [Build an OpenCL ICD library to be loaded by an ICD implementation
-   @:@default=disabled@:@])],
-[enable_opencl_icd=$enableval],
-[enable_opencl_icd=no])
 AC_ARG_ENABLE([xlib-glx],
 [AS_HELP_STRING([--enable-xlib-glx],
 [make GLX library Xlib-based instead of DRI-based 
@:@default=disabled@:@])],
@@ -1689,19 +1683,11 @@ if test x$enable_opencl = xyes; then
 # XXX: Use $enable_shared_pipe_drivers once converted to use static/shared 
pipe-drivers
 enable_gallium_loader=yes
 
-if test x$enable_opencl_icd = xyes; then
-OPENCL_LIBNAME=MesaOpenCL
-else
-OPENCL_LIBNAME=OpenCL
-fi
-
 if test x$have_libelf != xyes; then
AC_MSG_ERROR([Clover requires libelf])
 fi
 fi
 AM_CONDITIONAL(HAVE_CLOVER, test x$enable_opencl = xyes)
-AM_CONDITIONAL(HAVE_CLOVER_ICD, test x$enable_opencl_icd = xyes)
-AC_SUBST([OPENCL_LIBNAME])
 
 dnl
 dnl Gallium configuration
@@ -2006,6 +1992,38 @@ AC_ARG_WITH([d3d-libdir],
 [D3D_DRIVER_INSTALL_DIR=${libdir}/d3d])
 AC_SUBST([D3D_DRIVER_INSTALL_DIR])
 
+dnl OpenCL ICD
+
+AC_ARG_WITH([opencl-icd],
+[AS_HELP_STRING([--with-opencl-icd=@:@no,standard,sysconfdir@:@],
+[Build an OpenCL ICD library to be loaded by an ICD implementation.
+ If @:@standard@:@ the OpenCL ICD vendor file installs in 
/etc/OpenCL/vendors.
+ @:@sysconfdir@:@ installs the file in $sysconfdir/OpenCL/vendors
+ @:@default=no@:@])],
+[OPENCL_ICD=$withval],
+[OPENCL_ICD=no])
+
+case x$OPENCL_ICD in
+xno)
+OPENCL_LIBNAME=OpenCL
+;;
+xstandard)
+OPENCL_LIBNAME=MesaOpenCL
+ICD_FILE_DIR=/etc/OpenCL/vendors
+;;
+xsysconfdir)
+OPENCL_LIBNAME=MesaOpenCL
+ICD_FILE_DIR=$sysconfdir/OpenCL/vendors
+;;
+*)
+AC_MSG_ERROR(['$OPENCL_ICD' is not a valid option for --with-opencl-icd])
+;;
+esac
+
+AM_CONDITIONAL(HAVE_CLOVER_ICD, test x$OPENCL_ICD != xno)
+AC_SUBST([OPENCL_LIBNAME])
+AC_SUBST([ICD_FILE_DIR])
+
 dnl
 dnl Gallium helper functions
 dnl
diff --git a/src/gallium/targets/opencl/Makefile.am 
b/src/gallium/targets/opencl/Makefile.am
index 5daf327..781daa0 100644
--- a/src/gallium/targets/opencl/Makefile.am
+++ b/src/gallium/targets/opencl/Makefile.am
@@ -47,7 +47,7 @@ EXTRA_lib@OPENCL_LIBNAME@_la_DEPENDENCIES = opencl.sym
 EXTRA_DIST = mesa.icd opencl.sym
 
 if HAVE_CLOVER_ICD
-icddir = /etc/OpenCL/vendors/
+icddir = $(ICD_FILE_DIR)
 icd_DATA = mesa.icd
 endif
 
-- 
2.1.0

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH] clover: add --with-icd-file-dir option

2015-05-02 Thread EdB
The standard ICD file path is /etc/OpenCL/vendor/.
However it doesn't fit well with custom build.
This option allow ICD vendor file installation path override
---
 configure.ac   | 6 ++
 src/gallium/targets/opencl/Makefile.am | 2 +-
 2 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/configure.ac b/configure.ac
index 095e23e..bf08d76 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2005,6 +2005,12 @@ AC_ARG_WITH([d3d-libdir],
 [D3D_DRIVER_INSTALL_DIR=$withval],
 [D3D_DRIVER_INSTALL_DIR=${libdir}/d3d])
 AC_SUBST([D3D_DRIVER_INSTALL_DIR])
+AC_ARG_WITH([icd-file-dir],
+[AS_HELP_STRING([--with-icd-file-dir=DIR],
+[directory for the OpenCL ICD vendor file 
@:@/etc/OpenCL/vendors@:@])],
+[ICD_FILE_INSTALL_DIR=$withval],
+[ICD_FILE_INSTALL_DIR=/etc/OpenCL/vendors])
+AC_SUBST([ICD_FILE_INSTALL_DIR])
 
 dnl
 dnl Gallium helper functions
diff --git a/src/gallium/targets/opencl/Makefile.am 
b/src/gallium/targets/opencl/Makefile.am
index 5daf327..9f0e58e 100644
--- a/src/gallium/targets/opencl/Makefile.am
+++ b/src/gallium/targets/opencl/Makefile.am
@@ -47,7 +47,7 @@ EXTRA_lib@OPENCL_LIBNAME@_la_DEPENDENCIES = opencl.sym
 EXTRA_DIST = mesa.icd opencl.sym
 
 if HAVE_CLOVER_ICD
-icddir = /etc/OpenCL/vendors/
+icddir = $(ICD_FILE_INSTALL_DIR)
 icd_DATA = mesa.icd
 endif
 
-- 
2.1.0

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 4/4] clover: remove util/compat

2015-04-29 Thread EdB


---
 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(-)
 delete mode 100644 src/gallium/state_trackers/clover/util/compat.hpp

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 sstream
+
 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_matrixunsigned char() = 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::vectorstd::pairstd::string,
-   std::string  header_map;
+   typedef std::vectorstd::pairstd::string, std::string  
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 stdexcept

-#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_ptrcommand_queue _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/state_trackers/clover/core/module.cpp
+++ b/src/gallium/state_trackers/clover/core/module.cpp
@@ -21,6 +21,7 @@
 //

 #include type_traits
+#include iostream

 #include core/module.hpp

@@ -33,20 +34,20 @@ namespace {
/// Serialize the specified object.
templatetypename T
 

[Mesa-dev] [PATCH 1/4] clover: remove compat classes that match std one

2015-04-24 Thread EdB
---
 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(-)
 delete mode 100644 src/gallium/state_trackers/clover/util/compat.cpp

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::paircompat::string, compat::string(
+headers.push_back(std::paircompat::string, compat::string(
  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::vectorcompat::paircompat::string,
+   typedef compat::vectorstd::paircompat::string,
compat::string  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 stdexcept
+
 #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..ea7d3a0 100644
--- a/src/gallium/state_trackers/clover/util/compat.hpp
+++ b/src/gallium/state_trackers/clover/util/compat.hpp
@@ -411,33 +411,6 @@ namespace clover {
   private:

[Mesa-dev] [PATCH 0/4] clover: this serie remove util/compat.*

2015-04-24 Thread EdB
Since clover should compile use -std=c++11,
compat classes are no longer neccessary

EdB (4):
  clover: remove compat class that matche std one
  clover: remove compat::string
  clover: make module::symbol::name a string
  clover: remove util/compat

 src/gallium/state_trackers/clover/Makefile.sources |   2 -
 src/gallium/state_trackers/clover/api/program.cpp  |  19 +-
 .../state_trackers/clover/core/compiler.hpp|  14 +-
 src/gallium/state_trackers/clover/core/error.hpp   |  10 +-
 src/gallium/state_trackers/clover/core/kernel.cpp  |   2 +-
 src/gallium/state_trackers/clover/core/module.cpp  |  56 ++-
 src/gallium/state_trackers/clover/core/module.hpp  |  23 +-
 src/gallium/state_trackers/clover/core/program.cpp |   4 +-
 src/gallium/state_trackers/clover/core/program.hpp |   2 +-
 .../state_trackers/clover/llvm/invocation.cpp  |  42 +-
 .../state_trackers/clover/tgsi/compiler.cpp|  12 +-
 src/gallium/state_trackers/clover/util/compat.cpp  |  38 --
 src/gallium/state_trackers/clover/util/compat.hpp  | 444 -
 13 files changed, 105 insertions(+), 563 deletions(-)
 delete mode 100644 src/gallium/state_trackers/clover/util/compat.cpp
 delete mode 100644 src/gallium/state_trackers/clover/util/compat.hpp

-- 
2.3.6

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 3/4] clover: make module::symbol::name a string

2015-04-24 Thread EdB
---
 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 _serializerstd::string {
+  static void
+  proc(compat::ostream os, const std::string s) {
+ _procuint32_t(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(_procuint32_t(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 _serializermodule::section {
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::vectorchar name, resource_id section,
+ symbol(const std::string name, resource_id section,
 size_t offset, const compat::vectorargument args) :
 name(name), section(section), offset(offset), args(args) { }
  symbol() : name(), section(0), offset(0), args() { }
 
- compat::vectorchar name;
+ std::string name;
  resource_id section;
  size_t offset;
  compat::vectorargument args;
-- 
2.3.6

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 2/4] clover: remove compat::string

2015-04-24 Thread EdB
---
 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::paircompat::string, compat::string(
+headers.push_back(std::pairstd::string, std::string(
  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::vectorstd::paircompat::string,
-   compat::string  header_map;
+   typedef compat::vectorstd::pairstd::string,
+   std::string  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_vectordevice 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) {
+ std::string r_log) {
   LLVMBool err;
   char *err_message = NULL;
 
@@ -491,7 +491,7 @@ namespace {
std::vectorchar
compile_native(const llvm::Module *mod, const std::string triple,
   const std::string processor, unsigned dump_asm,
-  compat::string r_log) {

Re: [Mesa-dev] [PATCH] clover: compile all sources with c++11

2015-04-21 Thread EdB
On Tuesday 21 April 2015 12:54:28 Emil Velikov wrote:
 On 20/04/15 21:34, EdB wrote:
  Later we can remove the compat code.
  ---
  
   src/gallium/state_trackers/clover/Makefile.am | 3 +--
   1 file changed, 1 insertion(+), 2 deletions(-)
  
  diff --git a/src/gallium/state_trackers/clover/Makefile.am
  b/src/gallium/state_trackers/clover/Makefile.am
  index 62c13fa..54b6fff 100644
  --- a/src/gallium/state_trackers/clover/Makefile.am
  +++ b/src/gallium/state_trackers/clover/Makefile.am
  @@ -3,6 +3,7 @@ AUTOMAKE_OPTIONS = subdir-objects
  
   include Makefile.sources
   
   AM_CPPFLAGS = \
  
  +   -std=c++11 \
 
 Strictly speaking this should is not part of the pre-processor flags and
 one should use the CXXFLAGS variable(s). Barring any bugs things should
 work as is, so I'll leave the decision up-to you :-)

Thanks, I'll change that in a v2
 
  $(GALLIUM_PIPE_LOADER_DEFINES) \
  -DPIPE_SEARCH_DIR=\$(libdir)/gallium-pipe\ \
  -I$(top_srcdir)/include \
  
  @@ -35,7 +36,6 @@ endif
  
   noinst_LTLIBRARIES = libclover.la libcltgsi.la libclllvm.la
 
 Now that all the code is built with c++11 does not make sense the have
 three separate static libraries ?

According to Francisco Jerez, it happen that some time llvm requiring exotic 
compilation flags and it would be preferable not to to contaminate the rest of 
clover build

 
 Thanks
 Emil

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH v2] clover: compile all sources with c++11

2015-04-21 Thread EdB
Later we can remove the compat code

According to Francisco Jerez, it happen that some time llvm requiring exotic
compilation flags and it would be preferable not to to contaminate the rest of
the clover build and keep the 3 statics libs
---
 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) \
-- 
2.4.0.rc2

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH] clover: compile all sources with c++11

2015-04-20 Thread EdB

Later we can remove the compat code.
---
 src/gallium/state_trackers/clover/Makefile.am | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/src/gallium/state_trackers/clover/Makefile.am 
b/src/gallium/state_trackers/clover/Makefile.am

index 62c13fa..54b6fff 100644
--- a/src/gallium/state_trackers/clover/Makefile.am
+++ b/src/gallium/state_trackers/clover/Makefile.am
@@ -3,6 +3,7 @@ AUTOMAKE_OPTIONS = subdir-objects
 include Makefile.sources

 AM_CPPFLAGS = \
+   -std=c++11 \
$(GALLIUM_PIPE_LOADER_DEFINES) \
-DPIPE_SEARCH_DIR=\$(libdir)/gallium-pipe\ \
-I$(top_srcdir)/include \
@@ -35,7 +36,6 @@ endif
 noinst_LTLIBRARIES = libclover.la libcltgsi.la libclllvm.la

 libcltgsi_la_CXXFLAGS = \
-   -std=c++0x \
$(VISIBILITY_CXXFLAGS)

 libcltgsi_la_SOURCES = $(TGSI_SOURCES)
@@ -51,7 +51,6 @@ libclllvm_la_CXXFLAGS = \
 libclllvm_la_SOURCES = $(LLVM_SOURCES)

 libclover_la_CXXFLAGS = \
-   -std=c++11 \
$(VISIBILITY_CXXFLAGS)
 libclover_la_LIBADD = \
--
2.4.0.rc2
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH v2 1/2] clover: make llvm = 3.5.0 and c++11 mandatory

2015-04-20 Thread EdB
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.
---
 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
-- 
2.1.0

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 1/2] clover: make llvm = 3.5.0 and c++11 mandatory

2015-04-19 Thread EdB
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.
---
 configure.ac  | 32 ---
 src/gallium/state_trackers/clover/Makefile.am |  6 ++---
 2 files changed, 17 insertions(+), 21 deletions(-)

diff --git a/configure.ac b/configure.ac
index 325b936..ff4eef3 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1865,6 +1865,13 @@ strip_unwanted_llvm_flags() {
-e 's/-fstack-protector-strong\//g'
 }
 
+llvm_check_for() {
+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
+}
+
+
 
 if test -z $with_gallium_drivers; then
 enable_gallium_llvm=no
@@ -1919,22 +1926,13 @@ if test x$enable_gallium_llvm = xyes; then
 fi
 
 if test x$enable_opencl = xyes; then
+LLVM_REQUIRED_VERSION_MAJOR=3
+LLVM_REQUIRED_VERSION_MINOR=5
+LLVM_REQUIRED_VERSION_PATCH=0
+llvm_check_for 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
@@ -2061,9 +2059,7 @@ radeon_llvm_check() {
 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_for $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
diff --git a/src/gallium/state_trackers/clover/Makefile.am 
b/src/gallium/state_trackers/clover/Makefile.am
index 62c13fa..3a45b9c 100644
--- a/src/gallium/state_trackers/clover/Makefile.am
+++ b/src/gallium/state_trackers/clover/Makefile.am
@@ -3,6 +3,7 @@ AUTOMAKE_OPTIONS = subdir-objects
 include Makefile.sources
 
 AM_CPPFLAGS = \
+-std=c++11 \
$(GALLIUM_PIPE_LOADER_DEFINES) \
-DPIPE_SEARCH_DIR=\$(libdir)/gallium-pipe\ \
-I$(top_srcdir)/include \
@@ -35,7 +36,6 @@ endif
 noinst_LTLIBRARIES = libclover.la libcltgsi.la libclllvm.la
 
 libcltgsi_la_CXXFLAGS = \
-   -std=c++0x \
$(VISIBILITY_CXXFLAGS)
 
 libcltgsi_la_SOURCES = $(TGSI_SOURCES)
@@ -48,10 +48,10 @@ libclllvm_la_CXXFLAGS = \
-DLIBCLC_LIBEXECDIR=\$(LIBCLC_LIBEXECDIR)/\ \
-DCLANG_RESOURCE_DIR=\$(CLANG_RESOURCE_DIR)\
 
-libclllvm_la_SOURCES = $(LLVM_SOURCES)
+libclllvm_la_SOURCES = \
+$(LLVM_SOURCES)
 
 libclover_la_CXXFLAGS = \
-   -std=c++11 \
$(VISIBILITY_CXXFLAGS)
 
 libclover_la_LIBADD = \
-- 
2.3.5

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH 0/7] clover: add clLinkProgram

2015-03-25 Thread EdB

Ping

Le 2014-12-14 11:31, EdB a écrit :

Hello,

This serie add the neccesary bits needed for clLinkProgram.
Patches from 1 to 2 are llvm/invocation.cpp little reorganisation.
Patches 3 to 5 rework our clCompileProgram implementation.
Patch 6 is for returning clover smart ptr to the API side.
Patch 7 finaly add clLinkProgram.

Patches from 1 to 6 are all neccesary to patch 7,
but they can be commited apart from clLinKProgram addition as there are 
clean up

and bug fixes in the current tree.

Please note that patch 7 only compile with llvm/clang 3.5 for the 
moment.
I was making it ready for 3.4 but it add lots of #ifdef and I found out 
that
master didn't even compile it for the moment. This is because 3.5 
enfore c++11

flags and that std::ofstream file(std:::string, ) is a c++11 addition.
Easy to fix but it went unnoticided until now.

I can come up with a 3.4 friendly v2 latter, but would appreciate your 
comments

on this version.
As I said 1 to 6 can be pushed before 7 as clean up and fixes.
And I also want to be sure 7 is the right way to go.

Regards
EdB

EdB (7):
  clover: move CLOVER_DEBUG stuff into anonymous ns
  clover: Dump the OpenCL C code earlier
  clover: split module::section::text
  clover: clCreateKernel now checks for executable
  clover: seperate build and compile
  clover: override ret_object
  clover: add clLinkProgram

 src/gallium/state_trackers/clover/api/dispatch.cpp |   2 +-
 src/gallium/state_trackers/clover/api/kernel.cpp   |   3 +
 src/gallium/state_trackers/clover/api/program.cpp  |  33 ++-
 src/gallium/state_trackers/clover/api/util.hpp |  11 +
 .../state_trackers/clover/core/compiler.hpp|  18 +-
 src/gallium/state_trackers/clover/core/error.hpp   |   7 +
 src/gallium/state_trackers/clover/core/kernel.cpp  |   2 +-
 src/gallium/state_trackers/clover/core/module.hpp  |   6 +-
 src/gallium/state_trackers/clover/core/program.cpp | 115 -
 src/gallium/state_trackers/clover/core/program.hpp |  10 +-
 .../state_trackers/clover/llvm/invocation.cpp  | 277 
++---

 .../state_trackers/clover/tgsi/compiler.cpp|   5 +-
 12 files changed, 427 insertions(+), 62 deletions(-)

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH] util: Predicate the fpclassify fallback on !defined(__cplusplus)

2015-01-28 Thread EdB
On Wednesday 28 January 2015 11:20:10 Tom Stellard wrote:
 On Wed, Jan 28, 2015 at 10:44:57AM -0800, Jason Ekstrand wrote:
  The problem is that the fallbacks we have at the moment don't work in C++.
  While we could theoretically fix the fallbacks it would also raise the
  issue of correctly detecting the fpclassify function.  So, for now, we'll
  just disable it until we actually have a C++ user.
 
 Tested-by: Tom Stellard thomas.stell...@amd.com
Tested-by: EdB edb+m...@sigluy.net
 
  Reported-by: Tom Stellard t...@stellard.net
 
 Should use my AMD email here too ^ or you can drop this line all together if
 you want.
 
 -Tom
 
  ---
  
   src/util/macros.h | 14 --
   1 file changed, 12 insertions(+), 2 deletions(-)
  
  diff --git a/src/util/macros.h b/src/util/macros.h
  index 180f2f6..74bd8bf 100644
  --- a/src/util/macros.h
  +++ b/src/util/macros.h
  @@ -158,7 +158,15 @@ do {   \
  
   #   endif
   #endif
  
  -#if defined(fpclassify)
  +/* The fallbacks below don't work correctly in C++ and properly detecting
  + * FP_NORMAL in C++ is hard.  Since we don't use fpclassify in any C++
  code + * at the moment, we can just predicate this whole thing by not
  being in + * C++ and we shoudld be ok.  If we ever want to use fpclassify
  in a C++ + * file, we will have to revisit this.
  + */
  +#ifndef __cplusplus
  +
  +#ifdef FP_NORMAL
  
   /* ISO C99 says that fpclassify is a macro.  Assume that any
   implementation
   
* of fpclassify, whether it's in a C99 compiler or not, will be a macro.
*/
  
  @@ -199,7 +207,7 @@ fpclassify(double x)
  
   #else
  
  -enum {FP_NAN, FP_INFINITE, FP_ZERO, FP_SUBNORMAL, FP_NORMAL}
  +static inline enum {FP_NAN, FP_INFINITE, FP_ZERO, FP_SUBNORMAL,
  FP_NORMAL}
  
   fpclassify(double x)
   {
   
  /* XXX do something better someday */
  
  @@ -208,4 +216,6 @@ fpclassify(double x)
  
   #endif
  
  +#endif /* __cplusplus */
  +
  
   #endif /* UTIL_MACROS_H */
 
 ___
 mesa-dev mailing list
 mesa-dev@lists.freedesktop.org
 http://lists.freedesktop.org/mailman/listinfo/mesa-dev

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH] clover: CL 1.2 add GetKernelArgInfo

2015-01-23 Thread EdB
---
 depends on clLinkProgram serie

 src/gallium/state_trackers/clover/api/dispatch.cpp |  2 +-
 src/gallium/state_trackers/clover/api/dispatch.hpp |  8 +-
 src/gallium/state_trackers/clover/api/kernel.cpp   | 51 
 src/gallium/state_trackers/clover/core/kernel.cpp  |  6 ++
 src/gallium/state_trackers/clover/core/kernel.hpp  |  1 +
 src/gallium/state_trackers/clover/core/module.hpp  | 17 +++-
 .../state_trackers/clover/llvm/invocation.cpp  | 95 +-
 7 files changed, 175 insertions(+), 5 deletions(-)

diff --git a/src/gallium/state_trackers/clover/api/dispatch.cpp 
b/src/gallium/state_trackers/clover/api/dispatch.cpp
index 44bff4f..c0388ec 100644
--- a/src/gallium/state_trackers/clover/api/dispatch.cpp
+++ b/src/gallium/state_trackers/clover/api/dispatch.cpp
@@ -125,7 +125,7 @@ namespace clover {
   clCompileProgram,
   clLinkProgram,
   clUnloadPlatformCompiler,
-  NULL, // clGetKernelArgInfo
+  clGetKernelArgInfo,
   NULL, // clEnqueueFillBuffer
   NULL, // clEnqueueFillImage
   NULL, // clEnqueueMigrateMemObjects
diff --git a/src/gallium/state_trackers/clover/api/dispatch.hpp 
b/src/gallium/state_trackers/clover/api/dispatch.hpp
index ffae1ae..ffe8556 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,
diff --git a/src/gallium/state_trackers/clover/api/kernel.cpp 
b/src/gallium/state_trackers/clover/api/kernel.cpp
index 4fe1756..7f4ae9d 100644
--- a/src/gallium/state_trackers/clover/api/kernel.cpp
+++ b/src/gallium/state_trackers/clover/api/kernel.cpp
@@ -148,6 +148,57 @@ clGetKernelInfo(cl_kernel d_kern, cl_kernel_info param,
 }
 
 CLOVER_API cl_int
+clGetKernelArgInfo(cl_kernel d_kern,
+   cl_uint idx, cl_kernel_arg_info param,
+   size_t size, void *r_buf, size_t *r_size) try {
+   property_buffer buf { r_buf, size, r_size };
+   const auto kern = obj(d_kern);
+   const auto args_info = kern.args_info();
+
+   if (args_info.size() == 0)
+  throw error(CL_KERNEL_ARG_INFO_NOT_AVAILABLE);
+
+   if (idx = args_info.size())
+  throw error(CL_INVALID_ARG_INDEX);
+
+   const auto info = args_info[idx];
+
+   switch (param) {
+   case CL_KERNEL_ARG_ADDRESS_QUALIFIER:
+  buf.as_scalarcl_kernel_arg_address_qualifier() =
+  info.address_qualifier;
+  break;
+
+   case CL_KERNEL_ARG_ACCESS_QUALIFIER:
+  buf.as_scalarcl_kernel_arg_access_qualifier() =
+  info.access_qualifier;
+  break;
+
+   case CL_KERNEL_ARG_TYPE_NAME:
+  buf.as_string() =
+  std::string(info.type_name.begin(), info.type_name.size());
+  break;
+
+   case CL_KERNEL_ARG_TYPE_QUALIFIER:
+  buf.as_scalarcl_kernel_arg_type_qualifier() = info.type_qualifier;
+  break;
+
+   case CL_KERNEL_ARG_NAME:
+  buf.as_string() =
+  std::string(info.arg_name.begin(), info.arg_name.size());
+  break;
+
+   default:
+  throw error(CL_INVALID_VALUE);
+   }
+
+   return CL_SUCCESS;
+
+} catch (error e) {
+   return e.get();
+}
+
+CLOVER_API cl_int
 clGetKernelWorkGroupInfo(cl_kernel d_kern, cl_device_id d_dev,
  cl_kernel_work_group_info param,
  size_t size, void *r_buf, size_t *r_size) try {
diff --git a/src/gallium/state_trackers/clover/core/kernel.cpp 
b/src/gallium/state_trackers/clover/core/kernel.cpp
index ed4b9b0..a212cc1 100644
--- a/src/gallium/state_trackers/clover/core/kernel.cpp
+++ b/src/gallium/state_trackers/clover/core/kernel.cpp
@@ -134,6 +134,12 @@ kernel::args() const {
return map(derefs(), _args);
 }
 
+compat::vectorclover::module::argument_info
+kernel::args_info() const {
+   auto syms = program().symbols();
+   return find(name_equals(_name), syms).args_info;
+}
+
 const module 
 kernel::module(const command_queue q) const {
return program().binary(q.device());
diff --git a/src/gallium/state_trackers/clover/core/kernel.hpp 
b/src/gallium/state_trackers/clover/core/kernel.hpp
index bf5998d..5ae4690 100644
--- a/src/gallium/state_trackers/clover/core/kernel.hpp
+++ b/src/gallium/state_trackers/clover/core/kernel.hpp
@@ -134,6 +134,7 @@ namespace clover {
 
   argument_range args();
   const_argument_range args() const;
+  compat::vectorclover::module::argument_info args_info() const;
 
   const 

[Mesa-dev] [PATCH 1/2] clover: support CL_PROGRAM_BINARY_TYPE (CL1.2)

2014-12-19 Thread EdB
CL_PROGRAM_BINARY_TYPE have been added to clGetProgramBuildInfo in CL1.2
---
 src/gallium/state_trackers/clover/api/program.cpp  |  4 +++
 src/gallium/state_trackers/clover/core/program.cpp | 31 +-
 src/gallium/state_trackers/clover/core/program.hpp |  1 +
 3 files changed, 29 insertions(+), 7 deletions(-)

diff --git a/src/gallium/state_trackers/clover/api/program.cpp 
b/src/gallium/state_trackers/clover/api/program.cpp
index be97ae5..9373fac 100644
--- a/src/gallium/state_trackers/clover/api/program.cpp
+++ b/src/gallium/state_trackers/clover/api/program.cpp
@@ -363,6 +363,10 @@ clGetProgramBuildInfo(cl_program d_prog, cl_device_id 
d_dev,
   buf.as_string() = prog.build_log(dev);
   break;
 
+   case CL_PROGRAM_BINARY_TYPE:
+  buf.as_scalarcl_program_binary_type() = prog.binary_type(dev);
+  break;
+
default:
   throw error(CL_INVALID_VALUE);
}
diff --git a/src/gallium/state_trackers/clover/core/program.cpp 
b/src/gallium/state_trackers/clover/core/program.cpp
index 8bece05..5fcde2c 100644
--- a/src/gallium/state_trackers/clover/core/program.cpp
+++ b/src/gallium/state_trackers/clover/core/program.cpp
@@ -147,14 +147,11 @@ program::has_executable() const {
 
 bool
 program::has_linkable(const device dev) const {
-   const auto bin = _binaries.find(dev);
+   cl_program_binary_type type = binary_type(dev);
 
-   if (bin != _binaries.end()) {
-  const auto secs = bin-second.secs;
-  if (any_of(type_equals(module::section::text_compiled), secs) ||
-  any_of(type_equals(module::section::text_library), secs))
- return true;
-   }
+   if (type == CL_PROGRAM_BINARY_TYPE_COMPILED_OBJECT ||
+   type == CL_PROGRAM_BINARY_TYPE_LIBRARY)
+  return true;
 
return false;
 }
@@ -192,6 +189,26 @@ program::build_log(const device dev) const {
return _logs.count(dev) ? _logs.find(dev)-second : ;
 }
 
+cl_program_binary_type
+program::binary_type(const device dev) const {
+   const auto bin = _binaries.find(dev);
+
+   if (bin != _binaries.end()) {
+  const auto secs = bin-second.secs;
+
+  if (any_of(type_equals(module::section::text_compiled), secs))
+ return CL_PROGRAM_BINARY_TYPE_COMPILED_OBJECT;
+
+  if (any_of(type_equals(module::section::text_library), secs))
+ return CL_PROGRAM_BINARY_TYPE_LIBRARY;
+
+  if (any_of(type_equals(module::section::text_executable), secs))
+ return CL_PROGRAM_BINARY_TYPE_EXECUTABLE;
+   }
+
+   return CL_PROGRAM_BINARY_TYPE_NONE;
+}
+
 const compat::vectormodule::symbol 
 program::symbols() const {
if (_binaries.empty())
diff --git a/src/gallium/state_trackers/clover/core/program.hpp 
b/src/gallium/state_trackers/clover/core/program.hpp
index 19c4420..13abc21 100644
--- a/src/gallium/state_trackers/clover/core/program.hpp
+++ b/src/gallium/state_trackers/clover/core/program.hpp
@@ -63,6 +63,7 @@ namespace clover {
   cl_build_status build_status(const device dev) const;
   std::string build_opts(const device dev) const;
   std::string build_log(const device dev) const;
+  cl_program_binary_type binary_type(const device dev) const;
 
   const compat::vectormodule::symbol symbols() const;
 
-- 
2.2.0

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 2/2] clover: add missing clGetDeviceInfo CL1.2 queries

2014-12-19 Thread EdB
---
 src/gallium/state_trackers/clover/api/device.cpp  | 21 +
 src/gallium/state_trackers/clover/core/device.cpp | 11 +++
 src/gallium/state_trackers/clover/core/device.hpp |  2 ++
 3 files changed, 34 insertions(+)

diff --git a/src/gallium/state_trackers/clover/api/device.cpp 
b/src/gallium/state_trackers/clover/api/device.cpp
index e825468..947d9e9 100644
--- a/src/gallium/state_trackers/clover/api/device.cpp
+++ b/src/gallium/state_trackers/clover/api/device.cpp
@@ -183,6 +183,14 @@ clGetDeviceInfo(cl_device_id d_dev, cl_device_info param,
   buf.as_scalarsize_t() = 1  dev.max_image_levels_3d();
   break;
 
+   case CL_DEVICE_IMAGE_MAX_BUFFER_SIZE:
+  buf.as_scalarsize_t() = dev.max_image_buffer_size();
+  break;
+
+   case CL_DEVICE_IMAGE_MAX_ARRAY_SIZE:
+  buf.as_scalarsize_t() = dev.max_image_array_number();
+  break;
+
case CL_DEVICE_IMAGE_SUPPORT:
   buf.as_scalarcl_bool() = dev.image_support();
   break;
@@ -251,6 +259,7 @@ clGetDeviceInfo(cl_device_id d_dev, cl_device_info param,
 
case CL_DEVICE_AVAILABLE:
case CL_DEVICE_COMPILER_AVAILABLE:
+   case CL_DEVICE_LINKER_AVAILABLE:
   buf.as_scalarcl_bool() = CL_TRUE;
   break;
 
@@ -262,6 +271,10 @@ clGetDeviceInfo(cl_device_id d_dev, cl_device_info param,
   buf.as_scalarcl_command_queue_properties() = CL_QUEUE_PROFILING_ENABLE;
   break;
 
+   case CL_DEVICE_BUILT_IN_KERNELS:
+  buf.as_string() = ;
+  break;
+
case CL_DEVICE_NAME:
   buf.as_string() = dev.device_name();
   break;
@@ -326,6 +339,14 @@ clGetDeviceInfo(cl_device_id d_dev, cl_device_info param,
   buf.as_string() = OpenCL C 1.1;
   break;
 
+   case CL_DEVICE_PRINTF_BUFFER_SIZE:
+  buf.as_scalarsize_t() = 1024;
+  break;
+
+   case CL_DEVICE_PREFERRED_INTEROP_USER_SYNC:
+  buf.as_scalarcl_bool() = CL_TRUE;
+  break;
+
case CL_DEVICE_PARENT_DEVICE:
   buf.as_scalarcl_device_id() = NULL;
   break;
diff --git a/src/gallium/state_trackers/clover/core/device.cpp 
b/src/gallium/state_trackers/clover/core/device.cpp
index 688a7dd..ad4aaf1 100644
--- a/src/gallium/state_trackers/clover/core/device.cpp
+++ b/src/gallium/state_trackers/clover/core/device.cpp
@@ -97,6 +97,11 @@ device::max_images_write() const {
return PIPE_MAX_SHADER_RESOURCES;
 }
 
+size_t
+device::max_image_buffer_size() const {
+   return pipe-get_param(pipe, PIPE_CAP_MAX_TEXTURE_BUFFER_SIZE);
+}
+
 cl_uint
 device::max_image_levels_2d() const {
return pipe-get_param(pipe, PIPE_CAP_MAX_TEXTURE_2D_LEVELS);
@@ -107,6 +112,12 @@ device::max_image_levels_3d() const {
return pipe-get_param(pipe, PIPE_CAP_MAX_TEXTURE_3D_LEVELS);
 }
 
+
+size_t
+device::max_image_array_number() const {
+   return pipe-get_param(pipe, PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS);
+}
+
 cl_uint
 device::max_samplers() const {
return pipe-get_shader_param(pipe, PIPE_SHADER_COMPUTE,
diff --git a/src/gallium/state_trackers/clover/core/device.hpp 
b/src/gallium/state_trackers/clover/core/device.hpp
index 2201700..89a 100644
--- a/src/gallium/state_trackers/clover/core/device.hpp
+++ b/src/gallium/state_trackers/clover/core/device.hpp
@@ -51,8 +51,10 @@ namespace clover {
   cl_uint vendor_id() const;
   size_t max_images_read() const;
   size_t max_images_write() const;
+  size_t max_image_buffer_size() const;
   cl_uint max_image_levels_2d() const;
   cl_uint max_image_levels_3d() const;
+  size_t max_image_array_number() const;
   cl_uint max_samplers() const;
   cl_ulong max_mem_global() const;
   cl_ulong max_mem_local() const;
-- 
2.2.0

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 0/2] Add support for some of the missing CL1.2 queries

2014-12-19 Thread EdB
patch 1 depends on clLinkProgram serie
patch 2 should be fine on master

EdB (2):
  clover: support CL_PROGRAM_BINARY_TYPE (CL1.2)
  clover: add missing clGetDeviceInfo CL1.2 queries

 src/gallium/state_trackers/clover/api/device.cpp   | 21 +++
 src/gallium/state_trackers/clover/api/program.cpp  |  4 +++
 src/gallium/state_trackers/clover/core/device.cpp  | 11 
 src/gallium/state_trackers/clover/core/device.hpp  |  2 ++
 src/gallium/state_trackers/clover/core/program.cpp | 31 +-
 src/gallium/state_trackers/clover/core/program.hpp |  1 +
 6 files changed, 63 insertions(+), 7 deletions(-)

-- 
2.2.0

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH 2/7] clover: Dump the OpenCL C code earlier

2014-12-19 Thread EdB
On Friday, December 19, 2014 01:08:31 PM Tom Stellard wrote:
 On Sun, Dec 14, 2014 at 11:31:22AM +0100, EdB wrote:
  ---
  
   src/gallium/state_trackers/clover/llvm/invocation.cpp | 6 +++---
   1 file changed, 3 insertions(+), 3 deletions(-)
  
  diff --git a/src/gallium/state_trackers/clover/llvm/invocation.cpp
  b/src/gallium/state_trackers/clover/llvm/invocation.cpp index
  10dbe08..510e195 100644
  --- a/src/gallium/state_trackers/clover/llvm/invocation.cpp
  +++ b/src/gallium/state_trackers/clover/llvm/invocation.cpp
  @@ -709,6 +709,9 @@ clover::compile_program_llvm(const compat::string
  source, 
  llvm_ctx.setDiagnosticHandler(diagnostic_handler, r_log);
   
   #endif
  
  +   if (debug_flags  DBG_CLC)
  +  debug_log(source, .cl);
  +
 
 Why do we need to do this?  Could you add an explanation to the commit
 message?

When the code failed to compile, I found it easier to looks at what we try to 
compile with DBG_CLC on.
I moved it before because some time llvm assert or clover raise an exception 
and I wasn't having any dump;

  // The input file name must have the .cl extension in order for the
  // CompilerInvocation class to recognize it as an OpenCL source file.
  llvm::Module *mod = compile_llvm(llvm_ctx, source, headers,
  input.cl,
  
  @@ -719,9 +722,6 @@ clover::compile_program_llvm(const compat::string
  source, 
  optimize(mod, optimization_level, kernels);
  
  -   if (debug_flags  DBG_CLC)
  -  debug_log(source, .cl);
  -
  
  if (debug_flags  DBG_LLVM) {
  
 std::string log;
 llvm::raw_string_ostream s_log(log);

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH 3/7] clover: split module::section::text

2014-12-19 Thread EdB
On Friday, December 19, 2014 01:14:47 PM Tom Stellard wrote:
 On Sun, Dec 14, 2014 at 11:31:23AM +0100, EdB wrote:
  OpenCL 1.2 make distinction between 3 binaries kind:
   executable as produce by clBuildProgram and clLinkProgam
   compiled as produce by clCompileProgram
   library as produce by clLinkProgam with -create-library option
 
 s/produce/produced/
 
  ---
  
   src/gallium/state_trackers/clover/core/kernel.cpp | 2 +-
   src/gallium/state_trackers/clover/core/module.hpp | 6 --
   src/gallium/state_trackers/clover/llvm/invocation.cpp | 4 ++--
   src/gallium/state_trackers/clover/tgsi/compiler.cpp   | 3 ++-
   4 files changed, 9 insertions(+), 6 deletions(-)
  
  diff --git a/src/gallium/state_trackers/clover/core/kernel.cpp
  b/src/gallium/state_trackers/clover/core/kernel.cpp index
  442762c..ed4b9b0 100644
  --- a/src/gallium/state_trackers/clover/core/kernel.cpp
  +++ b/src/gallium/state_trackers/clover/core/kernel.cpp
  @@ -156,7 +156,7 @@
  kernel::exec_context::bind(intrusive_ptrcommand_queue _q, 
  // Bind kernel arguments.
  auto m = kern.program().binary(q-device());
  auto margs = find(name_equals(kern.name()), m.syms).args;
  
  -   auto msec = find(type_equals(module::section::text), m.secs);
  +   auto msec = find(type_equals(module::section::text_executable),
  m.secs); 
  auto explicit_arg = kern._args.begin();
  
  for (auto marg : margs) {
  
  diff --git a/src/gallium/state_trackers/clover/core/module.hpp
  b/src/gallium/state_trackers/clover/core/module.hpp index
  ee6caf9..200b9de 100644
  --- a/src/gallium/state_trackers/clover/core/module.hpp
  +++ b/src/gallium/state_trackers/clover/core/module.hpp
  @@ -32,7 +32,9 @@ namespace clover {
  
 struct section {
 
enum type {
  
  -text,
  +text_executable,
  +text_compiled,
 
 From clover's perspective, what is the difference between text_executable
 and text_compiled?

text_compiled shouln't be use to create kernel

 
  +text_library,
  
   data_constant,
   data_global,
   data_local,
  
  @@ -42,7 +44,7 @@ namespace clover {
  
section(resource_id id, enum type type, size_t size,

const compat::vectorchar data) :
id(id), type(type), size(size), data(data) { }
  
  - section() : id(0), type(text), size(0), data() { }
  + section() : id(0), type(text_executable), size(0), data() { }
  
resource_id id;
type type;
  
  diff --git a/src/gallium/state_trackers/clover/llvm/invocation.cpp
  b/src/gallium/state_trackers/clover/llvm/invocation.cpp index
  510e195..1eb47f5 100644
  --- a/src/gallium/state_trackers/clover/llvm/invocation.cpp
  +++ b/src/gallium/state_trackers/clover/llvm/invocation.cpp
  @@ -457,7 +457,7 @@ namespace {
  
 data.insert(0, (char*)(header), sizeof(header));
 data.insert(data.end(), llvm_bitcode.begin(),
 
 llvm_bitcode.end());
  
  -  m.secs.push_back(module::section(0, module::section::text,
  +  m.secs.push_back(module::section(0,
  module::section::text_executable, 
  header.num_bytes, data));
 
 return m;
  
  @@ -622,7 +622,7 @@ namespace {
  
 std::string data;
 data.append((char*)(header), sizeof(header));
 data.append(code.begin(), code.end());
  
  -  m.secs.push_back(module::section(0, module::section::text,
  +  m.secs.push_back(module::section(0,
  module::section::text_executable, 
  header.num_bytes, data));
 
 for (std::mapstd::string, unsigned::iterator i =
 kernel_offsets.begin(),
  
  diff --git a/src/gallium/state_trackers/clover/tgsi/compiler.cpp
  b/src/gallium/state_trackers/clover/tgsi/compiler.cpp index
  93dfeb5..d901d2b 100644
  --- a/src/gallium/state_trackers/clover/tgsi/compiler.cpp
  +++ b/src/gallium/state_trackers/clover/tgsi/compiler.cpp
  @@ -83,7 +83,8 @@ namespace {
  
throw build_error(translate failed);
 
 unsigned sz = tgsi_num_tokens(prog) * sizeof(tgsi_token);
  
  -  m.secs.push_back({ 0, module::section::text, sz, { (char *)prog, sz
  } }); +  m.secs.push_back({ 0, module::section::text_executable,
  + sz, { (char *)prog, sz } });
  
  }
   
   }

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 3/7] clover: split module::section::text

2014-12-14 Thread EdB
OpenCL 1.2 make distinction between 3 binaries kind:
 executable as produce by clBuildProgram and clLinkProgam
 compiled as produce by clCompileProgram
 library as produce by clLinkProgam with -create-library option
---
 src/gallium/state_trackers/clover/core/kernel.cpp | 2 +-
 src/gallium/state_trackers/clover/core/module.hpp | 6 --
 src/gallium/state_trackers/clover/llvm/invocation.cpp | 4 ++--
 src/gallium/state_trackers/clover/tgsi/compiler.cpp   | 3 ++-
 4 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/src/gallium/state_trackers/clover/core/kernel.cpp 
b/src/gallium/state_trackers/clover/core/kernel.cpp
index 442762c..ed4b9b0 100644
--- a/src/gallium/state_trackers/clover/core/kernel.cpp
+++ b/src/gallium/state_trackers/clover/core/kernel.cpp
@@ -156,7 +156,7 @@ kernel::exec_context::bind(intrusive_ptrcommand_queue _q,
// Bind kernel arguments.
auto m = kern.program().binary(q-device());
auto margs = find(name_equals(kern.name()), m.syms).args;
-   auto msec = find(type_equals(module::section::text), m.secs);
+   auto msec = find(type_equals(module::section::text_executable), m.secs);
auto explicit_arg = kern._args.begin();
 
for (auto marg : margs) {
diff --git a/src/gallium/state_trackers/clover/core/module.hpp 
b/src/gallium/state_trackers/clover/core/module.hpp
index ee6caf9..200b9de 100644
--- a/src/gallium/state_trackers/clover/core/module.hpp
+++ b/src/gallium/state_trackers/clover/core/module.hpp
@@ -32,7 +32,9 @@ namespace clover {
 
   struct section {
  enum type {
-text,
+text_executable,
+text_compiled,
+text_library,
 data_constant,
 data_global,
 data_local,
@@ -42,7 +44,7 @@ namespace clover {
  section(resource_id id, enum type type, size_t size,
  const compat::vectorchar data) :
  id(id), type(type), size(size), data(data) { }
- section() : id(0), type(text), size(0), data() { }
+ section() : id(0), type(text_executable), size(0), data() { }
 
  resource_id id;
  type type;
diff --git a/src/gallium/state_trackers/clover/llvm/invocation.cpp 
b/src/gallium/state_trackers/clover/llvm/invocation.cpp
index 510e195..1eb47f5 100644
--- a/src/gallium/state_trackers/clover/llvm/invocation.cpp
+++ b/src/gallium/state_trackers/clover/llvm/invocation.cpp
@@ -457,7 +457,7 @@ namespace {
   data.insert(0, (char*)(header), sizeof(header));
   data.insert(data.end(), llvm_bitcode.begin(),
   llvm_bitcode.end());
-  m.secs.push_back(module::section(0, module::section::text,
+  m.secs.push_back(module::section(0, module::section::text_executable,
header.num_bytes, data));
 
   return m;
@@ -622,7 +622,7 @@ namespace {
   std::string data;
   data.append((char*)(header), sizeof(header));
   data.append(code.begin(), code.end());
-  m.secs.push_back(module::section(0, module::section::text,
+  m.secs.push_back(module::section(0, module::section::text_executable,
header.num_bytes, data));
 
   for (std::mapstd::string, unsigned::iterator i = 
kernel_offsets.begin(),
diff --git a/src/gallium/state_trackers/clover/tgsi/compiler.cpp 
b/src/gallium/state_trackers/clover/tgsi/compiler.cpp
index 93dfeb5..d901d2b 100644
--- a/src/gallium/state_trackers/clover/tgsi/compiler.cpp
+++ b/src/gallium/state_trackers/clover/tgsi/compiler.cpp
@@ -83,7 +83,8 @@ namespace {
  throw build_error(translate failed);
 
   unsigned sz = tgsi_num_tokens(prog) * sizeof(tgsi_token);
-  m.secs.push_back({ 0, module::section::text, sz, { (char *)prog, sz } });
+  m.secs.push_back({ 0, module::section::text_executable,
+ sz, { (char *)prog, sz } });
}
 }
 
-- 
2.2.0

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 5/7] clover: seperate build and compile

2014-12-14 Thread EdB
they produce different binaries
---
 src/gallium/state_trackers/clover/api/program.cpp  |   2 +-
 .../state_trackers/clover/core/compiler.hpp|  12 ++-
 src/gallium/state_trackers/clover/core/program.cpp |  48 +++--
 src/gallium/state_trackers/clover/core/program.hpp |   6 +-
 .../state_trackers/clover/llvm/invocation.cpp  | 112 -
 .../state_trackers/clover/tgsi/compiler.cpp|   2 +-
 6 files changed, 140 insertions(+), 42 deletions(-)

diff --git a/src/gallium/state_trackers/clover/api/program.cpp 
b/src/gallium/state_trackers/clover/api/program.cpp
index 60184ed..1e91da1 100644
--- a/src/gallium/state_trackers/clover/api/program.cpp
+++ b/src/gallium/state_trackers/clover/api/program.cpp
@@ -222,7 +222,7 @@ clCompileProgram(cl_program d_prog, cl_uint num_devs,
   range(header_names, num_headers),
   objsallow_empty_tag(d_header_progs, num_headers));
 
-   prog.build(devs, opts, headers);
+   prog.compile(devs, opts, headers);
return CL_SUCCESS;
 
 } catch (error e) {
diff --git a/src/gallium/state_trackers/clover/core/compiler.hpp 
b/src/gallium/state_trackers/clover/core/compiler.hpp
index 7210d1e..75c7435 100644
--- a/src/gallium/state_trackers/clover/core/compiler.hpp
+++ b/src/gallium/state_trackers/clover/core/compiler.hpp
@@ -32,14 +32,20 @@ namespace clover {
typedef compat::vectorcompat::paircompat::string,
compat::string  header_map;
 
-   module compile_program_llvm(const compat::string source,
-   const header_map headers,
+   module build_program_llvm(const compat::string source,
pipe_shader_ir ir,
const compat::string target,
const compat::string opts,
compat::string r_log);
 
-   module compile_program_tgsi(const compat::string source);
+   module compile_program_llvm(const compat::string source,
+ const header_map headers,
+ pipe_shader_ir ir,
+ const compat::string target,
+ const compat::string opts,
+ compat::string r_log);
+
+   module build_program_tgsi(const compat::string source);
 }
 
 #endif
diff --git a/src/gallium/state_trackers/clover/core/program.cpp 
b/src/gallium/state_trackers/clover/core/program.cpp
index 5e05a33..a0aeb46 100644
--- a/src/gallium/state_trackers/clover/core/program.cpp
+++ b/src/gallium/state_trackers/clover/core/program.cpp
@@ -40,24 +40,19 @@ program::program(clover::context ctx,
 }
 
 void
-program::build(const ref_vectordevice devs, const char *opts,
-   const header_map headers) {
+program::build(const ref_vectordevice devs, const char *opts) {
if (has_source) {
   _devices = devs;
 
   for (auto dev : devs) {
- _binaries.erase(dev);
- _logs.erase(dev);
- _opts.erase(dev);
-
- _opts.insert({ dev, opts });
+ reset_device(dev, opts);
 
  compat::string log;
 
  try {
 auto module = (dev.ir_format() == PIPE_SHADER_IR_TGSI ?
-   compile_program_tgsi(_source) :
-   compile_program_llvm(_source, headers,
+   build_program_tgsi(_source) :
+   build_program_llvm(_source,
 dev.ir_format(),
 dev.ir_target(), 
build_opts(dev),
 log));
@@ -71,6 +66,32 @@ program::build(const ref_vectordevice devs, const char 
*opts,
}
 }
 
+void
+program::compile(const ref_vectordevice devs, const char *opts,
+ const header_map headers) {
+   if (has_source) {
+  _devices = devs;
+
+  for (auto dev : devs) {
+ reset_device(dev, opts);
+
+ compat::string log;
+
+ try {
+auto module = compile_program_llvm(_source, headers,
+   dev.ir_format(),
+   dev.ir_target(), 
build_opts(dev),
+   log);
+_binaries.insert({ dev, module });
+_logs.insert({ dev, log });
+ } catch (const build_error ) {
+_logs.insert({ dev, log });
+throw;
+ }
+  }
+   }
+}
+
 bool
 program::has_executable() const {
for (auto bin : _binaries) {
@@ -127,3 +148,12 @@ unsigned
 program::kernel_ref_count() const {
return _kernel_ref_counter.ref_count();
 }
+
+void
+program::reset_device(const device *dev, const char *opts) {
+   _binaries.erase(dev);
+   _logs.erase(dev);
+   _opts.erase(dev);
+
+   _opts.insert({ dev, opts });
+}
diff --git a/src/gallium/state_trackers/clover/core/program.hpp 

[Mesa-dev] [PATCH 4/7] clover: clCreateKernel now checks for executable

2014-12-14 Thread EdB
clCreateKernel should check that there is a least one executable
available, otherwise it has to trigger CL_INVALID_PROGRAM_EXECUTABLE
---
 src/gallium/state_trackers/clover/api/kernel.cpp   |  3 +++
 src/gallium/state_trackers/clover/core/program.cpp | 11 +++
 src/gallium/state_trackers/clover/core/program.hpp |  1 +
 3 files changed, 15 insertions(+)

diff --git a/src/gallium/state_trackers/clover/api/kernel.cpp 
b/src/gallium/state_trackers/clover/api/kernel.cpp
index 05cc392..4fe1756 100644
--- a/src/gallium/state_trackers/clover/api/kernel.cpp
+++ b/src/gallium/state_trackers/clover/api/kernel.cpp
@@ -33,6 +33,9 @@ clCreateKernel(cl_program d_prog, const char *name, cl_int 
*r_errcode) try {
if (!name)
   throw error(CL_INVALID_VALUE);
 
+   if (!prog.has_executable())
+  throw error(CL_INVALID_PROGRAM_EXECUTABLE);
+
auto sym = find(name_equals(name), prog.symbols());
 
ret_error(r_errcode, CL_SUCCESS);
diff --git a/src/gallium/state_trackers/clover/core/program.cpp 
b/src/gallium/state_trackers/clover/core/program.cpp
index 8553ca7..5e05a33 100644
--- a/src/gallium/state_trackers/clover/core/program.cpp
+++ b/src/gallium/state_trackers/clover/core/program.cpp
@@ -71,6 +71,17 @@ program::build(const ref_vectordevice devs, const char 
*opts,
}
 }
 
+bool
+program::has_executable() const {
+   for (auto bin : _binaries) {
+  if (any_of(type_equals(module::section::text_executable),
+  bin.second.secs))
+ return true;
+   }
+
+   return false;
+}
+
 const std::string 
 program::source() const {
return _source;
diff --git a/src/gallium/state_trackers/clover/core/program.hpp 
b/src/gallium/state_trackers/clover/core/program.hpp
index 661fa03..7f61d88 100644
--- a/src/gallium/state_trackers/clover/core/program.hpp
+++ b/src/gallium/state_trackers/clover/core/program.hpp
@@ -50,6 +50,7 @@ namespace clover {
   void build(const ref_vectordevice devs, const char *opts,
  const header_map headers = {});
 
+  bool has_executable() const;
   const bool has_source;
   const std::string source() const;
 
-- 
2.2.0

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 2/7] clover: Dump the OpenCL C code earlier

2014-12-14 Thread EdB
---
 src/gallium/state_trackers/clover/llvm/invocation.cpp | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/gallium/state_trackers/clover/llvm/invocation.cpp 
b/src/gallium/state_trackers/clover/llvm/invocation.cpp
index 10dbe08..510e195 100644
--- a/src/gallium/state_trackers/clover/llvm/invocation.cpp
+++ b/src/gallium/state_trackers/clover/llvm/invocation.cpp
@@ -709,6 +709,9 @@ clover::compile_program_llvm(const compat::string source,
llvm_ctx.setDiagnosticHandler(diagnostic_handler, r_log);
 #endif
 
+   if (debug_flags  DBG_CLC)
+  debug_log(source, .cl);
+
// The input file name must have the .cl extension in order for the
// CompilerInvocation class to recognize it as an OpenCL source file.
llvm::Module *mod = compile_llvm(llvm_ctx, source, headers, input.cl,
@@ -719,9 +722,6 @@ clover::compile_program_llvm(const compat::string source,
 
optimize(mod, optimization_level, kernels);
 
-   if (debug_flags  DBG_CLC)
-  debug_log(source, .cl);
-
if (debug_flags  DBG_LLVM) {
   std::string log;
   llvm::raw_string_ostream s_log(log);
-- 
2.2.0

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 7/7] clover: add clLinkProgram

2014-12-14 Thread EdB
---
 src/gallium/state_trackers/clover/api/dispatch.cpp |   2 +-
 src/gallium/state_trackers/clover/api/program.cpp  |  31 +
 .../state_trackers/clover/core/compiler.hpp|   6 +
 src/gallium/state_trackers/clover/core/error.hpp   |   7 ++
 src/gallium/state_trackers/clover/core/program.cpp |  56 +
 src/gallium/state_trackers/clover/core/program.hpp |   3 +
 .../state_trackers/clover/llvm/invocation.cpp  | 129 +
 7 files changed, 233 insertions(+), 1 deletion(-)

diff --git a/src/gallium/state_trackers/clover/api/dispatch.cpp 
b/src/gallium/state_trackers/clover/api/dispatch.cpp
index b5a4094..44bff4f 100644
--- a/src/gallium/state_trackers/clover/api/dispatch.cpp
+++ b/src/gallium/state_trackers/clover/api/dispatch.cpp
@@ -123,7 +123,7 @@ namespace clover {
   clCreateImage,
   clCreateProgramWithBuiltInKernels,
   clCompileProgram,
-  NULL, // clLinkProgram
+  clLinkProgram,
   clUnloadPlatformCompiler,
   NULL, // clGetKernelArgInfo
   NULL, // clEnqueueFillBuffer
diff --git a/src/gallium/state_trackers/clover/api/program.cpp 
b/src/gallium/state_trackers/clover/api/program.cpp
index 1e91da1..be97ae5 100644
--- a/src/gallium/state_trackers/clover/api/program.cpp
+++ b/src/gallium/state_trackers/clover/api/program.cpp
@@ -229,6 +229,37 @@ clCompileProgram(cl_program d_prog, cl_uint num_devs,
return e.get();
 }
 
+CLOVER_API cl_program
+clLinkProgram (cl_context d_ctx, cl_uint num_devs, const cl_device_id *d_devs,
+   const char *p_opts, cl_uint num_progs, const cl_program 
*d_progs,
+   void (*pfn_notify) (cl_program, void *), void *user_data,
+   cl_int *r_errcode) try {
+   auto ctx = obj(d_ctx);
+   auto devs = (d_devs ? objs(d_devs, num_devs) :
+ref_vectordevice(ctx.devices()));
+   auto opts = (p_opts ? p_opts : );
+   auto progs = objs(d_progs, num_progs);
+
+   if ((!pfn_notify  user_data))
+ throw error(CL_INVALID_VALUE);
+
+   if (any_of([](const device dev) {
+return !count(dev, ctx.devices());
+ }, objsallow_empty_tag(d_devs, num_devs)))
+  throw error(CL_INVALID_DEVICE);
+
+   auto prog = createprogram(ctx, devs, std::vectormodule());
+   if (prog().link(progs, opts))
+  *r_errcode = CL_SUCCESS;
+   else
+  *r_errcode = CL_LINK_PROGRAM_FAILURE;
+
+   return ret_object(prog);
+} catch (error e) {
+   ret_error(r_errcode, e);
+   return NULL;
+}
+
 CLOVER_API cl_int
 clUnloadCompiler() {
return CL_SUCCESS;
diff --git a/src/gallium/state_trackers/clover/core/compiler.hpp 
b/src/gallium/state_trackers/clover/core/compiler.hpp
index 75c7435..168431a 100644
--- a/src/gallium/state_trackers/clover/core/compiler.hpp
+++ b/src/gallium/state_trackers/clover/core/compiler.hpp
@@ -45,6 +45,12 @@ namespace clover {
  const compat::string opts,
  compat::string r_log);
 
+   module link_program_llvm(const compat::vectormodule modules,
+  pipe_shader_ir ir,
+  const compat::string target,
+  const compat::string opts,
+  compat::string r_log);
+
module build_program_tgsi(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..15a2447 100644
--- a/src/gallium/state_trackers/clover/core/error.hpp
+++ b/src/gallium/state_trackers/clover/core/error.hpp
@@ -71,6 +71,13 @@ namespace clover {
   }
};
 
+   class link_error : public error {
+   public:
+  link_error(const compat::string what = ) :
+ error(CL_LINK_PROGRAM_FAILURE, what) {
+  }
+   };
+
templatetypename O
class invalid_object_error;
 
diff --git a/src/gallium/state_trackers/clover/core/program.cpp 
b/src/gallium/state_trackers/clover/core/program.cpp
index a0aeb46..8bece05 100644
--- a/src/gallium/state_trackers/clover/core/program.cpp
+++ b/src/gallium/state_trackers/clover/core/program.cpp
@@ -93,6 +93,48 @@ program::compile(const ref_vectordevice devs, const char 
*opts,
 }
 
 bool
+program::link(const ref_vectorprogram progs, const char *opts) {
+   bool ret = true;
+
+   for (auto d : _devices) {
+  auto dev = d();
+
+  reset_device(dev, opts);
+
+  compat::vectormodule mods;
+  mods.reserve(progs.size());
+  for (auto prog : progs)
+ if (prog.has_linkable(dev))
+mods.push_back(prog.binary(dev));
+
+  if (mods.size() == 0) {
+ _logs.insert({ dev,
+None of the programs contain a compiled binary or library for that device. 
});
+ ret = false;
+ continue;
+  }
+
+  if (mods.size() != progs.size())
+ throw error(CL_INVALID_OPERATION);
+
+  compat::string log;
+
+  try {
+ auto module = link_program_llvm(mods,
+ 

[Mesa-dev] [PATCH 6/7] clover: override ret_object

2014-12-14 Thread EdB
Return an API object from an intrusive smart reference Clover object,
incrementing the reference count of the object.
---
 src/gallium/state_trackers/clover/api/util.hpp | 11 +++
 1 file changed, 11 insertions(+)

diff --git a/src/gallium/state_trackers/clover/api/util.hpp 
b/src/gallium/state_trackers/clover/api/util.hpp
index 918df61..a7adaa4 100644
--- a/src/gallium/state_trackers/clover/api/util.hpp
+++ b/src/gallium/state_trackers/clover/api/util.hpp
@@ -61,6 +61,17 @@ namespace clover {
  *p = desc(v());
   }
}
+
+   ///
+   /// Return an API object from an intrusive smart reference Clover object,
+   /// incrementing the reference count of the object.
+   ///
+   templatetypename T
+   typename T::descriptor_type *
+   ret_object(const intrusive_refT v) {
+  v().retain();
+  return desc(v());
+   }
 }
 
 #endif
-- 
2.2.0

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH] clover: add clLinkProgram

2014-12-14 Thread EdB
---
 src/gallium/state_trackers/clover/api/dispatch.cpp |   2 +-
 src/gallium/state_trackers/clover/api/program.cpp  |  31 +
 .../state_trackers/clover/core/compiler.hpp|   6 +
 src/gallium/state_trackers/clover/core/error.hpp   |   7 ++
 src/gallium/state_trackers/clover/core/program.cpp |  56 +
 src/gallium/state_trackers/clover/core/program.hpp |   3 +
 .../state_trackers/clover/llvm/invocation.cpp  | 129 +
 7 files changed, 233 insertions(+), 1 deletion(-)

diff --git a/src/gallium/state_trackers/clover/api/dispatch.cpp 
b/src/gallium/state_trackers/clover/api/dispatch.cpp
index b5a4094..44bff4f 100644
--- a/src/gallium/state_trackers/clover/api/dispatch.cpp
+++ b/src/gallium/state_trackers/clover/api/dispatch.cpp
@@ -123,7 +123,7 @@ namespace clover {
   clCreateImage,
   clCreateProgramWithBuiltInKernels,
   clCompileProgram,
-  NULL, // clLinkProgram
+  clLinkProgram,
   clUnloadPlatformCompiler,
   NULL, // clGetKernelArgInfo
   NULL, // clEnqueueFillBuffer
diff --git a/src/gallium/state_trackers/clover/api/program.cpp 
b/src/gallium/state_trackers/clover/api/program.cpp
index 1e91da1..be97ae5 100644
--- a/src/gallium/state_trackers/clover/api/program.cpp
+++ b/src/gallium/state_trackers/clover/api/program.cpp
@@ -229,6 +229,37 @@ clCompileProgram(cl_program d_prog, cl_uint num_devs,
return e.get();
 }
 
+CLOVER_API cl_program
+clLinkProgram (cl_context d_ctx, cl_uint num_devs, const cl_device_id *d_devs,
+   const char *p_opts, cl_uint num_progs, const cl_program 
*d_progs,
+   void (*pfn_notify) (cl_program, void *), void *user_data,
+   cl_int *r_errcode) try {
+   auto ctx = obj(d_ctx);
+   auto devs = (d_devs ? objs(d_devs, num_devs) :
+ref_vectordevice(ctx.devices()));
+   auto opts = (p_opts ? p_opts : );
+   auto progs = objs(d_progs, num_progs);
+
+   if ((!pfn_notify  user_data))
+ throw error(CL_INVALID_VALUE);
+
+   if (any_of([](const device dev) {
+return !count(dev, ctx.devices());
+ }, objsallow_empty_tag(d_devs, num_devs)))
+  throw error(CL_INVALID_DEVICE);
+
+   auto prog = createprogram(ctx, devs, std::vectormodule());
+   if (prog().link(progs, opts))
+  *r_errcode = CL_SUCCESS;
+   else
+  *r_errcode = CL_LINK_PROGRAM_FAILURE;
+
+   return ret_object(prog);
+} catch (error e) {
+   ret_error(r_errcode, e);
+   return NULL;
+}
+
 CLOVER_API cl_int
 clUnloadCompiler() {
return CL_SUCCESS;
diff --git a/src/gallium/state_trackers/clover/core/compiler.hpp 
b/src/gallium/state_trackers/clover/core/compiler.hpp
index 75c7435..168431a 100644
--- a/src/gallium/state_trackers/clover/core/compiler.hpp
+++ b/src/gallium/state_trackers/clover/core/compiler.hpp
@@ -45,6 +45,12 @@ namespace clover {
  const compat::string opts,
  compat::string r_log);
 
+   module link_program_llvm(const compat::vectormodule modules,
+  pipe_shader_ir ir,
+  const compat::string target,
+  const compat::string opts,
+  compat::string r_log);
+
module build_program_tgsi(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..15a2447 100644
--- a/src/gallium/state_trackers/clover/core/error.hpp
+++ b/src/gallium/state_trackers/clover/core/error.hpp
@@ -71,6 +71,13 @@ namespace clover {
   }
};
 
+   class link_error : public error {
+   public:
+  link_error(const compat::string what = ) :
+ error(CL_LINK_PROGRAM_FAILURE, what) {
+  }
+   };
+
templatetypename O
class invalid_object_error;
 
diff --git a/src/gallium/state_trackers/clover/core/program.cpp 
b/src/gallium/state_trackers/clover/core/program.cpp
index a0aeb46..8bece05 100644
--- a/src/gallium/state_trackers/clover/core/program.cpp
+++ b/src/gallium/state_trackers/clover/core/program.cpp
@@ -93,6 +93,48 @@ program::compile(const ref_vectordevice devs, const char 
*opts,
 }
 
 bool
+program::link(const ref_vectorprogram progs, const char *opts) {
+   bool ret = true;
+
+   for (auto d : _devices) {
+  auto dev = d();
+
+  reset_device(dev, opts);
+
+  compat::vectormodule mods;
+  mods.reserve(progs.size());
+  for (auto prog : progs)
+ if (prog.has_linkable(dev))
+mods.push_back(prog.binary(dev));
+
+  if (mods.size() == 0) {
+ _logs.insert({ dev,
+None of the programs contain a compiled binary or library for that device. 
});
+ ret = false;
+ continue;
+  }
+
+  if (mods.size() != progs.size())
+ throw error(CL_INVALID_OPERATION);
+
+  compat::string log;
+
+  try {
+ auto module = link_program_llvm(mods,
+ 

[Mesa-dev] [PATCH 1/7] clover: move CLOVER_DEBUG stuff into anonymous ns

2014-12-14 Thread EdB
---
 .../state_trackers/clover/llvm/invocation.cpp  | 26 +-
 1 file changed, 16 insertions(+), 10 deletions(-)

diff --git a/src/gallium/state_trackers/clover/llvm/invocation.cpp 
b/src/gallium/state_trackers/clover/llvm/invocation.cpp
index 5265d10..10dbe08 100644
--- a/src/gallium/state_trackers/clover/llvm/invocation.cpp
+++ b/src/gallium/state_trackers/clover/llvm/invocation.cpp
@@ -664,19 +664,26 @@ namespace {
  targets_initialized = true;
   }
}
-} // 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_SHADER_IR_NATIVE},
-   DEBUG_NAMED_VALUE_END // must be last
-};
+   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_SHADER_IR_NATIVE},
+  DEBUG_NAMED_VALUE_END // must be last
+   };
+
+   unsigned get_debug_flags() {
+  static unsigned debug_flags = debug_get_flags_option(CLOVER_DEBUG,
+ debug_options, 0);
+  return debug_flags;
+   }
+
+} // End anonymous namespace
 
 module
 clover::compile_program_llvm(const compat::string source,
@@ -687,8 +694,7 @@ clover::compile_program_llvm(const compat::string source,
  compat::string r_log) {
 
init_targets();
-   static unsigned debug_flags = debug_get_flags_option(CLOVER_DEBUG,
- debug_options, 0);
+   unsigned debug_flags = get_debug_flags();
 
std::vectorllvm::Function * kernels;
size_t processor_str_len = std::string(target.begin()).find_first_of(-);
-- 
2.2.0

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 0/7] clover: add clLinkProgram

2014-12-14 Thread EdB
Hello,

This serie add the neccesary bits needed for clLinkProgram.
Patches from 1 to 2 are llvm/invocation.cpp little reorganisation.
Patches 3 to 5 rework our clCompileProgram implementation.
Patch 6 is for returning clover smart ptr to the API side.
Patch 7 finaly add clLinkProgram.

Patches from 1 to 6 are all neccesary to patch 7,
but they can be commited apart from clLinKProgram addition as there are clean up
and bug fixes in the current tree.

Please note that patch 7 only compile with llvm/clang 3.5 for the moment.
I was making it ready for 3.4 but it add lots of #ifdef and I found out that
master didn't even compile it for the moment. This is because 3.5 enfore c++11
flags and that std::ofstream file(std:::string, ) is a c++11 addition.
Easy to fix but it went unnoticided until now.

I can come up with a 3.4 friendly v2 latter, but would appreciate your comments
on this version.
As I said 1 to 6 can be pushed before 7 as clean up and fixes.
And I also want to be sure 7 is the right way to go.

Regards
EdB

EdB (7):
  clover: move CLOVER_DEBUG stuff into anonymous ns
  clover: Dump the OpenCL C code earlier
  clover: split module::section::text
  clover: clCreateKernel now checks for executable
  clover: seperate build and compile
  clover: override ret_object
  clover: add clLinkProgram

 src/gallium/state_trackers/clover/api/dispatch.cpp |   2 +-
 src/gallium/state_trackers/clover/api/kernel.cpp   |   3 +
 src/gallium/state_trackers/clover/api/program.cpp  |  33 ++-
 src/gallium/state_trackers/clover/api/util.hpp |  11 +
 .../state_trackers/clover/core/compiler.hpp|  18 +-
 src/gallium/state_trackers/clover/core/error.hpp   |   7 +
 src/gallium/state_trackers/clover/core/kernel.cpp  |   2 +-
 src/gallium/state_trackers/clover/core/module.hpp  |   6 +-
 src/gallium/state_trackers/clover/core/program.cpp | 115 -
 src/gallium/state_trackers/clover/core/program.hpp |  10 +-
 .../state_trackers/clover/llvm/invocation.cpp  | 277 ++---
 .../state_trackers/clover/tgsi/compiler.cpp|   5 +-
 12 files changed, 427 insertions(+), 62 deletions(-)

-- 
2.2.0

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH] clover: add clLinkProgram

2014-12-14 Thread EdB
On Sunday, December 14, 2014 11:31:28 AM EdB wrote:

This one went out by mistake (I forgot to remove -1 option on git send-email).
It's the same as [Patch 7/7]

 ---
  src/gallium/state_trackers/clover/api/dispatch.cpp |   2 +-
  src/gallium/state_trackers/clover/api/program.cpp  |  31 +
  .../state_trackers/clover/core/compiler.hpp|   6 +
  src/gallium/state_trackers/clover/core/error.hpp   |   7 ++
  src/gallium/state_trackers/clover/core/program.cpp |  56 +
  src/gallium/state_trackers/clover/core/program.hpp |   3 +
  .../state_trackers/clover/llvm/invocation.cpp  | 129
 + 7 files changed, 233 insertions(+), 1 deletion(-)
 
 diff --git a/src/gallium/state_trackers/clover/api/dispatch.cpp
 b/src/gallium/state_trackers/clover/api/dispatch.cpp index b5a4094..44bff4f
 100644
 --- a/src/gallium/state_trackers/clover/api/dispatch.cpp
 +++ b/src/gallium/state_trackers/clover/api/dispatch.cpp
 @@ -123,7 +123,7 @@ namespace clover {
clCreateImage,
clCreateProgramWithBuiltInKernels,
clCompileProgram,
 -  NULL, // clLinkProgram
 +  clLinkProgram,
clUnloadPlatformCompiler,
NULL, // clGetKernelArgInfo
NULL, // clEnqueueFillBuffer
 diff --git a/src/gallium/state_trackers/clover/api/program.cpp
 b/src/gallium/state_trackers/clover/api/program.cpp index 1e91da1..be97ae5
 100644
 --- a/src/gallium/state_trackers/clover/api/program.cpp
 +++ b/src/gallium/state_trackers/clover/api/program.cpp
 @@ -229,6 +229,37 @@ clCompileProgram(cl_program d_prog, cl_uint num_devs,
 return e.get();
  }
 
 +CLOVER_API cl_program
 +clLinkProgram (cl_context d_ctx, cl_uint num_devs, const cl_device_id
 *d_devs, +   const char *p_opts, cl_uint num_progs, const
 cl_program *d_progs, +   void (*pfn_notify) (cl_program, void
 *), void *user_data, +   cl_int *r_errcode) try {
 +   auto ctx = obj(d_ctx);
 +   auto devs = (d_devs ? objs(d_devs, num_devs) :
 +ref_vectordevice(ctx.devices()));
 +   auto opts = (p_opts ? p_opts : );
 +   auto progs = objs(d_progs, num_progs);
 +
 +   if ((!pfn_notify  user_data))
 + throw error(CL_INVALID_VALUE);
 +
 +   if (any_of([](const device dev) {
 +return !count(dev, ctx.devices());
 + }, objsallow_empty_tag(d_devs, num_devs)))
 +  throw error(CL_INVALID_DEVICE);
 +
 +   auto prog = createprogram(ctx, devs, std::vectormodule());
 +   if (prog().link(progs, opts))
 +  *r_errcode = CL_SUCCESS;
 +   else
 +  *r_errcode = CL_LINK_PROGRAM_FAILURE;
 +
 +   return ret_object(prog);
 +} catch (error e) {
 +   ret_error(r_errcode, e);
 +   return NULL;
 +}
 +
  CLOVER_API cl_int
  clUnloadCompiler() {
 return CL_SUCCESS;
 diff --git a/src/gallium/state_trackers/clover/core/compiler.hpp
 b/src/gallium/state_trackers/clover/core/compiler.hpp index
 75c7435..168431a 100644
 --- a/src/gallium/state_trackers/clover/core/compiler.hpp
 +++ b/src/gallium/state_trackers/clover/core/compiler.hpp
 @@ -45,6 +45,12 @@ namespace clover {
   const compat::string opts,
   compat::string r_log);
 
 +   module link_program_llvm(const compat::vectormodule modules,
 +  pipe_shader_ir ir,
 +  const compat::string target,
 +  const compat::string opts,
 +  compat::string r_log);
 +
 module build_program_tgsi(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..15a2447
 100644
 --- a/src/gallium/state_trackers/clover/core/error.hpp
 +++ b/src/gallium/state_trackers/clover/core/error.hpp
 @@ -71,6 +71,13 @@ namespace clover {
}
 };
 
 +   class link_error : public error {
 +   public:
 +  link_error(const compat::string what = ) :
 + error(CL_LINK_PROGRAM_FAILURE, what) {
 +  }
 +   };
 +
 templatetypename O
 class invalid_object_error;
 
 diff --git a/src/gallium/state_trackers/clover/core/program.cpp
 b/src/gallium/state_trackers/clover/core/program.cpp index a0aeb46..8bece05
 100644
 --- a/src/gallium/state_trackers/clover/core/program.cpp
 +++ b/src/gallium/state_trackers/clover/core/program.cpp
 @@ -93,6 +93,48 @@ program::compile(const ref_vectordevice devs, const
 char *opts, }
 
  bool
 +program::link(const ref_vectorprogram progs, const char *opts) {
 +   bool ret = true;
 +
 +   for (auto d : _devices) {
 +  auto dev = d();
 +
 +  reset_device(dev, opts);
 +
 +  compat::vectormodule mods;
 +  mods.reserve(progs.size());
 +  for (auto prog : progs)
 + if (prog.has_linkable(dev))
 +mods.push_back(prog.binary(dev));
 +
 +  if (mods.size() == 0) {
 + _logs.insert({ dev,
 +None of the programs contain a compiled binary or library for that
 device

[Mesa-dev] [PATCH 1/2 v2] clover: add CL_MEM_HOST_* flags checks

2014-11-29 Thread EdB
those flags have been introduced in OpenCL 1.2
---
 src/gallium/state_trackers/clover/api/memory.cpp   | 15 --
 src/gallium/state_trackers/clover/api/transfer.cpp | 32 --
 2 files changed, 42 insertions(+), 5 deletions(-)

diff --git a/src/gallium/state_trackers/clover/api/memory.cpp 
b/src/gallium/state_trackers/clover/api/memory.cpp
index a094e74..fe01d3f 100644
--- a/src/gallium/state_trackers/clover/api/memory.cpp
+++ b/src/gallium/state_trackers/clover/api/memory.cpp
@@ -44,13 +44,18 @@ clCreateBuffer(cl_context d_ctx, cl_mem_flags flags, size_t 
size,
 
if (flags  ~(CL_MEM_READ_WRITE | CL_MEM_WRITE_ONLY | CL_MEM_READ_ONLY |
  CL_MEM_USE_HOST_PTR | CL_MEM_ALLOC_HOST_PTR |
- CL_MEM_COPY_HOST_PTR))
+ CL_MEM_COPY_HOST_PTR | CL_MEM_HOST_WRITE_ONLY |
+ CL_MEM_HOST_READ_ONLY | CL_MEM_HOST_NO_ACCESS ))
   throw error(CL_INVALID_VALUE);
 
if (util_bitcount(flags  (CL_MEM_READ_ONLY | CL_MEM_WRITE_ONLY |
   CL_MEM_READ_WRITE))  1)
   throw error(CL_INVALID_VALUE);
 
+   if (util_bitcount(flags  (CL_MEM_HOST_WRITE_ONLY | CL_MEM_HOST_READ_ONLY |
+  CL_MEM_HOST_NO_ACCESS))  1)
+  throw error(CL_INVALID_VALUE);
+
if ((flags  CL_MEM_USE_HOST_PTR) 
(flags  (CL_MEM_COPY_HOST_PTR | CL_MEM_ALLOC_HOST_PTR)))
   throw error(CL_INVALID_VALUE);
@@ -76,6 +81,11 @@ clCreateSubBuffer(cl_mem d_mem, cl_mem_flags flags,
CL_MEM_WRITE_ONLY)))
   throw error(CL_INVALID_VALUE);
 
+   if (util_bitcount((flags | parent.flags()) 
+ (CL_MEM_HOST_WRITE_ONLY | CL_MEM_HOST_READ_ONLY |
+  CL_MEM_HOST_NO_ACCESS))  1)
+  throw error(CL_INVALID_VALUE);
+
if (op == CL_BUFFER_CREATE_TYPE_REGION) {
   auto reg = reinterpret_castconst cl_buffer_region *(op_info);
 
@@ -182,7 +192,8 @@ clGetSupportedImageFormats(cl_context d_ctx, cl_mem_flags 
flags,
 
if (flags  ~(CL_MEM_READ_WRITE | CL_MEM_WRITE_ONLY | CL_MEM_READ_ONLY |
  CL_MEM_USE_HOST_PTR | CL_MEM_ALLOC_HOST_PTR |
- CL_MEM_COPY_HOST_PTR))
+ CL_MEM_COPY_HOST_PTR | CL_MEM_HOST_WRITE_ONLY |
+ CL_MEM_HOST_READ_ONLY | CL_MEM_HOST_NO_ACCESS ))
   throw error(CL_INVALID_VALUE);
 
if (r_buf  !r_count)
diff --git a/src/gallium/state_trackers/clover/api/transfer.cpp 
b/src/gallium/state_trackers/clover/api/transfer.cpp
index b8d7771..32bd47a 100644
--- a/src/gallium/state_trackers/clover/api/transfer.cpp
+++ b/src/gallium/state_trackers/clover/api/transfer.cpp
@@ -171,10 +171,30 @@ namespace {
/// Checks that the mapping flags are correct.
///
void
-   validate_flags(const cl_map_flags flags) {
+   validate_map_flags(const cl_map_flags flags, const cl_mem_flags mem_flags) {
   if ((flags  (CL_MAP_WRITE | CL_MAP_READ)) 
   (flags  CL_MAP_WRITE_INVALIDATE_REGION))
  throw error(CL_INVALID_VALUE);
+
+  if ((flags  CL_MAP_READ) 
+  (mem_flags  (CL_MEM_HOST_WRITE_ONLY | CL_MEM_HOST_NO_ACCESS)))
+ throw error(CL_INVALID_OPERATION);
+
+  if ((flags  (CL_MAP_WRITE | CL_MAP_WRITE_INVALIDATE_REGION)) 
+  (mem_flags  (CL_MEM_HOST_READ_ONLY | CL_MEM_HOST_NO_ACCESS)))
+ throw error(CL_INVALID_OPERATION);
+   }
+
+   void
+   validate_read_permission(const cl_mem_flags mem_flags) {
+  if (mem_flags  (CL_MEM_HOST_WRITE_ONLY | CL_MEM_HOST_NO_ACCESS))
+ throw error(CL_INVALID_OPERATION);
+   }
+
+   void
+   validate_write_permission(const cl_mem_flags mem_flags) {
+  if (mem_flags  (CL_MEM_HOST_READ_ONLY | CL_MEM_HOST_NO_ACCESS))
+ throw error(CL_INVALID_OPERATION);
}
 
///
@@ -269,6 +289,7 @@ clEnqueueReadBuffer(cl_command_queue d_q, cl_mem d_mem, 
cl_bool blocking,
validate_common(q, deps);
validate_object(q, ptr, {}, obj_pitch, region);
validate_object(q, mem, obj_origin, obj_pitch, region);
+   validate_read_permission(mem.flags());
 
auto hev = createhard_event(
   q, CL_COMMAND_READ_BUFFER, deps,
@@ -298,6 +319,7 @@ clEnqueueWriteBuffer(cl_command_queue d_q, cl_mem d_mem, 
cl_bool blocking,
validate_common(q, deps);
validate_object(q, mem, obj_origin, obj_pitch, region);
validate_object(q, ptr, {}, obj_pitch, region);
+   validate_write_permission(mem.flags());
 
auto hev = createhard_event(
   q, CL_COMMAND_WRITE_BUFFER, deps,
@@ -334,6 +356,7 @@ clEnqueueReadBufferRect(cl_command_queue d_q, cl_mem d_mem, 
cl_bool blocking,
validate_common(q, deps);
validate_object(q, ptr, host_origin, host_pitch, region);
validate_object(q, mem, obj_origin, obj_pitch, region);
+   validate_read_permission(mem.flags());
 
auto hev = createhard_event(
   q, CL_COMMAND_READ_BUFFER_RECT, deps,
@@ -370,6 +393,7 @@ clEnqueueWriteBufferRect(cl_command_queue d_q, cl_mem 
d_mem, cl_bool blocking,
validate_common(q, deps);

Re: [Mesa-dev] [PATCH 2/2] clover: clCompileProgram CL_INVALID_COMPILER_OPTIONS

2014-11-29 Thread EdB
On Monday 10 November 2014 19:04:54 Francisco Jerez wrote:
 EdB edb+m...@sigluy.net writes:
  clCompileProgram should return CL_INVALID_COMPILER_OPTIONS
  instead of CL_INVALID_BUILD_OPTIONS
 
 Looks good to me,
 Reviewed-by: Francisco Jerez curroje...@riseup.net

I don't have commit access. Can someone push it for me?

 
  ---
  
   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
  d29f5a6..30547d0 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-dev mailing list
  mesa-dev@lists.freedesktop.org
  http://lists.freedesktop.org/mailman/listinfo/mesa-dev

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH] clover: fix clCreateContext Piglit test crash

2014-11-12 Thread EdB
clCreateContext no longer crash when CL_CONTEXT_PLATFORM is invalid
---
 src/gallium/state_trackers/clover/api/context.cpp | 11 ---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/src/gallium/state_trackers/clover/api/context.cpp 
b/src/gallium/state_trackers/clover/api/context.cpp
index 021eea3..749d2d7 100644
--- a/src/gallium/state_trackers/clover/api/context.cpp
+++ b/src/gallium/state_trackers/clover/api/context.cpp
@@ -39,10 +39,15 @@ clCreateContext(const cl_context_properties *d_props, 
cl_uint num_devs,
   throw error(CL_INVALID_VALUE);
 
for (auto prop : props) {
-  if (prop.first == CL_CONTEXT_PLATFORM)
- obj(prop.second.ascl_platform_id());
-  else
+  if (prop.first == CL_CONTEXT_PLATFORM) {
+ //clover only have one platform
+ cl_platform_id d_platform;
+ cl_int ret = clGetPlatformIDs(1, d_platform, NULL);
+ if (ret || (prop.second.ascl_platform_id() != d_platform))
+throw error(CL_INVALID_PLATFORM);
+  } else {
  throw error(CL_INVALID_PROPERTY);
+  }
}
 
ret_error(r_errcode, CL_SUCCESS);
-- 
1.9.3

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 0/2] clover: CL_MEM_HOST_* flags checks

2014-11-11 Thread EdB
This serie add CL_MEM_HOST_WRITE_ONLY, CL_MEM_HOST_READ_ONLY and
CL_MEM_HOST_NO_ACCESS checks

Those flags should be inherited when creting sub buffer.
So I change clGetMemObjectInfo to report them and the otherd that should also 
be reported.

EdB (2):
  clover: add CL_MEM_HOST_* flags checks
  clover: clGetMemObjectInfo report sub buffer inherited flags

 src/gallium/state_trackers/clover/api/memory.cpp   | 32 +++---
 src/gallium/state_trackers/clover/api/transfer.cpp | 32 --
 2 files changed, 57 insertions(+), 7 deletions(-)

-- 
1.9.3

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 1/2] clover: add CL_MEM_HOST_* flags checks

2014-11-11 Thread EdB
those flags have been introduced in OpenCL 1.2
---
 src/gallium/state_trackers/clover/api/memory.cpp   | 15 --
 src/gallium/state_trackers/clover/api/transfer.cpp | 32 --
 2 files changed, 42 insertions(+), 5 deletions(-)

diff --git a/src/gallium/state_trackers/clover/api/memory.cpp 
b/src/gallium/state_trackers/clover/api/memory.cpp
index a094e74..fe01d3f 100644
--- a/src/gallium/state_trackers/clover/api/memory.cpp
+++ b/src/gallium/state_trackers/clover/api/memory.cpp
@@ -44,13 +44,18 @@ clCreateBuffer(cl_context d_ctx, cl_mem_flags flags, size_t 
size,
 
if (flags  ~(CL_MEM_READ_WRITE | CL_MEM_WRITE_ONLY | CL_MEM_READ_ONLY |
  CL_MEM_USE_HOST_PTR | CL_MEM_ALLOC_HOST_PTR |
- CL_MEM_COPY_HOST_PTR))
+ CL_MEM_COPY_HOST_PTR | CL_MEM_HOST_WRITE_ONLY |
+ CL_MEM_HOST_READ_ONLY | CL_MEM_HOST_NO_ACCESS ))
   throw error(CL_INVALID_VALUE);
 
if (util_bitcount(flags  (CL_MEM_READ_ONLY | CL_MEM_WRITE_ONLY |
   CL_MEM_READ_WRITE))  1)
   throw error(CL_INVALID_VALUE);
 
+   if (util_bitcount(flags  (CL_MEM_HOST_WRITE_ONLY | CL_MEM_HOST_READ_ONLY |
+  CL_MEM_HOST_NO_ACCESS))  1)
+  throw error(CL_INVALID_VALUE);
+
if ((flags  CL_MEM_USE_HOST_PTR) 
(flags  (CL_MEM_COPY_HOST_PTR | CL_MEM_ALLOC_HOST_PTR)))
   throw error(CL_INVALID_VALUE);
@@ -76,6 +81,11 @@ clCreateSubBuffer(cl_mem d_mem, cl_mem_flags flags,
CL_MEM_WRITE_ONLY)))
   throw error(CL_INVALID_VALUE);
 
+   if (util_bitcount((flags | parent.flags()) 
+ (CL_MEM_HOST_WRITE_ONLY | CL_MEM_HOST_READ_ONLY |
+  CL_MEM_HOST_NO_ACCESS))  1)
+  throw error(CL_INVALID_VALUE);
+
if (op == CL_BUFFER_CREATE_TYPE_REGION) {
   auto reg = reinterpret_castconst cl_buffer_region *(op_info);
 
@@ -182,7 +192,8 @@ clGetSupportedImageFormats(cl_context d_ctx, cl_mem_flags 
flags,
 
if (flags  ~(CL_MEM_READ_WRITE | CL_MEM_WRITE_ONLY | CL_MEM_READ_ONLY |
  CL_MEM_USE_HOST_PTR | CL_MEM_ALLOC_HOST_PTR |
- CL_MEM_COPY_HOST_PTR))
+ CL_MEM_COPY_HOST_PTR | CL_MEM_HOST_WRITE_ONLY |
+ CL_MEM_HOST_READ_ONLY | CL_MEM_HOST_NO_ACCESS ))
   throw error(CL_INVALID_VALUE);
 
if (r_buf  !r_count)
diff --git a/src/gallium/state_trackers/clover/api/transfer.cpp 
b/src/gallium/state_trackers/clover/api/transfer.cpp
index b8d7771..32bd47a 100644
--- a/src/gallium/state_trackers/clover/api/transfer.cpp
+++ b/src/gallium/state_trackers/clover/api/transfer.cpp
@@ -171,10 +171,30 @@ namespace {
/// Checks that the mapping flags are correct.
///
void
-   validate_flags(const cl_map_flags flags) {
+   validate_map_flags(const cl_map_flags flags, const cl_mem_flags mem_flags) {
   if ((flags  (CL_MAP_WRITE | CL_MAP_READ)) 
   (flags  CL_MAP_WRITE_INVALIDATE_REGION))
  throw error(CL_INVALID_VALUE);
+
+  if ((flags  CL_MAP_READ) 
+  (mem_flags  (CL_MEM_HOST_WRITE_ONLY | CL_MEM_HOST_NO_ACCESS)))
+ throw error(CL_MEM_HOST_WRITE_ONLY);
+
+  if ((flags  (CL_MAP_WRITE | CL_MAP_WRITE_INVALIDATE_REGION)) 
+  (mem_flags  (CL_MEM_HOST_READ_ONLY | CL_MEM_HOST_NO_ACCESS)))
+ throw error(CL_MEM_HOST_WRITE_ONLY);
+   }
+
+   void
+   validate_read_permission(const cl_mem_flags mem_flags) {
+  if (mem_flags  (CL_MEM_HOST_WRITE_ONLY | CL_MEM_HOST_NO_ACCESS))
+ throw error(CL_INVALID_OPERATION);
+   }
+
+   void
+   validate_write_permission(const cl_mem_flags mem_flags) {
+  if (mem_flags  (CL_MEM_HOST_READ_ONLY | CL_MEM_HOST_NO_ACCESS))
+ throw error(CL_INVALID_OPERATION);
}
 
///
@@ -269,6 +289,7 @@ clEnqueueReadBuffer(cl_command_queue d_q, cl_mem d_mem, 
cl_bool blocking,
validate_common(q, deps);
validate_object(q, ptr, {}, obj_pitch, region);
validate_object(q, mem, obj_origin, obj_pitch, region);
+   validate_read_permission(mem.flags());
 
auto hev = createhard_event(
   q, CL_COMMAND_READ_BUFFER, deps,
@@ -298,6 +319,7 @@ clEnqueueWriteBuffer(cl_command_queue d_q, cl_mem d_mem, 
cl_bool blocking,
validate_common(q, deps);
validate_object(q, mem, obj_origin, obj_pitch, region);
validate_object(q, ptr, {}, obj_pitch, region);
+   validate_write_permission(mem.flags());
 
auto hev = createhard_event(
   q, CL_COMMAND_WRITE_BUFFER, deps,
@@ -334,6 +356,7 @@ clEnqueueReadBufferRect(cl_command_queue d_q, cl_mem d_mem, 
cl_bool blocking,
validate_common(q, deps);
validate_object(q, ptr, host_origin, host_pitch, region);
validate_object(q, mem, obj_origin, obj_pitch, region);
+   validate_read_permission(mem.flags());
 
auto hev = createhard_event(
   q, CL_COMMAND_READ_BUFFER_RECT, deps,
@@ -370,6 +393,7 @@ clEnqueueWriteBufferRect(cl_command_queue d_q, cl_mem 
d_mem, cl_bool blocking,
validate_common(q, deps);

[Mesa-dev] [PATCH 2/2] clover: clGetMemObjectInfo report sub buffer inherited flags

2014-11-11 Thread EdB
when call cbCreateSubBuffer when followings memory flags are not set
they should be inherited from parent buffer.
Report them when calling clGetMemObjectInfo

flags:
CL_MEM_READ_WRITE, CL_MEM_READ_ONLY, CL_MEM_WRITE_ONLY,
CL_MEM_USE_HOST_PTR, CL_MEM_ALLOC_HOST_PTR, CL_MEM_COPY_HOST_PTR,
CL_MEM_HOST_WRITE_ONLY, CL_MEM_HOST_READ_ONLY, CL_MEM_HOST_NO_ACCESS
---
 src/gallium/state_trackers/clover/api/memory.cpp | 17 +++--
 1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/src/gallium/state_trackers/clover/api/memory.cpp 
b/src/gallium/state_trackers/clover/api/memory.cpp
index fe01d3f..4843cff 100644
--- a/src/gallium/state_trackers/clover/api/memory.cpp
+++ b/src/gallium/state_trackers/clover/api/memory.cpp
@@ -226,9 +226,22 @@ clGetMemObjectInfo(cl_mem d_mem, cl_mem_info param,
   buf.as_scalarcl_mem_object_type() = mem.type();
   break;
 
-   case CL_MEM_FLAGS:
-  buf.as_scalarcl_mem_flags() = mem.flags();
+   case CL_MEM_FLAGS: {
+  cl_mem_flags flags = mem.flags();
+
+  //inherited flags
+  sub_buffer *sub = dynamic_castsub_buffer *(mem);
+  if (sub) {
+ flags = flags | (sub-parent().flags() 
+ (CL_MEM_READ_WRITE | CL_MEM_READ_ONLY | CL_MEM_WRITE_ONLY |
+  CL_MEM_USE_HOST_PTR | CL_MEM_ALLOC_HOST_PTR |
+  CL_MEM_COPY_HOST_PTR |
+  CL_MEM_HOST_WRITE_ONLY | CL_MEM_HOST_READ_ONLY |
+  CL_MEM_HOST_NO_ACCESS));
+  }
+  buf.as_scalarcl_mem_flags() = flags;
   break;
+   }
 
case CL_MEM_SIZE:
   buf.as_scalarsize_t() = mem.size();
-- 
1.9.3

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH 1/2] clover: add CL_MEM_HOST_* flags checks

2014-11-11 Thread EdB
On Tuesday 11 November 2014 17:42:42 EdB wrote:
 those flags have been introduced in OpenCL 1.2
 ---
  src/gallium/state_trackers/clover/api/memory.cpp   | 15 --
  src/gallium/state_trackers/clover/api/transfer.cpp | 32
 -- 2 files changed, 42 insertions(+), 5 deletions(-)
 
 diff --git a/src/gallium/state_trackers/clover/api/memory.cpp
 b/src/gallium/state_trackers/clover/api/memory.cpp index a094e74..fe01d3f
 100644
 --- a/src/gallium/state_trackers/clover/api/memory.cpp
 +++ b/src/gallium/state_trackers/clover/api/memory.cpp
 @@ -44,13 +44,18 @@ clCreateBuffer(cl_context d_ctx, cl_mem_flags flags,
 size_t size,
 
 if (flags  ~(CL_MEM_READ_WRITE | CL_MEM_WRITE_ONLY | CL_MEM_READ_ONLY |
 CL_MEM_USE_HOST_PTR | CL_MEM_ALLOC_HOST_PTR |
 - CL_MEM_COPY_HOST_PTR))
 + CL_MEM_COPY_HOST_PTR | CL_MEM_HOST_WRITE_ONLY |
 + CL_MEM_HOST_READ_ONLY | CL_MEM_HOST_NO_ACCESS ))
throw error(CL_INVALID_VALUE);
 
 if (util_bitcount(flags  (CL_MEM_READ_ONLY | CL_MEM_WRITE_ONLY |
CL_MEM_READ_WRITE))  1)
throw error(CL_INVALID_VALUE);
 
 +   if (util_bitcount(flags  (CL_MEM_HOST_WRITE_ONLY |
 CL_MEM_HOST_READ_ONLY | + 
 CL_MEM_HOST_NO_ACCESS))  1)
 +  throw error(CL_INVALID_VALUE);
 +
 if ((flags  CL_MEM_USE_HOST_PTR) 
 (flags  (CL_MEM_COPY_HOST_PTR | CL_MEM_ALLOC_HOST_PTR)))
throw error(CL_INVALID_VALUE);
 @@ -76,6 +81,11 @@ clCreateSubBuffer(cl_mem d_mem, cl_mem_flags flags,
 CL_MEM_WRITE_ONLY)))
throw error(CL_INVALID_VALUE);
 
 +   if (util_bitcount((flags | parent.flags()) 
 + (CL_MEM_HOST_WRITE_ONLY | CL_MEM_HOST_READ_ONLY |
 +  CL_MEM_HOST_NO_ACCESS))  1)
 +  throw error(CL_INVALID_VALUE);
 +
 if (op == CL_BUFFER_CREATE_TYPE_REGION) {
auto reg = reinterpret_castconst cl_buffer_region *(op_info);
 
 @@ -182,7 +192,8 @@ clGetSupportedImageFormats(cl_context d_ctx,
 cl_mem_flags flags,
 
 if (flags  ~(CL_MEM_READ_WRITE | CL_MEM_WRITE_ONLY | CL_MEM_READ_ONLY |
 CL_MEM_USE_HOST_PTR | CL_MEM_ALLOC_HOST_PTR |
 - CL_MEM_COPY_HOST_PTR))
 + CL_MEM_COPY_HOST_PTR | CL_MEM_HOST_WRITE_ONLY |
 + CL_MEM_HOST_READ_ONLY | CL_MEM_HOST_NO_ACCESS ))
throw error(CL_INVALID_VALUE);
 
 if (r_buf  !r_count)
 diff --git a/src/gallium/state_trackers/clover/api/transfer.cpp
 b/src/gallium/state_trackers/clover/api/transfer.cpp index b8d7771..32bd47a
 100644
 --- a/src/gallium/state_trackers/clover/api/transfer.cpp
 +++ b/src/gallium/state_trackers/clover/api/transfer.cpp
 @@ -171,10 +171,30 @@ namespace {
 /// Checks that the mapping flags are correct.
 ///
 void
 -   validate_flags(const cl_map_flags flags) {
 +   validate_map_flags(const cl_map_flags flags, const cl_mem_flags
 mem_flags) { if ((flags  (CL_MAP_WRITE | CL_MAP_READ)) 
(flags  CL_MAP_WRITE_INVALIDATE_REGION))
   throw error(CL_INVALID_VALUE);
 +
 +  if ((flags  CL_MAP_READ) 
 +  (mem_flags  (CL_MEM_HOST_WRITE_ONLY | CL_MEM_HOST_NO_ACCESS)))
 + throw error(CL_MEM_HOST_WRITE_ONLY);
sorry, I recreate the patches series before sending it and forgot one change.
This should be : throw error(CL_INVALID_OPERATION);

 +
 +  if ((flags  (CL_MAP_WRITE | CL_MAP_WRITE_INVALIDATE_REGION)) 
 +  (mem_flags  (CL_MEM_HOST_READ_ONLY | CL_MEM_HOST_NO_ACCESS)))
 + throw error(CL_MEM_HOST_WRITE_ONLY);
same here : throw error(CL_INVALID_OPERATION);
 +   }
 +
 +   void
 +   validate_read_permission(const cl_mem_flags mem_flags) {
 +  if (mem_flags  (CL_MEM_HOST_WRITE_ONLY | CL_MEM_HOST_NO_ACCESS))
 + throw error(CL_INVALID_OPERATION);
 +   }
 +
 +   void
 +   validate_write_permission(const cl_mem_flags mem_flags) {
 +  if (mem_flags  (CL_MEM_HOST_READ_ONLY | CL_MEM_HOST_NO_ACCESS))
 + throw error(CL_INVALID_OPERATION);
 }
 
 ///
 @@ -269,6 +289,7 @@ clEnqueueReadBuffer(cl_command_queue d_q, cl_mem d_mem,
 cl_bool blocking, validate_common(q, deps);
 validate_object(q, ptr, {}, obj_pitch, region);
 validate_object(q, mem, obj_origin, obj_pitch, region);
 +   validate_read_permission(mem.flags());
 
 auto hev = createhard_event(
q, CL_COMMAND_READ_BUFFER, deps,
 @@ -298,6 +319,7 @@ clEnqueueWriteBuffer(cl_command_queue d_q, cl_mem d_mem,
 cl_bool blocking, validate_common(q, deps);
 validate_object(q, mem, obj_origin, obj_pitch, region);
 validate_object(q, ptr, {}, obj_pitch, region);
 +   validate_write_permission(mem.flags());
 
 auto hev = createhard_event(
q, CL_COMMAND_WRITE_BUFFER, deps,
 @@ -334,6 +356,7 @@ clEnqueueReadBufferRect(cl_command_queue d_q, cl_mem
 d_mem, cl_bool blocking, validate_common(q, deps);
 validate_object(q, ptr, host_origin, host_pitch, region);
 validate_object(q, mem, obj_origin

Re: [Mesa-dev] [PATCH 1/2] clover: fix tab/space and alignement

2014-11-10 Thread EdB
On Monday 10 November 2014 19:03:43 Francisco Jerez wrote:
 EdB edb+m...@sigluy.net writes:
  ---
  
   src/gallium/state_trackers/clover/llvm/invocation.cpp | 6 +++---
   1 file changed, 3 insertions(+), 3 deletions(-)
  
  diff --git a/src/gallium/state_trackers/clover/llvm/invocation.cpp
  b/src/gallium/state_trackers/clover/llvm/invocation.cpp index
  3a4fcf0..d29f5a6 100644
  --- a/src/gallium/state_trackers/clover/llvm/invocation.cpp
  +++ b/src/gallium/state_trackers/clover/llvm/invocation.cpp
  @@ -214,7 +214,7 @@ namespace {
  
   #if HAVE_LLVM = 0x0306
   
 c.getPreprocessorOpts().addRemappedFile(name,
  
  - 
  llvm::MemoryBuffer::getMemBuffer(source).release()); +   
llvm::MemoryBuffer::getMemBuffer(source).release());
 This doesn't to fix the inconsistency that the line goes over the 80
 column limit, if that's what you meant to fix, and it makes the
 alignment with the open parenthesis inconsistent.

 
I tried to make it consistent with the bottom line.
Please use the style that fit better

EdB

 
   #else
   
 c.getPreprocessorOpts().addRemappedFile(name,
 
 llvm::MemoryBuffer::getMemBuffer(so
 urce));
  
  @@ -675,7 +675,7 @@ static const struct debug_named_value debug_options[]
  = { 
  {llvm, DBG_LLVM, Dump the generated LLVM IR for all kernels.},
  {asm, DBG_ASM, Dump kernel assembly code for targets specifying 
  
   PIPE_SHADER_IR_NATIVE},
  
  -   DEBUG_NAMED_VALUE_END // must be last
  +   DEBUG_NAMED_VALUE_END // must be last
  
   };
   
   module
  
  @@ -737,7 +737,7 @@ clover::compile_program_llvm(const compat::string
  source, 
break;
 
 case PIPE_SHADER_IR_NATIVE: {
 
std::vectorchar code = compile_native(mod, triple, processor,
  
  -debug_flags  DBG_ASM, 
r_log);
  + debug_flags  DBG_ASM,
  r_log); 
m = build_module_native(code, mod, kernels, address_spaces,
r_log);
break;
 
 }
  
  ___
  mesa-dev mailing list
  mesa-dev@lists.freedesktop.org
  http://lists.freedesktop.org/mailman/listinfo/mesa-dev

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 1/2] clover: fix tab/space and alignement

2014-11-07 Thread EdB
---
 src/gallium/state_trackers/clover/llvm/invocation.cpp | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/gallium/state_trackers/clover/llvm/invocation.cpp 
b/src/gallium/state_trackers/clover/llvm/invocation.cpp
index 3a4fcf0..d29f5a6 100644
--- a/src/gallium/state_trackers/clover/llvm/invocation.cpp
+++ b/src/gallium/state_trackers/clover/llvm/invocation.cpp
@@ -214,7 +214,7 @@ namespace {
 
 #if HAVE_LLVM = 0x0306
   c.getPreprocessorOpts().addRemappedFile(name,
-  
llvm::MemoryBuffer::getMemBuffer(source).release());
+  
llvm::MemoryBuffer::getMemBuffer(source).release());
 #else
   c.getPreprocessorOpts().addRemappedFile(name,
   
llvm::MemoryBuffer::getMemBuffer(source));
@@ -675,7 +675,7 @@ static const struct debug_named_value debug_options[] = {
{llvm, DBG_LLVM, Dump the generated LLVM IR for all kernels.},
{asm, DBG_ASM, Dump kernel assembly code for targets specifying 
 PIPE_SHADER_IR_NATIVE},
-   DEBUG_NAMED_VALUE_END // must be last
+   DEBUG_NAMED_VALUE_END // must be last
 };
 
 module
@@ -737,7 +737,7 @@ clover::compile_program_llvm(const compat::string source,
  break;
   case PIPE_SHADER_IR_NATIVE: {
  std::vectorchar code = compile_native(mod, triple, processor,
-debug_flags  DBG_ASM, r_log);
+ debug_flags  DBG_ASM, r_log);
  m = build_module_native(code, mod, kernels, address_spaces, r_log);
  break;
   }
-- 
1.9.3

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 0/2] clover CL_INVALID_COMPILER_OPTIONS

2014-11-07 Thread EdB
When I added clCompileProgram, I forgot to made the change to
trigger CL_INVALID_COMPILER_OPTIONS instead of CL_INVALID_BUILD_OPTIONS
when invalid option are pass to compiler.
This have been catched by the yet to be reviewed Pigilt test

The first patch remove some spaces inconsistency in
llvm/invocation.cpp. It could have been a stand-alone one

EdB (2):
  clover: fix tab/space and alignement
  clover: clCompileProgram CL_INVALID_COMPILER_OPTIONS

 src/gallium/state_trackers/clover/api/program.cpp | 2 ++
 src/gallium/state_trackers/clover/llvm/invocation.cpp | 8 
 2 files changed, 6 insertions(+), 4 deletions(-)

-- 
1.9.3

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 2/2] clover: clCompileProgram CL_INVALID_COMPILER_OPTIONS

2014-11-07 Thread EdB
clCompileProgram should return CL_INVALID_COMPILER_OPTIONS
instead of CL_INVALID_BUILD_OPTIONS
---
 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 d29f5a6..30547d0 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;
-- 
1.9.3

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH] clover: fix clBuildProgram Piglit regression

2014-11-02 Thread EdB
should trigger CL_INVALID_VALUE
if device_list is NULL and num_devices is greater than zero.

introduced by e5468dfa523be2a7a0d04bb9efcf8ae780957563
---
 src/gallium/state_trackers/clover/api/program.cpp | 20 +++-
 1 file changed, 11 insertions(+), 9 deletions(-)

diff --git a/src/gallium/state_trackers/clover/api/program.cpp 
b/src/gallium/state_trackers/clover/api/program.cpp
index 64c4a43..dc89730 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_vectordevice devs,
+  ref_vectordevice devs,
   void (*pfn_notify)(cl_program, void *),
   void *user_data) {
 
@@ -37,10 +37,14 @@ namespace {
   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);
+  if (!num_devs) {
+ devs = prog.context().devices();
+  } else {
+ if (any_of([](const device dev) {
+  return !count(dev, prog.context().devices());
+   }, devs))
+throw error(CL_INVALID_DEVICE);
+  }
}
 }
 
@@ -173,8 +177,7 @@ clBuildProgram(cl_program d_prog, cl_uint num_devs,
void (*pfn_notify)(cl_program, void *),
void *user_data) try {
auto prog = obj(d_prog);
-   auto devs = (d_devs ? objs(d_devs, num_devs) :
-ref_vectordevice(prog.context().devices()));
+   auto devs = objsallow_empty_tag(d_devs, num_devs);
auto opts = (p_opts ? p_opts : );
 
validate_build_program_common(prog, num_devs, devs, pfn_notify, user_data);
@@ -195,8 +198,7 @@ clCompileProgram(cl_program d_prog, cl_uint num_devs,
  void (*pfn_notify)(cl_program, void *),
  void *user_data) try {
auto prog = obj(d_prog);
-   auto devs = (d_devs ? objs(d_devs, num_devs) :
-ref_vectordevice(prog.context().devices()));
+   auto devs = objsallow_empty_tag(d_devs, num_devs);
auto opts = (p_opts ? p_opts : );
header_map headers;
 
-- 
1.9.3

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 1/2] clover: add allow_empty_tag

2014-10-24 Thread EdB
to allow empty objs() list checks
---
 src/gallium/state_trackers/clover/core/object.hpp | 18 ++
 1 file changed, 18 insertions(+)

diff --git a/src/gallium/state_trackers/clover/core/object.hpp 
b/src/gallium/state_trackers/clover/core/object.hpp
index 697565c..01fa779 100644
--- a/src/gallium/state_trackers/clover/core/object.hpp
+++ b/src/gallium/state_trackers/clover/core/object.hpp
@@ -54,6 +54,7 @@ namespace clover {
};
 
struct default_tag;
+   struct allow_empty_tag;
struct wait_list_tag;
struct property_list_tag;
 
@@ -95,6 +96,23 @@ namespace clover {
   };
 
   templatetypename D
+  struct descriptor_traitsallow_empty_tag, D {
+ typedef typename D::object_type object_type;
+
+ static void
+ validate(D *d) {
+if (!d || d-dispatch != _dispatch)
+   throw invalid_object_errorobject_type();
+ }
+
+ static void
+ validate_list(D *const *ds, size_t n) {
+if (bool(ds) != bool(n))
+   throw error(CL_INVALID_VALUE);
+ }
+  };
+
+  templatetypename D
   struct descriptor_traitswait_list_tag, D {
  typedef typename D::object_type object_type;
 
-- 
1.9.3

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH 3/3] clover: add clCompile

2014-10-20 Thread EdB

Le 2014-10-20 09:42, Francisco Jerez a écrit :

Francisco Jerez curroje...@riseup.net writes:


EdB edb+m...@sigluy.net writes:


Sorry, I didn't test it enought.
It needs the two following patch in order to work ok

EdB (2):
  clover: add allow_empty_tag
  clover: don't return CL_INVALID_VALUE if there is no header



These look good,
Reviewed-by: Francisco Jerez curroje...@riseup.net


I've pushed the whole clCompileProgram series.  Thanks!

Thanks,
Tom ask me to try another method in order to avoid using the fake 
headers path.
However, I'm not at home for the moment, anyway this one is ok, but I'll 
try to send a new path.





 src/gallium/state_trackers/clover/api/program.cpp |  2 +-
 src/gallium/state_trackers/clover/core/object.hpp | 18 
++

 2 files changed, 19 insertions(+), 1 deletion(-)

--
1.9.3

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH] clover: use correct typenames for compat::pair's first/second

2014-10-20 Thread EdB

Le 2014-10-20 10:56, Emil Velikov a écrit :

Seems to be a typo judging from the overall declaration of the
template.


Right. Thanks
EdB


Cc: EdB edb+m...@sigluy.net
Cc: Francisco Jerez curroje...@riseup.net
Signed-off-by: Emil Velikov emil.l.veli...@gmail.com
---
 src/gallium/state_trackers/clover/util/compat.hpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/gallium/state_trackers/clover/util/compat.hpp
b/src/gallium/state_trackers/clover/util/compat.hpp
index a52a6af..735994f 100644
--- a/src/gallium/state_trackers/clover/util/compat.hpp
+++ b/src/gallium/state_trackers/clover/util/compat.hpp
@@ -417,8 +417,8 @@ namespace clover {
  pair(T first, S second) :
 first(first), second(second) {}

- S first;
- T second;
+ T first;
+ S second;
   };

   class exception {

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH 3/3] clover: add clCompile

2014-10-11 Thread EdB
On Friday 10 October 2014 15:45:51 Tom Stellard wrote:
 On Fri, Oct 10, 2014 at 07:51:40PM +0200, EdB wrote:
  On Friday 10 October 2014 10:16:08 Tom Stellard wrote:
   On Thu, Oct 09, 2014 at 09:22:46PM +0200, EdB wrote:
On Thursday, October 09, 2014 06:29:40 AM Tom Stellard wrote:
 On Sun, Sep 28, 2014 at 12:57:22PM +0200, EdB wrote:
  ---
  
   src/gallium/state_trackers/clover/api/dispatch.cpp |  2 +-
   src/gallium/state_trackers/clover/api/program.cpp  | 39
   +++---
   .../state_trackers/clover/core/compiler.hpp
   
| 12 ---
   
   src/gallium/state_trackers/clover/core/error.hpp   |  2 +-
   src/gallium/state_trackers/clover/core/program.cpp | 14 ++--
   src/gallium/state_trackers/clover/core/program.hpp |  5 ++-
   .../state_trackers/clover/llvm/invocation.cpp  | 39
   ++ 7 files changed, 93 insertions(+), 20
   deletions(-)
  
  diff --git a/src/gallium/state_trackers/clover/api/dispatch.cpp
  b/src/gallium/state_trackers/clover/api/dispatch.cpp index
  35d150d..b5a4094 100644
  --- a/src/gallium/state_trackers/clover/api/dispatch.cpp
  +++ b/src/gallium/state_trackers/clover/api/dispatch.cpp
  @@ -122,7 +122,7 @@ namespace clover {
  
 clReleaseDevice,
 clCreateImage,
 clCreateProgramWithBuiltInKernels,
  
  -  NULL, // clCompileProgram
  +  clCompileProgram,
  
 NULL, // clLinkProgram
 clUnloadPlatformCompiler,
 NULL, // clGetKernelArgInfo
  
  diff --git a/src/gallium/state_trackers/clover/api/program.cpp
  b/src/gallium/state_trackers/clover/api/program.cpp index
  6771735..33df0cd 100644
  --- a/src/gallium/state_trackers/clover/api/program.cpp
  +++ b/src/gallium/state_trackers/clover/api/program.cpp
  @@ -152,14 +152,34 @@ 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) try {
  +   void *user_data) {
  +   cl_int error = clCompileProgram(d_prog, num_devs, d_devs,
  p_opts,
  +   0, 0, 0,
  +   pfn_notify, user_data);
  +   return error == CL_COMPILE_PROGRAM_FAILURE ?
  + CL_BUILD_PROGRAM_FAILURE : error;
  +}
  +
  +CLOVER_API cl_int
  +clCompileProgram(cl_program d_prog, cl_uint num_devs,
  + const cl_device_id *d_devs, const char *p_opts,
  + cl_uint num_headers, const cl_program
  *d_header_progs,
  + const char **header_names,
  + void (*pfn_notify)(cl_program, void *),
  + void *user_data) try {
  
  auto prog = obj(d_prog);
  
  auto devs = (d_devs ? objs(d_devs, num_devs) :
   ref_vectordevice(prog.context().devices()));
  
  auto opts = (p_opts ? p_opts : );
  
  -   if (bool(num_devs) != bool(d_devs) ||
  -   (!pfn_notify  user_data))
  +   if (bool(num_devs) != bool(d_devs))
  +  throw error(CL_INVALID_VALUE);
  +
  +   if (!pfn_notify  user_data)
  +  throw error(CL_INVALID_VALUE);
  +
  +   if (bool(num_headers) != bool(header_names) ||
  +   bool(num_headers) != bool(d_header_progs))
  
 throw error(CL_INVALID_VALUE);
  
  if (any_of([](const device dev) {
  
  @@ -170,7 +190,18 @@ clBuildProgram(cl_program d_prog, cl_uint
  num_devs,
  
  if (prog.kernel_ref_count())
  
 throw error(CL_INVALID_OPERATION);
  
  -   prog.build(devs, opts);
  +   std::mapconst std::string, const std::string headers;
  +   for (cl_uint i = 0; i  num_headers; ++i) {
  +  auto h_name = std::string(header_names[i]);
  +  auto h_prog = obj(d_header_progs[i]);
  +
  +  if (!h_prog.has_source)
  + throw error(CL_INVALID_OPERATION);
  +
  +  headers.insert(make_pair(h_name, h_prog.source()));
  +   }
  +
  +   prog.build(devs, opts, headers);
  
  return CL_SUCCESS;
   
   } catch (error e) {
  
  diff --git a/src/gallium/state_trackers/clover/core/compiler.hpp
  b/src/gallium/state_trackers/clover/core/compiler.hpp index
  6ef84d1..c2c4063 100644
  --- a/src/gallium/state_trackers/clover/core/compiler.hpp
  +++ b/src/gallium/state_trackers/clover/core/compiler.hpp
  @@ -29,11 +29,15 @@
  
   #include pipe/p_defines.h
   
   namespace clover {
  
  +   typedef compat::paircompat::vector_refconst char,
  +compat

Re: [Mesa-dev] [PATCH 3/3] clover: add clCompile

2014-10-11 Thread EdB
Sorry, I didn't test it enought.
It needs the two following patch in order to work ok

EdB (2):
  clover: add allow_empty_tag
  clover: don't return CL_INVALID_VALUE if there is no header

 src/gallium/state_trackers/clover/api/program.cpp |  2 +-
 src/gallium/state_trackers/clover/core/object.hpp | 18 ++
 2 files changed, 19 insertions(+), 1 deletion(-)

-- 
1.9.3

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 2/2] clover: don't return CL_INVALID_VALUE if there is no header

2014-10-11 Thread EdB
---
 src/gallium/state_trackers/clover/api/program.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/gallium/state_trackers/clover/api/program.cpp 
b/src/gallium/state_trackers/clover/api/program.cpp
index 1b9311f..e3ef8d0 100644
--- a/src/gallium/state_trackers/clover/api/program.cpp
+++ b/src/gallium/state_trackers/clover/api/program.cpp
@@ -198,7 +198,7 @@ clCompileProgram(cl_program d_prog, cl_uint num_devs,
  name, header.source()));
   },
   range(header_names, num_headers),
-  objs(d_header_progs, num_headers));
+  objsallow_empty_tag(d_header_progs, num_headers));
 
prog.build(devs, opts, headers);
return CL_SUCCESS;
-- 
1.9.3

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH 3/3] clover: add clCompile

2014-10-10 Thread EdB
On Friday 10 October 2014 10:16:08 Tom Stellard wrote:
 On Thu, Oct 09, 2014 at 09:22:46PM +0200, EdB wrote:
  On Thursday, October 09, 2014 06:29:40 AM Tom Stellard wrote:
   On Sun, Sep 28, 2014 at 12:57:22PM +0200, EdB wrote:
---

 src/gallium/state_trackers/clover/api/dispatch.cpp |  2 +-
 src/gallium/state_trackers/clover/api/program.cpp  | 39
 +++--- .../state_trackers/clover/core/compiler.hpp
 
  | 12 ---
 
 src/gallium/state_trackers/clover/core/error.hpp   |  2 +-
 src/gallium/state_trackers/clover/core/program.cpp | 14 ++--
 src/gallium/state_trackers/clover/core/program.hpp |  5 ++-
 .../state_trackers/clover/llvm/invocation.cpp  | 39
 ++ 7 files changed, 93 insertions(+), 20
 deletions(-)

diff --git a/src/gallium/state_trackers/clover/api/dispatch.cpp
b/src/gallium/state_trackers/clover/api/dispatch.cpp index
35d150d..b5a4094 100644
--- a/src/gallium/state_trackers/clover/api/dispatch.cpp
+++ b/src/gallium/state_trackers/clover/api/dispatch.cpp
@@ -122,7 +122,7 @@ namespace clover {

   clReleaseDevice,
   clCreateImage,
   clCreateProgramWithBuiltInKernels,

-  NULL, // clCompileProgram
+  clCompileProgram,

   NULL, // clLinkProgram
   clUnloadPlatformCompiler,
   NULL, // clGetKernelArgInfo

diff --git a/src/gallium/state_trackers/clover/api/program.cpp
b/src/gallium/state_trackers/clover/api/program.cpp index
6771735..33df0cd 100644
--- a/src/gallium/state_trackers/clover/api/program.cpp
+++ b/src/gallium/state_trackers/clover/api/program.cpp
@@ -152,14 +152,34 @@ 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) try {
+   void *user_data) {
+   cl_int error = clCompileProgram(d_prog, num_devs, d_devs, p_opts,
+   0, 0, 0,
+   pfn_notify, user_data);
+   return error == CL_COMPILE_PROGRAM_FAILURE ?
+ CL_BUILD_PROGRAM_FAILURE : error;
+}
+
+CLOVER_API cl_int
+clCompileProgram(cl_program d_prog, cl_uint num_devs,
+ const cl_device_id *d_devs, const char *p_opts,
+ cl_uint num_headers, const cl_program
*d_header_progs,
+ const char **header_names,
+ void (*pfn_notify)(cl_program, void *),
+ void *user_data) try {

auto prog = obj(d_prog);

auto devs = (d_devs ? objs(d_devs, num_devs) :
 ref_vectordevice(prog.context().devices()));

auto opts = (p_opts ? p_opts : );

-   if (bool(num_devs) != bool(d_devs) ||
-   (!pfn_notify  user_data))
+   if (bool(num_devs) != bool(d_devs))
+  throw error(CL_INVALID_VALUE);
+
+   if (!pfn_notify  user_data)
+  throw error(CL_INVALID_VALUE);
+
+   if (bool(num_headers) != bool(header_names) ||
+   bool(num_headers) != bool(d_header_progs))

   throw error(CL_INVALID_VALUE);

if (any_of([](const device dev) {

@@ -170,7 +190,18 @@ clBuildProgram(cl_program d_prog, cl_uint
num_devs,

if (prog.kernel_ref_count())

   throw error(CL_INVALID_OPERATION);

-   prog.build(devs, opts);
+   std::mapconst std::string, const std::string headers;
+   for (cl_uint i = 0; i  num_headers; ++i) {
+  auto h_name = std::string(header_names[i]);
+  auto h_prog = obj(d_header_progs[i]);
+
+  if (!h_prog.has_source)
+ throw error(CL_INVALID_OPERATION);
+
+  headers.insert(make_pair(h_name, h_prog.source()));
+   }
+
+   prog.build(devs, opts, headers);

return CL_SUCCESS;
 
 } catch (error e) {

diff --git a/src/gallium/state_trackers/clover/core/compiler.hpp
b/src/gallium/state_trackers/clover/core/compiler.hpp index
6ef84d1..c2c4063 100644
--- a/src/gallium/state_trackers/clover/core/compiler.hpp
+++ b/src/gallium/state_trackers/clover/core/compiler.hpp
@@ -29,11 +29,15 @@

 #include pipe/p_defines.h
 
 namespace clover {

+   typedef compat::paircompat::vector_refconst char,
+compat::vector_refconst char  vector_ref_pair;
+

module compile_program_llvm(const compat::string source,

-   pipe_shader_ir ir,
-   const compat::string target,
-   const compat::string opts,
-   compat::string r_log

Re: [Mesa-dev] [PATCH 3/3] clover: add clCompile

2014-10-09 Thread EdB
On Thursday, October 09, 2014 06:29:40 AM Tom Stellard wrote:
 On Sun, Sep 28, 2014 at 12:57:22PM +0200, EdB wrote:
  ---
  
   src/gallium/state_trackers/clover/api/dispatch.cpp |  2 +-
   src/gallium/state_trackers/clover/api/program.cpp  | 39
   +++--- .../state_trackers/clover/core/compiler.hpp  
| 12 ---
   src/gallium/state_trackers/clover/core/error.hpp   |  2 +-
   src/gallium/state_trackers/clover/core/program.cpp | 14 ++--
   src/gallium/state_trackers/clover/core/program.hpp |  5 ++-
   .../state_trackers/clover/llvm/invocation.cpp  | 39
   ++ 7 files changed, 93 insertions(+), 20
   deletions(-)
  
  diff --git a/src/gallium/state_trackers/clover/api/dispatch.cpp
  b/src/gallium/state_trackers/clover/api/dispatch.cpp index
  35d150d..b5a4094 100644
  --- a/src/gallium/state_trackers/clover/api/dispatch.cpp
  +++ b/src/gallium/state_trackers/clover/api/dispatch.cpp
  @@ -122,7 +122,7 @@ namespace clover {
  
 clReleaseDevice,
 clCreateImage,
 clCreateProgramWithBuiltInKernels,
  
  -  NULL, // clCompileProgram
  +  clCompileProgram,
  
 NULL, // clLinkProgram
 clUnloadPlatformCompiler,
 NULL, // clGetKernelArgInfo
  
  diff --git a/src/gallium/state_trackers/clover/api/program.cpp
  b/src/gallium/state_trackers/clover/api/program.cpp index
  6771735..33df0cd 100644
  --- a/src/gallium/state_trackers/clover/api/program.cpp
  +++ b/src/gallium/state_trackers/clover/api/program.cpp
  @@ -152,14 +152,34 @@ 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) try {
  +   void *user_data) {
  +   cl_int error = clCompileProgram(d_prog, num_devs, d_devs, p_opts,
  +   0, 0, 0,
  +   pfn_notify, user_data);
  +   return error == CL_COMPILE_PROGRAM_FAILURE ?
  + CL_BUILD_PROGRAM_FAILURE : error;
  +}
  +
  +CLOVER_API cl_int
  +clCompileProgram(cl_program d_prog, cl_uint num_devs,
  + const cl_device_id *d_devs, const char *p_opts,
  + cl_uint num_headers, const cl_program *d_header_progs,
  + const char **header_names,
  + void (*pfn_notify)(cl_program, void *),
  + void *user_data) try {
  
  auto prog = obj(d_prog);
  
  auto devs = (d_devs ? objs(d_devs, num_devs) :
   ref_vectordevice(prog.context().devices()));
  
  auto opts = (p_opts ? p_opts : );
  
  -   if (bool(num_devs) != bool(d_devs) ||
  -   (!pfn_notify  user_data))
  +   if (bool(num_devs) != bool(d_devs))
  +  throw error(CL_INVALID_VALUE);
  +
  +   if (!pfn_notify  user_data)
  +  throw error(CL_INVALID_VALUE);
  +
  +   if (bool(num_headers) != bool(header_names) ||
  +   bool(num_headers) != bool(d_header_progs))
  
 throw error(CL_INVALID_VALUE);
  
  if (any_of([](const device dev) {
  
  @@ -170,7 +190,18 @@ clBuildProgram(cl_program d_prog, cl_uint num_devs,
  
  if (prog.kernel_ref_count())
  
 throw error(CL_INVALID_OPERATION);
  
  -   prog.build(devs, opts);
  +   std::mapconst std::string, const std::string headers;
  +   for (cl_uint i = 0; i  num_headers; ++i) {
  +  auto h_name = std::string(header_names[i]);
  +  auto h_prog = obj(d_header_progs[i]);
  +
  +  if (!h_prog.has_source)
  + throw error(CL_INVALID_OPERATION);
  +
  +  headers.insert(make_pair(h_name, h_prog.source()));
  +   }
  +
  +   prog.build(devs, opts, headers);
  
  return CL_SUCCESS;
   
   } catch (error e) {
  
  diff --git a/src/gallium/state_trackers/clover/core/compiler.hpp
  b/src/gallium/state_trackers/clover/core/compiler.hpp index
  6ef84d1..c2c4063 100644
  --- a/src/gallium/state_trackers/clover/core/compiler.hpp
  +++ b/src/gallium/state_trackers/clover/core/compiler.hpp
  @@ -29,11 +29,15 @@
  
   #include pipe/p_defines.h
   
   namespace clover {
  
  +   typedef compat::paircompat::vector_refconst char,
  +compat::vector_refconst char  vector_ref_pair;
  +
  
  module compile_program_llvm(const compat::string source,
  
  -   pipe_shader_ir ir,
  -   const compat::string target,
  -   const compat::string opts,
  -   compat::string r_log);
  +   const compat::vectorvector_ref_pair headers,
  +   pipe_shader_ir ir,
  +   const compat::string target,
  +   const compat::string opts,
  +   compat::string r_log);
  
  module compile_program_tgsi(const compat::string source);
   
   }
  
  diff --git a/src/gallium/state_trackers/clover/core/error.hpp
  b

Re: [Mesa-dev] [PATCH 3/3] clover: add clCompile

2014-10-09 Thread EdB
On Wednesday, October 08, 2014 08:31:39 PM Francisco Jerez wrote:
 I'm attaching a somewhat cleaned up version of this patch, does it look
 OK to you?  Tom, do you have any comments on the LLVM changes?  It looks
 good to me.

I've tested the modified version you push at 
http://cgit.freedesktop.org/~currojerez/mesa/log/?h=clover-compile-program
and it's ok

 
 EdB edb+m...@sigluy.net writes:
  ---
  
   src/gallium/state_trackers/clover/api/dispatch.cpp |  2 +-
   src/gallium/state_trackers/clover/api/program.cpp  | 39
   +++--- .../state_trackers/clover/core/compiler.hpp  
| 12 ---
   src/gallium/state_trackers/clover/core/error.hpp   |  2 +-
   src/gallium/state_trackers/clover/core/program.cpp | 14 ++--
   src/gallium/state_trackers/clover/core/program.hpp |  5 ++-
   .../state_trackers/clover/llvm/invocation.cpp  | 39
   ++ 7 files changed, 93 insertions(+), 20
   deletions(-)
 
 [...]

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 2/3] clover: add vector_ref default constructor

2014-09-28 Thread EdB
---
 src/gallium/state_trackers/clover/util/compat.hpp | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/src/gallium/state_trackers/clover/util/compat.hpp 
b/src/gallium/state_trackers/clover/util/compat.hpp
index dd20ef0..f938e74 100644
--- a/src/gallium/state_trackers/clover/util/compat.hpp
+++ b/src/gallium/state_trackers/clover/util/compat.hpp
@@ -190,6 +190,9 @@ namespace clover {
  typedef std::ptrdiff_t difference_type;
  typedef std::size_t size_type;
 
+ vector_ref() : p(NULL), n(0) {
+ }
+
  vector_ref(iterator p, size_type n) : p(p), n(n) {
  }
 
-- 
2.1.1

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 0/3] clover: add clCompile

2014-09-28 Thread EdB
This serie add clCompile function as mandatory for CL 1.2

EdB (3):
  clover: add a simple compat::pair
  clover: add vector_ref default constructor
  clover: add clCompile

 src/gallium/state_trackers/clover/api/dispatch.cpp |  2 +-
 src/gallium/state_trackers/clover/api/program.cpp  | 39 +++---
 .../state_trackers/clover/core/compiler.hpp| 12 ---
 src/gallium/state_trackers/clover/core/error.hpp   |  2 +-
 src/gallium/state_trackers/clover/core/program.cpp | 14 ++--
 src/gallium/state_trackers/clover/core/program.hpp |  5 ++-
 .../state_trackers/clover/llvm/invocation.cpp  | 39 ++
 src/gallium/state_trackers/clover/util/compat.hpp  |  9 +
 8 files changed, 102 insertions(+), 20 deletions(-)

-- 
2.1.1

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 1/3] clover: add a simple compat::pair

2014-09-28 Thread EdB
std::pair is not c++98/c++11 safe
---
 src/gallium/state_trackers/clover/util/compat.hpp | 6 ++
 1 file changed, 6 insertions(+)

diff --git a/src/gallium/state_trackers/clover/util/compat.hpp 
b/src/gallium/state_trackers/clover/util/compat.hpp
index 7305577..dd20ef0 100644
--- a/src/gallium/state_trackers/clover/util/compat.hpp
+++ b/src/gallium/state_trackers/clover/util/compat.hpp
@@ -380,6 +380,12 @@ namespace clover {
  mutable vectorchar v;
   };
 
+  templateclass T1, class T2
+  struct pair {
+ T1 first;
+ T2 second;
+  };
+
   templatetypename T
   bool
   operator==(const vector_refT a, const vector_refT b) {
-- 
2.1.1

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 3/3] clover: add clCompile

2014-09-28 Thread EdB
---
 src/gallium/state_trackers/clover/api/dispatch.cpp |  2 +-
 src/gallium/state_trackers/clover/api/program.cpp  | 39 +++---
 .../state_trackers/clover/core/compiler.hpp| 12 ---
 src/gallium/state_trackers/clover/core/error.hpp   |  2 +-
 src/gallium/state_trackers/clover/core/program.cpp | 14 ++--
 src/gallium/state_trackers/clover/core/program.hpp |  5 ++-
 .../state_trackers/clover/llvm/invocation.cpp  | 39 ++
 7 files changed, 93 insertions(+), 20 deletions(-)

diff --git a/src/gallium/state_trackers/clover/api/dispatch.cpp 
b/src/gallium/state_trackers/clover/api/dispatch.cpp
index 35d150d..b5a4094 100644
--- a/src/gallium/state_trackers/clover/api/dispatch.cpp
+++ b/src/gallium/state_trackers/clover/api/dispatch.cpp
@@ -122,7 +122,7 @@ namespace clover {
   clReleaseDevice,
   clCreateImage,
   clCreateProgramWithBuiltInKernels,
-  NULL, // clCompileProgram
+  clCompileProgram,
   NULL, // clLinkProgram
   clUnloadPlatformCompiler,
   NULL, // clGetKernelArgInfo
diff --git a/src/gallium/state_trackers/clover/api/program.cpp 
b/src/gallium/state_trackers/clover/api/program.cpp
index 6771735..33df0cd 100644
--- a/src/gallium/state_trackers/clover/api/program.cpp
+++ b/src/gallium/state_trackers/clover/api/program.cpp
@@ -152,14 +152,34 @@ 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) try {
+   void *user_data) {
+   cl_int error = clCompileProgram(d_prog, num_devs, d_devs, p_opts,
+   0, 0, 0,
+   pfn_notify, user_data);
+   return error == CL_COMPILE_PROGRAM_FAILURE ?
+ CL_BUILD_PROGRAM_FAILURE : error;
+}
+
+CLOVER_API cl_int
+clCompileProgram(cl_program d_prog, cl_uint num_devs,
+ const cl_device_id *d_devs, const char *p_opts,
+ cl_uint num_headers, const cl_program *d_header_progs,
+ const char **header_names,
+ void (*pfn_notify)(cl_program, void *),
+ void *user_data) try {
auto prog = obj(d_prog);
auto devs = (d_devs ? objs(d_devs, num_devs) :
 ref_vectordevice(prog.context().devices()));
auto opts = (p_opts ? p_opts : );
 
-   if (bool(num_devs) != bool(d_devs) ||
-   (!pfn_notify  user_data))
+   if (bool(num_devs) != bool(d_devs))
+  throw error(CL_INVALID_VALUE);
+
+   if (!pfn_notify  user_data)
+  throw error(CL_INVALID_VALUE);
+
+   if (bool(num_headers) != bool(header_names) ||
+   bool(num_headers) != bool(d_header_progs))
   throw error(CL_INVALID_VALUE);
 
if (any_of([](const device dev) {
@@ -170,7 +190,18 @@ clBuildProgram(cl_program d_prog, cl_uint num_devs,
if (prog.kernel_ref_count())
   throw error(CL_INVALID_OPERATION);
 
-   prog.build(devs, opts);
+   std::mapconst std::string, const std::string headers;
+   for (cl_uint i = 0; i  num_headers; ++i) {
+  auto h_name = std::string(header_names[i]);
+  auto h_prog = obj(d_header_progs[i]);
+
+  if (!h_prog.has_source)
+ throw error(CL_INVALID_OPERATION);
+
+  headers.insert(make_pair(h_name, h_prog.source()));
+   }
+
+   prog.build(devs, opts, headers);
return CL_SUCCESS;
 
 } catch (error e) {
diff --git a/src/gallium/state_trackers/clover/core/compiler.hpp 
b/src/gallium/state_trackers/clover/core/compiler.hpp
index 6ef84d1..c2c4063 100644
--- a/src/gallium/state_trackers/clover/core/compiler.hpp
+++ b/src/gallium/state_trackers/clover/core/compiler.hpp
@@ -29,11 +29,15 @@
 #include pipe/p_defines.h
 
 namespace clover {
+   typedef compat::paircompat::vector_refconst char,
+compat::vector_refconst char  vector_ref_pair;
+
module compile_program_llvm(const compat::string source,
-   pipe_shader_ir ir,
-   const compat::string target,
-   const compat::string opts,
-   compat::string r_log);
+   const compat::vectorvector_ref_pair headers,
+   pipe_shader_ir ir,
+   const compat::string target,
+   const compat::string opts,
+   compat::string r_log);
 
module compile_program_tgsi(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 cecbe9b..7b010f1 100644
--- a/src/gallium/state_trackers/clover/core/error.hpp
+++ b/src/gallium/state_trackers/clover/core/error.hpp
@@ -67,7 +67,7 @@ namespace clover {
class build_error : public error {
public:
   build_error(const compat::string what = ) :
- error(CL_BUILD_PROGRAM_FAILURE, what) {
+ error(CL_COMPILE_PROGRAM_FAILURE, what) {

Re: [Mesa-dev] [PATCH 1/1] clover: Remove compat::string::c_str

2014-09-05 Thread EdB
On Friday, September 05, 2014 09:30:52 AM Francisco Jerez wrote:
 Jan Vesely jan.ves...@rutgers.edu writes:
  It's unsafe as compat::string is not null terminated.
  Fixes garbage log on successful build.
  
  Signed-off-by: Jan Vesely jan.ves...@rutgers.edu
  ---
  
  It's obviously not needed in program::build, but I'm not sure
  if runtime_error solution is the best one.
 
 Meh, I've just pushed the fix for c_str() I submitted to the list weeks
 ago:
 
 http://cgit.freedesktop.org/mesa/mesa/commit/?id=b4539274b6478249d52e99fa342
 43daacf48be80
 
 Thanks.

For reference, we discuss it on this thread:
http://lists.freedesktop.org/archives/mesa-dev/2014-August/065114.html


 
   src/gallium/state_trackers/clover/core/program.cpp | 4 ++--
   src/gallium/state_trackers/clover/util/compat.cpp  | 2 +-
   src/gallium/state_trackers/clover/util/compat.hpp  | 5 -
   3 files changed, 3 insertions(+), 8 deletions(-)
  
  diff --git a/src/gallium/state_trackers/clover/core/program.cpp
  b/src/gallium/state_trackers/clover/core/program.cpp index
  30a1f0e..3e9abec 100644
  --- a/src/gallium/state_trackers/clover/core/program.cpp
  +++ b/src/gallium/state_trackers/clover/core/program.cpp
  @@ -61,9 +61,9 @@ program::build(const ref_vectordevice devs, const
  char *opts) { 
   dev.ir_target(),
   build_opts(dev),
   log));
   
   _binaries.insert({ dev, module });
  
  -_logs.insert({ dev, std::string(log.c_str()) });
  +_logs.insert({ dev, std::string(log) });
  
} catch (const build_error ) {
  
  -_logs.insert({ dev, std::string(log.c_str()) });
  +_logs.insert({ dev, std::string(log) });
  
   throw;

}
 
 }
  
  diff --git a/src/gallium/state_trackers/clover/util/compat.cpp
  b/src/gallium/state_trackers/clover/util/compat.cpp index
  80d5b3e..afba92e 100644
  --- a/src/gallium/state_trackers/clover/util/compat.cpp
  +++ b/src/gallium/state_trackers/clover/util/compat.cpp
  @@ -34,5 +34,5 @@ exception::what() const {
  
   const char *
   runtime_error::what() const {
  
  -   return _what.c_str();
  +   return ((std::string)_what).c_str();
  
   }
  
  diff --git a/src/gallium/state_trackers/clover/util/compat.hpp
  b/src/gallium/state_trackers/clover/util/compat.hpp index
  50e1c7d..b3668c5 100644
  --- a/src/gallium/state_trackers/clover/util/compat.hpp
  +++ b/src/gallium/state_trackers/clover/util/compat.hpp
  @@ -280,11 +280,6 @@ namespace clover {
  
}

const char *
  
  - c_str() const {
  -return begin();
  - }
  -
  - const char *
  
find(const string s) const {

   for (size_t i = 0; i + s.size()  size(); ++i) {
   
  if (!std::memcmp(begin() + i, s.begin(), s.size()))

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH 3/3] clover: unsure compat::string is \0 terminated

2014-08-21 Thread EdB

Le 2014-08-20 16:03, Francisco Jerez a écrit :

EdB e...@sigluy.net writes:


Each time you call c_str() it will grow up, may be you could check if
the string is already \0 terminated before adding it.


Nope, that's not how it works.  Every time c_str() is called the size 
of

the underlying array is forced to at least size-of-the-actual-string +
1, so nothing will happen if the array is already big enough.


Sure, but I don't think people will reserve this extra capacity.
especially if they use the char* and the std::sting constructor.
I thinks c_str will (should) mostly be use for debug purpose,
they won't change capacity before displaying the string.




The way we do it, we use twice the memory every time a vector capacity
increase (before freeing the old vec) as we don't use a realloc.
I understand c_str() should be use for debug only purpose, but may be 
it

could be a problem while debugging huge strings.

Or we can keep compat::string the same and remove c_str(). If someone
needed it, he could use std::string operator and c_str() on it.
At the end, the memory used is the same.


Le 2014-08-18 14:35, Francisco Jerez a écrit :

EdB edb+m...@sigluy.net writes:


otherwise c_str() is not safe
---
 src/gallium/state_trackers/clover/util/compat.hpp | 54
---
 1 file changed, 48 insertions(+), 6 deletions(-)

diff --git a/src/gallium/state_trackers/clover/util/compat.hpp
b/src/gallium/state_trackers/clover/util/compat.hpp
index 6f0f7cc..7ca1f85 100644
--- a/src/gallium/state_trackers/clover/util/compat.hpp
+++ b/src/gallium/state_trackers/clover/util/compat.hpp
@@ -197,7 +197,7 @@ namespace clover {
 return _p[i];
  }

-  private:
+  protected:
  iterator _p;  //memory array
  size_type _s; //size
  size_type _c; //capacity
@@ -306,18 +306,56 @@ namespace clover {

   class string : public vectorchar {
   public:
- string() : vector() {
+ string() : vector(0, 1) {
+_p[_s - 1] = '\0';
  }

- string(const char *p) : vector(p, std::strlen(p)) {
+ string(const char *p) : vector(p, std::strlen(p) + 1) {
+_p[_s - 1] = '\0';
  }

  templatetypename C
- string(const C v) : vector(v) {
+ string(const C v) : vector(*v.begin(), v.size() + 1) {
+_p[_s - 1] = '\0';
  }

- operator std::string() const {
-return std::string(begin(), end());
+ void
+ reserve(size_type m) {
+vector::reserve(m + 1);
+ }
+
+ void
+ resize(size_type m, char x = '\0') {
+vector::resize(m + 1, x);
+_p[_s - 1] = '\0';
+ }
+
+ void
+ push_back(char x) {
+reserve(_s + 1);
+_p[_s - 1] = x;
+_p[_s] = '\0';
+++_s;
+ }
+
+ size_type
+ size() const {
+return _s - 1;
+ }
+
+ size_type
+ capacity() const {
+return _c - 1;
+ }
+
+ iterator
+ end() {
+return _p + size();
+ }
+
+ const_iterator
+ end() const {
+return _p + size();
  }



At this point where all methods from the base class need to be
redefined
it probably stops making sense to use inheritance instead of
aggregation.  Once we've done that fixing c_str() gets a lot easier
(two
lines of code) because we can just declare the container as mutable 
and

fix up the NULL terminator when c_str() is called.  Both changes
attached.


  const char *
@@ -325,6 +363,10 @@ namespace clover {
 return begin();
  }

+ operator std::string() const {
+return std::string(begin(), end());
+ }
+
  const char *
  find(const string s) const {
 for (size_t i = 0; i + s.size()  size(); ++i) {
--
2.0.4

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH 1/3] clover: fix _logs string creation

2014-08-18 Thread EdB
On Monday, August 18, 2014 09:20:03 AM Francisco Jerez wrote:
 EdB edb+m...@sigluy.net writes:
  compact::string is not \0 terminated.
  size() need to be used for std::string creation
  ---
  
   src/gallium/state_trackers/clover/core/program.cpp | 4 ++--
   1 file changed, 2 insertions(+), 2 deletions(-)
  
  diff --git a/src/gallium/state_trackers/clover/core/program.cpp
  b/src/gallium/state_trackers/clover/core/program.cpp index
  e09c3aa..3f504d5 100644
  --- a/src/gallium/state_trackers/clover/core/program.cpp
  +++ b/src/gallium/state_trackers/clover/core/program.cpp
  @@ -61,9 +61,9 @@ program::build(const ref_vectordevice devs, const
  char *opts) { 
   dev.ir_target(),
   build_opts(dev),
   log));
   
   _binaries.insert({ dev, module });
  
  -_logs.insert({ dev, std::string(log.c_str()) });
  +_logs.insert({ dev, std::string(log.c_str(), log.size()) });
  
} catch (const build_error ) {
  
  -_logs.insert({ dev, std::string(log.c_str()) });
  +_logs.insert({ dev, std::string(log.c_str(), log.size()) });
 
 Both of these should just be using the conversion operator.  See
 attachment.

Agreed, I was highlighting the problem.
Yours is better.

Thanks

 
   throw;

}
 
 }
  
  ___
  mesa-dev mailing list
  mesa-dev@lists.freedesktop.org
  http://lists.freedesktop.org/mailman/listinfo/mesa-dev

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH 2/3] clover: stdify compat::vector a little more

2014-08-18 Thread EdB
On Monday, August 18, 2014 09:29:02 AM Francisco Jerez wrote:
 EdB edb+m...@sigluy.net writes:
  make resize work like std::vector
  reserve take advantage of capacity
  rename members to be uniform with other class
  ---
  
   src/gallium/state_trackers/clover/core/module.cpp |   2 +-
   src/gallium/state_trackers/clover/util/compat.hpp | 113
   +++--- 2 files changed, 78 insertions(+), 37
   deletions(-)
 
 This could be a *lot* simpler, see attachment.

Looks good to me.

Thanks
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH] clover: fix piglit cl-api-build-program test

2014-08-17 Thread EdB
On Sunday, August 17, 2014 11:50:12 PM Francisco Jerez wrote:
 EdB edb+m...@sigluy.net writes:
  Hello
  
  There is a crash with your version.
  This one works
 
 Oops, sorry for that.  It seems like a hack to me to force the kernel
 reference count to one to keep it from being destroyed...  Can you try
 the attached patch instead on top of my clover-next branch [1]?
 8010325eaf and 47e8adea3a are the ones it depends on.
 
 [1] http://cgit.freedesktop.org/~currojerez/mesa/log/?h=clover-next

It works

Thanks
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH] clover: fix piglit cl-api-build-program test

2014-08-16 Thread EdB
On Saturday, August 16, 2014 04:37:08 PM Francisco Jerez wrote:
 EdB edb+m...@sigluy.net writes:
  program build should failed if there is created kernel attached to program
  
  piglit error:
  Trigger CL_INVALID_OPERATION if there are kernel objects attached to
  program
 [...]
 
 How about doing it as follows?
I used a counter related  to clRetain and clRelease because I was concerned 
that internally life of core object is not linked to api object.
ie a clKernel could have released (one clCreate, one clRealease) but clover 
may still using it and prevent a new build.
To be fair, I didn't found such case at that moment.
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH] clover: fix piglit cl-api-build-program test

2014-08-16 Thread EdB
Hello

There is a crash with your version.
This one works

---
diff --git a/src/gallium/state_trackers/clover/api/program.cpp 
b/src/gallium/state_trackers/clover/api/program.cpp
index b81ce69..ab6cf7c 100644
--- a/src/gallium/state_trackers/clover/api/program.cpp
+++ b/src/gallium/state_trackers/clover/api/program.cpp
@@ -167,6 +167,9 @@ clBuildProgram(cl_program d_prog, cl_uint num_devs,
  }, devs))
   throw error(CL_INVALID_DEVICE);
 
+   if (prog.kernel_ref_count())
+  throw error(CL_INVALID_OPERATION);
+
prog.build(devs, opts);
return CL_SUCCESS;
 
diff --git a/src/gallium/state_trackers/clover/core/kernel.cpp 
b/src/gallium/state_trackers/clover/core/kernel.cpp
index 5e5fe51..e4b2152 100644
--- a/src/gallium/state_trackers/clover/core/kernel.cpp
+++ b/src/gallium/state_trackers/clover/core/kernel.cpp
@@ -30,7 +30,8 @@ using namespace clover;
 
 kernel::kernel(clover::program prog, const std::string name,
const std::vectormodule::argument margs) :
-   program(prog), _name(name), exec(*this) {
+   program(prog), _name(name), exec(*this),
+   program_ref(prog._kernel_ref_counter) {
for (auto marg : margs) {
   if (marg.type == module::argument::scalar)
  _args.emplace_back(new scalar_argument(marg.size));
diff --git a/src/gallium/state_trackers/clover/core/kernel.hpp 
b/src/gallium/state_trackers/clover/core/kernel.hpp
index e544ec6..754970e 100644
--- a/src/gallium/state_trackers/clover/core/kernel.hpp
+++ b/src/gallium/state_trackers/clover/core/kernel.hpp
@@ -225,6 +225,7 @@ namespace clover {
   std::vectorstd::unique_ptrargument _args;
   std::string _name;
   exec_context exec;
+  const intrusive_refref_counter program_ref;
};
 }
 
diff --git a/src/gallium/state_trackers/clover/core/program.cpp 
b/src/gallium/state_trackers/clover/core/program.cpp
index e09c3aa..8204e95 100644
--- a/src/gallium/state_trackers/clover/core/program.cpp
+++ b/src/gallium/state_trackers/clover/core/program.cpp
@@ -26,14 +26,14 @@
 using namespace clover;
 
 program::program(clover::context ctx, const std::string source) :
-   has_source(true), context(ctx), _source(source) {
+   has_source(true), context(ctx), _source(source), _kernel_ref_counter() {
 }
 
 program::program(clover::context ctx,
  const ref_vectordevice devs,
  const std::vectormodule binaries) :
has_source(false), context(ctx),
-   _devices(devs) {
+   _devices(devs), _kernel_ref_counter() {
for_each([](device dev, const module bin) {
  _binaries.insert({ dev, bin });
   },
@@ -110,3 +110,8 @@ program::symbols() const {
 
return _binaries.begin()-second.syms;
 }
+
+unsigned
+program::kernel_ref_count() const {
+   return _kernel_ref_counter.ref_count() - 1;
+}
diff --git a/src/gallium/state_trackers/clover/core/program.hpp 
b/src/gallium/state_trackers/clover/core/program.hpp
index 1081454..4bb5b68 100644
--- a/src/gallium/state_trackers/clover/core/program.hpp
+++ b/src/gallium/state_trackers/clover/core/program.hpp
@@ -60,14 +60,19 @@ namespace clover {
 
   const compat::vectormodule::symbol symbols() const;
 
+  unsigned kernel_ref_count() const;
+
   const intrusive_refclover::context context;
 
+  friend class kernel;
+
private:
   std::vectorintrusive_refdevice _devices;
   std::mapconst device *, module _binaries;
   std::mapconst device *, std::string _logs;
   std::mapconst device *, std::string _opts;
   std::string _source;
+  ref_counter _kernel_ref_counter;
};
 }
 
diff --git a/src/gallium/state_trackers/clover/util/pointer.hpp 
b/src/gallium/state_trackers/clover/util/pointer.hpp
index 59c6e6e..b68fb58 100644
--- a/src/gallium/state_trackers/clover/util/pointer.hpp
+++ b/src/gallium/state_trackers/clover/util/pointer.hpp
@@ -31,10 +31,10 @@ namespace clover {
///
class ref_counter {
public:
-  ref_counter() : _ref_count(1) {}
+  ref_counter(unsigned x = 1) : _ref_count(x) {}
 
   unsigned
-  ref_count() {
+  ref_count() const {
  return _ref_count;
   }
 

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH] clover: clGetProgramInfo support for OpenCL 1.2

2014-08-16 Thread EdB
On Saturday, August 16, 2014 08:57:01 PM Francisco Jerez wrote:
 EdB edb+m...@sigluy.net writes:
  ---
  
   src/gallium/state_trackers/clover/api/program.cpp | 18 ++
   1 file changed, 18 insertions(+)
  
  diff --git a/src/gallium/state_trackers/clover/api/program.cpp
  b/src/gallium/state_trackers/clover/api/program.cpp index
  b81ce69..05f3840 100644
  --- a/src/gallium/state_trackers/clover/api/program.cpp
  +++ b/src/gallium/state_trackers/clover/api/program.cpp
  @@ -232,6 +232,24 @@ clGetProgramInfo(cl_program d_prog, cl_program_info
  param, 
prog.devices());
 
 break;
  
  +   case CL_PROGRAM_NUM_KERNELS:
  +  buf.as_scalarcl_uint() = prog.symbols().size();
  +  break;
  +
  +   case CL_PROGRAM_KERNEL_NAMES: {
  +  std::string names;
  +  for (auto symbol : prog.symbols()) {
  + std::string name(symbol.name.begin(), symbol.name.size());
  + name += ;;
  + names += name;
  +  }
  +  if (!names.empty())
  + names.pop_back(); //remove ';'
  +
  +  buf.as_string() = names;
  +  }
  +  break;
  +
 
 How about we implement this using fold()?  It's quite a bit more
 concise.  See attachment.

Indeed.
Tested, it works the same

Thanks

 
  default:
 throw error(CL_INVALID_VALUE);
  
  }
  
  ___
  mesa-dev mailing list
  mesa-dev@lists.freedesktop.org
  http://lists.freedesktop.org/mailman/listinfo/mesa-dev

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH] clover: fix piglit cl-api-build-program test

2014-08-10 Thread EdB
program build should failed if there is created kernel attached to program

piglit error:
Trigger CL_INVALID_OPERATION if there are kernel objects attached to program
---
 src/gallium/state_trackers/clover/api/kernel.cpp   | 10 --
 src/gallium/state_trackers/clover/core/kernel.cpp  |  1 +
 src/gallium/state_trackers/clover/core/program.cpp | 14 ++
 src/gallium/state_trackers/clover/core/program.hpp |  4 
 4 files changed, 27 insertions(+), 2 deletions(-)

diff --git a/src/gallium/state_trackers/clover/api/kernel.cpp 
b/src/gallium/state_trackers/clover/api/kernel.cpp
index 05cc392..69f7d6c 100644
--- a/src/gallium/state_trackers/clover/api/kernel.cpp
+++ b/src/gallium/state_trackers/clover/api/kernel.cpp
@@ -76,7 +76,10 @@ clCreateKernelsInProgram(cl_program d_prog, cl_uint count,
 
 CLOVER_API cl_int
 clRetainKernel(cl_kernel d_kern) try {
-   obj(d_kern).retain();
+   auto kern = obj(d_kern);
+   kern.retain();
+   program prog = kern.program;
+   prog.ref_kernel(kern.name());
return CL_SUCCESS;
 
 } catch (error e) {
@@ -85,7 +88,10 @@ clRetainKernel(cl_kernel d_kern) try {
 
 CLOVER_API cl_int
 clReleaseKernel(cl_kernel d_kern) try {
-   if (obj(d_kern).release())
+   auto kern = obj(d_kern);
+   program prog = kern.program;
+   prog.unref_kernel(kern.name());
+   if (kern.release())
   delete pobj(d_kern);
 
return CL_SUCCESS;
diff --git a/src/gallium/state_trackers/clover/core/kernel.cpp 
b/src/gallium/state_trackers/clover/core/kernel.cpp
index 5e5fe51..c670253 100644
--- a/src/gallium/state_trackers/clover/core/kernel.cpp
+++ b/src/gallium/state_trackers/clover/core/kernel.cpp
@@ -51,6 +51,7 @@ kernel::kernel(clover::program prog, const std::string name,
   else
  throw error(CL_INVALID_KERNEL_DEFINITION);
}
+   prog.ref_kernel(name);
 }
 
 templatetypename V
diff --git a/src/gallium/state_trackers/clover/core/program.cpp 
b/src/gallium/state_trackers/clover/core/program.cpp
index e09c3aa..dbfa284 100644
--- a/src/gallium/state_trackers/clover/core/program.cpp
+++ b/src/gallium/state_trackers/clover/core/program.cpp
@@ -42,6 +42,9 @@ program::program(clover::context ctx,
 
 void
 program::build(const ref_vectordevice devs, const char *opts) {
+   if (_cl_kernel_ref_count.size())
+  throw error(CL_INVALID_OPERATION);
+
if (has_source) {
   _devices = devs;
 
@@ -110,3 +113,14 @@ program::symbols() const {
 
return _binaries.begin()-second.syms;
 }
+
+void program::ref_kernel(const std::string name) {
+   ++_cl_kernel_ref_count[name];
+}
+
+void program::unref_kernel(const std::string name) {
+   auto it = _cl_kernel_ref_count.find(name);
+   if (it != _cl_kernel_ref_count.end())
+  if (--(it-second) == 0)
+ _cl_kernel_ref_count.erase(it);
+}
diff --git a/src/gallium/state_trackers/clover/core/program.hpp 
b/src/gallium/state_trackers/clover/core/program.hpp
index 1081454..f9c91ed 100644
--- a/src/gallium/state_trackers/clover/core/program.hpp
+++ b/src/gallium/state_trackers/clover/core/program.hpp
@@ -60,6 +60,9 @@ namespace clover {
 
   const compat::vectormodule::symbol symbols() const;
 
+  void ref_kernel(const std::string name);
+  void unref_kernel(const std::string name);
+
   const intrusive_refclover::context context;
 
private:
@@ -67,6 +70,7 @@ namespace clover {
   std::mapconst device *, module _binaries;
   std::mapconst device *, std::string _logs;
   std::mapconst device *, std::string _opts;
+  std::mapstd::string, size_t _cl_kernel_ref_count;
   std::string _source;
};
 }
-- 
2.0.4

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH] clover: support CL_PROGRAM_BINARY_TYPE query

2014-08-09 Thread EdB
On Saturday, August 09, 2014 01:18:57 AM Ilia Mirkin wrote:
 On Fri, Aug 8, 2014 at 10:10 PM, EdB edb+m...@sigluy.net wrote:
  ---
  
   src/gallium/state_trackers/clover/api/program.cpp  | 3 +++
   src/gallium/state_trackers/clover/core/program.cpp | 8 
   src/gallium/state_trackers/clover/core/program.hpp | 1 +
   3 files changed, 12 insertions(+)
  
  diff --git a/src/gallium/state_trackers/clover/api/program.cpp
  b/src/gallium/state_trackers/clover/api/program.cpp index
  b81ce69..0e9e3c9 100644
  --- a/src/gallium/state_trackers/clover/api/program.cpp
  +++ b/src/gallium/state_trackers/clover/api/program.cpp
  @@ -266,6 +266,9 @@ clGetProgramBuildInfo(cl_program d_prog, cl_device_id
  d_dev, 
 buf.as_string() = prog.build_log(dev);
 break;
  
  +   case CL_PROGRAM_BINARY_TYPE:
  +  buf.as_scalarcl_program_binary_type() = prog.binary_type(dev);
 
 break?

Thanks
 
  +
  
  default:
 throw error(CL_INVALID_VALUE);
  
  }
  
  diff --git a/src/gallium/state_trackers/clover/core/program.cpp
  b/src/gallium/state_trackers/clover/core/program.cpp index
  e09c3aa..482df7e 100644
  --- a/src/gallium/state_trackers/clover/core/program.cpp
  +++ b/src/gallium/state_trackers/clover/core/program.cpp
  @@ -103,6 +103,14 @@ program::build_log(const device dev) const {
  
  return _logs.count(dev) ? _logs.find(dev)-second : ;
   
   }
  
  +cl_program_binary_type
  +program::binary_type(const device dev) const {
  +   if (!_binaries.count(dev))
  +  return CL_PROGRAM_BINARY_TYPE_NONE;
  +   else
  +  return CL_PROGRAM_BINARY_TYPE_EXECUTABLE;
  +}
  +
  
   const compat::vectormodule::symbol 
   program::symbols() const {
   
  if (_binaries.empty())
  
  diff --git a/src/gallium/state_trackers/clover/core/program.hpp
  b/src/gallium/state_trackers/clover/core/program.hpp index
  1081454..b932b95 100644
  --- a/src/gallium/state_trackers/clover/core/program.hpp
  +++ b/src/gallium/state_trackers/clover/core/program.hpp
  @@ -57,6 +57,7 @@ namespace clover {
  
 cl_build_status build_status(const device dev) const;
 std::string build_opts(const device dev) const;
 std::string build_log(const device dev) const;
  
  +  cl_program_binary_type binary_type(const device dev) const;
  
 const compat::vectormodule::symbol symbols() const;
  
  --
  2.0.4
  
  ___
  mesa-dev mailing list
  mesa-dev@lists.freedesktop.org
  http://lists.freedesktop.org/mailman/listinfo/mesa-dev

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH v2] clover: support CL_PROGRAM_BINARY_TYPE query

2014-08-09 Thread EdB
---
 src/gallium/state_trackers/clover/api/program.cpp  | 4 
 src/gallium/state_trackers/clover/core/program.cpp | 8 
 src/gallium/state_trackers/clover/core/program.hpp | 1 +
 3 files changed, 13 insertions(+)

diff --git a/src/gallium/state_trackers/clover/api/program.cpp 
b/src/gallium/state_trackers/clover/api/program.cpp
index b81ce69..c3fe129 100644
--- a/src/gallium/state_trackers/clover/api/program.cpp
+++ b/src/gallium/state_trackers/clover/api/program.cpp
@@ -266,6 +266,10 @@ clGetProgramBuildInfo(cl_program d_prog, cl_device_id 
d_dev,
   buf.as_string() = prog.build_log(dev);
   break;
 
+   case CL_PROGRAM_BINARY_TYPE:
+  buf.as_scalarcl_program_binary_type() = prog.binary_type(dev);
+  break;
+
default:
   throw error(CL_INVALID_VALUE);
}
diff --git a/src/gallium/state_trackers/clover/core/program.cpp 
b/src/gallium/state_trackers/clover/core/program.cpp
index e09c3aa..482df7e 100644
--- a/src/gallium/state_trackers/clover/core/program.cpp
+++ b/src/gallium/state_trackers/clover/core/program.cpp
@@ -103,6 +103,14 @@ program::build_log(const device dev) const {
return _logs.count(dev) ? _logs.find(dev)-second : ;
 }
 
+cl_program_binary_type
+program::binary_type(const device dev) const {
+   if (!_binaries.count(dev))
+  return CL_PROGRAM_BINARY_TYPE_NONE;
+   else
+  return CL_PROGRAM_BINARY_TYPE_EXECUTABLE;
+}
+
 const compat::vectormodule::symbol 
 program::symbols() const {
if (_binaries.empty())
diff --git a/src/gallium/state_trackers/clover/core/program.hpp 
b/src/gallium/state_trackers/clover/core/program.hpp
index 1081454..b932b95 100644
--- a/src/gallium/state_trackers/clover/core/program.hpp
+++ b/src/gallium/state_trackers/clover/core/program.hpp
@@ -57,6 +57,7 @@ namespace clover {
   cl_build_status build_status(const device dev) const;
   std::string build_opts(const device dev) const;
   std::string build_log(const device dev) const;
+  cl_program_binary_type binary_type(const device dev) const;
 
   const compat::vectormodule::symbol symbols() const;
 
-- 
2.0.4

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH] clover: support CL_PROGRAM_BINARY_TYPE query

2014-08-08 Thread EdB
---
 src/gallium/state_trackers/clover/api/program.cpp  | 3 +++
 src/gallium/state_trackers/clover/core/program.cpp | 8 
 src/gallium/state_trackers/clover/core/program.hpp | 1 +
 3 files changed, 12 insertions(+)

diff --git a/src/gallium/state_trackers/clover/api/program.cpp 
b/src/gallium/state_trackers/clover/api/program.cpp
index b81ce69..0e9e3c9 100644
--- a/src/gallium/state_trackers/clover/api/program.cpp
+++ b/src/gallium/state_trackers/clover/api/program.cpp
@@ -266,6 +266,9 @@ clGetProgramBuildInfo(cl_program d_prog, cl_device_id d_dev,
   buf.as_string() = prog.build_log(dev);
   break;
 
+   case CL_PROGRAM_BINARY_TYPE:
+  buf.as_scalarcl_program_binary_type() = prog.binary_type(dev);
+
default:
   throw error(CL_INVALID_VALUE);
}
diff --git a/src/gallium/state_trackers/clover/core/program.cpp 
b/src/gallium/state_trackers/clover/core/program.cpp
index e09c3aa..482df7e 100644
--- a/src/gallium/state_trackers/clover/core/program.cpp
+++ b/src/gallium/state_trackers/clover/core/program.cpp
@@ -103,6 +103,14 @@ program::build_log(const device dev) const {
return _logs.count(dev) ? _logs.find(dev)-second : ;
 }
 
+cl_program_binary_type
+program::binary_type(const device dev) const {
+   if (!_binaries.count(dev))
+  return CL_PROGRAM_BINARY_TYPE_NONE;
+   else
+  return CL_PROGRAM_BINARY_TYPE_EXECUTABLE;
+}
+
 const compat::vectormodule::symbol 
 program::symbols() const {
if (_binaries.empty())
diff --git a/src/gallium/state_trackers/clover/core/program.hpp 
b/src/gallium/state_trackers/clover/core/program.hpp
index 1081454..b932b95 100644
--- a/src/gallium/state_trackers/clover/core/program.hpp
+++ b/src/gallium/state_trackers/clover/core/program.hpp
@@ -57,6 +57,7 @@ namespace clover {
   cl_build_status build_status(const device dev) const;
   std::string build_opts(const device dev) const;
   std::string build_log(const device dev) const;
+  cl_program_binary_type binary_type(const device dev) const;
 
   const compat::vectormodule::symbol symbols() const;
 
-- 
2.0.4

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 2/3] clover: stdify compat::vector a little more

2014-08-07 Thread EdB
make resize work like std::vector
reserve take advantage of capacity
rename members to be uniform with other class
---
 src/gallium/state_trackers/clover/core/module.cpp |   2 +-
 src/gallium/state_trackers/clover/util/compat.hpp | 113 +++---
 2 files changed, 78 insertions(+), 37 deletions(-)

diff --git a/src/gallium/state_trackers/clover/core/module.cpp 
b/src/gallium/state_trackers/clover/core/module.cpp
index 55ed91a..2a595d1 100644
--- a/src/gallium/state_trackers/clover/core/module.cpp
+++ b/src/gallium/state_trackers/clover/core/module.cpp
@@ -94,7 +94,7 @@ namespace {
 
   static void
   proc(compat::istream is, compat::vectorT v) {
- v.reserve(_procuint32_t(is));
+ v.resize(_procuint32_t(is));
 
  for (size_t i = 0; i  v.size(); i++)
 new(v[i]) T(_procT(is));
diff --git a/src/gallium/state_trackers/clover/util/compat.hpp 
b/src/gallium/state_trackers/clover/util/compat.hpp
index 50e1c7d..6f0f7cc 100644
--- a/src/gallium/state_trackers/clover/util/compat.hpp
+++ b/src/gallium/state_trackers/clover/util/compat.hpp
@@ -40,11 +40,14 @@ namespace clover {
   class vector {
   protected:
  static T *
- alloc(int n, const T *q, int m) {
-T *p = reinterpret_castT *(std::malloc(n * sizeof(T)));
-
-for (int i = 0; i  m; ++i)
-   new(p[i]) T(q[i]);
+ alloc(size_t n, const T *q) {
+T *p = 0;
+if (n  0) {
+   p = reinterpret_castT *(std::malloc(n * sizeof(T)));
+   if (!p) throw;
+   for (size_t i = 0; i  n; ++i)
+  new(p[i]) T(q[i]);
+}
 
 return p;
  }
@@ -66,100 +69,138 @@ namespace clover {
  typedef std::ptrdiff_t difference_type;
  typedef std::size_t size_type;
 
- vector() : p(NULL), n(0) {
+ vector() : _p(0), _s(0), _c(0) {
  }
 
- vector(const vector v) : p(alloc(v.n, v.p, v.n)), n(v.n) {
+ vector(const vector v) :
+   _p(alloc(v.size(), v.begin())), _s(v.size()), _c(_s) {
  }
 
- vector(const_iterator p, size_type n) : p(alloc(n, p, n)), n(n) {
+ vector(const_iterator v, size_type n) : _p(alloc(n, v)), _s(n), _c(n) 
{
  }
 
  templatetypename C
  vector(const C v) :
-p(alloc(v.size(), *v.begin(), v.size())), n(v.size()) {
+_p(alloc(v.size(), *v.begin())), _s(v.size()), _c(_s) {
  }
 
  ~vector() {
-free(n, p);
+free(_s, _p);
  }
 
  vector 
  operator=(const vector v) {
-free(n, p);
-
-p = alloc(v.n, v.p, v.n);
-n = v.n;
+size_type old_s = _s;
+_s = v.size();
+T *n_p = alloc(_s, v.begin());
+free(old_s, _p);
+_p = n_p;
+_c = _s;
 
 return *this;
  }
 
  void
  reserve(size_type m) {
-if (n  m) {
-   T *q = alloc(m, p, n);
-   free(n, p);
-
-   p = q;
-   n = m;
+if (m  _c) {
+   T *n_p = reinterpret_castT *(std::malloc(m * sizeof(T)));
+   for (size_type i = 0; i  _s; ++i) {
+  new(n_p[i]) T(_p[i]);
+  _p[i].~T();
+   }
+   std::free(_p);
+   _p = n_p;
+   _c = m;
 }
  }
 
  void
  resize(size_type m, T x = T()) {
-size_type n = size();
+if (_s == m)
+   return;
+
+//delete extra elements and keep capacity
+if (m  _s) {
+   size_type old_s = _s;
+   _s = m;
+   for (size_type i = m; i  old_s; ++i)
+  _p[i].~T();
+
+   return;
+}
+
+//fill with x
+if (m = _c) {
+   for (size_type i = _s; i  m; ++i)
+ new(_p[i]) T(x);
+
+   _s = m;
+   return;
+}
+
+if (m  _c) {
+   reserve(m);
 
-reserve(m);
+   //fill the extended part
+   for (size_type i = _s; i  m; ++i)
+ new(_p[i]) T(x);
 
-for (size_type i = n; i  m; ++i)
-   new(p[i]) T(x);
+   _s = m;
+   return;
+}
  }
 
  void
  push_back(const T x) {
-size_type n = size();
-reserve(n + 1);
-new(p[n]) T(x);
+reserve(_s + 1);
+new(_p[_s]) T(x);
+++_s;
  }
 
  size_type
  size() const {
-return n;
+return _s;
+ }
+
+ size_type
+ capacity() const {
+return _c;
  }
 
  iterator
  begin() {
-return p;
+

  1   2   >