[Beignet] [PATCH 27/57] Implement all command queue related API in cl_api_command_queue.c
junyan.he at inbox.com
junyan.he at inbox.com
Sun Jun 11 05:50:13 UTC 2017
From: Junyan He <junyan.he at intel.com>
Signed-off-by: Junyan He <junyan.he at intel.com>
---
runtime/cl_api_command_queue.c | 233 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 233 insertions(+)
create mode 100644 runtime/cl_api_command_queue.c
diff --git a/runtime/cl_api_command_queue.c b/runtime/cl_api_command_queue.c
new file mode 100644
index 0000000..c4132ed
--- /dev/null
+++ b/runtime/cl_api_command_queue.c
@@ -0,0 +1,233 @@
+/*
+ * 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 <http://www.gnu.org/licenses/>.
+ *
+ */
+#include "cl_command_queue.h"
+#include "cl_device_id.h"
+#include "CL/cl.h"
+#include <stdio.h>
+
+/* 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_command_queue_create(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_command_queue_create(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;
+}
--
2.7.4
More information about the Beignet
mailing list