[Mesa-dev] [PATCH 1/1] clover: Add clEnqueue{Marker, Barrier}WithWaitList
EdB
edb+mesa at sigluy.net
Sat Apr 26 10:11:09 PDT 2014
---
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 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..6652171 100644
--- a/src/gallium/state_trackers/clover/api/event.cpp
+++ b/src/gallium/state_trackers/clover/api/event.cpp
@@ -179,6 +179,29 @@ clEnqueueMarker(cl_command_queue d_q, cl_event *rd_ev) try {
}
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:
+ // subsequent commands in the same queue will be 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,8 +227,9 @@ 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) {
@@ -213,6 +237,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