Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
5563 serge 1
//
2
// Copyright 2012 Francisco Jerez
3
//
4
// Permission is hereby granted, free of charge, to any person obtaining a
5
// copy of this software and associated documentation files (the "Software"),
6
// to deal in the Software without restriction, including without limitation
7
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
8
// and/or sell copies of the Software, and to permit persons to whom the
9
// Software is furnished to do so, subject to the following conditions:
10
//
11
// The above copyright notice and this permission notice shall be included in
12
// all copies or substantial portions of the Software.
13
//
14
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
18
// OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20
// OTHER DEALINGS IN THE SOFTWARE.
21
//
22
 
23
#include "api/util.hpp"
24
#include "core/platform.hpp"
25
#include "core/device.hpp"
26
 
27
using namespace clover;
28
 
29
PUBLIC cl_int
30
clGetDeviceIDs(cl_platform_id platform, cl_device_type device_type,
31
               cl_uint num_entries, cl_device_id *devices,
32
               cl_uint *num_devices) {
33
   std::vector devs;
34
 
35
   if ((!num_entries && devices) ||
36
       (!num_devices && !devices))
37
      return CL_INVALID_VALUE;
38
 
39
   // Collect matching devices
40
   for (device &dev : *platform) {
41
      if (((device_type & CL_DEVICE_TYPE_DEFAULT) &&
42
           &dev == &platform->front()) ||
43
          (device_type & dev.type()))
44
         devs.push_back(&dev);
45
   }
46
 
47
   if (devs.empty())
48
      return CL_DEVICE_NOT_FOUND;
49
 
50
   // ...and return the requested data.
51
   if (num_devices)
52
      *num_devices = devs.size();
53
   if (devices)
54
      std::copy_n(devs.begin(),
55
                  std::min((cl_uint)devs.size(), num_entries),
56
                  devices);
57
 
58
   return CL_SUCCESS;
59
}
60
 
61
PUBLIC cl_int
62
clGetDeviceInfo(cl_device_id dev, cl_device_info param,
63
                size_t size, void *buf, size_t *size_ret) {
64
   if (!dev)
65
      return CL_INVALID_DEVICE;
66
 
67
   switch (param) {
68
   case CL_DEVICE_TYPE:
69
      return scalar_property(buf, size, size_ret, dev->type());
70
 
71
   case CL_DEVICE_VENDOR_ID:
72
      return scalar_property(buf, size, size_ret, dev->vendor_id());
73
 
74
   case CL_DEVICE_MAX_COMPUTE_UNITS:
75
      return scalar_property(buf, size, size_ret, 1);
76
 
77
   case CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS:
78
      return scalar_property(buf, size, size_ret,
79
                                      dev->max_block_size().size());
80
 
81
   case CL_DEVICE_MAX_WORK_ITEM_SIZES:
82
      return vector_property(buf, size, size_ret,
83
                                     dev->max_block_size());
84
 
85
   case CL_DEVICE_MAX_WORK_GROUP_SIZE:
86
      return scalar_property(buf, size, size_ret,
87
                                     dev->max_threads_per_block());
88
 
89
   case CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR:
90
      return scalar_property(buf, size, size_ret, 16);
91
 
92
   case CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT:
93
      return scalar_property(buf, size, size_ret, 8);
94
 
95
   case CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT:
96
      return scalar_property(buf, size, size_ret, 4);
97
 
98
   case CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG:
99
      return scalar_property(buf, size, size_ret, 2);
100
 
101
   case CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT:
102
      return scalar_property(buf, size, size_ret, 4);
103
 
104
   case CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE:
105
      return scalar_property(buf, size, size_ret, 2);
106
 
107
   case CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF:
108
      return scalar_property(buf, size, size_ret, 0);
109
 
110
   case CL_DEVICE_MAX_CLOCK_FREQUENCY:
111
      return scalar_property(buf, size, size_ret, 0);
112
 
113
   case CL_DEVICE_ADDRESS_BITS:
114
      return scalar_property(buf, size, size_ret, 32);
115
 
116
   case CL_DEVICE_MAX_READ_IMAGE_ARGS:
117
      return scalar_property(buf, size, size_ret,
118
                                      dev->max_images_read());
119
 
120
   case CL_DEVICE_MAX_WRITE_IMAGE_ARGS:
121
      return scalar_property(buf, size, size_ret,
122
                                      dev->max_images_write());
123
 
124
   case CL_DEVICE_MAX_MEM_ALLOC_SIZE:
125
      return scalar_property(buf, size, size_ret,
126
                                       dev->max_mem_alloc_size());
127
 
128
   case CL_DEVICE_IMAGE2D_MAX_WIDTH:
129
   case CL_DEVICE_IMAGE2D_MAX_HEIGHT:
130
      return scalar_property(buf, size, size_ret,
131
                                     1 << dev->max_image_levels_2d());
132
 
133
   case CL_DEVICE_IMAGE3D_MAX_WIDTH:
134
   case CL_DEVICE_IMAGE3D_MAX_HEIGHT:
135
   case CL_DEVICE_IMAGE3D_MAX_DEPTH:
136
      return scalar_property(buf, size, size_ret,
137
                                     1 << dev->max_image_levels_3d());
138
 
139
   case CL_DEVICE_IMAGE_SUPPORT:
140
      return scalar_property(buf, size, size_ret, CL_TRUE);
141
 
142
   case CL_DEVICE_MAX_PARAMETER_SIZE:
143
      return scalar_property(buf, size, size_ret,
144
                                     dev->max_mem_input());
145
 
146
   case CL_DEVICE_MAX_SAMPLERS:
147
      return scalar_property(buf, size, size_ret,
148
                                      dev->max_samplers());
149
 
150
   case CL_DEVICE_MEM_BASE_ADDR_ALIGN:
151
   case CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE:
152
      return scalar_property(buf, size, size_ret, 128);
153
 
154
   case CL_DEVICE_SINGLE_FP_CONFIG:
155
      return scalar_property(buf, size, size_ret,
156
         CL_FP_DENORM | CL_FP_INF_NAN | CL_FP_ROUND_TO_NEAREST);
157
 
158
   case CL_DEVICE_GLOBAL_MEM_CACHE_TYPE:
159
      return scalar_property(buf, size, size_ret,
160
                                                       CL_NONE);
161
 
162
   case CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE:
163
      return scalar_property(buf, size, size_ret, 0);
164
 
165
   case CL_DEVICE_GLOBAL_MEM_CACHE_SIZE:
166
      return scalar_property(buf, size, size_ret, 0);
167
 
168
   case CL_DEVICE_GLOBAL_MEM_SIZE:
169
      return scalar_property(buf, size, size_ret,
170
                                       dev->max_mem_global());
171
 
172
   case CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE:
173
      return scalar_property(buf, size, size_ret,
174
                                       dev->max_const_buffer_size());
175
 
176
   case CL_DEVICE_MAX_CONSTANT_ARGS:
177
      return scalar_property(buf, size, size_ret,
178
                                      dev->max_const_buffers());
179
 
180
   case CL_DEVICE_LOCAL_MEM_TYPE:
181
      return scalar_property(buf, size, size_ret,
182
                                                       CL_LOCAL);
183
 
184
   case CL_DEVICE_LOCAL_MEM_SIZE:
185
      return scalar_property(buf, size, size_ret,
186
                                       dev->max_mem_local());
187
 
188
   case CL_DEVICE_ERROR_CORRECTION_SUPPORT:
189
      return scalar_property(buf, size, size_ret, CL_FALSE);
190
 
191
   case CL_DEVICE_PROFILING_TIMER_RESOLUTION:
192
      return scalar_property(buf, size, size_ret, 0);
193
 
194
   case CL_DEVICE_ENDIAN_LITTLE:
195
      return scalar_property(buf, size, size_ret,
196
                                      dev->endianness() == PIPE_ENDIAN_LITTLE);
197
 
198
   case CL_DEVICE_AVAILABLE:
199
   case CL_DEVICE_COMPILER_AVAILABLE:
200
      return scalar_property(buf, size, size_ret, CL_TRUE);
201
 
202
   case CL_DEVICE_EXECUTION_CAPABILITIES:
203
      return scalar_property(buf, size, size_ret,
204
                                                          CL_EXEC_KERNEL);
205
 
206
   case CL_DEVICE_QUEUE_PROPERTIES:
207
      return scalar_property(buf, size, size_ret,
208
         CL_QUEUE_PROFILING_ENABLE);
209
 
210
   case CL_DEVICE_NAME:
211
      return string_property(buf, size, size_ret, dev->device_name());
212
 
213
   case CL_DEVICE_VENDOR:
214
      return string_property(buf, size, size_ret, dev->vendor_name());
215
 
216
   case CL_DRIVER_VERSION:
217
      return string_property(buf, size, size_ret, PACKAGE_VERSION);
218
 
219
   case CL_DEVICE_PROFILE:
220
      return string_property(buf, size, size_ret, "FULL_PROFILE");
221
 
222
   case CL_DEVICE_VERSION:
223
      return string_property(buf, size, size_ret,
224
                             "OpenCL 1.1 MESA " PACKAGE_VERSION);
225
 
226
   case CL_DEVICE_EXTENSIONS:
227
      return string_property(buf, size, size_ret, "");
228
 
229
   case CL_DEVICE_PLATFORM:
230
      return scalar_property(buf, size, size_ret,
231
                                             &dev->platform);
232
 
233
   case CL_DEVICE_HOST_UNIFIED_MEMORY:
234
      return scalar_property(buf, size, size_ret, CL_TRUE);
235
 
236
   case CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR:
237
      return scalar_property(buf, size, size_ret, 16);
238
 
239
   case CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT:
240
      return scalar_property(buf, size, size_ret, 8);
241
 
242
   case CL_DEVICE_NATIVE_VECTOR_WIDTH_INT:
243
      return scalar_property(buf, size, size_ret, 4);
244
 
245
   case CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG:
246
      return scalar_property(buf, size, size_ret, 2);
247
 
248
   case CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT:
249
      return scalar_property(buf, size, size_ret, 4);
250
 
251
   case CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE:
252
      return scalar_property(buf, size, size_ret, 2);
253
 
254
   case CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF:
255
      return scalar_property(buf, size, size_ret, 0);
256
 
257
   case CL_DEVICE_OPENCL_C_VERSION:
258
      return string_property(buf, size, size_ret, "OpenCL C 1.1");
259
 
260
   default:
261
      return CL_INVALID_VALUE;
262
   }
263
}