From 5827781d25d2e27ebbcfc2362fcc14cc710bccf5 Mon Sep 17 00:00:00 2001 From: EdB Date: Sat, 26 Apr 2014 19:11:09 +0200 Subject: clover: Add clEnqueue{Marker, Barrier}WithWaitList. Reviewed-by: Francisco Jerez --- src/gallium/state_trackers/clover/api/dispatch.cpp | 4 +- src/gallium/state_trackers/clover/api/event.cpp | 46 +++++++++++++++++++--- 2 files changed, 43 insertions(+), 7 deletions(-) diff --git a/src/gallium/state_trackers/clover/api/dispatch.cpp b/src/gallium/state_trackers/clover/api/dispatch.cpp index 746372c0d64..e4f7ea3cc74 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 6b1956c8f2f..5d1a0e52c56 100644 --- a/src/gallium/state_trackers/clover/api/event.cpp +++ b/src/gallium/state_trackers/clover/api/event.cpp @@ -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(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(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(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(q, 0, evs); + auto hev = create(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 { -- cgit v1.2.3