xref: /aosp_15_r20/external/angle/src/libANGLE/CLProgram.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 // CLProgram.h: Defines the cl::Program class, which consists of a set of OpenCL kernels.
7*8975f5c5SAndroid Build Coastguard Worker 
8*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_CLPROGRAM_H_
9*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_CLPROGRAM_H_
10*8975f5c5SAndroid Build Coastguard Worker 
11*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/CLDevice.h"
12*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/CLKernel.h"
13*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/cl_utils.h"
14*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/CLProgramImpl.h"
15*8975f5c5SAndroid Build Coastguard Worker 
16*8975f5c5SAndroid Build Coastguard Worker #include "common/SynchronizedValue.h"
17*8975f5c5SAndroid Build Coastguard Worker 
18*8975f5c5SAndroid Build Coastguard Worker #include <atomic>
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 Program final : public _cl_program, 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     angle::Result build(cl_uint numDevices,
29*8975f5c5SAndroid Build Coastguard Worker                         const cl_device_id *deviceList,
30*8975f5c5SAndroid Build Coastguard Worker                         const char *options,
31*8975f5c5SAndroid Build Coastguard Worker                         ProgramCB pfnNotify,
32*8975f5c5SAndroid Build Coastguard Worker                         void *userData);
33*8975f5c5SAndroid Build Coastguard Worker 
34*8975f5c5SAndroid Build Coastguard Worker     angle::Result compile(cl_uint numDevices,
35*8975f5c5SAndroid Build Coastguard Worker                           const cl_device_id *deviceList,
36*8975f5c5SAndroid Build Coastguard Worker                           const char *options,
37*8975f5c5SAndroid Build Coastguard Worker                           cl_uint numInputHeaders,
38*8975f5c5SAndroid Build Coastguard Worker                           const cl_program *inputHeaders,
39*8975f5c5SAndroid Build Coastguard Worker                           const char **headerIncludeNames,
40*8975f5c5SAndroid Build Coastguard Worker                           ProgramCB pfnNotify,
41*8975f5c5SAndroid Build Coastguard Worker                           void *userData);
42*8975f5c5SAndroid Build Coastguard Worker 
43*8975f5c5SAndroid Build Coastguard Worker     angle::Result getInfo(ProgramInfo name,
44*8975f5c5SAndroid Build Coastguard Worker                           size_t valueSize,
45*8975f5c5SAndroid Build Coastguard Worker                           void *value,
46*8975f5c5SAndroid Build Coastguard Worker                           size_t *valueSizeRet) const;
47*8975f5c5SAndroid Build Coastguard Worker 
48*8975f5c5SAndroid Build Coastguard Worker     angle::Result getBuildInfo(cl_device_id device,
49*8975f5c5SAndroid Build Coastguard Worker                                ProgramBuildInfo name,
50*8975f5c5SAndroid Build Coastguard Worker                                size_t valueSize,
51*8975f5c5SAndroid Build Coastguard Worker                                void *value,
52*8975f5c5SAndroid Build Coastguard Worker                                size_t *valueSizeRet) const;
53*8975f5c5SAndroid Build Coastguard Worker 
54*8975f5c5SAndroid Build Coastguard Worker     cl_kernel createKernel(const char *kernel_name);
55*8975f5c5SAndroid Build Coastguard Worker 
56*8975f5c5SAndroid Build Coastguard Worker     angle::Result createKernels(cl_uint numKernels, cl_kernel *kernels, cl_uint *numKernelsRet);
57*8975f5c5SAndroid Build Coastguard Worker 
58*8975f5c5SAndroid Build Coastguard Worker   public:
59*8975f5c5SAndroid Build Coastguard Worker     ~Program() override;
60*8975f5c5SAndroid Build Coastguard Worker 
61*8975f5c5SAndroid Build Coastguard Worker     Context &getContext();
62*8975f5c5SAndroid Build Coastguard Worker     const Context &getContext() const;
63*8975f5c5SAndroid Build Coastguard Worker     const DevicePtrs &getDevices() const;
64*8975f5c5SAndroid Build Coastguard Worker     const std::string &getSource() const;
65*8975f5c5SAndroid Build Coastguard Worker     bool hasDevice(const _cl_device_id *device) const;
66*8975f5c5SAndroid Build Coastguard Worker 
67*8975f5c5SAndroid Build Coastguard Worker     bool isBuilding() const;
68*8975f5c5SAndroid Build Coastguard Worker     bool hasAttachedKernels() const;
69*8975f5c5SAndroid Build Coastguard Worker 
70*8975f5c5SAndroid Build Coastguard Worker     template <typename T = rx::CLProgramImpl>
71*8975f5c5SAndroid Build Coastguard Worker     T &getImpl() const;
72*8975f5c5SAndroid Build Coastguard Worker 
73*8975f5c5SAndroid Build Coastguard Worker     void callback();
74*8975f5c5SAndroid Build Coastguard Worker 
75*8975f5c5SAndroid Build Coastguard Worker   private:
76*8975f5c5SAndroid Build Coastguard Worker     Program(Context &context, std::string &&source);
77*8975f5c5SAndroid Build Coastguard Worker     Program(Context &context, const void *il, size_t length);
78*8975f5c5SAndroid Build Coastguard Worker 
79*8975f5c5SAndroid Build Coastguard Worker     Program(Context &context,
80*8975f5c5SAndroid Build Coastguard Worker             DevicePtrs &&devices,
81*8975f5c5SAndroid Build Coastguard Worker             const size_t *lengths,
82*8975f5c5SAndroid Build Coastguard Worker             const unsigned char **binaries,
83*8975f5c5SAndroid Build Coastguard Worker             cl_int *binaryStatus);
84*8975f5c5SAndroid Build Coastguard Worker 
85*8975f5c5SAndroid Build Coastguard Worker     Program(Context &context, DevicePtrs &&devices, const char *kernelNames);
86*8975f5c5SAndroid Build Coastguard Worker 
87*8975f5c5SAndroid Build Coastguard Worker     Program(Context &context,
88*8975f5c5SAndroid Build Coastguard Worker             const DevicePtrs &devices,
89*8975f5c5SAndroid Build Coastguard Worker             const char *options,
90*8975f5c5SAndroid Build Coastguard Worker             const cl::ProgramPtrs &inputPrograms,
91*8975f5c5SAndroid Build Coastguard Worker             ProgramCB pfnNotify,
92*8975f5c5SAndroid Build Coastguard Worker             void *userData);
93*8975f5c5SAndroid Build Coastguard Worker 
94*8975f5c5SAndroid Build Coastguard Worker     using CallbackData = std::pair<ProgramCB, void *>;
95*8975f5c5SAndroid Build Coastguard Worker 
96*8975f5c5SAndroid Build Coastguard Worker     const ContextPtr mContext;
97*8975f5c5SAndroid Build Coastguard Worker     const DevicePtrs mDevices;
98*8975f5c5SAndroid Build Coastguard Worker     const std::string mIL;
99*8975f5c5SAndroid Build Coastguard Worker 
100*8975f5c5SAndroid Build Coastguard Worker     // mCallback might be accessed from implementation initialization
101*8975f5c5SAndroid Build Coastguard Worker     // and needs to be initialized first.
102*8975f5c5SAndroid Build Coastguard Worker     angle::SynchronizedValue<CallbackData> mCallback;
103*8975f5c5SAndroid Build Coastguard Worker     std::atomic<cl_uint> mNumAttachedKernels;
104*8975f5c5SAndroid Build Coastguard Worker 
105*8975f5c5SAndroid Build Coastguard Worker     rx::CLProgramImpl::Ptr mImpl;
106*8975f5c5SAndroid Build Coastguard Worker     const std::string mSource;
107*8975f5c5SAndroid Build Coastguard Worker 
108*8975f5c5SAndroid Build Coastguard Worker     friend class Kernel;
109*8975f5c5SAndroid Build Coastguard Worker     friend class Object;
110*8975f5c5SAndroid Build Coastguard Worker };
111*8975f5c5SAndroid Build Coastguard Worker 
getContext()112*8975f5c5SAndroid Build Coastguard Worker inline Context &Program::getContext()
113*8975f5c5SAndroid Build Coastguard Worker {
114*8975f5c5SAndroid Build Coastguard Worker     return *mContext;
115*8975f5c5SAndroid Build Coastguard Worker }
116*8975f5c5SAndroid Build Coastguard Worker 
getContext()117*8975f5c5SAndroid Build Coastguard Worker inline const Context &Program::getContext() const
118*8975f5c5SAndroid Build Coastguard Worker {
119*8975f5c5SAndroid Build Coastguard Worker     return *mContext;
120*8975f5c5SAndroid Build Coastguard Worker }
121*8975f5c5SAndroid Build Coastguard Worker 
getDevices()122*8975f5c5SAndroid Build Coastguard Worker inline const DevicePtrs &Program::getDevices() const
123*8975f5c5SAndroid Build Coastguard Worker {
124*8975f5c5SAndroid Build Coastguard Worker     return mDevices;
125*8975f5c5SAndroid Build Coastguard Worker }
126*8975f5c5SAndroid Build Coastguard Worker 
getSource()127*8975f5c5SAndroid Build Coastguard Worker inline const std::string &Program::getSource() const
128*8975f5c5SAndroid Build Coastguard Worker {
129*8975f5c5SAndroid Build Coastguard Worker     return mSource;
130*8975f5c5SAndroid Build Coastguard Worker }
131*8975f5c5SAndroid Build Coastguard Worker 
hasDevice(const _cl_device_id * device)132*8975f5c5SAndroid Build Coastguard Worker inline bool Program::hasDevice(const _cl_device_id *device) const
133*8975f5c5SAndroid Build Coastguard Worker {
134*8975f5c5SAndroid Build Coastguard Worker     return std::find(mDevices.cbegin(), mDevices.cend(), device) != mDevices.cend();
135*8975f5c5SAndroid Build Coastguard Worker }
136*8975f5c5SAndroid Build Coastguard Worker 
isBuilding()137*8975f5c5SAndroid Build Coastguard Worker inline bool Program::isBuilding() const
138*8975f5c5SAndroid Build Coastguard Worker {
139*8975f5c5SAndroid Build Coastguard Worker     for (const DevicePtr &device : getDevices())
140*8975f5c5SAndroid Build Coastguard Worker     {
141*8975f5c5SAndroid Build Coastguard Worker         cl_build_status buildStatus;
142*8975f5c5SAndroid Build Coastguard Worker         ANGLE_CL_IMPL_TRY(getBuildInfo(device->getNative(), ProgramBuildInfo::Status,
143*8975f5c5SAndroid Build Coastguard Worker                                        sizeof(cl_build_status), &buildStatus, nullptr));
144*8975f5c5SAndroid Build Coastguard Worker         if ((mCallback->first != nullptr) || (buildStatus == CL_BUILD_IN_PROGRESS))
145*8975f5c5SAndroid Build Coastguard Worker         {
146*8975f5c5SAndroid Build Coastguard Worker             return true;
147*8975f5c5SAndroid Build Coastguard Worker         }
148*8975f5c5SAndroid Build Coastguard Worker     }
149*8975f5c5SAndroid Build Coastguard Worker     return false;
150*8975f5c5SAndroid Build Coastguard Worker }
151*8975f5c5SAndroid Build Coastguard Worker 
hasAttachedKernels()152*8975f5c5SAndroid Build Coastguard Worker inline bool Program::hasAttachedKernels() const
153*8975f5c5SAndroid Build Coastguard Worker {
154*8975f5c5SAndroid Build Coastguard Worker     return mNumAttachedKernels != 0u;
155*8975f5c5SAndroid Build Coastguard Worker }
156*8975f5c5SAndroid Build Coastguard Worker 
157*8975f5c5SAndroid Build Coastguard Worker template <typename T>
getImpl()158*8975f5c5SAndroid Build Coastguard Worker inline T &Program::getImpl() const
159*8975f5c5SAndroid Build Coastguard Worker {
160*8975f5c5SAndroid Build Coastguard Worker     return static_cast<T &>(*mImpl);
161*8975f5c5SAndroid Build Coastguard Worker }
162*8975f5c5SAndroid Build Coastguard Worker 
163*8975f5c5SAndroid Build Coastguard Worker }  // namespace cl
164*8975f5c5SAndroid Build Coastguard Worker 
165*8975f5c5SAndroid Build Coastguard Worker #endif  // LIBANGLE_CLPROGRAM_H_
166