// // Copyright 2021 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // cl_utils.cpp: Helper functions for the CL back end #include "libANGLE/renderer/cl/cl_util.h" #include "libANGLE/Debug.h" #include namespace rx { cl_version ExtractCLVersion(const std::string &version) { const std::string::size_type spacePos = version.find(' '); const std::string::size_type dotPos = version.find('.'); if (spacePos == std::string::npos || dotPos == std::string::npos) { ERR() << "Failed to extract version from OpenCL version string: " << version; return 0u; } const long major = std::strtol(&version[spacePos + 1u], nullptr, 10); const long minor = std::strtol(&version[dotPos + 1u], nullptr, 10); if (major < 1 || major > 9 || minor < 0 || minor > 9) { ERR() << "Failed to extract version from OpenCL version string: " << version; return 0u; } return CL_MAKE_VERSION(static_cast(major), static_cast(minor), 0); } void RemoveUnsupportedCLExtensions(std::string &extensions) { if (extensions.empty()) { return; } using SizeT = std::string::size_type; SizeT extStart = 0u; SizeT spacePos = extensions.find(' '); // Remove all unsupported extensions which are terminated by a space while (spacePos != std::string::npos) { const SizeT length = spacePos - extStart; if (IsCLExtensionSupported(extensions.substr(extStart, length))) { extStart = spacePos + 1u; } else { extensions.erase(extStart, length + 1u); } spacePos = extensions.find(' ', extStart); } // Remove last extension in string, if exists and unsupported if (extStart < extensions.length()) { const SizeT length = extensions.length() - extStart; if (!IsCLExtensionSupported(extensions.substr(extStart, length))) { extensions.erase(extStart, length); } } // Remove trailing spaces while (!extensions.empty() && extensions.back() == ' ') { extensions.pop_back(); } } void RemoveUnsupportedCLExtensions(NameVersionVector &extensions) { auto extIt = extensions.cbegin(); while (extIt != extensions.cend()) { if (IsCLExtensionSupported(extIt->name)) { ++extIt; } else { extIt = extensions.erase(extIt); } } } } // namespace rx