xref: /aosp_15_r20/external/angle/src/libANGLE/CLPlatform.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 // CLPlatform.h: Defines the cl::Platform class, which provides information about platform-specific
7*8975f5c5SAndroid Build Coastguard Worker // OpenCL features.
8*8975f5c5SAndroid Build Coastguard Worker 
9*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_CLPLATFORM_H_
10*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_CLPLATFORM_H_
11*8975f5c5SAndroid Build Coastguard Worker 
12*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/CLObject.h"
13*8975f5c5SAndroid Build Coastguard Worker 
14*8975f5c5SAndroid Build Coastguard Worker #include "common/WorkerThread.h"
15*8975f5c5SAndroid Build Coastguard Worker 
16*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/CLPlatformImpl.h"
17*8975f5c5SAndroid Build Coastguard Worker 
18*8975f5c5SAndroid Build Coastguard Worker #include "anglebase/no_destructor.h"
19*8975f5c5SAndroid Build Coastguard Worker 
20*8975f5c5SAndroid Build Coastguard Worker namespace cl
21*8975f5c5SAndroid Build Coastguard Worker {
22*8975f5c5SAndroid Build Coastguard Worker 
23*8975f5c5SAndroid Build Coastguard Worker class Platform final : public _cl_platform_id, public Object
24*8975f5c5SAndroid Build Coastguard Worker {
25*8975f5c5SAndroid Build Coastguard Worker   public:
26*8975f5c5SAndroid Build Coastguard Worker     // Front end entry functions, only called from OpenCL entry points
27*8975f5c5SAndroid Build Coastguard Worker 
28*8975f5c5SAndroid Build Coastguard Worker     static void Initialize(const cl_icd_dispatch &dispatch,
29*8975f5c5SAndroid Build Coastguard Worker                            rx::CLPlatformImpl::CreateFuncs &&createFuncs);
30*8975f5c5SAndroid Build Coastguard Worker 
31*8975f5c5SAndroid Build Coastguard Worker     static Platform *GetDefault();
32*8975f5c5SAndroid Build Coastguard Worker     static Platform *CastOrDefault(cl_platform_id platform);
33*8975f5c5SAndroid Build Coastguard Worker     static bool IsValidOrDefault(const _cl_platform_id *platform);
34*8975f5c5SAndroid Build Coastguard Worker 
35*8975f5c5SAndroid Build Coastguard Worker     static angle::Result GetPlatformIDs(cl_uint numEntries,
36*8975f5c5SAndroid Build Coastguard Worker                                         cl_platform_id *platforms,
37*8975f5c5SAndroid Build Coastguard Worker                                         cl_uint *numPlatforms);
38*8975f5c5SAndroid Build Coastguard Worker 
39*8975f5c5SAndroid Build Coastguard Worker     angle::Result getInfo(PlatformInfo name,
40*8975f5c5SAndroid Build Coastguard Worker                           size_t valueSize,
41*8975f5c5SAndroid Build Coastguard Worker                           void *value,
42*8975f5c5SAndroid Build Coastguard Worker                           size_t *valueSizeRet) const;
43*8975f5c5SAndroid Build Coastguard Worker 
44*8975f5c5SAndroid Build Coastguard Worker     angle::Result getDeviceIDs(DeviceType deviceType,
45*8975f5c5SAndroid Build Coastguard Worker                                cl_uint numEntries,
46*8975f5c5SAndroid Build Coastguard Worker                                cl_device_id *devices,
47*8975f5c5SAndroid Build Coastguard Worker                                cl_uint *numDevices) const;
48*8975f5c5SAndroid Build Coastguard Worker 
49*8975f5c5SAndroid Build Coastguard Worker     bool hasDeviceType(DeviceType) const;
50*8975f5c5SAndroid Build Coastguard Worker 
51*8975f5c5SAndroid Build Coastguard Worker     static cl_context CreateContext(const cl_context_properties *properties,
52*8975f5c5SAndroid Build Coastguard Worker                                     cl_uint numDevices,
53*8975f5c5SAndroid Build Coastguard Worker                                     const cl_device_id *devices,
54*8975f5c5SAndroid Build Coastguard Worker                                     ContextErrorCB notify,
55*8975f5c5SAndroid Build Coastguard Worker                                     void *userData);
56*8975f5c5SAndroid Build Coastguard Worker 
57*8975f5c5SAndroid Build Coastguard Worker     static cl_context CreateContextFromType(const cl_context_properties *properties,
58*8975f5c5SAndroid Build Coastguard Worker                                             DeviceType deviceType,
59*8975f5c5SAndroid Build Coastguard Worker                                             ContextErrorCB notify,
60*8975f5c5SAndroid Build Coastguard Worker                                             void *userData);
61*8975f5c5SAndroid Build Coastguard Worker 
62*8975f5c5SAndroid Build Coastguard Worker     angle::Result unloadCompiler();
63*8975f5c5SAndroid Build Coastguard Worker 
64*8975f5c5SAndroid Build Coastguard Worker   public:
65*8975f5c5SAndroid Build Coastguard Worker     ~Platform() override;
66*8975f5c5SAndroid Build Coastguard Worker 
67*8975f5c5SAndroid Build Coastguard Worker     const rx::CLPlatformImpl::Info &getInfo() const;
68*8975f5c5SAndroid Build Coastguard Worker     cl_version getVersion() const;
69*8975f5c5SAndroid Build Coastguard Worker     bool isVersionOrNewer(cl_uint major, cl_uint minor) const;
70*8975f5c5SAndroid Build Coastguard Worker     const DevicePtrs &getDevices() const;
71*8975f5c5SAndroid Build Coastguard Worker 
72*8975f5c5SAndroid Build Coastguard Worker     template <typename T = rx::CLPlatformImpl>
73*8975f5c5SAndroid Build Coastguard Worker     T &getImpl() const;
74*8975f5c5SAndroid Build Coastguard Worker 
75*8975f5c5SAndroid Build Coastguard Worker     static const PlatformPtrs &GetPlatforms();
76*8975f5c5SAndroid Build Coastguard Worker 
77*8975f5c5SAndroid Build Coastguard Worker     static constexpr const char *GetVendor();
78*8975f5c5SAndroid Build Coastguard Worker 
79*8975f5c5SAndroid Build Coastguard Worker     const std::shared_ptr<angle::WorkerThreadPool> &getMultiThreadPool() const;
80*8975f5c5SAndroid Build Coastguard Worker 
81*8975f5c5SAndroid Build Coastguard Worker   private:
82*8975f5c5SAndroid Build Coastguard Worker     explicit Platform(const rx::CLPlatformImpl::CreateFunc &createFunc);
83*8975f5c5SAndroid Build Coastguard Worker 
84*8975f5c5SAndroid Build Coastguard Worker     DevicePtrs createDevices(rx::CLDeviceImpl::CreateDatas &&createDatas);
85*8975f5c5SAndroid Build Coastguard Worker 
86*8975f5c5SAndroid Build Coastguard Worker     static PlatformPtrs &GetPointers();
87*8975f5c5SAndroid Build Coastguard Worker 
88*8975f5c5SAndroid Build Coastguard Worker     const rx::CLPlatformImpl::Ptr mImpl;
89*8975f5c5SAndroid Build Coastguard Worker     const rx::CLPlatformImpl::Info mInfo;
90*8975f5c5SAndroid Build Coastguard Worker     const DevicePtrs mDevices;
91*8975f5c5SAndroid Build Coastguard Worker     std::shared_ptr<angle::WorkerThreadPool> mMultiThreadPool;
92*8975f5c5SAndroid Build Coastguard Worker 
93*8975f5c5SAndroid Build Coastguard Worker     static constexpr char kVendor[]    = "ANGLE";
94*8975f5c5SAndroid Build Coastguard Worker     static constexpr char kIcdSuffix[] = "ANGLE";
95*8975f5c5SAndroid Build Coastguard Worker };
96*8975f5c5SAndroid Build Coastguard Worker 
GetDefault()97*8975f5c5SAndroid Build Coastguard Worker inline Platform *Platform::GetDefault()
98*8975f5c5SAndroid Build Coastguard Worker {
99*8975f5c5SAndroid Build Coastguard Worker     return GetPlatforms().empty() ? nullptr : GetPlatforms().front().get();
100*8975f5c5SAndroid Build Coastguard Worker }
101*8975f5c5SAndroid Build Coastguard Worker 
CastOrDefault(cl_platform_id platform)102*8975f5c5SAndroid Build Coastguard Worker inline Platform *Platform::CastOrDefault(cl_platform_id platform)
103*8975f5c5SAndroid Build Coastguard Worker {
104*8975f5c5SAndroid Build Coastguard Worker     return platform != nullptr ? &platform->cast<Platform>() : GetDefault();
105*8975f5c5SAndroid Build Coastguard Worker }
106*8975f5c5SAndroid Build Coastguard Worker 
107*8975f5c5SAndroid Build Coastguard Worker // Our CL implementation defines that a nullptr value chooses the platform that we provide as
108*8975f5c5SAndroid Build Coastguard Worker // default, so this function returns true for a nullptr value if a default platform exists.
IsValidOrDefault(const _cl_platform_id * platform)109*8975f5c5SAndroid Build Coastguard Worker inline bool Platform::IsValidOrDefault(const _cl_platform_id *platform)
110*8975f5c5SAndroid Build Coastguard Worker {
111*8975f5c5SAndroid Build Coastguard Worker     return platform != nullptr ? IsValid(platform) : GetDefault() != nullptr;
112*8975f5c5SAndroid Build Coastguard Worker }
113*8975f5c5SAndroid Build Coastguard Worker 
getInfo()114*8975f5c5SAndroid Build Coastguard Worker inline const rx::CLPlatformImpl::Info &Platform::getInfo() const
115*8975f5c5SAndroid Build Coastguard Worker {
116*8975f5c5SAndroid Build Coastguard Worker     return mInfo;
117*8975f5c5SAndroid Build Coastguard Worker }
118*8975f5c5SAndroid Build Coastguard Worker 
getVersion()119*8975f5c5SAndroid Build Coastguard Worker inline cl_version Platform::getVersion() const
120*8975f5c5SAndroid Build Coastguard Worker {
121*8975f5c5SAndroid Build Coastguard Worker     return mInfo.version;
122*8975f5c5SAndroid Build Coastguard Worker }
123*8975f5c5SAndroid Build Coastguard Worker 
isVersionOrNewer(cl_uint major,cl_uint minor)124*8975f5c5SAndroid Build Coastguard Worker inline bool Platform::isVersionOrNewer(cl_uint major, cl_uint minor) const
125*8975f5c5SAndroid Build Coastguard Worker {
126*8975f5c5SAndroid Build Coastguard Worker     return mInfo.version >= CL_MAKE_VERSION(major, minor, 0u);
127*8975f5c5SAndroid Build Coastguard Worker }
128*8975f5c5SAndroid Build Coastguard Worker 
getDevices()129*8975f5c5SAndroid Build Coastguard Worker inline const DevicePtrs &Platform::getDevices() const
130*8975f5c5SAndroid Build Coastguard Worker {
131*8975f5c5SAndroid Build Coastguard Worker     return mDevices;
132*8975f5c5SAndroid Build Coastguard Worker }
133*8975f5c5SAndroid Build Coastguard Worker 
134*8975f5c5SAndroid Build Coastguard Worker template <typename T>
getImpl()135*8975f5c5SAndroid Build Coastguard Worker inline T &Platform::getImpl() const
136*8975f5c5SAndroid Build Coastguard Worker {
137*8975f5c5SAndroid Build Coastguard Worker     return static_cast<T &>(*mImpl);
138*8975f5c5SAndroid Build Coastguard Worker }
139*8975f5c5SAndroid Build Coastguard Worker 
GetPlatforms()140*8975f5c5SAndroid Build Coastguard Worker inline const PlatformPtrs &Platform::GetPlatforms()
141*8975f5c5SAndroid Build Coastguard Worker {
142*8975f5c5SAndroid Build Coastguard Worker     return GetPointers();
143*8975f5c5SAndroid Build Coastguard Worker }
144*8975f5c5SAndroid Build Coastguard Worker 
GetVendor()145*8975f5c5SAndroid Build Coastguard Worker constexpr const char *Platform::GetVendor()
146*8975f5c5SAndroid Build Coastguard Worker {
147*8975f5c5SAndroid Build Coastguard Worker     return kVendor;
148*8975f5c5SAndroid Build Coastguard Worker }
149*8975f5c5SAndroid Build Coastguard Worker 
getMultiThreadPool()150*8975f5c5SAndroid Build Coastguard Worker inline const std::shared_ptr<angle::WorkerThreadPool> &Platform::getMultiThreadPool() const
151*8975f5c5SAndroid Build Coastguard Worker {
152*8975f5c5SAndroid Build Coastguard Worker     return mMultiThreadPool;
153*8975f5c5SAndroid Build Coastguard Worker }
154*8975f5c5SAndroid Build Coastguard Worker 
GetPointers()155*8975f5c5SAndroid Build Coastguard Worker inline PlatformPtrs &Platform::GetPointers()
156*8975f5c5SAndroid Build Coastguard Worker {
157*8975f5c5SAndroid Build Coastguard Worker     static angle::base::NoDestructor<PlatformPtrs> sPointers;
158*8975f5c5SAndroid Build Coastguard Worker     return *sPointers;
159*8975f5c5SAndroid Build Coastguard Worker }
160*8975f5c5SAndroid Build Coastguard Worker 
161*8975f5c5SAndroid Build Coastguard Worker }  // namespace cl
162*8975f5c5SAndroid Build Coastguard Worker 
163*8975f5c5SAndroid Build Coastguard Worker #endif  // LIBANGLE_CLPLATFORM_H_
164