clray

annotate 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
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_ */