xref: /aosp_15_r20/external/angle/src/libANGLE/CLProgram.cpp (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.cpp: Implements the cl::Program class.
7*8975f5c5SAndroid Build Coastguard Worker 
8*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/CLProgram.h"
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/CLContext.h"
11*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/CLPlatform.h"
12*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/cl_utils.h"
13*8975f5c5SAndroid Build Coastguard Worker 
14*8975f5c5SAndroid Build Coastguard Worker #include <cstring>
15*8975f5c5SAndroid Build Coastguard Worker 
16*8975f5c5SAndroid Build Coastguard Worker namespace cl
17*8975f5c5SAndroid Build Coastguard Worker {
18*8975f5c5SAndroid Build Coastguard Worker 
build(cl_uint numDevices,const cl_device_id * deviceList,const char * options,ProgramCB pfnNotify,void * userData)19*8975f5c5SAndroid Build Coastguard Worker angle::Result Program::build(cl_uint numDevices,
20*8975f5c5SAndroid Build Coastguard Worker                              const cl_device_id *deviceList,
21*8975f5c5SAndroid Build Coastguard Worker                              const char *options,
22*8975f5c5SAndroid Build Coastguard Worker                              ProgramCB pfnNotify,
23*8975f5c5SAndroid Build Coastguard Worker                              void *userData)
24*8975f5c5SAndroid Build Coastguard Worker {
25*8975f5c5SAndroid Build Coastguard Worker     DevicePtrs devices;
26*8975f5c5SAndroid Build Coastguard Worker     devices.reserve(numDevices);
27*8975f5c5SAndroid Build Coastguard Worker     while (numDevices-- != 0u)
28*8975f5c5SAndroid Build Coastguard Worker     {
29*8975f5c5SAndroid Build Coastguard Worker         devices.emplace_back(&(*deviceList++)->cast<Device>());
30*8975f5c5SAndroid Build Coastguard Worker     }
31*8975f5c5SAndroid Build Coastguard Worker     Program *notify = nullptr;
32*8975f5c5SAndroid Build Coastguard Worker     if (pfnNotify != nullptr)
33*8975f5c5SAndroid Build Coastguard Worker     {
34*8975f5c5SAndroid Build Coastguard Worker         // This program has to be retained until the notify callback is called.
35*8975f5c5SAndroid Build Coastguard Worker         retain();
36*8975f5c5SAndroid Build Coastguard Worker         *mCallback = CallbackData(pfnNotify, userData);
37*8975f5c5SAndroid Build Coastguard Worker         notify     = this;
38*8975f5c5SAndroid Build Coastguard Worker     }
39*8975f5c5SAndroid Build Coastguard Worker     return mImpl->build(devices, options, notify);
40*8975f5c5SAndroid Build Coastguard Worker }
41*8975f5c5SAndroid Build Coastguard Worker 
compile(cl_uint numDevices,const cl_device_id * deviceList,const char * options,cl_uint numInputHeaders,const cl_program * inputHeaders,const char ** headerIncludeNames,ProgramCB pfnNotify,void * userData)42*8975f5c5SAndroid Build Coastguard Worker angle::Result Program::compile(cl_uint numDevices,
43*8975f5c5SAndroid Build Coastguard Worker                                const cl_device_id *deviceList,
44*8975f5c5SAndroid Build Coastguard Worker                                const char *options,
45*8975f5c5SAndroid Build Coastguard Worker                                cl_uint numInputHeaders,
46*8975f5c5SAndroid Build Coastguard Worker                                const cl_program *inputHeaders,
47*8975f5c5SAndroid Build Coastguard Worker                                const char **headerIncludeNames,
48*8975f5c5SAndroid Build Coastguard Worker                                ProgramCB pfnNotify,
49*8975f5c5SAndroid Build Coastguard Worker                                void *userData)
50*8975f5c5SAndroid Build Coastguard Worker {
51*8975f5c5SAndroid Build Coastguard Worker     DevicePtrs devices;
52*8975f5c5SAndroid Build Coastguard Worker     devices.reserve(numDevices);
53*8975f5c5SAndroid Build Coastguard Worker     while (numDevices-- != 0u)
54*8975f5c5SAndroid Build Coastguard Worker     {
55*8975f5c5SAndroid Build Coastguard Worker         devices.emplace_back(&(*deviceList++)->cast<Device>());
56*8975f5c5SAndroid Build Coastguard Worker     }
57*8975f5c5SAndroid Build Coastguard Worker     ProgramPtrs programs;
58*8975f5c5SAndroid Build Coastguard Worker     programs.reserve(numInputHeaders);
59*8975f5c5SAndroid Build Coastguard Worker     while (numInputHeaders-- != 0u)
60*8975f5c5SAndroid Build Coastguard Worker     {
61*8975f5c5SAndroid Build Coastguard Worker         programs.emplace_back(&(*inputHeaders++)->cast<Program>());
62*8975f5c5SAndroid Build Coastguard Worker     }
63*8975f5c5SAndroid Build Coastguard Worker     Program *notify = nullptr;
64*8975f5c5SAndroid Build Coastguard Worker     if (pfnNotify != nullptr)
65*8975f5c5SAndroid Build Coastguard Worker     {
66*8975f5c5SAndroid Build Coastguard Worker         // This program has to be retained until the notify callback is called.
67*8975f5c5SAndroid Build Coastguard Worker         retain();
68*8975f5c5SAndroid Build Coastguard Worker         *mCallback = CallbackData(pfnNotify, userData);
69*8975f5c5SAndroid Build Coastguard Worker         notify     = this;
70*8975f5c5SAndroid Build Coastguard Worker     }
71*8975f5c5SAndroid Build Coastguard Worker     return mImpl->compile(devices, options, programs, headerIncludeNames, notify);
72*8975f5c5SAndroid Build Coastguard Worker }
73*8975f5c5SAndroid Build Coastguard Worker 
getInfo(ProgramInfo name,size_t valueSize,void * value,size_t * valueSizeRet) const74*8975f5c5SAndroid Build Coastguard Worker angle::Result Program::getInfo(ProgramInfo name,
75*8975f5c5SAndroid Build Coastguard Worker                                size_t valueSize,
76*8975f5c5SAndroid Build Coastguard Worker                                void *value,
77*8975f5c5SAndroid Build Coastguard Worker                                size_t *valueSizeRet) const
78*8975f5c5SAndroid Build Coastguard Worker {
79*8975f5c5SAndroid Build Coastguard Worker     std::vector<cl_device_id> devices;
80*8975f5c5SAndroid Build Coastguard Worker     cl_uint valUInt       = 0u;
81*8975f5c5SAndroid Build Coastguard Worker     void *valPointer      = nullptr;
82*8975f5c5SAndroid Build Coastguard Worker     const void *copyValue = nullptr;
83*8975f5c5SAndroid Build Coastguard Worker     size_t copySize       = 0u;
84*8975f5c5SAndroid Build Coastguard Worker 
85*8975f5c5SAndroid Build Coastguard Worker     switch (name)
86*8975f5c5SAndroid Build Coastguard Worker     {
87*8975f5c5SAndroid Build Coastguard Worker         case ProgramInfo::ReferenceCount:
88*8975f5c5SAndroid Build Coastguard Worker             valUInt   = getRefCount();
89*8975f5c5SAndroid Build Coastguard Worker             copyValue = &valUInt;
90*8975f5c5SAndroid Build Coastguard Worker             copySize  = sizeof(valUInt);
91*8975f5c5SAndroid Build Coastguard Worker             break;
92*8975f5c5SAndroid Build Coastguard Worker         case ProgramInfo::Context:
93*8975f5c5SAndroid Build Coastguard Worker             valPointer = mContext->getNative();
94*8975f5c5SAndroid Build Coastguard Worker             copyValue  = &valPointer;
95*8975f5c5SAndroid Build Coastguard Worker             copySize   = sizeof(valPointer);
96*8975f5c5SAndroid Build Coastguard Worker             break;
97*8975f5c5SAndroid Build Coastguard Worker         case ProgramInfo::NumDevices:
98*8975f5c5SAndroid Build Coastguard Worker             valUInt   = static_cast<decltype(valUInt)>(mDevices.size());
99*8975f5c5SAndroid Build Coastguard Worker             copyValue = &valUInt;
100*8975f5c5SAndroid Build Coastguard Worker             copySize  = sizeof(valUInt);
101*8975f5c5SAndroid Build Coastguard Worker             break;
102*8975f5c5SAndroid Build Coastguard Worker         case ProgramInfo::Devices:
103*8975f5c5SAndroid Build Coastguard Worker             devices.reserve(mDevices.size());
104*8975f5c5SAndroid Build Coastguard Worker             for (const DevicePtr &device : mDevices)
105*8975f5c5SAndroid Build Coastguard Worker             {
106*8975f5c5SAndroid Build Coastguard Worker                 devices.emplace_back(device->getNative());
107*8975f5c5SAndroid Build Coastguard Worker             }
108*8975f5c5SAndroid Build Coastguard Worker             copyValue = devices.data();
109*8975f5c5SAndroid Build Coastguard Worker             copySize  = devices.size() * sizeof(decltype(devices)::value_type);
110*8975f5c5SAndroid Build Coastguard Worker             break;
111*8975f5c5SAndroid Build Coastguard Worker         case ProgramInfo::Source:
112*8975f5c5SAndroid Build Coastguard Worker             if (!mSource.empty())
113*8975f5c5SAndroid Build Coastguard Worker             {
114*8975f5c5SAndroid Build Coastguard Worker                 copyValue = mSource.c_str();
115*8975f5c5SAndroid Build Coastguard Worker                 copySize  = mSource.length() + 1u;
116*8975f5c5SAndroid Build Coastguard Worker             }
117*8975f5c5SAndroid Build Coastguard Worker             break;
118*8975f5c5SAndroid Build Coastguard Worker         case ProgramInfo::IL:
119*8975f5c5SAndroid Build Coastguard Worker             if (!mIL.empty())
120*8975f5c5SAndroid Build Coastguard Worker             {
121*8975f5c5SAndroid Build Coastguard Worker                 copyValue = mIL.c_str();
122*8975f5c5SAndroid Build Coastguard Worker                 copySize  = mIL.length() + 1u;
123*8975f5c5SAndroid Build Coastguard Worker             }
124*8975f5c5SAndroid Build Coastguard Worker             break;
125*8975f5c5SAndroid Build Coastguard Worker         case ProgramInfo::BinarySizes:
126*8975f5c5SAndroid Build Coastguard Worker         case ProgramInfo::Binaries:
127*8975f5c5SAndroid Build Coastguard Worker         case ProgramInfo::NumKernels:
128*8975f5c5SAndroid Build Coastguard Worker         case ProgramInfo::KernelNames:
129*8975f5c5SAndroid Build Coastguard Worker         case ProgramInfo::ScopeGlobalCtorsPresent:
130*8975f5c5SAndroid Build Coastguard Worker         case ProgramInfo::ScopeGlobalDtorsPresent:
131*8975f5c5SAndroid Build Coastguard Worker             return mImpl->getInfo(name, valueSize, value, valueSizeRet);
132*8975f5c5SAndroid Build Coastguard Worker         default:
133*8975f5c5SAndroid Build Coastguard Worker             ANGLE_CL_RETURN_ERROR(CL_INVALID_VALUE);
134*8975f5c5SAndroid Build Coastguard Worker     }
135*8975f5c5SAndroid Build Coastguard Worker 
136*8975f5c5SAndroid Build Coastguard Worker     if (value != nullptr)
137*8975f5c5SAndroid Build Coastguard Worker     {
138*8975f5c5SAndroid Build Coastguard Worker         // CL_INVALID_VALUE if size in bytes specified by param_value_size is < size of return type
139*8975f5c5SAndroid Build Coastguard Worker         // as described in the Program Object Queries table and param_value is not NULL.
140*8975f5c5SAndroid Build Coastguard Worker         if (valueSize < copySize)
141*8975f5c5SAndroid Build Coastguard Worker         {
142*8975f5c5SAndroid Build Coastguard Worker             ANGLE_CL_RETURN_ERROR(CL_INVALID_VALUE);
143*8975f5c5SAndroid Build Coastguard Worker         }
144*8975f5c5SAndroid Build Coastguard Worker         if (copyValue != nullptr)
145*8975f5c5SAndroid Build Coastguard Worker         {
146*8975f5c5SAndroid Build Coastguard Worker             std::memcpy(value, copyValue, copySize);
147*8975f5c5SAndroid Build Coastguard Worker         }
148*8975f5c5SAndroid Build Coastguard Worker     }
149*8975f5c5SAndroid Build Coastguard Worker     if (valueSizeRet != nullptr)
150*8975f5c5SAndroid Build Coastguard Worker     {
151*8975f5c5SAndroid Build Coastguard Worker         *valueSizeRet = copySize;
152*8975f5c5SAndroid Build Coastguard Worker     }
153*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
154*8975f5c5SAndroid Build Coastguard Worker }
155*8975f5c5SAndroid Build Coastguard Worker 
getBuildInfo(cl_device_id device,ProgramBuildInfo name,size_t valueSize,void * value,size_t * valueSizeRet) const156*8975f5c5SAndroid Build Coastguard Worker angle::Result Program::getBuildInfo(cl_device_id device,
157*8975f5c5SAndroid Build Coastguard Worker                                     ProgramBuildInfo name,
158*8975f5c5SAndroid Build Coastguard Worker                                     size_t valueSize,
159*8975f5c5SAndroid Build Coastguard Worker                                     void *value,
160*8975f5c5SAndroid Build Coastguard Worker                                     size_t *valueSizeRet) const
161*8975f5c5SAndroid Build Coastguard Worker {
162*8975f5c5SAndroid Build Coastguard Worker     return mImpl->getBuildInfo(device->cast<Device>(), name, valueSize, value, valueSizeRet);
163*8975f5c5SAndroid Build Coastguard Worker }
164*8975f5c5SAndroid Build Coastguard Worker 
createKernel(const char * kernel_name)165*8975f5c5SAndroid Build Coastguard Worker cl_kernel Program::createKernel(const char *kernel_name)
166*8975f5c5SAndroid Build Coastguard Worker {
167*8975f5c5SAndroid Build Coastguard Worker     return Object::Create<Kernel>(*this, kernel_name);
168*8975f5c5SAndroid Build Coastguard Worker }
169*8975f5c5SAndroid Build Coastguard Worker 
createKernels(cl_uint numKernels,cl_kernel * kernels,cl_uint * numKernelsRet)170*8975f5c5SAndroid Build Coastguard Worker angle::Result Program::createKernels(cl_uint numKernels, cl_kernel *kernels, cl_uint *numKernelsRet)
171*8975f5c5SAndroid Build Coastguard Worker {
172*8975f5c5SAndroid Build Coastguard Worker     if (kernels == nullptr)
173*8975f5c5SAndroid Build Coastguard Worker     {
174*8975f5c5SAndroid Build Coastguard Worker         numKernels = 0u;
175*8975f5c5SAndroid Build Coastguard Worker     }
176*8975f5c5SAndroid Build Coastguard Worker     rx::CLKernelImpl::CreateFuncs createFuncs;
177*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(mImpl->createKernels(numKernels, createFuncs, numKernelsRet));
178*8975f5c5SAndroid Build Coastguard Worker     KernelPtrs krnls;
179*8975f5c5SAndroid Build Coastguard Worker     krnls.reserve(createFuncs.size());
180*8975f5c5SAndroid Build Coastguard Worker     while (!createFuncs.empty())
181*8975f5c5SAndroid Build Coastguard Worker     {
182*8975f5c5SAndroid Build Coastguard Worker         krnls.emplace_back(new Kernel(*this, createFuncs.front()));
183*8975f5c5SAndroid Build Coastguard Worker         if (krnls.back()->mImpl == nullptr)
184*8975f5c5SAndroid Build Coastguard Worker         {
185*8975f5c5SAndroid Build Coastguard Worker             return angle::Result::Stop;
186*8975f5c5SAndroid Build Coastguard Worker         }
187*8975f5c5SAndroid Build Coastguard Worker         createFuncs.pop_front();
188*8975f5c5SAndroid Build Coastguard Worker     }
189*8975f5c5SAndroid Build Coastguard Worker     for (KernelPtr &kernel : krnls)
190*8975f5c5SAndroid Build Coastguard Worker     {
191*8975f5c5SAndroid Build Coastguard Worker         *kernels++ = kernel.release();
192*8975f5c5SAndroid Build Coastguard Worker     }
193*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
194*8975f5c5SAndroid Build Coastguard Worker }
195*8975f5c5SAndroid Build Coastguard Worker 
196*8975f5c5SAndroid Build Coastguard Worker Program::~Program() = default;
197*8975f5c5SAndroid Build Coastguard Worker 
callback()198*8975f5c5SAndroid Build Coastguard Worker void Program::callback()
199*8975f5c5SAndroid Build Coastguard Worker {
200*8975f5c5SAndroid Build Coastguard Worker     CallbackData callbackData;
201*8975f5c5SAndroid Build Coastguard Worker     mCallback->swap(callbackData);
202*8975f5c5SAndroid Build Coastguard Worker     const ProgramCB callback = callbackData.first;
203*8975f5c5SAndroid Build Coastguard Worker     void *const userData     = callbackData.second;
204*8975f5c5SAndroid Build Coastguard Worker     ASSERT(callback != nullptr);
205*8975f5c5SAndroid Build Coastguard Worker     callback(this, userData);
206*8975f5c5SAndroid Build Coastguard Worker     // This program can be released after the callback was called.
207*8975f5c5SAndroid Build Coastguard Worker     if (release())
208*8975f5c5SAndroid Build Coastguard Worker     {
209*8975f5c5SAndroid Build Coastguard Worker         delete this;
210*8975f5c5SAndroid Build Coastguard Worker     }
211*8975f5c5SAndroid Build Coastguard Worker }
212*8975f5c5SAndroid Build Coastguard Worker 
Program(Context & context,std::string && source)213*8975f5c5SAndroid Build Coastguard Worker Program::Program(Context &context, std::string &&source)
214*8975f5c5SAndroid Build Coastguard Worker     : mContext(&context),
215*8975f5c5SAndroid Build Coastguard Worker       mDevices(context.getDevices()),
216*8975f5c5SAndroid Build Coastguard Worker       mNumAttachedKernels(0u),
217*8975f5c5SAndroid Build Coastguard Worker       mImpl(nullptr),
218*8975f5c5SAndroid Build Coastguard Worker       mSource(std::move(source))
219*8975f5c5SAndroid Build Coastguard Worker {
220*8975f5c5SAndroid Build Coastguard Worker     ANGLE_CL_IMPL_TRY(context.getImpl().createProgramWithSource(*this, mSource, &mImpl));
221*8975f5c5SAndroid Build Coastguard Worker }
222*8975f5c5SAndroid Build Coastguard Worker 
Program(Context & context,const void * il,size_t length)223*8975f5c5SAndroid Build Coastguard Worker Program::Program(Context &context, const void *il, size_t length)
224*8975f5c5SAndroid Build Coastguard Worker     : mContext(&context),
225*8975f5c5SAndroid Build Coastguard Worker       mDevices(context.getDevices()),
226*8975f5c5SAndroid Build Coastguard Worker       mIL(static_cast<const char *>(il), length),
227*8975f5c5SAndroid Build Coastguard Worker       mNumAttachedKernels(0u),
228*8975f5c5SAndroid Build Coastguard Worker       mImpl(nullptr)
229*8975f5c5SAndroid Build Coastguard Worker {
230*8975f5c5SAndroid Build Coastguard Worker     ANGLE_CL_IMPL_TRY(context.getImpl().createProgramWithIL(*this, il, length, &mImpl));
231*8975f5c5SAndroid Build Coastguard Worker }
232*8975f5c5SAndroid Build Coastguard Worker 
Program(Context & context,DevicePtrs && devices,const size_t * lengths,const unsigned char ** binaries,cl_int * binaryStatus)233*8975f5c5SAndroid Build Coastguard Worker Program::Program(Context &context,
234*8975f5c5SAndroid Build Coastguard Worker                  DevicePtrs &&devices,
235*8975f5c5SAndroid Build Coastguard Worker                  const size_t *lengths,
236*8975f5c5SAndroid Build Coastguard Worker                  const unsigned char **binaries,
237*8975f5c5SAndroid Build Coastguard Worker                  cl_int *binaryStatus)
238*8975f5c5SAndroid Build Coastguard Worker     : mContext(&context), mDevices(std::move(devices)), mNumAttachedKernels(0u), mImpl(nullptr)
239*8975f5c5SAndroid Build Coastguard Worker {
240*8975f5c5SAndroid Build Coastguard Worker     ANGLE_CL_IMPL_TRY(
241*8975f5c5SAndroid Build Coastguard Worker         context.getImpl().createProgramWithBinary(*this, lengths, binaries, binaryStatus, &mImpl));
242*8975f5c5SAndroid Build Coastguard Worker }
243*8975f5c5SAndroid Build Coastguard Worker 
Program(Context & context,DevicePtrs && devices,const char * kernelNames)244*8975f5c5SAndroid Build Coastguard Worker Program::Program(Context &context, DevicePtrs &&devices, const char *kernelNames)
245*8975f5c5SAndroid Build Coastguard Worker     : mContext(&context), mDevices(std::move(devices)), mNumAttachedKernels(0u), mImpl(nullptr)
246*8975f5c5SAndroid Build Coastguard Worker {
247*8975f5c5SAndroid Build Coastguard Worker     ANGLE_CL_IMPL_TRY(
248*8975f5c5SAndroid Build Coastguard Worker         context.getImpl().createProgramWithBuiltInKernels(*this, kernelNames, &mImpl));
249*8975f5c5SAndroid Build Coastguard Worker }
250*8975f5c5SAndroid Build Coastguard Worker 
Program(Context & context,const DevicePtrs & devices,const char * options,const cl::ProgramPtrs & inputPrograms,ProgramCB pfnNotify,void * userData)251*8975f5c5SAndroid Build Coastguard Worker Program::Program(Context &context,
252*8975f5c5SAndroid Build Coastguard Worker                  const DevicePtrs &devices,
253*8975f5c5SAndroid Build Coastguard Worker                  const char *options,
254*8975f5c5SAndroid Build Coastguard Worker                  const cl::ProgramPtrs &inputPrograms,
255*8975f5c5SAndroid Build Coastguard Worker                  ProgramCB pfnNotify,
256*8975f5c5SAndroid Build Coastguard Worker                  void *userData)
257*8975f5c5SAndroid Build Coastguard Worker     : mContext(&context),
258*8975f5c5SAndroid Build Coastguard Worker       mDevices(!devices.empty() ? devices : context.getDevices()),
259*8975f5c5SAndroid Build Coastguard Worker       mNumAttachedKernels(0u),
260*8975f5c5SAndroid Build Coastguard Worker       mImpl(nullptr)
261*8975f5c5SAndroid Build Coastguard Worker {
262*8975f5c5SAndroid Build Coastguard Worker     if (pfnNotify != nullptr)
263*8975f5c5SAndroid Build Coastguard Worker     {
264*8975f5c5SAndroid Build Coastguard Worker         // This program has to be retained until the notify callback is called.
265*8975f5c5SAndroid Build Coastguard Worker         retain();
266*8975f5c5SAndroid Build Coastguard Worker         *mCallback = CallbackData(pfnNotify, userData);
267*8975f5c5SAndroid Build Coastguard Worker     }
268*8975f5c5SAndroid Build Coastguard Worker     else
269*8975f5c5SAndroid Build Coastguard Worker     {
270*8975f5c5SAndroid Build Coastguard Worker         *mCallback = CallbackData();
271*8975f5c5SAndroid Build Coastguard Worker     }
272*8975f5c5SAndroid Build Coastguard Worker     ANGLE_CL_IMPL_TRY(context.getImpl().linkProgram(*this, mDevices, options, inputPrograms,
273*8975f5c5SAndroid Build Coastguard Worker                                                     pfnNotify != nullptr ? this : nullptr, &mImpl));
274*8975f5c5SAndroid Build Coastguard Worker }
275*8975f5c5SAndroid Build Coastguard Worker 
276*8975f5c5SAndroid Build Coastguard Worker }  // namespace cl
277