clover: Factor input validation of clCompileProgram into a new function v2
authorTom Stellard <thomas.stellard@amd.com>
Tue, 21 Oct 2014 14:31:56 +0000 (10:31 -0400)
committerTom Stellard <thomas.stellard@amd.com>
Fri, 31 Oct 2014 19:24:00 +0000 (15:24 -0400)
This factors out the validation that is common with clBuildProgram().

v2:
  - Code cleanups.

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

index a8a6291..e32312e 100644 (file)
 
 using namespace clover;
 
+namespace {
+   void validate_build_program_common(const program &prog, cl_uint num_devs,
+                                      const ref_vector<device> &devs,
+                                      void (*pfn_notify)(cl_program, void *),
+                                      void *user_data) {
+
+      if ((!pfn_notify && user_data))
+         throw error(CL_INVALID_VALUE);
+
+      if (prog.kernel_ref_count())
+         throw error(CL_INVALID_OPERATION);
+
+      if (any_of([&](const device &dev) {
+               return !count(dev, prog.context().devices());
+            }, devs))
+         throw error(CL_INVALID_DEVICE);
+   }
+}
+
 CLOVER_API cl_program
 clCreateProgramWithSource(cl_context d_ctx, cl_uint count,
                           const char **strings, const size_t *lengths,
@@ -173,18 +192,12 @@ clCompileProgram(cl_program d_prog, cl_uint num_devs,
    auto opts = (p_opts ? p_opts : "");
    header_map headers;
 
-   if (bool(num_devs) != bool(d_devs) ||
-       (!pfn_notify && user_data) ||
-       bool(num_headers) != bool(header_names))
-      throw error(CL_INVALID_VALUE);
+   validate_build_program_common(prog, num_devs, devs, pfn_notify, user_data);
 
-   if (any_of([&](const device &dev) {
-            return !count(dev, prog.context().devices());
-         }, devs))
-      throw error(CL_INVALID_DEVICE);
+   if (bool(num_headers) != bool(header_names))
+      throw error(CL_INVALID_VALUE);
 
-   if (prog.kernel_ref_count() ||
-       !prog.has_source)
+   if (!prog.has_source)
       throw error(CL_INVALID_OPERATION);