[Mesa-dev] [PATCH] clover: Implement clSetCommandQueueProperty() from OpenCL 1.0

Edward O'Callaghan funfunctor at folklore1984.net
Fri Nov 18 03:25:47 UTC 2016


Signed-off-by: Edward O'Callaghan <funfunctor at folklore1984.net>
---
 include/CL/cl.h                                    |  6 ++++
 src/gallium/state_trackers/clover/api/dispatch.cpp |  2 +-
 src/gallium/state_trackers/clover/api/queue.cpp    | 34 ++++++++++++++++++++++
 src/gallium/state_trackers/clover/core/queue.cpp   |  3 ++
 src/gallium/state_trackers/clover/core/queue.hpp   |  1 +
 5 files changed, 45 insertions(+), 1 deletion(-)

diff --git a/include/CL/cl.h b/include/CL/cl.h
index 316565d..51adf65 100644
--- a/include/CL/cl.h
+++ b/include/CL/cl.h
@@ -656,6 +656,12 @@ clGetCommandQueueInfo(cl_command_queue      /* command_queue */,
                       void *                /* param_value */,
                       size_t *              /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
 
+extern CL_API_ENTRY cl_int CL_API_CALL
+clSetCommandQueueProperty(cl_command_queue            /* command_queue */,
+                          cl_command_queue_properties /* properties */,
+                          cl_bool                     /* param_value */,
+                          cl_command_queue_properties /* properties */) CL_API_SUFFIX__VERSION_1_0;
+
 /* Memory Object APIs */
 extern CL_API_ENTRY cl_mem CL_API_CALL
 clCreateBuffer(cl_context   /* context */,
diff --git a/src/gallium/state_trackers/clover/api/dispatch.cpp b/src/gallium/state_trackers/clover/api/dispatch.cpp
index 8f4cfdc..0f64914 100644
--- a/src/gallium/state_trackers/clover/api/dispatch.cpp
+++ b/src/gallium/state_trackers/clover/api/dispatch.cpp
@@ -37,7 +37,7 @@ namespace clover {
       clRetainCommandQueue,
       clReleaseCommandQueue,
       clGetCommandQueueInfo,
-      NULL, // clSetCommandQueueProperty
+      clSetCommandQueueProperty,
       clCreateBuffer,
       clCreateImage2D,
       clCreateImage3D,
diff --git a/src/gallium/state_trackers/clover/api/queue.cpp b/src/gallium/state_trackers/clover/api/queue.cpp
index 06a2863..7734e19 100644
--- a/src/gallium/state_trackers/clover/api/queue.cpp
+++ b/src/gallium/state_trackers/clover/api/queue.cpp
@@ -105,6 +105,40 @@ clGetCommandQueueInfo(cl_command_queue d_q, cl_command_queue_info param,
 }
 
 CLOVER_API cl_int
+clSetCommandQueueProperty(cl_command_queue d_q,
+                     cl_command_queue_properties props, cl_bool enabled,
+                     cl_command_queue_properties *old_props) try {
+   //throws CL_INVALID_COMMAND_QUEUE if command_queue is not a valid.
+   auto &q = obj(d_q);
+
+   if (props & ~(CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE |
+                 CL_QUEUE_PROFILING_ENABLE))
+      throw error(CL_INVALID_VALUE);
+
+   if (!old_props) // If old_properties is NULL, it is ignored.
+	   *old_props = q.propertices();
+
+   if (enabled == CL_TRUE) {
+      if (q.propertices() & props)
+         return CL_SUCCESS;
+   } else { // CL_FALSE
+      if (q.propertices() & ~props)
+         return CL_SUCCESS;
+   }
+
+   // TODO how to determine if device supports props???
+   if (1)
+      q.propertices(props);
+   else
+      throw error(CL_INVALID_QUEUE_PROPERTIES);
+
+   return CL_SUCCESS;
+
+} catch (error &e) {
+   return e.get();
+}
+
+CLOVER_API cl_int
 clFlush(cl_command_queue d_q) try {
    obj(d_q).flush();
    return CL_SUCCESS;
diff --git a/src/gallium/state_trackers/clover/core/queue.cpp b/src/gallium/state_trackers/clover/core/queue.cpp
index c91b97a..24b15f3 100644
--- a/src/gallium/state_trackers/clover/core/queue.cpp
+++ b/src/gallium/state_trackers/clover/core/queue.cpp
@@ -87,6 +87,9 @@ command_queue::properties() const {
    return props;
 }
 
+void
+command_queue::properties(cl_command_queue_properties props) : props(props);
+
 bool
 command_queue::profiling_enabled() const {
    return props & CL_QUEUE_PROFILING_ENABLE;
diff --git a/src/gallium/state_trackers/clover/core/queue.hpp b/src/gallium/state_trackers/clover/core/queue.hpp
index bddb86c..8c0906d 100644
--- a/src/gallium/state_trackers/clover/core/queue.hpp
+++ b/src/gallium/state_trackers/clover/core/queue.hpp
@@ -49,6 +49,7 @@ namespace clover {
       void flush();
 
       cl_command_queue_properties properties() const;
+      void command_queue::properties(cl_command_queue_properties props);
       bool profiling_enabled() const;
 
       const intrusive_ref<clover::context> context;
-- 
2.7.4



More information about the mesa-dev mailing list