1 // 2 // Copyright 2021 The ANGLE Project Authors. All rights reserved. 3 // Use of this source code is governed by a BSD-style license that can be 4 // found in the LICENSE file. 5 // 6 // CLExtensions.cpp: Implements the struct methods for CLExtension. 7 8 #include "libANGLE/renderer/CLExtensions.h" 9 #include "libANGLE/renderer/cl_types.h" 10 11 #include "common/string_utils.h" 12 13 namespace rx 14 { 15 16 CLExtensions::CLExtensions() = default; 17 18 CLExtensions::~CLExtensions() = default; 19 20 CLExtensions::CLExtensions(CLExtensions &&) = default; 21 22 CLExtensions &CLExtensions::operator=(CLExtensions &&) = default; 23 initializeExtensions(std::string && extensionStr)24void CLExtensions::initializeExtensions(std::string &&extensionStr) 25 { 26 ASSERT(extensions.empty()); 27 28 extensions.assign(std::move(extensionStr)); 29 if (extensions.empty()) 30 { 31 return; 32 } 33 34 auto hasExtension = [&](const std::string &extension) { 35 return angle::ContainsToken(extensions, ' ', extension); 36 }; 37 38 khrByteAddressableStore = hasExtension("cl_khr_byte_addressable_store"); 39 khrGlobalInt32BaseAtomics = hasExtension("cl_khr_global_int32_base_atomics"); 40 khrGlobalInt32ExtendedAtomics = hasExtension("cl_khr_global_int32_extended_atomics"); 41 khrLocalInt32BaseAtomics = hasExtension("cl_khr_local_int32_base_atomics"); 42 khrLocalInt32ExtendedAtomics = hasExtension("cl_khr_local_int32_extended_atomics"); 43 44 khr3D_ImageWrites = hasExtension("cl_khr_3d_image_writes"); 45 khrDepthImages = hasExtension("cl_khr_depth_images"); 46 khrImage2D_FromBuffer = hasExtension("cl_khr_image2d_from_buffer"); 47 48 khrExtendedVersioning = hasExtension("cl_khr_extended_versioning"); 49 khrFP64 = hasExtension("cl_khr_fp64"); 50 khrICD = hasExtension("cl_khr_icd"); 51 khrInt64BaseAtomics = hasExtension("cl_khr_int64_base_atomics"); 52 khrInt64ExtendedAtomics = hasExtension("cl_khr_int64_extended_atomics"); 53 } 54 initializeVersionedExtensions(const NameVersionVector & versionedExtList)55void CLExtensions::initializeVersionedExtensions(const NameVersionVector &versionedExtList) 56 { 57 ASSERT(extensionsWithVersion.empty()); 58 ASSERT(extensions.empty()); 59 60 extensionsWithVersion = std::move(versionedExtList); 61 62 std::string extensionString = ""; 63 for (cl_name_version ext : extensionsWithVersion) 64 { 65 extensionString += ext.name; 66 extensionString += " "; 67 } 68 69 return initializeExtensions(std::move(extensionString)); 70 } 71 72 } // namespace rx 73