xref: /aosp_15_r20/external/angle/src/libANGLE/CLDevice.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2021 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker // CLDevice.h: Defines the cl::Device class, which provides information about OpenCL device
7*8975f5c5SAndroid Build Coastguard Worker // configurations.
8*8975f5c5SAndroid Build Coastguard Worker 
9*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_CLDEVICE_H_
10*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_CLDEVICE_H_
11*8975f5c5SAndroid Build Coastguard Worker 
12*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/CLObject.h"
13*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/CLDeviceImpl.h"
14*8975f5c5SAndroid Build Coastguard Worker 
15*8975f5c5SAndroid Build Coastguard Worker #include "common/SynchronizedValue.h"
16*8975f5c5SAndroid Build Coastguard Worker 
17*8975f5c5SAndroid Build Coastguard Worker #include <functional>
18*8975f5c5SAndroid Build Coastguard Worker 
19*8975f5c5SAndroid Build Coastguard Worker namespace cl
20*8975f5c5SAndroid Build Coastguard Worker {
21*8975f5c5SAndroid Build Coastguard Worker 
22*8975f5c5SAndroid Build Coastguard Worker class Device final : public _cl_device_id, public Object
23*8975f5c5SAndroid Build Coastguard Worker {
24*8975f5c5SAndroid Build Coastguard Worker   public:
25*8975f5c5SAndroid Build Coastguard Worker     // Front end entry functions, only called from OpenCL entry points
26*8975f5c5SAndroid Build Coastguard Worker 
27*8975f5c5SAndroid Build Coastguard Worker     angle::Result getInfo(DeviceInfo name,
28*8975f5c5SAndroid Build Coastguard Worker                           size_t valueSize,
29*8975f5c5SAndroid Build Coastguard Worker                           void *value,
30*8975f5c5SAndroid Build Coastguard Worker                           size_t *valueSizeRet) const;
31*8975f5c5SAndroid Build Coastguard Worker 
32*8975f5c5SAndroid Build Coastguard Worker     angle::Result createSubDevices(const cl_device_partition_property *properties,
33*8975f5c5SAndroid Build Coastguard Worker                                    cl_uint numDevices,
34*8975f5c5SAndroid Build Coastguard Worker                                    cl_device_id *subDevices,
35*8975f5c5SAndroid Build Coastguard Worker                                    cl_uint *numDevicesRet);
36*8975f5c5SAndroid Build Coastguard Worker 
37*8975f5c5SAndroid Build Coastguard Worker   public:
38*8975f5c5SAndroid Build Coastguard Worker     ~Device() override;
39*8975f5c5SAndroid Build Coastguard Worker 
40*8975f5c5SAndroid Build Coastguard Worker     Platform &getPlatform() noexcept;
41*8975f5c5SAndroid Build Coastguard Worker     const Platform &getPlatform() const noexcept;
42*8975f5c5SAndroid Build Coastguard Worker     bool isRoot() const noexcept;
43*8975f5c5SAndroid Build Coastguard Worker     const rx::CLDeviceImpl::Info &getInfo() const;
44*8975f5c5SAndroid Build Coastguard Worker     cl_version getVersion() const;
45*8975f5c5SAndroid Build Coastguard Worker     bool isVersionOrNewer(cl_uint major, cl_uint minor) const;
46*8975f5c5SAndroid Build Coastguard Worker 
47*8975f5c5SAndroid Build Coastguard Worker     template <typename T = rx::CLDeviceImpl>
48*8975f5c5SAndroid Build Coastguard Worker     T &getImpl() const;
49*8975f5c5SAndroid Build Coastguard Worker 
50*8975f5c5SAndroid Build Coastguard Worker     bool supportsBuiltInKernel(const std::string &name) const;
51*8975f5c5SAndroid Build Coastguard Worker     bool supportsNativeImageDimensions(const cl_image_desc &desc) const;
52*8975f5c5SAndroid Build Coastguard Worker     bool supportsImageDimensions(const ImageDescriptor &desc) const;
53*8975f5c5SAndroid Build Coastguard Worker     bool hasDeviceEnqueueCaps() const;
54*8975f5c5SAndroid Build Coastguard Worker     bool supportsNonUniformWorkGroups() const;
55*8975f5c5SAndroid Build Coastguard Worker 
56*8975f5c5SAndroid Build Coastguard Worker     static bool IsValidType(DeviceType type);
57*8975f5c5SAndroid Build Coastguard Worker 
58*8975f5c5SAndroid Build Coastguard Worker   private:
59*8975f5c5SAndroid Build Coastguard Worker     Device(Platform &platform,
60*8975f5c5SAndroid Build Coastguard Worker            Device *parent,
61*8975f5c5SAndroid Build Coastguard Worker            DeviceType type,
62*8975f5c5SAndroid Build Coastguard Worker            const rx::CLDeviceImpl::CreateFunc &createFunc);
63*8975f5c5SAndroid Build Coastguard Worker 
64*8975f5c5SAndroid Build Coastguard Worker     Platform &mPlatform;
65*8975f5c5SAndroid Build Coastguard Worker     const DevicePtr mParent;
66*8975f5c5SAndroid Build Coastguard Worker     const rx::CLDeviceImpl::Ptr mImpl;
67*8975f5c5SAndroid Build Coastguard Worker     const rx::CLDeviceImpl::Info mInfo;
68*8975f5c5SAndroid Build Coastguard Worker 
69*8975f5c5SAndroid Build Coastguard Worker     angle::SynchronizedValue<CommandQueue *> mDefaultCommandQueue = nullptr;
70*8975f5c5SAndroid Build Coastguard Worker 
71*8975f5c5SAndroid Build Coastguard Worker     friend class CommandQueue;
72*8975f5c5SAndroid Build Coastguard Worker     friend class Platform;
73*8975f5c5SAndroid Build Coastguard Worker };
74*8975f5c5SAndroid Build Coastguard Worker 
getPlatform()75*8975f5c5SAndroid Build Coastguard Worker inline Platform &Device::getPlatform() noexcept
76*8975f5c5SAndroid Build Coastguard Worker {
77*8975f5c5SAndroid Build Coastguard Worker     return mPlatform;
78*8975f5c5SAndroid Build Coastguard Worker }
79*8975f5c5SAndroid Build Coastguard Worker 
getPlatform()80*8975f5c5SAndroid Build Coastguard Worker inline const Platform &Device::getPlatform() const noexcept
81*8975f5c5SAndroid Build Coastguard Worker {
82*8975f5c5SAndroid Build Coastguard Worker     return mPlatform;
83*8975f5c5SAndroid Build Coastguard Worker }
84*8975f5c5SAndroid Build Coastguard Worker 
isRoot()85*8975f5c5SAndroid Build Coastguard Worker inline bool Device::isRoot() const noexcept
86*8975f5c5SAndroid Build Coastguard Worker {
87*8975f5c5SAndroid Build Coastguard Worker     return mParent == nullptr;
88*8975f5c5SAndroid Build Coastguard Worker }
89*8975f5c5SAndroid Build Coastguard Worker 
getInfo()90*8975f5c5SAndroid Build Coastguard Worker inline const rx::CLDeviceImpl::Info &Device::getInfo() const
91*8975f5c5SAndroid Build Coastguard Worker {
92*8975f5c5SAndroid Build Coastguard Worker     return mInfo;
93*8975f5c5SAndroid Build Coastguard Worker }
94*8975f5c5SAndroid Build Coastguard Worker 
getVersion()95*8975f5c5SAndroid Build Coastguard Worker inline cl_version Device::getVersion() const
96*8975f5c5SAndroid Build Coastguard Worker {
97*8975f5c5SAndroid Build Coastguard Worker     return mInfo.version;
98*8975f5c5SAndroid Build Coastguard Worker }
99*8975f5c5SAndroid Build Coastguard Worker 
isVersionOrNewer(cl_uint major,cl_uint minor)100*8975f5c5SAndroid Build Coastguard Worker inline bool Device::isVersionOrNewer(cl_uint major, cl_uint minor) const
101*8975f5c5SAndroid Build Coastguard Worker {
102*8975f5c5SAndroid Build Coastguard Worker     return mInfo.version >= CL_MAKE_VERSION(major, minor, 0u);
103*8975f5c5SAndroid Build Coastguard Worker }
104*8975f5c5SAndroid Build Coastguard Worker 
105*8975f5c5SAndroid Build Coastguard Worker template <typename T>
getImpl()106*8975f5c5SAndroid Build Coastguard Worker inline T &Device::getImpl() const
107*8975f5c5SAndroid Build Coastguard Worker {
108*8975f5c5SAndroid Build Coastguard Worker     return static_cast<T &>(*mImpl);
109*8975f5c5SAndroid Build Coastguard Worker }
110*8975f5c5SAndroid Build Coastguard Worker 
IsValidType(DeviceType type)111*8975f5c5SAndroid Build Coastguard Worker inline bool Device::IsValidType(DeviceType type)
112*8975f5c5SAndroid Build Coastguard Worker {
113*8975f5c5SAndroid Build Coastguard Worker     return type.get() <= CL_DEVICE_TYPE_CUSTOM || type == CL_DEVICE_TYPE_ALL;
114*8975f5c5SAndroid Build Coastguard Worker }
115*8975f5c5SAndroid Build Coastguard Worker 
116*8975f5c5SAndroid Build Coastguard Worker }  // namespace cl
117*8975f5c5SAndroid Build Coastguard Worker 
118*8975f5c5SAndroid Build Coastguard Worker #endif  // LIBANGLE_CLDEVICE_H_
119