rev |
line source |
nuclear@0
|
1 #ifndef OCL_H_
|
nuclear@0
|
2 #define OCL_H_
|
nuclear@0
|
3
|
nuclear@0
|
4 #include <vector>
|
nuclear@0
|
5 #include <string>
|
nuclear@0
|
6 #ifndef __APPLE__
|
nuclear@8
|
7 #include <CL/cl.h>
|
nuclear@39
|
8 #include <CL/cl_gl.h>
|
nuclear@0
|
9 #else
|
nuclear@0
|
10 #include <OpenCL/opencl.h>
|
nuclear@0
|
11 #endif
|
nuclear@0
|
12
|
nuclear@0
|
13 enum {
|
nuclear@0
|
14 ARG_RD = CL_MEM_READ_ONLY,
|
nuclear@0
|
15 ARG_WR = CL_MEM_WRITE_ONLY,
|
nuclear@0
|
16 ARG_RDWR = CL_MEM_READ_WRITE
|
nuclear@0
|
17 };
|
nuclear@0
|
18
|
nuclear@0
|
19 enum {
|
nuclear@0
|
20 MAP_RD = CL_MAP_READ,
|
nuclear@0
|
21 MAP_WR = CL_MAP_WRITE,
|
nuclear@0
|
22 MAP_RDWR = CL_MAP_READ | CL_MAP_WRITE
|
nuclear@0
|
23 };
|
nuclear@0
|
24
|
nuclear@0
|
25 struct CLMemBuffer {
|
nuclear@0
|
26 cl_mem mem;
|
nuclear@0
|
27 size_t size;
|
nuclear@0
|
28 void *ptr;
|
nuclear@39
|
29 unsigned int tex;
|
nuclear@0
|
30 };
|
nuclear@0
|
31
|
nuclear@39
|
32
|
nuclear@39
|
33 bool init_opencl();
|
nuclear@39
|
34
|
nuclear@39
|
35 CLMemBuffer *create_mem_buffer(int rdwr, size_t sz, const void *buf);
|
nuclear@39
|
36 CLMemBuffer *create_mem_buffer(int rdwr, unsigned int tex);
|
nuclear@0
|
37 void destroy_mem_buffer(CLMemBuffer *mbuf);
|
nuclear@0
|
38
|
nuclear@39
|
39 void *map_mem_buffer(CLMemBuffer *mbuf, int rdwr, cl_event *ev = 0);
|
nuclear@39
|
40 void unmap_mem_buffer(CLMemBuffer *mbuf, cl_event *ev = 0);
|
nuclear@0
|
41
|
nuclear@39
|
42 bool write_mem_buffer(CLMemBuffer *mbuf, size_t sz, const void *src, cl_event *ev = 0);
|
nuclear@39
|
43 bool read_mem_buffer(CLMemBuffer *mbuf, size_t sz, void *dest, cl_event *ev = 0);
|
nuclear@39
|
44
|
nuclear@39
|
45 bool acquire_gl_object(CLMemBuffer *mbuf, cl_event *ev = 0);
|
nuclear@39
|
46 bool release_gl_object(CLMemBuffer *mbuf, cl_event *ev = 0);
|
nuclear@0
|
47
|
nuclear@1
|
48 enum {
|
nuclear@1
|
49 ARGTYPE_NONE,
|
nuclear@1
|
50
|
nuclear@1
|
51 ARGTYPE_INT,
|
nuclear@1
|
52 ARGTYPE_FLOAT,
|
nuclear@1
|
53 ARGTYPE_FLOAT4,
|
nuclear@1
|
54 ARGTYPE_MEM_BUF
|
nuclear@1
|
55 };
|
nuclear@1
|
56
|
nuclear@1
|
57 struct CLArg {
|
nuclear@1
|
58 int type;
|
nuclear@1
|
59 union {
|
nuclear@1
|
60 int ival;
|
nuclear@1
|
61 float fval;
|
nuclear@1
|
62 cl_float4 vval;
|
nuclear@1
|
63 CLMemBuffer *mbuf;
|
nuclear@1
|
64 } v;
|
John@14
|
65
|
John@14
|
66 CLArg();
|
nuclear@1
|
67 };
|
nuclear@1
|
68
|
nuclear@0
|
69
|
nuclear@0
|
70 class CLProgram {
|
nuclear@0
|
71 private:
|
nuclear@0
|
72 std::string kname;
|
nuclear@0
|
73 cl_program prog;
|
nuclear@0
|
74 cl_kernel kernel;
|
nuclear@1
|
75 std::vector<CLArg> args;
|
nuclear@0
|
76 bool built;
|
nuclear@39
|
77 mutable cl_event wait_event;
|
nuclear@39
|
78 mutable cl_event last_event;
|
nuclear@0
|
79
|
nuclear@0
|
80 public:
|
nuclear@0
|
81 CLProgram(const char *kname);
|
nuclear@0
|
82 ~CLProgram();
|
nuclear@0
|
83
|
nuclear@0
|
84 bool load(const char *fname);
|
nuclear@0
|
85
|
nuclear@1
|
86 bool set_argi(int arg, int val);
|
nuclear@1
|
87 bool set_argf(int arg, float val);
|
nuclear@28
|
88 bool set_arg_buffer(int arg, int rdwr, size_t sz, const void *buf = 0);
|
nuclear@39
|
89 bool set_arg_texture(int arg, int rdwr, unsigned int tex);
|
nuclear@0
|
90 CLMemBuffer *get_arg_buffer(int arg);
|
John@14
|
91 int get_num_args() const;
|
nuclear@0
|
92
|
nuclear@0
|
93 bool build();
|
nuclear@0
|
94
|
nuclear@0
|
95 bool run() const;
|
nuclear@0
|
96 bool run(int dim, ...) const;
|
nuclear@39
|
97
|
nuclear@39
|
98 // sets an event that has to be completed before running the kernel
|
nuclear@39
|
99 void set_wait_event(cl_event ev);
|
nuclear@39
|
100
|
nuclear@39
|
101 // gets the last event so that we can wait for it to finish
|
nuclear@39
|
102 cl_event get_last_event() const;
|
nuclear@0
|
103 };
|
nuclear@0
|
104
|
nuclear@0
|
105 #endif /* OCL_H_ */
|