clray

annotate src/ocl.h @ 39:980bc07be868

Implemented OpenGL/OpenCL interop, and removed the texture copy
author John Tsiombikas <nuclear@member.fsf.org>
date Fri, 27 Aug 2010 18:30:09 +0100
parents 97cfd9675310
children 1bcbb53b3505
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_ */