diff --git a/src/gallium/frontends/clover/api/device.cpp b/src/gallium/frontends/clover/api/device.cpp index 71953713633..d5204d35c69 100644 --- a/src/gallium/frontends/clover/api/device.cpp +++ b/src/gallium/frontends/clover/api/device.cpp @@ -417,6 +417,10 @@ clGetDeviceInfo(cl_device_id d_dev, cl_device_info param, buf.as_vector() = dev.opencl_c_all_versions(); break; + case CL_DEVICE_EXTENSIONS_WITH_VERSION: + buf.as_vector() = dev.supported_extensions(); + break; + default: throw error(CL_INVALID_VALUE); } diff --git a/src/gallium/frontends/clover/core/device.cpp b/src/gallium/frontends/clover/core/device.cpp index 092a9033f02..4db593cd60e 100644 --- a/src/gallium/frontends/clover/core/device.cpp +++ b/src/gallium/frontends/clover/core/device.cpp @@ -341,19 +341,42 @@ device::supports_ir(enum pipe_shader_ir ir) const { PIPE_SHADER_CAP_SUPPORTED_IRS) & (1 << ir); } +std::vector +device::supported_extensions() const { + std::vector vec; + + vec.push_back( (cl_name_version){ CL_MAKE_VERSION(1, 0, 0), "cl_khr_byte_addressable_store" } ); + vec.push_back( (cl_name_version){ CL_MAKE_VERSION(1, 0, 0), "cl_khr_global_int32_base_atomics" } ); + vec.push_back( (cl_name_version){ CL_MAKE_VERSION(1, 0, 0), "cl_khr_global_int32_extended_atomics" } ); + vec.push_back( (cl_name_version){ CL_MAKE_VERSION(1, 0, 0), "cl_khr_local_int32_base_atomics" } ); + vec.push_back( (cl_name_version){ CL_MAKE_VERSION(1, 0, 0), "cl_khr_local_int32_extended_atomics" } ); + if (has_int64_atomics()) { + vec.push_back( (cl_name_version){ CL_MAKE_VERSION(1, 0, 0), "cl_khr_int64_base_atomics" } ); + vec.push_back( (cl_name_version){ CL_MAKE_VERSION(1, 0, 0), "cl_khr_int64_extended_atomics" } ); + } + if (has_doubles()) + vec.push_back( (cl_name_version){ CL_MAKE_VERSION(1, 0, 0), "cl_khr_fp64" } ); + if (has_halves()) + vec.push_back( (cl_name_version){ CL_MAKE_VERSION(1, 0, 0), "cl_khr_fp16" } ); + if (svm_support()) + vec.push_back( (cl_name_version){ CL_MAKE_VERSION(1, 0, 0), "cl_arm_shared_virtual_memory" } ); + return vec; +} + std::string device::supported_extensions_as_string() const { - return - "cl_khr_byte_addressable_store" - " cl_khr_global_int32_base_atomics" - " cl_khr_global_int32_extended_atomics" - " cl_khr_local_int32_base_atomics" - " cl_khr_local_int32_extended_atomics" - + std::string(has_int64_atomics() ? " cl_khr_int64_base_atomics" : "") - + std::string(has_int64_atomics() ? " cl_khr_int64_extended_atomics" : "") - + std::string(has_doubles() ? " cl_khr_fp64" : "") - + std::string(has_halves() ? " cl_khr_fp16" : "") - + std::string(svm_support() ? " cl_arm_shared_virtual_memory" : ""); + static std::string extensions_string; + + if (!extensions_string.empty()) + return extensions_string; + + const auto extension_list = supported_extensions(); + for (const auto &extension : extension_list) { + if (!extensions_string.empty()) + extensions_string += " "; + extensions_string += extension.name; + } + return extensions_string; } const void * diff --git a/src/gallium/frontends/clover/core/device.hpp b/src/gallium/frontends/clover/core/device.hpp index d07bb6250d4..81687b5781e 100644 --- a/src/gallium/frontends/clover/core/device.hpp +++ b/src/gallium/frontends/clover/core/device.hpp @@ -94,6 +94,7 @@ namespace clover { cl_version device_version() const; cl_version device_clc_version() const; std::vector opencl_c_all_versions() const; + std::vector supported_extensions() const; friend class command_queue; friend class root_resource;