-
Notifications
You must be signed in to change notification settings - Fork 0
/
event.lua
63 lines (56 loc) · 1.64 KB
/
event.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
local ffi = require 'ffi'
local cl = require 'ffi.req' 'OpenCL'
local classert = require 'cl.assert'
local GCWrapper = require 'cl.gcwrapper'
local GetInfo = require 'cl.getinfo'
local Event = GetInfo(GCWrapper{
ctype = 'cl_event',
retain = function(self) return cl.clRetainEvent(self.id) end,
release = function(self) return cl.clReleaseEvent(self.id) end,
}):subclass()
function Event:init(id)
Event.super.init(self, id)
-- and keep it in an array cuz in commandqueue it is used so often
self.ptr = ffi.new(self.ctype..'[1]')
self.ptr[0] = id
end
function Event:wait()
classert(cl.clWaitForEvents(1, self.id))
end
-- static
function Event.waitForEvents(...)
local n = select('#', ...)
local events
if n > 0 then
events = ffi.new('cl_event[?]', n)
for i=1,n do
events[i-1] = select(i).id
end
end
classert(cl.clWaitForEvents(n, n > 0 and events or nil))
end
Event.getInfo = Event:makeGetter{
getter = cl.clGetEventInfo,
vars = {
-- 1.0:
{name='CL_EVENT_COMMAND_QUEUE', type='cl_command_queue'},
{name='CL_EVENT_COMMAND_TYPE', type='cl_command_type'},
{name='CL_EVENT_REFERENCE_COUNT', type='cl_uint'},
{name='CL_EVENT_COMMAND_EXECUTION_STATUS', type='cl_int'},
-- 1.1
{name='CL_EVENT_CONTEXT', type='cl_context'},
},
}
Event.getProfilingInfo = Event:makeGetter{
getter = cl.clGetEventProfilingInfo,
vars = {
-- 1.0
{name='CL_PROFILING_COMMAND_QUEUED', type='cl_ulong'},
{name='CL_PROFILING_COMMAND_SUBMIT', type='cl_ulong'},
{name='CL_PROFILING_COMMAND_START', type='cl_ulong'},
{name='CL_PROFILING_COMMAND_END', type='cl_ulong'},
-- 2.0
{name='CL_PROFILING_COMMAND_COMPLETE', type='cl_ulong'},
},
}
return Event