[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