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 // CLDeviceImpl.h: Defines the abstract rx::CLDeviceImpl class. 7 8 #ifndef LIBANGLE_RENDERER_CLDEVICEIMPL_H_ 9 #define LIBANGLE_RENDERER_CLDEVICEIMPL_H_ 10 11 #include "libANGLE/renderer/CLExtensions.h" 12 13 namespace rx 14 { 15 16 class CLDeviceImpl : angle::NonCopyable 17 { 18 public: 19 using Ptr = std::unique_ptr<CLDeviceImpl>; 20 using CreateFunc = std::function<Ptr(const cl::Device &)>; 21 using CreateFuncs = std::list<CreateFunc>; 22 using CreateData = std::pair<cl::DeviceType, CreateFunc>; 23 using CreateDatas = std::list<CreateData>; 24 25 struct Info : public CLExtensions 26 { 27 Info(); 28 explicit Info(cl::DeviceType deviceType); 29 ~Info(); 30 31 Info(const Info &) = delete; 32 Info &operator=(const Info &) = delete; 33 34 Info(Info &&); 35 Info &operator=(Info &&); 36 isValidInfo37 bool isValid() const { return version != 0u; } 38 39 // In the order as they appear in the OpenCL specification V3.0.7, table 5 40 cl::DeviceType type; 41 std::vector<size_t> maxWorkItemSizes; 42 cl_ulong maxMemAllocSize = 0u; 43 cl_bool imageSupport = CL_FALSE; 44 std::string IL_Version; 45 NameVersionVector ILsWithVersion; 46 size_t image2D_MaxWidth = 0u; 47 size_t image2D_MaxHeight = 0u; 48 size_t image3D_MaxWidth = 0u; 49 size_t image3D_MaxHeight = 0u; 50 size_t image3D_MaxDepth = 0u; 51 size_t imageMaxBufferSize = 0u; 52 size_t imageMaxArraySize = 0u; 53 cl_uint imagePitchAlignment = 0u; 54 cl_uint imageBaseAddressAlignment = 0u; 55 cl_uint memBaseAddrAlign = 0u; 56 cl::DeviceExecCapabilities execCapabilities; 57 cl_uint queueOnDeviceMaxSize = 0u; 58 std::string builtInKernels; 59 NameVersionVector builtInKernelsWithVersion; 60 NameVersionVector OpenCL_C_AllVersions; 61 NameVersionVector OpenCL_C_Features; 62 std::vector<cl_device_partition_property> partitionProperties; 63 std::vector<cl_device_partition_property> partitionType; 64 }; 65 66 CLDeviceImpl(const cl::Device &device); 67 virtual ~CLDeviceImpl(); 68 69 virtual Info createInfo(cl::DeviceType type) const = 0; 70 71 virtual cl_int getInfoUInt(cl::DeviceInfo name, cl_uint *value) const = 0; 72 virtual cl_int getInfoULong(cl::DeviceInfo name, cl_ulong *value) const = 0; 73 virtual cl_int getInfoSizeT(cl::DeviceInfo name, size_t *value) const = 0; 74 virtual cl_int getInfoStringLength(cl::DeviceInfo name, size_t *value) const = 0; 75 virtual cl_int getInfoString(cl::DeviceInfo name, size_t size, char *value) const = 0; 76 77 virtual cl_int createSubDevices(const cl_device_partition_property *properties, 78 cl_uint numDevices, 79 CreateFuncs &createFuncs, 80 cl_uint *numDevicesRet) = 0; 81 82 protected: 83 const cl::Device &mDevice; 84 }; 85 86 } // namespace rx 87 88 #endif // LIBANGLE_RENDERER_CLDEVICEIMPL_H_ 89