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