1c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// 2c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// Copyright 2012 Francisco Jerez 3c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// 4c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// Permission is hereby granted, free of charge, to any person obtaining a 5c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// copy of this software and associated documentation files (the "Software"), 6c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// to deal in the Software without restriction, including without limitation 7c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// the rights to use, copy, modify, merge, publish, distribute, sublicense, 8c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// and/or sell copies of the Software, and to permit persons to whom the 9c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// Software is furnished to do so, subject to the following conditions: 10c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// 11c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// The above copyright notice and this permission notice shall be included in 12c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// all copies or substantial portions of the Software. 13c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// 14c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17f0cb66b69904b0a3e4083aa8874af63cf1c14321Kenneth Graunke// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 18f0cb66b69904b0a3e4083aa8874af63cf1c14321Kenneth Graunke// OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19f0cb66b69904b0a3e4083aa8874af63cf1c14321Kenneth Graunke// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20f0cb66b69904b0a3e4083aa8874af63cf1c14321Kenneth Graunke// OTHER DEALINGS IN THE SOFTWARE. 21c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// 22c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 23c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#include "api/util.hpp" 24c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#include "core/event.hpp" 25c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 26c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezusing namespace clover; 27c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 286230f77232a4703c9f98f569104ac03430a5fb95Francisco JerezCLOVER_API cl_event 29257781f243476863591965f22787ff390edd8ba0Francisco JerezclCreateUserEvent(cl_context d_ctx, cl_int *r_errcode) try { 309d06fb8fa86a70d1c3a4924960dfebabaf1fa3bfFrancisco Jerez auto &ctx = obj(d_ctx); 31c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 32257781f243476863591965f22787ff390edd8ba0Francisco Jerez ret_error(r_errcode, CL_SUCCESS); 33257781f243476863591965f22787ff390edd8ba0Francisco Jerez return desc(new soft_event(ctx, {}, false)); 34c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 35257781f243476863591965f22787ff390edd8ba0Francisco Jerez} catch (error &e) { 36257781f243476863591965f22787ff390edd8ba0Francisco Jerez ret_error(r_errcode, e); 37c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return NULL; 38c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 39c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 406230f77232a4703c9f98f569104ac03430a5fb95Francisco JerezCLOVER_API cl_int 41257781f243476863591965f22787ff390edd8ba0Francisco JerezclSetUserEventStatus(cl_event d_ev, cl_int status) try { 42257781f243476863591965f22787ff390edd8ba0Francisco Jerez auto &sev = obj<soft_event>(d_ev); 43c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 44c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (status > 0) 45c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return CL_INVALID_VALUE; 46c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 47257781f243476863591965f22787ff390edd8ba0Francisco Jerez if (sev.status() <= 0) 48c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return CL_INVALID_OPERATION; 49c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 50c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (status) 51257781f243476863591965f22787ff390edd8ba0Francisco Jerez sev.abort(status); 52c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez else 53257781f243476863591965f22787ff390edd8ba0Francisco Jerez sev.trigger(); 54c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 55c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return CL_SUCCESS; 56257781f243476863591965f22787ff390edd8ba0Francisco Jerez 57257781f243476863591965f22787ff390edd8ba0Francisco Jerez} catch (error &e) { 58257781f243476863591965f22787ff390edd8ba0Francisco Jerez return e.get(); 59c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 60c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 616230f77232a4703c9f98f569104ac03430a5fb95Francisco JerezCLOVER_API cl_int 62257781f243476863591965f22787ff390edd8ba0Francisco JerezclWaitForEvents(cl_uint num_evs, const cl_event *d_evs) try { 63257781f243476863591965f22787ff390edd8ba0Francisco Jerez auto evs = objs(d_evs, num_evs); 64c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 65257781f243476863591965f22787ff390edd8ba0Francisco Jerez for (auto &ev : evs) { 66c4578d2277155c50c8680849763850cddb8e8ec2Francisco Jerez if (ev.context() != evs.front().context()) 67257781f243476863591965f22787ff390edd8ba0Francisco Jerez throw error(CL_INVALID_CONTEXT); 68c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 69257781f243476863591965f22787ff390edd8ba0Francisco Jerez if (ev.status() < 0) 70257781f243476863591965f22787ff390edd8ba0Francisco Jerez throw error(CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST); 71257781f243476863591965f22787ff390edd8ba0Francisco Jerez } 72c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 73c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez // Create a temporary soft event that depends on all the events in 74c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez // the wait list 75a0d99937a0b4e778cc0b2e93886c814dd8819f6dFrancisco Jerez auto sev = create<soft_event>(evs.front().context(), evs, true); 76c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 77c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez // ...and wait on it. 78a0d99937a0b4e778cc0b2e93886c814dd8819f6dFrancisco Jerez sev().wait(); 79c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 80c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return CL_SUCCESS; 81c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 82257781f243476863591965f22787ff390edd8ba0Francisco Jerez} catch (error &e) { 83c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return e.get(); 84c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 85c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 866230f77232a4703c9f98f569104ac03430a5fb95Francisco JerezCLOVER_API cl_int 87257781f243476863591965f22787ff390edd8ba0Francisco JerezclGetEventInfo(cl_event d_ev, cl_event_info param, 88d8b499428183178885bb182c898ee6f52e92ef03Francisco Jerez size_t size, void *r_buf, size_t *r_size) try { 89d8b499428183178885bb182c898ee6f52e92ef03Francisco Jerez property_buffer buf { r_buf, size, r_size }; 90257781f243476863591965f22787ff390edd8ba0Francisco Jerez auto &ev = obj(d_ev); 91c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 92c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez switch (param) { 93c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez case CL_EVENT_COMMAND_QUEUE: 949968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez buf.as_scalar<cl_command_queue>() = desc(ev.queue()); 95d8b499428183178885bb182c898ee6f52e92ef03Francisco Jerez break; 96c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 97c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez case CL_EVENT_CONTEXT: 98c4578d2277155c50c8680849763850cddb8e8ec2Francisco Jerez buf.as_scalar<cl_context>() = desc(ev.context()); 99d8b499428183178885bb182c898ee6f52e92ef03Francisco Jerez break; 100c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 101c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez case CL_EVENT_COMMAND_TYPE: 102257781f243476863591965f22787ff390edd8ba0Francisco Jerez buf.as_scalar<cl_command_type>() = ev.command(); 103d8b499428183178885bb182c898ee6f52e92ef03Francisco Jerez break; 104c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 105c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez case CL_EVENT_COMMAND_EXECUTION_STATUS: 106257781f243476863591965f22787ff390edd8ba0Francisco Jerez buf.as_scalar<cl_int>() = ev.status(); 107d8b499428183178885bb182c898ee6f52e92ef03Francisco Jerez break; 108c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 109c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez case CL_EVENT_REFERENCE_COUNT: 110257781f243476863591965f22787ff390edd8ba0Francisco Jerez buf.as_scalar<cl_uint>() = ev.ref_count(); 111d8b499428183178885bb182c898ee6f52e92ef03Francisco Jerez break; 112c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 113c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez default: 114d8b499428183178885bb182c898ee6f52e92ef03Francisco Jerez throw error(CL_INVALID_VALUE); 115c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez } 116d8b499428183178885bb182c898ee6f52e92ef03Francisco Jerez 117d8b499428183178885bb182c898ee6f52e92ef03Francisco Jerez return CL_SUCCESS; 118d8b499428183178885bb182c898ee6f52e92ef03Francisco Jerez 119d8b499428183178885bb182c898ee6f52e92ef03Francisco Jerez} catch (error &e) { 120d8b499428183178885bb182c898ee6f52e92ef03Francisco Jerez return e.get(); 121c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 122c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 1236230f77232a4703c9f98f569104ac03430a5fb95Francisco JerezCLOVER_API cl_int 124257781f243476863591965f22787ff390edd8ba0Francisco JerezclSetEventCallback(cl_event d_ev, cl_int type, 125257781f243476863591965f22787ff390edd8ba0Francisco Jerez void (CL_CALLBACK *pfn_notify)(cl_event, cl_int, void *), 126c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez void *user_data) try { 127257781f243476863591965f22787ff390edd8ba0Francisco Jerez auto &ev = obj(d_ev); 128c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 129257781f243476863591965f22787ff390edd8ba0Francisco Jerez if (!pfn_notify || type != CL_COMPLETE) 130c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez throw error(CL_INVALID_VALUE); 131c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 132c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez // Create a temporary soft event that depends on ev, with 133257781f243476863591965f22787ff390edd8ba0Francisco Jerez // pfn_notify as completion action. 134a0d99937a0b4e778cc0b2e93886c814dd8819f6dFrancisco Jerez create<soft_event>(ev.context(), ref_vector<event> { ev }, true, 135a0d99937a0b4e778cc0b2e93886c814dd8819f6dFrancisco Jerez [=, &ev](event &) { 136a0d99937a0b4e778cc0b2e93886c814dd8819f6dFrancisco Jerez ev.wait(); 137a0d99937a0b4e778cc0b2e93886c814dd8819f6dFrancisco Jerez pfn_notify(desc(ev), ev.status(), user_data); 138a0d99937a0b4e778cc0b2e93886c814dd8819f6dFrancisco Jerez }); 139c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 140c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return CL_SUCCESS; 141c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 142257781f243476863591965f22787ff390edd8ba0Francisco Jerez} catch (error &e) { 143c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return e.get(); 144c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 145c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 1466230f77232a4703c9f98f569104ac03430a5fb95Francisco JerezCLOVER_API cl_int 147257781f243476863591965f22787ff390edd8ba0Francisco JerezclRetainEvent(cl_event d_ev) try { 148257781f243476863591965f22787ff390edd8ba0Francisco Jerez obj(d_ev).retain(); 149c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return CL_SUCCESS; 150257781f243476863591965f22787ff390edd8ba0Francisco Jerez 151257781f243476863591965f22787ff390edd8ba0Francisco Jerez} catch (error &e) { 152257781f243476863591965f22787ff390edd8ba0Francisco Jerez return e.get(); 153c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 154c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 1556230f77232a4703c9f98f569104ac03430a5fb95Francisco JerezCLOVER_API cl_int 156257781f243476863591965f22787ff390edd8ba0Francisco JerezclReleaseEvent(cl_event d_ev) try { 157257781f243476863591965f22787ff390edd8ba0Francisco Jerez if (obj(d_ev).release()) 158257781f243476863591965f22787ff390edd8ba0Francisco Jerez delete pobj(d_ev); 159c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 160c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return CL_SUCCESS; 161257781f243476863591965f22787ff390edd8ba0Francisco Jerez 162257781f243476863591965f22787ff390edd8ba0Francisco Jerez} catch (error &e) { 163257781f243476863591965f22787ff390edd8ba0Francisco Jerez return e.get(); 164c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 165c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 1666230f77232a4703c9f98f569104ac03430a5fb95Francisco JerezCLOVER_API cl_int 167257781f243476863591965f22787ff390edd8ba0Francisco JerezclEnqueueMarker(cl_command_queue d_q, cl_event *rd_ev) try { 1689968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez auto &q = obj(d_q); 169c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 170257781f243476863591965f22787ff390edd8ba0Francisco Jerez if (!rd_ev) 171c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez throw error(CL_INVALID_VALUE); 172c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 1739968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez *rd_ev = desc(new hard_event(q, CL_COMMAND_MARKER, {})); 174c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 175c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return CL_SUCCESS; 176c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 177257781f243476863591965f22787ff390edd8ba0Francisco Jerez} catch (error &e) { 178c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return e.get(); 179c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 180c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 1816230f77232a4703c9f98f569104ac03430a5fb95Francisco JerezCLOVER_API cl_int 1825827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge MartinclEnqueueMarkerWithWaitList(cl_command_queue d_q, cl_uint num_deps, 1835827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin const cl_event *d_deps, cl_event *rd_ev) try { 1845827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin auto &q = obj(d_q); 1855827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin auto deps = objs<wait_list_tag>(d_deps, num_deps); 1865827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin 1875827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin for (auto &ev : deps) { 1885827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin if (ev.context() != q.context()) 1895827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin throw error(CL_INVALID_CONTEXT); 1905827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin } 1915827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin 1925827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin // Create a hard event that depends on the events in the wait list: 1935827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin // previous commands in the same queue are implicitly serialized 1945827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin // with respect to it -- hard events always are. 1955827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin auto hev = create<hard_event>(q, CL_COMMAND_MARKER, deps); 1965827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin 1975827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin ret_object(rd_ev, hev); 1985827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin return CL_SUCCESS; 1995827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin 2005827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin} catch (error &e) { 2015827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin return e.get(); 2025827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin} 2035827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin 2045827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge MartinCLOVER_API cl_int 2059968d9daf264b726ee50bbc97937daac4e9c1811Francisco JerezclEnqueueBarrier(cl_command_queue d_q) try { 2069968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez obj(d_q); 207c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 208c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez // No need to do anything, q preserves data ordering strictly. 209257781f243476863591965f22787ff390edd8ba0Francisco Jerez 210c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return CL_SUCCESS; 2119968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez 2129968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez} catch (error &e) { 2139968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez return e.get(); 214c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 215c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 2166230f77232a4703c9f98f569104ac03430a5fb95Francisco JerezCLOVER_API cl_int 2175827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge MartinclEnqueueBarrierWithWaitList(cl_command_queue d_q, cl_uint num_deps, 2185827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin const cl_event *d_deps, cl_event *rd_ev) try { 2199968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez auto &q = obj(d_q); 2205827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin auto deps = objs<wait_list_tag>(d_deps, num_deps); 221c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 2225827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin for (auto &ev : deps) { 223c4578d2277155c50c8680849763850cddb8e8ec2Francisco Jerez if (ev.context() != q.context()) 224c4578d2277155c50c8680849763850cddb8e8ec2Francisco Jerez throw error(CL_INVALID_CONTEXT); 225257781f243476863591965f22787ff390edd8ba0Francisco Jerez } 226c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 227c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez // Create a hard event that depends on the events in the wait list: 228c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez // subsequent commands in the same queue will be implicitly 229c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez // serialized with respect to it -- hard events always are. 2305827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin auto hev = create<hard_event>(q, CL_COMMAND_BARRIER, deps); 231c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 2325827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin ret_object(rd_ev, hev); 233c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return CL_SUCCESS; 234c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 235257781f243476863591965f22787ff390edd8ba0Francisco Jerez} catch (error &e) { 236c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return e.get(); 237c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 238c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 2396230f77232a4703c9f98f569104ac03430a5fb95Francisco JerezCLOVER_API cl_int 2405827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge MartinclEnqueueWaitForEvents(cl_command_queue d_q, cl_uint num_evs, 2415827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin const cl_event *d_evs) try { 2425827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin // The wait list is mandatory for clEnqueueWaitForEvents(). 2435827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin objs(d_evs, num_evs); 2445827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin 2455827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin return clEnqueueBarrierWithWaitList(d_q, num_evs, d_evs, NULL); 2465827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin 2475827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin} catch (error &e) { 2485827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin return e.get(); 2495827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin} 2505827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge Martin 2515827781d25d2e27ebbcfc2362fcc14cc710bccf5Serge MartinCLOVER_API cl_int 252257781f243476863591965f22787ff390edd8ba0Francisco JerezclGetEventProfilingInfo(cl_event d_ev, cl_profiling_info param, 253d8b499428183178885bb182c898ee6f52e92ef03Francisco Jerez size_t size, void *r_buf, size_t *r_size) try { 254d8b499428183178885bb182c898ee6f52e92ef03Francisco Jerez property_buffer buf { r_buf, size, r_size }; 255257781f243476863591965f22787ff390edd8ba0Francisco Jerez hard_event &hev = dynamic_cast<hard_event &>(obj(d_ev)); 256ebfdce079b8f99f92dff4d58a53c27e0888c373fFrancisco Jerez 257257781f243476863591965f22787ff390edd8ba0Francisco Jerez if (hev.status() != CL_COMPLETE) 258257781f243476863591965f22787ff390edd8ba0Francisco Jerez throw error(CL_PROFILING_INFO_NOT_AVAILABLE); 2594a3505d5487fbdab773f5c91edd39e8aea6e90afNiels Ole Salscheider 2604a3505d5487fbdab773f5c91edd39e8aea6e90afNiels Ole Salscheider switch (param) { 2614a3505d5487fbdab773f5c91edd39e8aea6e90afNiels Ole Salscheider case CL_PROFILING_COMMAND_QUEUED: 262257781f243476863591965f22787ff390edd8ba0Francisco Jerez buf.as_scalar<cl_ulong>() = hev.time_queued(); 263d8b499428183178885bb182c898ee6f52e92ef03Francisco Jerez break; 2644a3505d5487fbdab773f5c91edd39e8aea6e90afNiels Ole Salscheider 2654a3505d5487fbdab773f5c91edd39e8aea6e90afNiels Ole Salscheider case CL_PROFILING_COMMAND_SUBMIT: 266257781f243476863591965f22787ff390edd8ba0Francisco Jerez buf.as_scalar<cl_ulong>() = hev.time_submit(); 267d8b499428183178885bb182c898ee6f52e92ef03Francisco Jerez break; 2684a3505d5487fbdab773f5c91edd39e8aea6e90afNiels Ole Salscheider 2694a3505d5487fbdab773f5c91edd39e8aea6e90afNiels Ole Salscheider case CL_PROFILING_COMMAND_START: 270257781f243476863591965f22787ff390edd8ba0Francisco Jerez buf.as_scalar<cl_ulong>() = hev.time_start(); 271d8b499428183178885bb182c898ee6f52e92ef03Francisco Jerez break; 2724a3505d5487fbdab773f5c91edd39e8aea6e90afNiels Ole Salscheider 2734a3505d5487fbdab773f5c91edd39e8aea6e90afNiels Ole Salscheider case CL_PROFILING_COMMAND_END: 274257781f243476863591965f22787ff390edd8ba0Francisco Jerez buf.as_scalar<cl_ulong>() = hev.time_end(); 275d8b499428183178885bb182c898ee6f52e92ef03Francisco Jerez break; 2764a3505d5487fbdab773f5c91edd39e8aea6e90afNiels Ole Salscheider 2774a3505d5487fbdab773f5c91edd39e8aea6e90afNiels Ole Salscheider default: 278d8b499428183178885bb182c898ee6f52e92ef03Francisco Jerez throw error(CL_INVALID_VALUE); 2794a3505d5487fbdab773f5c91edd39e8aea6e90afNiels Ole Salscheider } 280ebfdce079b8f99f92dff4d58a53c27e0888c373fFrancisco Jerez 281d8b499428183178885bb182c898ee6f52e92ef03Francisco Jerez return CL_SUCCESS; 282d8b499428183178885bb182c898ee6f52e92ef03Francisco Jerez 283257781f243476863591965f22787ff390edd8ba0Francisco Jerez} catch (std::bad_cast &e) { 284257781f243476863591965f22787ff390edd8ba0Francisco Jerez return CL_PROFILING_INFO_NOT_AVAILABLE; 285257781f243476863591965f22787ff390edd8ba0Francisco Jerez 286ebfdce079b8f99f92dff4d58a53c27e0888c373fFrancisco Jerez} catch (lazy<cl_ulong>::undefined_error &e) { 287ebfdce079b8f99f92dff4d58a53c27e0888c373fFrancisco Jerez return CL_PROFILING_INFO_NOT_AVAILABLE; 288ebfdce079b8f99f92dff4d58a53c27e0888c373fFrancisco Jerez 289ebfdce079b8f99f92dff4d58a53c27e0888c373fFrancisco Jerez} catch (error &e) { 290ebfdce079b8f99f92dff4d58a53c27e0888c373fFrancisco Jerez return e.get(); 291c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 292c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 2936230f77232a4703c9f98f569104ac03430a5fb95Francisco JerezCLOVER_API cl_int 294257781f243476863591965f22787ff390edd8ba0Francisco JerezclFinish(cl_command_queue d_q) try { 2959968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez auto &q = obj(d_q); 296c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 297c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez // Create a temporary hard event -- it implicitly depends on all 298c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez // the previously queued hard events. 299a0d99937a0b4e778cc0b2e93886c814dd8819f6dFrancisco Jerez auto hev = create<hard_event>(q, 0, ref_vector<event> {}); 300c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 301c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez // And wait on it. 302a0d99937a0b4e778cc0b2e93886c814dd8819f6dFrancisco Jerez hev().wait(); 303c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 304c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return CL_SUCCESS; 305c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 306257781f243476863591965f22787ff390edd8ba0Francisco Jerez} catch (error &e) { 307c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return e.get(); 308c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 309