Re: [Mesa-dev] [RFC] Fix for clang compiler issue as reported in Bug 91826
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
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
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
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
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
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
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
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
--- 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
--- 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
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
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)
--- 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)
--- 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)
--- 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
--- 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
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
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
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
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
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
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
(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
--- 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
--- 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
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
--- 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
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
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
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
--- 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
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
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
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
--- 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
--- 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.*
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
--- 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
--- 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
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
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
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
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
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
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)
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
--- 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)
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
--- 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
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
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
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
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
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
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
--- 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
--- 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
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
--- 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
--- .../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
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
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
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
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
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
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
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
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
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
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
--- 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
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
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
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
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
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
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
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
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
--- 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
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
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
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
--- 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
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
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
--- 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
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
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
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
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
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
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
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
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
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
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
--- 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
--- 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
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; +