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