1*6467f958SSadaf Ebrahimi //
2*6467f958SSadaf Ebrahimi // Copyright (c) 2020 The Khronos Group Inc.
3*6467f958SSadaf Ebrahimi //
4*6467f958SSadaf Ebrahimi // Licensed under the Apache License, Version 2.0 (the "License");
5*6467f958SSadaf Ebrahimi // you may not use this file except in compliance with the License.
6*6467f958SSadaf Ebrahimi // You may obtain a copy of the License at
7*6467f958SSadaf Ebrahimi //
8*6467f958SSadaf Ebrahimi // http://www.apache.org/licenses/LICENSE-2.0
9*6467f958SSadaf Ebrahimi //
10*6467f958SSadaf Ebrahimi // Unless required by applicable law or agreed to in writing, software
11*6467f958SSadaf Ebrahimi // distributed under the License is distributed on an "AS IS" BASIS,
12*6467f958SSadaf Ebrahimi // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*6467f958SSadaf Ebrahimi // See the License for the specific language governing permissions and
14*6467f958SSadaf Ebrahimi // limitations under the License.
15*6467f958SSadaf Ebrahimi //
16*6467f958SSadaf Ebrahimi #include "featureHelpers.h"
17*6467f958SSadaf Ebrahimi #include "errorHelpers.h"
18*6467f958SSadaf Ebrahimi
19*6467f958SSadaf Ebrahimi #include <assert.h>
20*6467f958SSadaf Ebrahimi #include <string.h>
21*6467f958SSadaf Ebrahimi
22*6467f958SSadaf Ebrahimi #include <vector>
23*6467f958SSadaf Ebrahimi
get_device_cl_c_features(cl_device_id device,OpenCLCFeatures & features)24*6467f958SSadaf Ebrahimi int get_device_cl_c_features(cl_device_id device, OpenCLCFeatures& features)
25*6467f958SSadaf Ebrahimi {
26*6467f958SSadaf Ebrahimi // Initially, all features are unsupported.
27*6467f958SSadaf Ebrahimi features = { 0 };
28*6467f958SSadaf Ebrahimi
29*6467f958SSadaf Ebrahimi // The CL_DEVICE_OPENCL_C_FEATURES query does not exist pre-3.0.
30*6467f958SSadaf Ebrahimi const Version version = get_device_cl_version(device);
31*6467f958SSadaf Ebrahimi if (version < Version(3, 0))
32*6467f958SSadaf Ebrahimi {
33*6467f958SSadaf Ebrahimi return TEST_PASS;
34*6467f958SSadaf Ebrahimi }
35*6467f958SSadaf Ebrahimi
36*6467f958SSadaf Ebrahimi cl_int error = CL_SUCCESS;
37*6467f958SSadaf Ebrahimi
38*6467f958SSadaf Ebrahimi size_t sz = 0;
39*6467f958SSadaf Ebrahimi error = clGetDeviceInfo(device, CL_DEVICE_OPENCL_C_FEATURES, 0, NULL, &sz);
40*6467f958SSadaf Ebrahimi test_error(error, "Unable to query CL_DEVICE_OPENCL_C_FEATURES size");
41*6467f958SSadaf Ebrahimi
42*6467f958SSadaf Ebrahimi std::vector<cl_name_version> clc_features(sz / sizeof(cl_name_version));
43*6467f958SSadaf Ebrahimi error = clGetDeviceInfo(device, CL_DEVICE_OPENCL_C_FEATURES, sz,
44*6467f958SSadaf Ebrahimi clc_features.data(), NULL);
45*6467f958SSadaf Ebrahimi test_error(error, "Unable to query CL_DEVICE_OPENCL_C_FEATURES");
46*6467f958SSadaf Ebrahimi
47*6467f958SSadaf Ebrahimi #define CHECK_OPENCL_C_FEATURE(_feature) \
48*6467f958SSadaf Ebrahimi if (strcmp(clc_feature.name, #_feature) == 0) \
49*6467f958SSadaf Ebrahimi { \
50*6467f958SSadaf Ebrahimi features.supports##_feature = true; \
51*6467f958SSadaf Ebrahimi }
52*6467f958SSadaf Ebrahimi
53*6467f958SSadaf Ebrahimi for (const auto& clc_feature : clc_features)
54*6467f958SSadaf Ebrahimi {
55*6467f958SSadaf Ebrahimi CHECK_OPENCL_C_FEATURE(__opencl_c_3d_image_writes);
56*6467f958SSadaf Ebrahimi CHECK_OPENCL_C_FEATURE(__opencl_c_atomic_order_acq_rel);
57*6467f958SSadaf Ebrahimi CHECK_OPENCL_C_FEATURE(__opencl_c_atomic_order_seq_cst);
58*6467f958SSadaf Ebrahimi CHECK_OPENCL_C_FEATURE(__opencl_c_atomic_scope_device);
59*6467f958SSadaf Ebrahimi CHECK_OPENCL_C_FEATURE(__opencl_c_atomic_scope_all_devices);
60*6467f958SSadaf Ebrahimi CHECK_OPENCL_C_FEATURE(__opencl_c_device_enqueue);
61*6467f958SSadaf Ebrahimi CHECK_OPENCL_C_FEATURE(__opencl_c_generic_address_space);
62*6467f958SSadaf Ebrahimi CHECK_OPENCL_C_FEATURE(__opencl_c_fp64);
63*6467f958SSadaf Ebrahimi CHECK_OPENCL_C_FEATURE(__opencl_c_images);
64*6467f958SSadaf Ebrahimi CHECK_OPENCL_C_FEATURE(__opencl_c_int64);
65*6467f958SSadaf Ebrahimi CHECK_OPENCL_C_FEATURE(__opencl_c_pipes);
66*6467f958SSadaf Ebrahimi CHECK_OPENCL_C_FEATURE(__opencl_c_program_scope_global_variables);
67*6467f958SSadaf Ebrahimi CHECK_OPENCL_C_FEATURE(__opencl_c_read_write_images);
68*6467f958SSadaf Ebrahimi CHECK_OPENCL_C_FEATURE(__opencl_c_subgroups);
69*6467f958SSadaf Ebrahimi CHECK_OPENCL_C_FEATURE(__opencl_c_work_group_collective_functions);
70*6467f958SSadaf Ebrahimi }
71*6467f958SSadaf Ebrahimi
72*6467f958SSadaf Ebrahimi #undef CHECK_OPENCL_C_FEATURE
73*6467f958SSadaf Ebrahimi
74*6467f958SSadaf Ebrahimi return TEST_PASS;
75*6467f958SSadaf Ebrahimi }
76