clover: Fix bug when binary programs are passed to clBuildProgram() v2
authorTom Stellard <thomas.stellard@amd.com>
Tue, 21 Oct 2014 14:33:21 +0000 (10:33 -0400)
committerTom Stellard <thomas.stellard@amd.com>
Fri, 31 Oct 2014 19:24:00 +0000 (15:24 -0400)
This was a regression introduced by
611d66fe4513e53bde052dd2bab95d448c909a2a

Passing a binary program to clBuildProgram() is legal, but passing one
to clCompileProgram() is not.

v2:
  - Code cleanups.

Reviewed-by: Francisco Jerez <currojerez@riseup.net>
src/gallium/state_trackers/clover/api/program.cpp
src/gallium/state_trackers/clover/core/program.hpp

index e32312eec1b5e2c8f64400450f788c8ce8e71313..64c4a43f4b3eac5a8066c19ac353714ec0abf2c0 100644 (file)
@@ -171,12 +171,20 @@ CLOVER_API cl_int
 clBuildProgram(cl_program d_prog, cl_uint num_devs,
                const cl_device_id *d_devs, const char *p_opts,
                void (*pfn_notify)(cl_program, void *),
-               void *user_data) {
-   cl_int ret = clCompileProgram(d_prog, num_devs, d_devs, p_opts,
-                                 0, NULL, NULL, pfn_notify, user_data);
+               void *user_data) try {
+   auto &prog = obj(d_prog);
+   auto devs = (d_devs ? objs(d_devs, num_devs) :
+                ref_vector<device>(prog.context().devices()));
+   auto opts = (p_opts ? p_opts : "");
 
-   return (ret == CL_COMPILE_PROGRAM_FAILURE ?
-           CL_BUILD_PROGRAM_FAILURE : ret);
+   validate_build_program_common(prog, num_devs, devs, pfn_notify, user_data);
+
+   prog.build(devs, opts);
+   return CL_SUCCESS;
+} catch (error &e) {
+   if (e.get() == CL_COMPILE_PROGRAM_FAILURE)
+      return CL_BUILD_PROGRAM_FAILURE;
+   return e.get();
 }
 
 CLOVER_API cl_int
index b5aae7e0dff7cdd3bc9993382557fbb3e20d0da6..661fa03102c76b89c63183454e6c17b15f45584d 100644 (file)
@@ -48,7 +48,7 @@ namespace clover {
       operator=(const program &prog) = delete;
 
       void build(const ref_vector<device> &devs, const char *opts,
-                 const header_map &headers);
+                 const header_map &headers = {});
 
       const bool has_source;
       const std::string &source() const;