clover: Add clEnqueue{Marker, Barrier}WithWaitList.
authorEdB <edb+mesa@sigluy.net>
Sat, 26 Apr 2014 17:11:09 +0000 (19:11 +0200)
committerFrancisco Jerez <currojerez@riseup.net>
Tue, 29 Apr 2014 11:12:38 +0000 (13:12 +0200)
Reviewed-by: Francisco Jerez <currojerez@riseup.net>
src/gallium/state_trackers/clover/api/dispatch.cpp
src/gallium/state_trackers/clover/api/event.cpp

index 746372c0d642c18761b23182ded9dfeba80078ed..e4f7ea3cc74282ff748d56c661e2aed279508959 100644 (file)
@@ -129,8 +129,8 @@ namespace clover {
       NULL, // clEnqueueFillBuffer
       NULL, // clEnqueueFillImage
       NULL, // clEnqueueMigrateMemObjects
-      NULL, // clEnqueueMarkerWithWaitList
-      NULL, // clEnqueueBarrierWithWaitList
+      clEnqueueMarkerWithWaitList,
+      clEnqueueBarrierWithWaitList,
       NULL, // clGetExtensionFunctionAddressForPlatform
       NULL, // clCreateFromGLTexture
       NULL, // clGetDeviceIDsFromD3D11KHR
index 6b1956c8f2f4298313c981de0a09ae92f358baa5..5d1a0e52c5630e3256d39d17c7d79d0ce0b8ab58 100644 (file)
@@ -178,6 +178,29 @@ clEnqueueMarker(cl_command_queue d_q, cl_event *rd_ev) try {
    return e.get();
 }
 
+CLOVER_API cl_int
+clEnqueueMarkerWithWaitList(cl_command_queue d_q, cl_uint num_deps,
+                            const cl_event *d_deps, cl_event *rd_ev) try {
+   auto &q = obj(d_q);
+   auto deps = objs<wait_list_tag>(d_deps, num_deps);
+
+   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:
+   // previous commands in the same queue are implicitly serialized
+   // with respect to it -- hard events always are.
+   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,12 +214,12 @@ 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_deps,
+                             const cl_event *d_deps, cl_event *rd_ev) try {
    auto &q = obj(d_q);
-   auto evs = objs(d_evs, num_evs);
+   auto deps = objs<wait_list_tag>(d_deps, num_deps);
 
-   for (auto &ev : evs) {
+   for (auto &ev : deps) {
       if (ev.context() != q.context())
          throw error(CL_INVALID_CONTEXT);
    }
@@ -204,14 +227,27 @@ clEnqueueWaitForEvents(cl_command_queue d_q, cl_uint num_evs,
    // 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);
+   auto hev = create<hard_event>(q, CL_COMMAND_BARRIER, deps);
 
+   ret_object(rd_ev, hev);
    return CL_SUCCESS;
 
 } catch (error &e) {
    return e.get();
 }
 
+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 {