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