summaryrefslogtreecommitdiffstats
path: root/src/gallium/state_trackers/clover
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/state_trackers/clover')
-rw-r--r--src/gallium/state_trackers/clover/api/program.cpp33
1 files changed, 23 insertions, 10 deletions
diff --git a/src/gallium/state_trackers/clover/api/program.cpp b/src/gallium/state_trackers/clover/api/program.cpp
index a8a6291806e..e32312eec1b 100644
--- a/src/gallium/state_trackers/clover/api/program.cpp
+++ b/src/gallium/state_trackers/clover/api/program.cpp
@@ -25,6 +25,25 @@
using namespace clover;
+namespace {
+ void validate_build_program_common(const program &prog, cl_uint num_devs,
+ const ref_vector<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);