clray

view src/ocl.h @ 40:1bcbb53b3505

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