/* * Copyright © 2012 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . * */ #include "cl_command_queue.h" #include "cl_device_id.h" #include "CL/cl.h" #include /* Depreciated in 2.0 later */ cl_command_queue clCreateCommandQueue(cl_context context, cl_device_id device, cl_command_queue_properties properties, cl_int *errcode_ret) { cl_command_queue queue = NULL; cl_int err = CL_SUCCESS; do { if (!CL_OBJECT_IS_CONTEXT(context)) { err = CL_INVALID_CONTEXT; break; } err = cl_devices_list_include_check(context->device_num, context->devices, 1, &device); if (err) break; if (properties & ~(CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE | CL_QUEUE_PROFILING_ENABLE)) { err = CL_INVALID_VALUE; break; } if (properties & CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE) { /*not supported now.*/ err = CL_INVALID_QUEUE_PROPERTIES; break; } queue = cl_create_command_queue(context, device, properties, 0, &err); } while (0); if (errcode_ret) *errcode_ret = err; return queue; } /* 2.0 new API for create command queue. */ cl_command_queue clCreateCommandQueueWithProperties(cl_context context, cl_device_id device, const cl_queue_properties *properties, cl_int *errcode_ret) { cl_command_queue queue = NULL; cl_int err = CL_SUCCESS; cl_command_queue_properties prop = 0xFFFFFFFF; cl_uint queue_sz = 0xFFFFFFFF; do { if (!CL_OBJECT_IS_CONTEXT(context)) { err = CL_INVALID_CONTEXT; break; } err = cl_devices_list_include_check(context->device_num, context->devices, 1, &device); if (err) break; if (properties) { cl_ulong que_type; cl_ulong que_val; cl_uint i; for (i = 0; (que_type = properties[i++]) != 0; i++) { que_val = properties[i]; switch (que_type) { case CL_QUEUE_PROPERTIES: if (prop != 0xFFFFFFFF) err = CL_INVALID_VALUE; else { switch (que_val) { case 0: case CL_QUEUE_PROFILING_ENABLE: case CL_QUEUE_PROFILING_ENABLE | CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE: case CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE: case CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE | CL_QUEUE_ON_DEVICE: case CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE | CL_QUEUE_ON_DEVICE | CL_QUEUE_ON_DEVICE_DEFAULT: case CL_QUEUE_PROFILING_ENABLE | CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE | CL_QUEUE_ON_DEVICE: case CL_QUEUE_PROFILING_ENABLE | CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE | CL_QUEUE_ON_DEVICE | CL_QUEUE_ON_DEVICE_DEFAULT: prop = que_val; break; default: err = CL_INVALID_VALUE; break; } } break; case CL_QUEUE_SIZE: queue_sz = que_val; break; default: err = CL_INVALID_VALUE; break; } } if (err) /* break the while and return some err. */ break; } /* Set some paramters to default val. */ if (prop == 0xFFFFFFFF) prop = 0; if (queue_sz != 0xFFFFFFFF) if (!(prop & CL_QUEUE_ON_DEVICE)) { err = CL_INVALID_VALUE; break; } if (queue_sz == 0xFFFFFFFF) queue_sz = device->queue_on_device_preferred_size; if (queue_sz > device->queue_on_device_max_size) { err = CL_INVALID_VALUE; break; } queue = cl_create_command_queue(context, device, prop, queue_sz, &err); } while (0); if (errcode_ret) *errcode_ret = err; return queue; } cl_int clGetCommandQueueInfo(cl_command_queue command_queue, cl_command_queue_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret) { const void *src_ptr = NULL; size_t src_size = 0; cl_int ref; if (!CL_OBJECT_IS_COMMAND_QUEUE(command_queue)) { return CL_INVALID_COMMAND_QUEUE; } if (param_name == CL_QUEUE_CONTEXT) { src_ptr = &command_queue->ctx; src_size = sizeof(cl_context); } else if (param_name == CL_QUEUE_DEVICE) { src_ptr = &command_queue->device; src_size = sizeof(cl_device_id); } else if (param_name == CL_QUEUE_REFERENCE_COUNT) { ref = CL_OBJECT_GET_REF(command_queue); src_ptr = &ref; src_size = sizeof(cl_int); } else if (param_name == CL_QUEUE_PROPERTIES) { src_ptr = &command_queue->props; src_size = sizeof(cl_command_queue_properties); } else if (param_name == CL_QUEUE_SIZE) { src_ptr = &command_queue->size; src_size = sizeof(command_queue->size); } else { return CL_INVALID_VALUE; } return cl_get_info_helper(src_ptr, src_size, param_value, param_value_size, param_value_size_ret); } cl_int clFlush(cl_command_queue command_queue) { if (!CL_OBJECT_IS_COMMAND_QUEUE(command_queue)) { return CL_INVALID_COMMAND_QUEUE; } return cl_command_queue_wait_flush(command_queue); } cl_int clFinish(cl_command_queue command_queue) { if (!CL_OBJECT_IS_COMMAND_QUEUE(command_queue)) { return CL_INVALID_COMMAND_QUEUE; } return cl_command_queue_wait_finish(command_queue); } cl_int clRetainCommandQueue(cl_command_queue command_queue) { if (!CL_OBJECT_IS_COMMAND_QUEUE(command_queue)) { return CL_INVALID_COMMAND_QUEUE; } cl_command_queue_add_ref(command_queue); return CL_SUCCESS; } cl_int clReleaseCommandQueue(cl_command_queue command_queue) { if (!CL_OBJECT_IS_COMMAND_QUEUE(command_queue)) { return CL_INVALID_COMMAND_QUEUE; } cl_command_queue_wait_flush(command_queue); cl_command_queue_delete(command_queue); return CL_SUCCESS; }