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@40
|
34 void destroy_opencl();
|
nuclear@39
|
35
|
nuclear@39
|
36 CLMemBuffer *create_mem_buffer(int rdwr, size_t sz, const void *buf);
|
nuclear@39
|
37 CLMemBuffer *create_mem_buffer(int rdwr, unsigned int tex);
|
nuclear@0
|
38 void destroy_mem_buffer(CLMemBuffer *mbuf);
|
nuclear@0
|
39
|
nuclear@39
|
40 void *map_mem_buffer(CLMemBuffer *mbuf, int rdwr, cl_event *ev = 0);
|
nuclear@39
|
41 void unmap_mem_buffer(CLMemBuffer *mbuf, cl_event *ev = 0);
|
nuclear@0
|
42
|
nuclear@39
|
43 bool write_mem_buffer(CLMemBuffer *mbuf, size_t sz, const void *src, cl_event *ev = 0);
|
nuclear@39
|
44 bool read_mem_buffer(CLMemBuffer *mbuf, size_t sz, void *dest, cl_event *ev = 0);
|
nuclear@39
|
45
|
nuclear@39
|
46 bool acquire_gl_object(CLMemBuffer *mbuf, cl_event *ev = 0);
|
nuclear@39
|
47 bool release_gl_object(CLMemBuffer *mbuf, cl_event *ev = 0);
|
nuclear@0
|
48
|
nuclear@1
|
49 enum {
|
nuclear@1
|
50 ARGTYPE_NONE,
|
nuclear@1
|
51
|
nuclear@1
|
52 ARGTYPE_INT,
|
nuclear@1
|
53 ARGTYPE_FLOAT,
|
nuclear@1
|
54 ARGTYPE_FLOAT4,
|
nuclear@1
|
55 ARGTYPE_MEM_BUF
|
nuclear@1
|
56 };
|
nuclear@1
|
57
|
nuclear@1
|
58 struct CLArg {
|
nuclear@1
|
59 int type;
|
nuclear@1
|
60 union {
|
nuclear@1
|
61 int ival;
|
nuclear@1
|
62 float fval;
|
nuclear@1
|
63 cl_float4 vval;
|
nuclear@1
|
64 CLMemBuffer *mbuf;
|
nuclear@1
|
65 } v;
|
John@14
|
66
|
John@14
|
67 CLArg();
|
nuclear@1
|
68 };
|
nuclear@1
|
69
|
nuclear@0
|
70
|
nuclear@0
|
71 class CLProgram {
|
nuclear@0
|
72 private:
|
nuclear@0
|
73 std::string kname;
|
nuclear@0
|
74 cl_program prog;
|
nuclear@0
|
75 cl_kernel kernel;
|
nuclear@1
|
76 std::vector<CLArg> args;
|
nuclear@0
|
77 bool built;
|
nuclear@39
|
78 mutable cl_event wait_event;
|
nuclear@39
|
79 mutable cl_event last_event;
|
nuclear@0
|
80
|
nuclear@0
|
81 public:
|
nuclear@0
|
82 CLProgram(const char *kname);
|
nuclear@0
|
83 ~CLProgram();
|
nuclear@0
|
84
|
nuclear@0
|
85 bool load(const char *fname);
|
nuclear@0
|
86
|
nuclear@1
|
87 bool set_argi(int arg, int val);
|
nuclear@1
|
88 bool set_argf(int arg, float val);
|
nuclear@28
|
89 bool set_arg_buffer(int arg, int rdwr, size_t sz, const void *buf = 0);
|
nuclear@39
|
90 bool set_arg_texture(int arg, int rdwr, unsigned int tex);
|
nuclear@0
|
91 CLMemBuffer *get_arg_buffer(int arg);
|
John@14
|
92 int get_num_args() const;
|
nuclear@0
|
93
|
nuclear@0
|
94 bool build();
|
nuclear@0
|
95
|
nuclear@0
|
96 bool run() const;
|
nuclear@0
|
97 bool run(int dim, ...) const;
|
nuclear@39
|
98
|
nuclear@39
|
99 // sets an event that has to be completed before running the kernel
|
nuclear@39
|
100 void set_wait_event(cl_event ev);
|
nuclear@39
|
101
|
nuclear@39
|
102 // gets the last event so that we can wait for it to finish
|
nuclear@39
|
103 cl_event get_last_event() const;
|
nuclear@0
|
104 };
|
nuclear@0
|
105
|
nuclear@0
|
106 #endif /* OCL_H_ */
|