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 // CLKernel.cpp: Implements the cl::Kernel class.
7*8975f5c5SAndroid Build Coastguard Worker
8*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/CLKernel.h"
9*8975f5c5SAndroid Build Coastguard Worker
10*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/CLContext.h"
11*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/CLProgram.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
setArg(cl_uint argIndex,size_t argSize,const void * argValue)19*8975f5c5SAndroid Build Coastguard Worker angle::Result Kernel::setArg(cl_uint argIndex, size_t argSize, const void *argValue)
20*8975f5c5SAndroid Build Coastguard Worker {
21*8975f5c5SAndroid Build Coastguard Worker ANGLE_TRY(mImpl->setArg(argIndex, argSize, argValue));
22*8975f5c5SAndroid Build Coastguard Worker
23*8975f5c5SAndroid Build Coastguard Worker mSetArguments[argIndex] = {true, argIndex, argSize, argValue};
24*8975f5c5SAndroid Build Coastguard Worker return angle::Result::Continue;
25*8975f5c5SAndroid Build Coastguard Worker }
26*8975f5c5SAndroid Build Coastguard Worker
getInfo(KernelInfo name,size_t valueSize,void * value,size_t * valueSizeRet) const27*8975f5c5SAndroid Build Coastguard Worker angle::Result Kernel::getInfo(KernelInfo 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 cl_uint valUInt = 0u;
33*8975f5c5SAndroid Build Coastguard Worker void *valPointer = nullptr;
34*8975f5c5SAndroid Build Coastguard Worker const void *copyValue = nullptr;
35*8975f5c5SAndroid Build Coastguard Worker size_t copySize = 0u;
36*8975f5c5SAndroid Build Coastguard Worker
37*8975f5c5SAndroid Build Coastguard Worker switch (name)
38*8975f5c5SAndroid Build Coastguard Worker {
39*8975f5c5SAndroid Build Coastguard Worker case KernelInfo::FunctionName:
40*8975f5c5SAndroid Build Coastguard Worker copyValue = mInfo.functionName.c_str();
41*8975f5c5SAndroid Build Coastguard Worker copySize = mInfo.functionName.length() + 1u;
42*8975f5c5SAndroid Build Coastguard Worker break;
43*8975f5c5SAndroid Build Coastguard Worker case KernelInfo::NumArgs:
44*8975f5c5SAndroid Build Coastguard Worker copyValue = &mInfo.numArgs;
45*8975f5c5SAndroid Build Coastguard Worker copySize = sizeof(mInfo.numArgs);
46*8975f5c5SAndroid Build Coastguard Worker break;
47*8975f5c5SAndroid Build Coastguard Worker case KernelInfo::ReferenceCount:
48*8975f5c5SAndroid Build Coastguard Worker valUInt = getRefCount();
49*8975f5c5SAndroid Build Coastguard Worker copyValue = &valUInt;
50*8975f5c5SAndroid Build Coastguard Worker copySize = sizeof(valUInt);
51*8975f5c5SAndroid Build Coastguard Worker break;
52*8975f5c5SAndroid Build Coastguard Worker case KernelInfo::Context:
53*8975f5c5SAndroid Build Coastguard Worker valPointer = mProgram->getContext().getNative();
54*8975f5c5SAndroid Build Coastguard Worker copyValue = &valPointer;
55*8975f5c5SAndroid Build Coastguard Worker copySize = sizeof(valPointer);
56*8975f5c5SAndroid Build Coastguard Worker break;
57*8975f5c5SAndroid Build Coastguard Worker case KernelInfo::Program:
58*8975f5c5SAndroid Build Coastguard Worker valPointer = mProgram->getNative();
59*8975f5c5SAndroid Build Coastguard Worker copyValue = &valPointer;
60*8975f5c5SAndroid Build Coastguard Worker copySize = sizeof(valPointer);
61*8975f5c5SAndroid Build Coastguard Worker break;
62*8975f5c5SAndroid Build Coastguard Worker case KernelInfo::Attributes:
63*8975f5c5SAndroid Build Coastguard Worker copyValue = mInfo.attributes.c_str();
64*8975f5c5SAndroid Build Coastguard Worker copySize = mInfo.attributes.length() + 1u;
65*8975f5c5SAndroid Build Coastguard Worker break;
66*8975f5c5SAndroid Build Coastguard Worker default:
67*8975f5c5SAndroid Build Coastguard Worker ANGLE_CL_RETURN_ERROR(CL_INVALID_VALUE);
68*8975f5c5SAndroid Build Coastguard Worker }
69*8975f5c5SAndroid Build Coastguard Worker
70*8975f5c5SAndroid Build Coastguard Worker if (value != nullptr)
71*8975f5c5SAndroid Build Coastguard Worker {
72*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if size in bytes specified by param_value_size is < size of return type
73*8975f5c5SAndroid Build Coastguard Worker // as described in the Kernel Object Queries table and param_value is not NULL.
74*8975f5c5SAndroid Build Coastguard Worker if (valueSize < copySize)
75*8975f5c5SAndroid Build Coastguard Worker {
76*8975f5c5SAndroid Build Coastguard Worker ANGLE_CL_RETURN_ERROR(CL_INVALID_VALUE);
77*8975f5c5SAndroid Build Coastguard Worker }
78*8975f5c5SAndroid Build Coastguard Worker if (copyValue != nullptr)
79*8975f5c5SAndroid Build Coastguard Worker {
80*8975f5c5SAndroid Build Coastguard Worker std::memcpy(value, copyValue, copySize);
81*8975f5c5SAndroid Build Coastguard Worker }
82*8975f5c5SAndroid Build Coastguard Worker }
83*8975f5c5SAndroid Build Coastguard Worker if (valueSizeRet != nullptr)
84*8975f5c5SAndroid Build Coastguard Worker {
85*8975f5c5SAndroid Build Coastguard Worker *valueSizeRet = copySize;
86*8975f5c5SAndroid Build Coastguard Worker }
87*8975f5c5SAndroid Build Coastguard Worker return angle::Result::Continue;
88*8975f5c5SAndroid Build Coastguard Worker }
89*8975f5c5SAndroid Build Coastguard Worker
getWorkGroupInfo(cl_device_id device,KernelWorkGroupInfo name,size_t valueSize,void * value,size_t * valueSizeRet) const90*8975f5c5SAndroid Build Coastguard Worker angle::Result Kernel::getWorkGroupInfo(cl_device_id device,
91*8975f5c5SAndroid Build Coastguard Worker KernelWorkGroupInfo name,
92*8975f5c5SAndroid Build Coastguard Worker size_t valueSize,
93*8975f5c5SAndroid Build Coastguard Worker void *value,
94*8975f5c5SAndroid Build Coastguard Worker size_t *valueSizeRet) const
95*8975f5c5SAndroid Build Coastguard Worker {
96*8975f5c5SAndroid Build Coastguard Worker size_t index = 0u;
97*8975f5c5SAndroid Build Coastguard Worker if (device != nullptr)
98*8975f5c5SAndroid Build Coastguard Worker {
99*8975f5c5SAndroid Build Coastguard Worker const DevicePtrs &devices = mProgram->getContext().getDevices();
100*8975f5c5SAndroid Build Coastguard Worker while (index < devices.size() && devices[index] != device)
101*8975f5c5SAndroid Build Coastguard Worker {
102*8975f5c5SAndroid Build Coastguard Worker ++index;
103*8975f5c5SAndroid Build Coastguard Worker }
104*8975f5c5SAndroid Build Coastguard Worker if (index == devices.size())
105*8975f5c5SAndroid Build Coastguard Worker {
106*8975f5c5SAndroid Build Coastguard Worker ANGLE_CL_RETURN_ERROR(CL_INVALID_DEVICE);
107*8975f5c5SAndroid Build Coastguard Worker }
108*8975f5c5SAndroid Build Coastguard Worker }
109*8975f5c5SAndroid Build Coastguard Worker const rx::CLKernelImpl::WorkGroupInfo &info = mInfo.workGroups[index];
110*8975f5c5SAndroid Build Coastguard Worker
111*8975f5c5SAndroid Build Coastguard Worker const void *copyValue = nullptr;
112*8975f5c5SAndroid Build Coastguard Worker size_t copySize = 0u;
113*8975f5c5SAndroid Build Coastguard Worker
114*8975f5c5SAndroid Build Coastguard Worker switch (name)
115*8975f5c5SAndroid Build Coastguard Worker {
116*8975f5c5SAndroid Build Coastguard Worker case KernelWorkGroupInfo::GlobalWorkSize:
117*8975f5c5SAndroid Build Coastguard Worker copyValue = &info.globalWorkSize;
118*8975f5c5SAndroid Build Coastguard Worker copySize = sizeof(info.globalWorkSize);
119*8975f5c5SAndroid Build Coastguard Worker break;
120*8975f5c5SAndroid Build Coastguard Worker case KernelWorkGroupInfo::WorkGroupSize:
121*8975f5c5SAndroid Build Coastguard Worker copyValue = &info.workGroupSize;
122*8975f5c5SAndroid Build Coastguard Worker copySize = sizeof(info.workGroupSize);
123*8975f5c5SAndroid Build Coastguard Worker break;
124*8975f5c5SAndroid Build Coastguard Worker case KernelWorkGroupInfo::CompileWorkGroupSize:
125*8975f5c5SAndroid Build Coastguard Worker copyValue = &info.compileWorkGroupSize;
126*8975f5c5SAndroid Build Coastguard Worker copySize = sizeof(info.compileWorkGroupSize);
127*8975f5c5SAndroid Build Coastguard Worker break;
128*8975f5c5SAndroid Build Coastguard Worker case KernelWorkGroupInfo::LocalMemSize:
129*8975f5c5SAndroid Build Coastguard Worker copyValue = &info.localMemSize;
130*8975f5c5SAndroid Build Coastguard Worker copySize = sizeof(info.localMemSize);
131*8975f5c5SAndroid Build Coastguard Worker break;
132*8975f5c5SAndroid Build Coastguard Worker case KernelWorkGroupInfo::PreferredWorkGroupSizeMultiple:
133*8975f5c5SAndroid Build Coastguard Worker copyValue = &info.prefWorkGroupSizeMultiple;
134*8975f5c5SAndroid Build Coastguard Worker copySize = sizeof(info.prefWorkGroupSizeMultiple);
135*8975f5c5SAndroid Build Coastguard Worker break;
136*8975f5c5SAndroid Build Coastguard Worker case KernelWorkGroupInfo::PrivateMemSize:
137*8975f5c5SAndroid Build Coastguard Worker copyValue = &info.privateMemSize;
138*8975f5c5SAndroid Build Coastguard Worker copySize = sizeof(info.privateMemSize);
139*8975f5c5SAndroid Build Coastguard Worker break;
140*8975f5c5SAndroid Build Coastguard Worker default:
141*8975f5c5SAndroid Build Coastguard Worker ANGLE_CL_RETURN_ERROR(CL_INVALID_VALUE);
142*8975f5c5SAndroid Build Coastguard Worker }
143*8975f5c5SAndroid Build Coastguard Worker
144*8975f5c5SAndroid Build Coastguard Worker if (value != nullptr)
145*8975f5c5SAndroid Build Coastguard Worker {
146*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if size in bytes specified by param_value_size is < size of return type
147*8975f5c5SAndroid Build Coastguard Worker // as described in the Kernel Object Device Queries table and param_value is not NULL.
148*8975f5c5SAndroid Build Coastguard Worker if (valueSize < copySize)
149*8975f5c5SAndroid Build Coastguard Worker {
150*8975f5c5SAndroid Build Coastguard Worker ANGLE_CL_RETURN_ERROR(CL_INVALID_VALUE);
151*8975f5c5SAndroid Build Coastguard Worker }
152*8975f5c5SAndroid Build Coastguard Worker if (copyValue != nullptr)
153*8975f5c5SAndroid Build Coastguard Worker {
154*8975f5c5SAndroid Build Coastguard Worker std::memcpy(value, copyValue, copySize);
155*8975f5c5SAndroid Build Coastguard Worker }
156*8975f5c5SAndroid Build Coastguard Worker }
157*8975f5c5SAndroid Build Coastguard Worker if (valueSizeRet != nullptr)
158*8975f5c5SAndroid Build Coastguard Worker {
159*8975f5c5SAndroid Build Coastguard Worker *valueSizeRet = copySize;
160*8975f5c5SAndroid Build Coastguard Worker }
161*8975f5c5SAndroid Build Coastguard Worker return angle::Result::Continue;
162*8975f5c5SAndroid Build Coastguard Worker }
163*8975f5c5SAndroid Build Coastguard Worker
getArgInfo(cl_uint argIndex,KernelArgInfo name,size_t valueSize,void * value,size_t * valueSizeRet) const164*8975f5c5SAndroid Build Coastguard Worker angle::Result Kernel::getArgInfo(cl_uint argIndex,
165*8975f5c5SAndroid Build Coastguard Worker KernelArgInfo name,
166*8975f5c5SAndroid Build Coastguard Worker size_t valueSize,
167*8975f5c5SAndroid Build Coastguard Worker void *value,
168*8975f5c5SAndroid Build Coastguard Worker size_t *valueSizeRet) const
169*8975f5c5SAndroid Build Coastguard Worker {
170*8975f5c5SAndroid Build Coastguard Worker const rx::CLKernelImpl::ArgInfo &info = mInfo.args[argIndex];
171*8975f5c5SAndroid Build Coastguard Worker const void *copyValue = nullptr;
172*8975f5c5SAndroid Build Coastguard Worker size_t copySize = 0u;
173*8975f5c5SAndroid Build Coastguard Worker
174*8975f5c5SAndroid Build Coastguard Worker switch (name)
175*8975f5c5SAndroid Build Coastguard Worker {
176*8975f5c5SAndroid Build Coastguard Worker case KernelArgInfo::AddressQualifier:
177*8975f5c5SAndroid Build Coastguard Worker copyValue = &info.addressQualifier;
178*8975f5c5SAndroid Build Coastguard Worker copySize = sizeof(info.addressQualifier);
179*8975f5c5SAndroid Build Coastguard Worker break;
180*8975f5c5SAndroid Build Coastguard Worker case KernelArgInfo::AccessQualifier:
181*8975f5c5SAndroid Build Coastguard Worker copyValue = &info.accessQualifier;
182*8975f5c5SAndroid Build Coastguard Worker copySize = sizeof(info.accessQualifier);
183*8975f5c5SAndroid Build Coastguard Worker break;
184*8975f5c5SAndroid Build Coastguard Worker case KernelArgInfo::TypeName:
185*8975f5c5SAndroid Build Coastguard Worker copyValue = info.typeName.c_str();
186*8975f5c5SAndroid Build Coastguard Worker copySize = info.typeName.length() + 1u;
187*8975f5c5SAndroid Build Coastguard Worker break;
188*8975f5c5SAndroid Build Coastguard Worker case KernelArgInfo::TypeQualifier:
189*8975f5c5SAndroid Build Coastguard Worker copyValue = &info.typeQualifier;
190*8975f5c5SAndroid Build Coastguard Worker copySize = sizeof(info.typeQualifier);
191*8975f5c5SAndroid Build Coastguard Worker break;
192*8975f5c5SAndroid Build Coastguard Worker case KernelArgInfo::Name:
193*8975f5c5SAndroid Build Coastguard Worker copyValue = info.name.c_str();
194*8975f5c5SAndroid Build Coastguard Worker copySize = info.name.length() + 1u;
195*8975f5c5SAndroid Build Coastguard Worker break;
196*8975f5c5SAndroid Build Coastguard Worker default:
197*8975f5c5SAndroid Build Coastguard Worker ANGLE_CL_RETURN_ERROR(CL_INVALID_VALUE);
198*8975f5c5SAndroid Build Coastguard Worker }
199*8975f5c5SAndroid Build Coastguard Worker
200*8975f5c5SAndroid Build Coastguard Worker if (value != nullptr)
201*8975f5c5SAndroid Build Coastguard Worker {
202*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if size in bytes specified by param_value size is < size of return type
203*8975f5c5SAndroid Build Coastguard Worker // as described in the Kernel Argument Queries table and param_value is not NULL.
204*8975f5c5SAndroid Build Coastguard Worker if (valueSize < copySize)
205*8975f5c5SAndroid Build Coastguard Worker {
206*8975f5c5SAndroid Build Coastguard Worker ANGLE_CL_RETURN_ERROR(CL_INVALID_VALUE);
207*8975f5c5SAndroid Build Coastguard Worker }
208*8975f5c5SAndroid Build Coastguard Worker if (copyValue != nullptr)
209*8975f5c5SAndroid Build Coastguard Worker {
210*8975f5c5SAndroid Build Coastguard Worker std::memcpy(value, copyValue, copySize);
211*8975f5c5SAndroid Build Coastguard Worker }
212*8975f5c5SAndroid Build Coastguard Worker }
213*8975f5c5SAndroid Build Coastguard Worker if (valueSizeRet != nullptr)
214*8975f5c5SAndroid Build Coastguard Worker {
215*8975f5c5SAndroid Build Coastguard Worker *valueSizeRet = copySize;
216*8975f5c5SAndroid Build Coastguard Worker }
217*8975f5c5SAndroid Build Coastguard Worker return angle::Result::Continue;
218*8975f5c5SAndroid Build Coastguard Worker }
219*8975f5c5SAndroid Build Coastguard Worker
clone() const220*8975f5c5SAndroid Build Coastguard Worker Kernel *Kernel::clone() const
221*8975f5c5SAndroid Build Coastguard Worker {
222*8975f5c5SAndroid Build Coastguard Worker cl_kernel kernel = mProgram->createKernel(getName().c_str());
223*8975f5c5SAndroid Build Coastguard Worker
224*8975f5c5SAndroid Build Coastguard Worker for (KernelArg arg : mSetArguments)
225*8975f5c5SAndroid Build Coastguard Worker {
226*8975f5c5SAndroid Build Coastguard Worker if (arg.isSet && IsError(kernel->cast<Kernel>().setArg(arg.index, arg.size, arg.valuePtr)))
227*8975f5c5SAndroid Build Coastguard Worker {
228*8975f5c5SAndroid Build Coastguard Worker ANGLE_CL_SET_ERROR(CL_OUT_OF_RESOURCES);
229*8975f5c5SAndroid Build Coastguard Worker return nullptr;
230*8975f5c5SAndroid Build Coastguard Worker }
231*8975f5c5SAndroid Build Coastguard Worker }
232*8975f5c5SAndroid Build Coastguard Worker return &kernel->cast<Kernel>();
233*8975f5c5SAndroid Build Coastguard Worker }
234*8975f5c5SAndroid Build Coastguard Worker
~Kernel()235*8975f5c5SAndroid Build Coastguard Worker Kernel::~Kernel()
236*8975f5c5SAndroid Build Coastguard Worker {
237*8975f5c5SAndroid Build Coastguard Worker --mProgram->mNumAttachedKernels;
238*8975f5c5SAndroid Build Coastguard Worker }
239*8975f5c5SAndroid Build Coastguard Worker
Kernel(Program & program,const char * name)240*8975f5c5SAndroid Build Coastguard Worker Kernel::Kernel(Program &program, const char *name) : mProgram(&program), mImpl(nullptr)
241*8975f5c5SAndroid Build Coastguard Worker {
242*8975f5c5SAndroid Build Coastguard Worker if (!IsError(program.getImpl().createKernel(*this, name, &mImpl)))
243*8975f5c5SAndroid Build Coastguard Worker {
244*8975f5c5SAndroid Build Coastguard Worker initImpl();
245*8975f5c5SAndroid Build Coastguard Worker }
246*8975f5c5SAndroid Build Coastguard Worker }
247*8975f5c5SAndroid Build Coastguard Worker
Kernel(Program & program,const rx::CLKernelImpl::CreateFunc & createFunc)248*8975f5c5SAndroid Build Coastguard Worker Kernel::Kernel(Program &program, const rx::CLKernelImpl::CreateFunc &createFunc)
249*8975f5c5SAndroid Build Coastguard Worker : mProgram(&program), mImpl(createFunc(*this))
250*8975f5c5SAndroid Build Coastguard Worker {
251*8975f5c5SAndroid Build Coastguard Worker if (mImpl)
252*8975f5c5SAndroid Build Coastguard Worker {
253*8975f5c5SAndroid Build Coastguard Worker initImpl();
254*8975f5c5SAndroid Build Coastguard Worker }
255*8975f5c5SAndroid Build Coastguard Worker }
256*8975f5c5SAndroid Build Coastguard Worker
initImpl()257*8975f5c5SAndroid Build Coastguard Worker void Kernel::initImpl()
258*8975f5c5SAndroid Build Coastguard Worker {
259*8975f5c5SAndroid Build Coastguard Worker ANGLE_CL_IMPL_TRY(mImpl->createInfo(&mInfo));
260*8975f5c5SAndroid Build Coastguard Worker
261*8975f5c5SAndroid Build Coastguard Worker mSetArguments.resize(mInfo.numArgs);
262*8975f5c5SAndroid Build Coastguard Worker std::fill(mSetArguments.begin(), mSetArguments.end(), KernelArg{false, 0, 0, 0});
263*8975f5c5SAndroid Build Coastguard Worker
264*8975f5c5SAndroid Build Coastguard Worker ++mProgram->mNumAttachedKernels;
265*8975f5c5SAndroid Build Coastguard Worker }
266*8975f5c5SAndroid Build Coastguard Worker
267*8975f5c5SAndroid Build Coastguard Worker } // namespace cl
268