// // Copyright (c) 2020 The Khronos Group Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // #include "featureHelpers.h" #include "errorHelpers.h" #include #include #include int get_device_cl_c_features(cl_device_id device, OpenCLCFeatures& features) { // Initially, all features are unsupported. features = { 0 }; // The CL_DEVICE_OPENCL_C_FEATURES query does not exist pre-3.0. const Version version = get_device_cl_version(device); if (version < Version(3, 0)) { return TEST_PASS; } cl_int error = CL_SUCCESS; size_t sz = 0; error = clGetDeviceInfo(device, CL_DEVICE_OPENCL_C_FEATURES, 0, NULL, &sz); test_error(error, "Unable to query CL_DEVICE_OPENCL_C_FEATURES size"); std::vector clc_features(sz / sizeof(cl_name_version)); error = clGetDeviceInfo(device, CL_DEVICE_OPENCL_C_FEATURES, sz, clc_features.data(), NULL); test_error(error, "Unable to query CL_DEVICE_OPENCL_C_FEATURES"); #define CHECK_OPENCL_C_FEATURE(_feature) \ if (strcmp(clc_feature.name, #_feature) == 0) \ { \ features.supports##_feature = true; \ } for (const auto& clc_feature : clc_features) { CHECK_OPENCL_C_FEATURE(__opencl_c_3d_image_writes); CHECK_OPENCL_C_FEATURE(__opencl_c_atomic_order_acq_rel); CHECK_OPENCL_C_FEATURE(__opencl_c_atomic_order_seq_cst); CHECK_OPENCL_C_FEATURE(__opencl_c_atomic_scope_device); CHECK_OPENCL_C_FEATURE(__opencl_c_atomic_scope_all_devices); CHECK_OPENCL_C_FEATURE(__opencl_c_device_enqueue); CHECK_OPENCL_C_FEATURE(__opencl_c_generic_address_space); CHECK_OPENCL_C_FEATURE(__opencl_c_fp64); CHECK_OPENCL_C_FEATURE(__opencl_c_images); CHECK_OPENCL_C_FEATURE(__opencl_c_int64); CHECK_OPENCL_C_FEATURE(__opencl_c_pipes); CHECK_OPENCL_C_FEATURE(__opencl_c_program_scope_global_variables); CHECK_OPENCL_C_FEATURE(__opencl_c_read_write_images); CHECK_OPENCL_C_FEATURE(__opencl_c_subgroups); CHECK_OPENCL_C_FEATURE(__opencl_c_work_group_collective_functions); } #undef CHECK_OPENCL_C_FEATURE return TEST_PASS; }