annotate opencl/wrapper.d @ 0:3cea44337083

initial commit
author Trass3r
date Wed, 02 Dec 2009 17:40:59 +0100
parents
children c78ffc9a7434
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
3cea44337083 initial commit
Trass3r
parents:
diff changeset
1 /**
3cea44337083 initial commit
Trass3r
parents:
diff changeset
2 *
3cea44337083 initial commit
Trass3r
parents:
diff changeset
3 */
3cea44337083 initial commit
Trass3r
parents:
diff changeset
4 module opencl.wrapper;
3cea44337083 initial commit
Trass3r
parents:
diff changeset
5
3cea44337083 initial commit
Trass3r
parents:
diff changeset
6 import opencl.error;
3cea44337083 initial commit
Trass3r
parents:
diff changeset
7 import opencl.c.opencl;
3cea44337083 initial commit
Trass3r
parents:
diff changeset
8
3cea44337083 initial commit
Trass3r
parents:
diff changeset
9 // alternate Info getter functions
3cea44337083 initial commit
Trass3r
parents:
diff changeset
10 private alias extern(C) cl_int function(const(void)*, const(void*), cl_uint, size_t, void*, size_t*) Func;
3cea44337083 initial commit
Trass3r
parents:
diff changeset
11
3cea44337083 initial commit
Trass3r
parents:
diff changeset
12 /// abstract base class
3cea44337083 initial commit
Trass3r
parents:
diff changeset
13 abstract class CLWrapper(T, alias infoFunction)
3cea44337083 initial commit
Trass3r
parents:
diff changeset
14 {
3cea44337083 initial commit
Trass3r
parents:
diff changeset
15 protected:
3cea44337083 initial commit
Trass3r
parents:
diff changeset
16 T _object = null;
3cea44337083 initial commit
Trass3r
parents:
diff changeset
17
3cea44337083 initial commit
Trass3r
parents:
diff changeset
18 // should only be used inside here
3cea44337083 initial commit
Trass3r
parents:
diff changeset
19 package T getObject()
3cea44337083 initial commit
Trass3r
parents:
diff changeset
20 {
3cea44337083 initial commit
Trass3r
parents:
diff changeset
21 return _object;
3cea44337083 initial commit
Trass3r
parents:
diff changeset
22 }
3cea44337083 initial commit
Trass3r
parents:
diff changeset
23
3cea44337083 initial commit
Trass3r
parents:
diff changeset
24 // used for all non-array types
3cea44337083 initial commit
Trass3r
parents:
diff changeset
25 T getInfo(T)(cl_uint infoname, Func altFunction = null, cl_device_id device = null)
3cea44337083 initial commit
Trass3r
parents:
diff changeset
26 {
3cea44337083 initial commit
Trass3r
parents:
diff changeset
27 assert(_object !is null);
3cea44337083 initial commit
Trass3r
parents:
diff changeset
28 size_t needed;
3cea44337083 initial commit
Trass3r
parents:
diff changeset
29 cl_int res;
3cea44337083 initial commit
Trass3r
parents:
diff changeset
30
3cea44337083 initial commit
Trass3r
parents:
diff changeset
31 // get number of needed memory
3cea44337083 initial commit
Trass3r
parents:
diff changeset
32 if (altFunction != null && device != null)
3cea44337083 initial commit
Trass3r
parents:
diff changeset
33 res = altFunction(_object, device, infoname, 0, null, &needed);
3cea44337083 initial commit
Trass3r
parents:
diff changeset
34 else
3cea44337083 initial commit
Trass3r
parents:
diff changeset
35 res = infoFunction(_object, infoname, 0, null, &needed);
3cea44337083 initial commit
Trass3r
parents:
diff changeset
36
3cea44337083 initial commit
Trass3r
parents:
diff changeset
37 // error checking
3cea44337083 initial commit
Trass3r
parents:
diff changeset
38 if (res != CL_SUCCESS)
3cea44337083 initial commit
Trass3r
parents:
diff changeset
39 throw new CLException(res);
3cea44337083 initial commit
Trass3r
parents:
diff changeset
40
3cea44337083 initial commit
Trass3r
parents:
diff changeset
41 assert(needed == T.sizeof); // TODO:
3cea44337083 initial commit
Trass3r
parents:
diff changeset
42
3cea44337083 initial commit
Trass3r
parents:
diff changeset
43 T info;
3cea44337083 initial commit
Trass3r
parents:
diff changeset
44
3cea44337083 initial commit
Trass3r
parents:
diff changeset
45 // get actual data
3cea44337083 initial commit
Trass3r
parents:
diff changeset
46 if (altFunction != null && device != null)
3cea44337083 initial commit
Trass3r
parents:
diff changeset
47 res = altFunction(_object, device, infoname, T.sizeof, &info, null);
3cea44337083 initial commit
Trass3r
parents:
diff changeset
48 else
3cea44337083 initial commit
Trass3r
parents:
diff changeset
49 res = infoFunction(_object, infoname, T.sizeof, &info, null);
3cea44337083 initial commit
Trass3r
parents:
diff changeset
50
3cea44337083 initial commit
Trass3r
parents:
diff changeset
51 // error checking
3cea44337083 initial commit
Trass3r
parents:
diff changeset
52 if (res != CL_SUCCESS)
3cea44337083 initial commit
Trass3r
parents:
diff changeset
53 throw new CLException(res);
3cea44337083 initial commit
Trass3r
parents:
diff changeset
54
3cea44337083 initial commit
Trass3r
parents:
diff changeset
55 return info;
3cea44337083 initial commit
Trass3r
parents:
diff changeset
56 }
3cea44337083 initial commit
Trass3r
parents:
diff changeset
57
3cea44337083 initial commit
Trass3r
parents:
diff changeset
58 // helper function for all OpenCL Get*Info functions
3cea44337083 initial commit
Trass3r
parents:
diff changeset
59 // used for all array return types
3cea44337083 initial commit
Trass3r
parents:
diff changeset
60 T[] getArrayInfo(T)(cl_uint infoname, Func altFunction = null, cl_device_id device = null)
3cea44337083 initial commit
Trass3r
parents:
diff changeset
61 {
3cea44337083 initial commit
Trass3r
parents:
diff changeset
62 assert(_object !is null);
3cea44337083 initial commit
Trass3r
parents:
diff changeset
63 size_t needed;
3cea44337083 initial commit
Trass3r
parents:
diff changeset
64 cl_int res;
3cea44337083 initial commit
Trass3r
parents:
diff changeset
65
3cea44337083 initial commit
Trass3r
parents:
diff changeset
66 // get number of needed memory
3cea44337083 initial commit
Trass3r
parents:
diff changeset
67 if (altFunction != null && device != null)
3cea44337083 initial commit
Trass3r
parents:
diff changeset
68 res = altFunction(_object, device, infoname, 0, null, &needed);
3cea44337083 initial commit
Trass3r
parents:
diff changeset
69 else
3cea44337083 initial commit
Trass3r
parents:
diff changeset
70 res = infoFunction(_object, infoname, 0, null, &needed);
3cea44337083 initial commit
Trass3r
parents:
diff changeset
71
3cea44337083 initial commit
Trass3r
parents:
diff changeset
72 // error checking
3cea44337083 initial commit
Trass3r
parents:
diff changeset
73 if (res != CL_SUCCESS)
3cea44337083 initial commit
Trass3r
parents:
diff changeset
74 throw new CLException(res);
3cea44337083 initial commit
Trass3r
parents:
diff changeset
75
3cea44337083 initial commit
Trass3r
parents:
diff changeset
76 auto buffer = new T[needed];
3cea44337083 initial commit
Trass3r
parents:
diff changeset
77
3cea44337083 initial commit
Trass3r
parents:
diff changeset
78 // get actual data
3cea44337083 initial commit
Trass3r
parents:
diff changeset
79 if (altFunction != null && device != null)
3cea44337083 initial commit
Trass3r
parents:
diff changeset
80 res = altFunction(_object, device, infoname, buffer.length, cast(void*)buffer.ptr, null);
3cea44337083 initial commit
Trass3r
parents:
diff changeset
81 else
3cea44337083 initial commit
Trass3r
parents:
diff changeset
82 res = infoFunction(_object, infoname, buffer.length, cast(void*)buffer.ptr, null);
3cea44337083 initial commit
Trass3r
parents:
diff changeset
83
3cea44337083 initial commit
Trass3r
parents:
diff changeset
84 // error checking
3cea44337083 initial commit
Trass3r
parents:
diff changeset
85 if (res != CL_SUCCESS)
3cea44337083 initial commit
Trass3r
parents:
diff changeset
86 throw new CLException(res);
3cea44337083 initial commit
Trass3r
parents:
diff changeset
87
3cea44337083 initial commit
Trass3r
parents:
diff changeset
88 return buffer;
3cea44337083 initial commit
Trass3r
parents:
diff changeset
89 }
3cea44337083 initial commit
Trass3r
parents:
diff changeset
90
3cea44337083 initial commit
Trass3r
parents:
diff changeset
91 string getStringInfo(cl_uint infoname, Func altFunction = null, cl_device_id device = null)
3cea44337083 initial commit
Trass3r
parents:
diff changeset
92 {
3cea44337083 initial commit
Trass3r
parents:
diff changeset
93 return cast(string) getArrayInfo!(char)(infoname, altFunction, device);
3cea44337083 initial commit
Trass3r
parents:
diff changeset
94 }
3cea44337083 initial commit
Trass3r
parents:
diff changeset
95
3cea44337083 initial commit
Trass3r
parents:
diff changeset
96 // static cl_int getInfo(Arg0, Arg1)(Arg0 arg0, Arg1)
3cea44337083 initial commit
Trass3r
parents:
diff changeset
97
3cea44337083 initial commit
Trass3r
parents:
diff changeset
98 public:
3cea44337083 initial commit
Trass3r
parents:
diff changeset
99 this() {}
3cea44337083 initial commit
Trass3r
parents:
diff changeset
100 this(T obj)
3cea44337083 initial commit
Trass3r
parents:
diff changeset
101 {
3cea44337083 initial commit
Trass3r
parents:
diff changeset
102 _object = obj;
3cea44337083 initial commit
Trass3r
parents:
diff changeset
103 }
3cea44337083 initial commit
Trass3r
parents:
diff changeset
104 }