[Mesa-dev] [PATCH 2/2] clover: Add clEnqueue{Marker, Barrier}WithWaitList

EdB edb+mesa at sigluy.net
Fri Apr 25 12:55:38 PDT 2014


---
 src/gallium/state_trackers/clover/api/dispatch.cpp |  4 +-
 src/gallium/state_trackers/clover/api/event.cpp    | 48 ++++++++++++++++++----
 2 files changed, 42 insertions(+), 10 deletions(-)

diff --git a/src/gallium/state_trackers/clover/api/dispatch.cpp b/src/gallium/state_trackers/clover/api/dispatch.cpp
index 746372c..e4f7ea3 100644
--- a/src/gallium/state_trackers/clover/api/dispatch.cpp
+++ b/src/gallium/state_trackers/clover/api/dispatch.cpp
@@ -129,8 +129,8 @@ namespace clover {
       NULL, // clEnqueueFillBuffer
       NULL, // clEnqueueFillImage
       NULL, // clEnqueueMigrateMemObjects
-      NULL, // clEnqueueMarkerWithWaitList
-      NULL, // clEnqueueBarrierWithWaitList
+      clEnqueueMarkerWithWaitList,
+      clEnqueueBarrierWithWaitList,
       NULL, // clGetExtensionFunctionAddressForPlatform
       NULL, // clCreateFromGLTexture
       NULL, // clGetDeviceIDsFromD3D11KHR
diff --git a/src/gallium/state_trackers/clover/api/event.cpp b/src/gallium/state_trackers/clover/api/event.cpp
index 6b1956c..daf9577 100644
--- a/src/gallium/state_trackers/clover/api/event.cpp
+++ b/src/gallium/state_trackers/clover/api/event.cpp
@@ -179,6 +179,27 @@ clEnqueueMarker(cl_command_queue d_q, cl_event *rd_ev) try {
 }
 
 CLOVER_API cl_int
+clEnqueueMarkerWithWaitList(cl_command_queue d_q, cl_uint num_evs,
+                            const cl_event *d_evs, cl_event *rd_ev) try {
+   auto &q = obj(d_q);
+	 auto deps = objs<wait_list_tag>(d_evs, num_evs);
+
+	 for (auto &ev : deps) {
+      if (ev.context() != q.context())
+         throw error(CL_INVALID_CONTEXT);
+   }
+
+   // Create a hard event that depends on the events in the wait list.
+   auto hev = create<hard_event>(q, CL_COMMAND_MARKER, deps);
+
+   ret_object(rd_ev, hev);
+   return CL_SUCCESS;
+
+} catch (error &e) {
+   return e.get();
+}
+
+CLOVER_API cl_int
 clEnqueueBarrier(cl_command_queue d_q) try {
    obj(d_q);
 
@@ -191,21 +212,20 @@ clEnqueueBarrier(cl_command_queue d_q) try {
 }
 
 CLOVER_API cl_int
-clEnqueueWaitForEvents(cl_command_queue d_q, cl_uint num_evs,
-                       const cl_event *d_evs) try {
+clEnqueueBarrierWithWaitList(cl_command_queue d_q, cl_uint num_evs,
+                             const cl_event *d_evs, cl_event *rd_ev) try {
    auto &q = obj(d_q);
-   auto evs = objs(d_evs, num_evs);
+	 auto deps = objs<wait_list_tag>(d_evs, num_evs);
 
-   for (auto &ev : evs) {
+	 for (auto &ev : deps) {
       if (ev.context() != q.context())
          throw error(CL_INVALID_CONTEXT);
    }
 
-   // Create a hard event that depends on the events in the wait list:
-   // subsequent commands in the same queue will be implicitly
-   // serialized with respect to it -- hard events always are.
-   create<hard_event>(q, 0, evs);
+   // Create a hard event that depends on the events in the wait list.
+   auto hev = create<hard_event>(q, CL_COMMAND_BARRIER, deps);
 
+   ret_object(rd_ev, hev);
    return CL_SUCCESS;
 
 } catch (error &e) {
@@ -213,6 +233,18 @@ clEnqueueWaitForEvents(cl_command_queue d_q, cl_uint num_evs,
 }
 
 CLOVER_API cl_int
+clEnqueueWaitForEvents(cl_command_queue d_q, cl_uint num_evs,
+                       const cl_event *d_evs) try {
+   // The wait list is mandatory for clEnqueueWaitForEvents().
+   objs(d_evs, num_evs);
+
+   return clEnqueueBarrierWithWaitList(d_q, num_evs, d_evs, NULL);
+
+} catch (error &e) {
+   return e.get();
+}
+
+CLOVER_API cl_int
 clGetEventProfilingInfo(cl_event d_ev, cl_profiling_info param,
                         size_t size, void *r_buf, size_t *r_size) try {
    property_buffer buf { r_buf, size, r_size };
-- 
1.9.1



More information about the mesa-dev mailing list