summaryrefslogtreecommitdiff
path: root/libclapi/cl_kernel.c
diff options
context:
space:
mode:
Diffstat (limited to 'libclapi/cl_kernel.c')
-rw-r--r--libclapi/cl_kernel.c36
1 files changed, 33 insertions, 3 deletions
diff --git a/libclapi/cl_kernel.c b/libclapi/cl_kernel.c
index 0f110bef..b0853536 100644
--- a/libclapi/cl_kernel.c
+++ b/libclapi/cl_kernel.c
@@ -773,7 +773,10 @@ static cl_int cl_command_queue_ND_range(cl_command_queue queue, cl_kernel kernel
const cl_event *event_wait_list, cl_event *event_ret)
{
cl_event event = NULL;
+ cl_command_queue_work_item it = NULL;
cl_int err = CL_SUCCESS;
+ uint32_t i;
+ cl_int ret_status;
if (event_ret) {
event = cl_create_event(queue->ctx, queue, CL_FALSE, num_events_in_wait_list, event_wait_list, &err);
@@ -781,21 +784,46 @@ static cl_int cl_command_queue_ND_range(cl_command_queue queue, cl_kernel kernel
goto error;
}
- uint32_t i;
+ it = cl_enqueue_create_work_item(queue, num_events_in_wait_list, event_wait_list, event);
+ if (it == NULL) {
+ err = CL_OUT_OF_HOST_MEMORY;
+ goto error;
+ }
+
CL_MUTEX_LOCK(&kernel->lock);
for (i = 0; i < kernel->arg_num; ++i)
if (kernel->args[i]->is_set == CL_FALSE) {
- return CL_INVALID_KERNEL_ARGS;
+ err = CL_INVALID_KERNEL_ARGS;
CL_MUTEX_UNLOCK(&kernel->lock);
+ goto error;
}
CL_MUTEX_UNLOCK(&kernel->lock);
err = queue->device->driver->enqueue_nd_range_kernel(queue, kernel, work_dim, global_wk_off,
- global_wk_sz, local_wk_sz, num_events_in_wait_list, event_wait_list, event);
+ global_wk_sz, local_wk_sz, it);
if (err != CL_SUCCESS) {
goto error;
}
+ /* If no events depend, we submit it immediately. */
+ if (event_wait_list == NULL) {
+ ret_status = cl_enqueue_submit_work_item(queue, it);
+ if (ret_status < 0) {
+ /* We consider it as a error and return fail. */
+ err = CL_OUT_OF_RESOURCES;
+ goto error;
+ }
+ if (ret_status > CL_COMPLETE) {
+ err = cl_enqueue_insert_work_item(queue, it);
+ if (err != CL_SUCCESS)
+ goto error;
+ }
+ } else {
+ err = cl_enqueue_insert_work_item(queue, it);
+ if (err != CL_SUCCESS)
+ goto error;
+ }
+
if (event_ret)
*event_ret = event;
@@ -814,6 +842,8 @@ static cl_int cl_command_queue_ND_range(cl_command_queue queue, cl_kernel kernel
return err;
error:
+ if (it)
+ cl_enqueue_destroy_work_item(queue, it);
if (event)
cl_release_event(event);
return err;