xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/cl/CLContextCL.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 // CLContextCL.cpp: Implements the class methods for CLContextCL.
7*8975f5c5SAndroid Build Coastguard Worker 
8*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/cl/CLContextCL.h"
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/cl/CLCommandQueueCL.h"
11*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/cl/CLDeviceCL.h"
12*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/cl/CLEventCL.h"
13*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/cl/CLMemoryCL.h"
14*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/cl/CLPlatformCL.h"
15*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/cl/CLProgramCL.h"
16*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/cl/CLSamplerCL.h"
17*8975f5c5SAndroid Build Coastguard Worker 
18*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/CLBuffer.h"
19*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/CLCommandQueue.h"
20*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/CLContext.h"
21*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/CLDevice.h"
22*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/CLEvent.h"
23*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/CLImage.h"
24*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/CLMemory.h"
25*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/CLPlatform.h"
26*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/CLProgram.h"
27*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/CLSampler.h"
28*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/cl_utils.h"
29*8975f5c5SAndroid Build Coastguard Worker 
30*8975f5c5SAndroid Build Coastguard Worker namespace rx
31*8975f5c5SAndroid Build Coastguard Worker {
32*8975f5c5SAndroid Build Coastguard Worker 
CLContextCL(const cl::Context & context,cl_context native)33*8975f5c5SAndroid Build Coastguard Worker CLContextCL::CLContextCL(const cl::Context &context, cl_context native)
34*8975f5c5SAndroid Build Coastguard Worker     : CLContextImpl(context), mNative(native)
35*8975f5c5SAndroid Build Coastguard Worker {}
36*8975f5c5SAndroid Build Coastguard Worker 
~CLContextCL()37*8975f5c5SAndroid Build Coastguard Worker CLContextCL::~CLContextCL()
38*8975f5c5SAndroid Build Coastguard Worker {
39*8975f5c5SAndroid Build Coastguard Worker     if (mNative->getDispatch().clReleaseContext(mNative) != CL_SUCCESS)
40*8975f5c5SAndroid Build Coastguard Worker     {
41*8975f5c5SAndroid Build Coastguard Worker         ERR() << "Error while releasing CL context";
42*8975f5c5SAndroid Build Coastguard Worker     }
43*8975f5c5SAndroid Build Coastguard Worker }
44*8975f5c5SAndroid Build Coastguard Worker 
getDevices(cl::DevicePtrs * devicePtrsOut) const45*8975f5c5SAndroid Build Coastguard Worker angle::Result CLContextCL::getDevices(cl::DevicePtrs *devicePtrsOut) const
46*8975f5c5SAndroid Build Coastguard Worker {
47*8975f5c5SAndroid Build Coastguard Worker     size_t valueSize = 0u;
48*8975f5c5SAndroid Build Coastguard Worker     ANGLE_CL_TRY(mNative->getDispatch().clGetContextInfo(mNative, CL_CONTEXT_DEVICES, 0u, nullptr,
49*8975f5c5SAndroid Build Coastguard Worker                                                          &valueSize));
50*8975f5c5SAndroid Build Coastguard Worker     if ((valueSize % sizeof(cl_device_id)) == 0u)
51*8975f5c5SAndroid Build Coastguard Worker     {
52*8975f5c5SAndroid Build Coastguard Worker         std::vector<cl_device_id> nativeDevices(valueSize / sizeof(cl_device_id), nullptr);
53*8975f5c5SAndroid Build Coastguard Worker         ANGLE_CL_TRY(mNative->getDispatch().clGetContextInfo(mNative, CL_CONTEXT_DEVICES, valueSize,
54*8975f5c5SAndroid Build Coastguard Worker                                                              nativeDevices.data(), nullptr));
55*8975f5c5SAndroid Build Coastguard Worker         const cl::DevicePtrs &platformDevices = mContext.getPlatform().getDevices();
56*8975f5c5SAndroid Build Coastguard Worker         devicePtrsOut->reserve(nativeDevices.size());
57*8975f5c5SAndroid Build Coastguard Worker         for (cl_device_id nativeDevice : nativeDevices)
58*8975f5c5SAndroid Build Coastguard Worker         {
59*8975f5c5SAndroid Build Coastguard Worker             auto it = platformDevices.cbegin();
60*8975f5c5SAndroid Build Coastguard Worker             while (it != platformDevices.cend() &&
61*8975f5c5SAndroid Build Coastguard Worker                    (*it)->getImpl<CLDeviceCL>().getNative() != nativeDevice)
62*8975f5c5SAndroid Build Coastguard Worker             {
63*8975f5c5SAndroid Build Coastguard Worker                 ++it;
64*8975f5c5SAndroid Build Coastguard Worker             }
65*8975f5c5SAndroid Build Coastguard Worker             if (it != platformDevices.cend())
66*8975f5c5SAndroid Build Coastguard Worker             {
67*8975f5c5SAndroid Build Coastguard Worker                 devicePtrsOut->emplace_back(it->get());
68*8975f5c5SAndroid Build Coastguard Worker             }
69*8975f5c5SAndroid Build Coastguard Worker             else
70*8975f5c5SAndroid Build Coastguard Worker             {
71*8975f5c5SAndroid Build Coastguard Worker                 ASSERT(false);
72*8975f5c5SAndroid Build Coastguard Worker                 ERR() << "Device not found in platform list";
73*8975f5c5SAndroid Build Coastguard Worker                 ANGLE_CL_RETURN_ERROR(CL_INVALID_DEVICE);
74*8975f5c5SAndroid Build Coastguard Worker             }
75*8975f5c5SAndroid Build Coastguard Worker         }
76*8975f5c5SAndroid Build Coastguard Worker         return angle::Result::Continue;
77*8975f5c5SAndroid Build Coastguard Worker     }
78*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
79*8975f5c5SAndroid Build Coastguard Worker }
80*8975f5c5SAndroid Build Coastguard Worker 
createCommandQueue(const cl::CommandQueue & commandQueue,CLCommandQueueImpl::Ptr * commandQueueOut)81*8975f5c5SAndroid Build Coastguard Worker angle::Result CLContextCL::createCommandQueue(const cl::CommandQueue &commandQueue,
82*8975f5c5SAndroid Build Coastguard Worker                                               CLCommandQueueImpl::Ptr *commandQueueOut)
83*8975f5c5SAndroid Build Coastguard Worker {
84*8975f5c5SAndroid Build Coastguard Worker     cl_int errorCode                = CL_SUCCESS;
85*8975f5c5SAndroid Build Coastguard Worker     const cl::Device &device        = commandQueue.getDevice();
86*8975f5c5SAndroid Build Coastguard Worker     const cl_device_id nativeDevice = device.getImpl<CLDeviceCL>().getNative();
87*8975f5c5SAndroid Build Coastguard Worker     cl_command_queue nativeQueue    = nullptr;
88*8975f5c5SAndroid Build Coastguard Worker 
89*8975f5c5SAndroid Build Coastguard Worker     if (!device.isVersionOrNewer(2u, 0u))
90*8975f5c5SAndroid Build Coastguard Worker     {
91*8975f5c5SAndroid Build Coastguard Worker         nativeQueue = mNative->getDispatch().clCreateCommandQueue(
92*8975f5c5SAndroid Build Coastguard Worker             mNative, nativeDevice, commandQueue.getProperties().get(), &errorCode);
93*8975f5c5SAndroid Build Coastguard Worker     }
94*8975f5c5SAndroid Build Coastguard Worker     else
95*8975f5c5SAndroid Build Coastguard Worker     {
96*8975f5c5SAndroid Build Coastguard Worker         const cl_queue_properties propArray[] = {
97*8975f5c5SAndroid Build Coastguard Worker             CL_QUEUE_PROPERTIES, commandQueue.getProperties().get(),
98*8975f5c5SAndroid Build Coastguard Worker             commandQueue.hasSize() ? CL_QUEUE_SIZE : 0u, commandQueue.getSize(), 0u};
99*8975f5c5SAndroid Build Coastguard Worker         nativeQueue = mNative->getDispatch().clCreateCommandQueueWithProperties(
100*8975f5c5SAndroid Build Coastguard Worker             mNative, nativeDevice, propArray, &errorCode);
101*8975f5c5SAndroid Build Coastguard Worker     }
102*8975f5c5SAndroid Build Coastguard Worker     ANGLE_CL_TRY(errorCode);
103*8975f5c5SAndroid Build Coastguard Worker 
104*8975f5c5SAndroid Build Coastguard Worker     *commandQueueOut = CLCommandQueueImpl::Ptr(
105*8975f5c5SAndroid Build Coastguard Worker         nativeQueue != nullptr ? new CLCommandQueueCL(commandQueue, nativeQueue) : nullptr);
106*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
107*8975f5c5SAndroid Build Coastguard Worker }
108*8975f5c5SAndroid Build Coastguard Worker 
createBuffer(const cl::Buffer & buffer,void * hostPtr,CLMemoryImpl::Ptr * bufferOut)109*8975f5c5SAndroid Build Coastguard Worker angle::Result CLContextCL::createBuffer(const cl::Buffer &buffer,
110*8975f5c5SAndroid Build Coastguard Worker                                         void *hostPtr,
111*8975f5c5SAndroid Build Coastguard Worker                                         CLMemoryImpl::Ptr *bufferOut)
112*8975f5c5SAndroid Build Coastguard Worker {
113*8975f5c5SAndroid Build Coastguard Worker     cl_int errorCode    = CL_SUCCESS;
114*8975f5c5SAndroid Build Coastguard Worker     cl_mem nativeBuffer = nullptr;
115*8975f5c5SAndroid Build Coastguard Worker 
116*8975f5c5SAndroid Build Coastguard Worker     if (buffer.getProperties().empty())
117*8975f5c5SAndroid Build Coastguard Worker     {
118*8975f5c5SAndroid Build Coastguard Worker         nativeBuffer = mNative->getDispatch().clCreateBuffer(mNative, buffer.getFlags().get(),
119*8975f5c5SAndroid Build Coastguard Worker                                                              buffer.getSize(), hostPtr, &errorCode);
120*8975f5c5SAndroid Build Coastguard Worker     }
121*8975f5c5SAndroid Build Coastguard Worker     else
122*8975f5c5SAndroid Build Coastguard Worker     {
123*8975f5c5SAndroid Build Coastguard Worker         nativeBuffer = mNative->getDispatch().clCreateBufferWithProperties(
124*8975f5c5SAndroid Build Coastguard Worker             mNative, buffer.getProperties().data(), buffer.getFlags().get(), buffer.getSize(),
125*8975f5c5SAndroid Build Coastguard Worker             hostPtr, &errorCode);
126*8975f5c5SAndroid Build Coastguard Worker     }
127*8975f5c5SAndroid Build Coastguard Worker     ANGLE_CL_TRY(errorCode);
128*8975f5c5SAndroid Build Coastguard Worker 
129*8975f5c5SAndroid Build Coastguard Worker     *bufferOut =
130*8975f5c5SAndroid Build Coastguard Worker         CLMemoryImpl::Ptr(nativeBuffer != nullptr ? new CLMemoryCL(buffer, nativeBuffer) : nullptr);
131*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
132*8975f5c5SAndroid Build Coastguard Worker }
133*8975f5c5SAndroid Build Coastguard Worker 
createImage(const cl::Image & image,void * hostPtr,CLMemoryImpl::Ptr * imageOut)134*8975f5c5SAndroid Build Coastguard Worker angle::Result CLContextCL::createImage(const cl::Image &image,
135*8975f5c5SAndroid Build Coastguard Worker                                        void *hostPtr,
136*8975f5c5SAndroid Build Coastguard Worker                                        CLMemoryImpl::Ptr *imageOut)
137*8975f5c5SAndroid Build Coastguard Worker {
138*8975f5c5SAndroid Build Coastguard Worker     cl_int errorCode         = CL_SUCCESS;
139*8975f5c5SAndroid Build Coastguard Worker     cl_mem nativeImage       = nullptr;
140*8975f5c5SAndroid Build Coastguard Worker     cl::ImageDescriptor desc = image.getDescriptor();
141*8975f5c5SAndroid Build Coastguard Worker     cl::MemFlags flags       = image.getFlags();
142*8975f5c5SAndroid Build Coastguard Worker     cl_image_format format   = image.getFormat();
143*8975f5c5SAndroid Build Coastguard Worker 
144*8975f5c5SAndroid Build Coastguard Worker     if (mContext.getPlatform().isVersionOrNewer(1u, 2u))
145*8975f5c5SAndroid Build Coastguard Worker     {
146*8975f5c5SAndroid Build Coastguard Worker         const cl_mem_object_type nativeType = cl::ToCLenum(desc.type);
147*8975f5c5SAndroid Build Coastguard Worker         const cl_mem nativeParent =
148*8975f5c5SAndroid Build Coastguard Worker             image.getParent() ? image.getParent()->getImpl<CLMemoryCL>().getNative() : nullptr;
149*8975f5c5SAndroid Build Coastguard Worker         const cl_image_desc nativeDesc = {
150*8975f5c5SAndroid Build Coastguard Worker             nativeType,    desc.width,      desc.height,       desc.depth,      desc.arraySize,
151*8975f5c5SAndroid Build Coastguard Worker             desc.rowPitch, desc.slicePitch, desc.numMipLevels, desc.numSamples, {nativeParent}};
152*8975f5c5SAndroid Build Coastguard Worker 
153*8975f5c5SAndroid Build Coastguard Worker         if (image.getProperties().empty())
154*8975f5c5SAndroid Build Coastguard Worker         {
155*8975f5c5SAndroid Build Coastguard Worker             nativeImage = mNative->getDispatch().clCreateImage(mNative, flags.get(), &format,
156*8975f5c5SAndroid Build Coastguard Worker                                                                &nativeDesc, hostPtr, &errorCode);
157*8975f5c5SAndroid Build Coastguard Worker         }
158*8975f5c5SAndroid Build Coastguard Worker         else
159*8975f5c5SAndroid Build Coastguard Worker         {
160*8975f5c5SAndroid Build Coastguard Worker             nativeImage = mNative->getDispatch().clCreateImageWithProperties(
161*8975f5c5SAndroid Build Coastguard Worker                 mNative, image.getProperties().data(), flags.get(), &format, &nativeDesc, hostPtr,
162*8975f5c5SAndroid Build Coastguard Worker                 &errorCode);
163*8975f5c5SAndroid Build Coastguard Worker         }
164*8975f5c5SAndroid Build Coastguard Worker     }
165*8975f5c5SAndroid Build Coastguard Worker     else
166*8975f5c5SAndroid Build Coastguard Worker     {
167*8975f5c5SAndroid Build Coastguard Worker         switch (desc.type)
168*8975f5c5SAndroid Build Coastguard Worker         {
169*8975f5c5SAndroid Build Coastguard Worker             case cl::MemObjectType::Image2D:
170*8975f5c5SAndroid Build Coastguard Worker                 nativeImage = mNative->getDispatch().clCreateImage2D(
171*8975f5c5SAndroid Build Coastguard Worker                     mNative, flags.get(), &format, desc.width, desc.height, desc.rowPitch, hostPtr,
172*8975f5c5SAndroid Build Coastguard Worker                     &errorCode);
173*8975f5c5SAndroid Build Coastguard Worker                 break;
174*8975f5c5SAndroid Build Coastguard Worker             case cl::MemObjectType::Image3D:
175*8975f5c5SAndroid Build Coastguard Worker                 nativeImage = mNative->getDispatch().clCreateImage3D(
176*8975f5c5SAndroid Build Coastguard Worker                     mNative, flags.get(), &format, desc.width, desc.height, desc.depth,
177*8975f5c5SAndroid Build Coastguard Worker                     desc.rowPitch, desc.slicePitch, hostPtr, &errorCode);
178*8975f5c5SAndroid Build Coastguard Worker                 break;
179*8975f5c5SAndroid Build Coastguard Worker             default:
180*8975f5c5SAndroid Build Coastguard Worker                 ASSERT(false);
181*8975f5c5SAndroid Build Coastguard Worker                 ERR() << "Failed to create unsupported image type";
182*8975f5c5SAndroid Build Coastguard Worker                 break;
183*8975f5c5SAndroid Build Coastguard Worker         }
184*8975f5c5SAndroid Build Coastguard Worker     }
185*8975f5c5SAndroid Build Coastguard Worker     ANGLE_CL_TRY(errorCode);
186*8975f5c5SAndroid Build Coastguard Worker 
187*8975f5c5SAndroid Build Coastguard Worker     *imageOut =
188*8975f5c5SAndroid Build Coastguard Worker         CLMemoryImpl::Ptr(nativeImage != nullptr ? new CLMemoryCL(image, nativeImage) : nullptr);
189*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
190*8975f5c5SAndroid Build Coastguard Worker }
191*8975f5c5SAndroid Build Coastguard Worker 
getSupportedImageFormats(cl::MemFlags flags,cl::MemObjectType imageType,cl_uint numEntries,cl_image_format * imageFormats,cl_uint * numImageFormats)192*8975f5c5SAndroid Build Coastguard Worker angle::Result CLContextCL::getSupportedImageFormats(cl::MemFlags flags,
193*8975f5c5SAndroid Build Coastguard Worker                                                     cl::MemObjectType imageType,
194*8975f5c5SAndroid Build Coastguard Worker                                                     cl_uint numEntries,
195*8975f5c5SAndroid Build Coastguard Worker                                                     cl_image_format *imageFormats,
196*8975f5c5SAndroid Build Coastguard Worker                                                     cl_uint *numImageFormats)
197*8975f5c5SAndroid Build Coastguard Worker {
198*8975f5c5SAndroid Build Coastguard Worker     // Fetch available image formats for given flags and image type.
199*8975f5c5SAndroid Build Coastguard Worker     cl_uint numFormats = 0u;
200*8975f5c5SAndroid Build Coastguard Worker     ANGLE_CL_TRY(mNative->getDispatch().clGetSupportedImageFormats(
201*8975f5c5SAndroid Build Coastguard Worker         mNative, flags.get(), cl::ToCLenum(imageType), 0u, nullptr, &numFormats));
202*8975f5c5SAndroid Build Coastguard Worker     std::vector<cl_image_format> formats(numFormats);
203*8975f5c5SAndroid Build Coastguard Worker     ANGLE_CL_TRY(mNative->getDispatch().clGetSupportedImageFormats(
204*8975f5c5SAndroid Build Coastguard Worker         mNative, flags.get(), cl::ToCLenum(imageType), numFormats, formats.data(), nullptr));
205*8975f5c5SAndroid Build Coastguard Worker 
206*8975f5c5SAndroid Build Coastguard Worker     // Filter out formats which are not supported by front end.
207*8975f5c5SAndroid Build Coastguard Worker     const CLPlatformImpl::Info &info = mContext.getPlatform().getInfo();
208*8975f5c5SAndroid Build Coastguard Worker     std::vector<cl_image_format> supportedFormats;
209*8975f5c5SAndroid Build Coastguard Worker     supportedFormats.reserve(formats.size());
210*8975f5c5SAndroid Build Coastguard Worker     std::copy_if(
211*8975f5c5SAndroid Build Coastguard Worker         formats.cbegin(), formats.cend(), std::back_inserter(supportedFormats),
212*8975f5c5SAndroid Build Coastguard Worker         [&](const cl_image_format &format) { return cl::IsValidImageFormat(&format, info); });
213*8975f5c5SAndroid Build Coastguard Worker 
214*8975f5c5SAndroid Build Coastguard Worker     if (imageFormats != nullptr)
215*8975f5c5SAndroid Build Coastguard Worker     {
216*8975f5c5SAndroid Build Coastguard Worker         auto formatIt = supportedFormats.cbegin();
217*8975f5c5SAndroid Build Coastguard Worker         while (numEntries-- != 0u && formatIt != supportedFormats.cend())
218*8975f5c5SAndroid Build Coastguard Worker         {
219*8975f5c5SAndroid Build Coastguard Worker             *imageFormats++ = *formatIt++;
220*8975f5c5SAndroid Build Coastguard Worker         }
221*8975f5c5SAndroid Build Coastguard Worker     }
222*8975f5c5SAndroid Build Coastguard Worker     if (numImageFormats != nullptr)
223*8975f5c5SAndroid Build Coastguard Worker     {
224*8975f5c5SAndroid Build Coastguard Worker         *numImageFormats = static_cast<cl_uint>(supportedFormats.size());
225*8975f5c5SAndroid Build Coastguard Worker     }
226*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
227*8975f5c5SAndroid Build Coastguard Worker }
228*8975f5c5SAndroid Build Coastguard Worker 
createSampler(const cl::Sampler & sampler,CLSamplerImpl::Ptr * samplerOut)229*8975f5c5SAndroid Build Coastguard Worker angle::Result CLContextCL::createSampler(const cl::Sampler &sampler, CLSamplerImpl::Ptr *samplerOut)
230*8975f5c5SAndroid Build Coastguard Worker {
231*8975f5c5SAndroid Build Coastguard Worker     cl_int errorCode         = CL_SUCCESS;
232*8975f5c5SAndroid Build Coastguard Worker     cl_sampler nativeSampler = nullptr;
233*8975f5c5SAndroid Build Coastguard Worker 
234*8975f5c5SAndroid Build Coastguard Worker     if (!mContext.getPlatform().isVersionOrNewer(2u, 0u))
235*8975f5c5SAndroid Build Coastguard Worker     {
236*8975f5c5SAndroid Build Coastguard Worker         nativeSampler = mNative->getDispatch().clCreateSampler(
237*8975f5c5SAndroid Build Coastguard Worker             mNative, sampler.getNormalizedCoords(), cl::ToCLenum(sampler.getAddressingMode()),
238*8975f5c5SAndroid Build Coastguard Worker             cl::ToCLenum(sampler.getFilterMode()), &errorCode);
239*8975f5c5SAndroid Build Coastguard Worker     }
240*8975f5c5SAndroid Build Coastguard Worker     else if (!sampler.getProperties().empty())
241*8975f5c5SAndroid Build Coastguard Worker     {
242*8975f5c5SAndroid Build Coastguard Worker         nativeSampler = mNative->getDispatch().clCreateSamplerWithProperties(
243*8975f5c5SAndroid Build Coastguard Worker             mNative, sampler.getProperties().data(), &errorCode);
244*8975f5c5SAndroid Build Coastguard Worker     }
245*8975f5c5SAndroid Build Coastguard Worker     else
246*8975f5c5SAndroid Build Coastguard Worker     {
247*8975f5c5SAndroid Build Coastguard Worker         const cl_sampler_properties propArray[] = {CL_SAMPLER_NORMALIZED_COORDS,
248*8975f5c5SAndroid Build Coastguard Worker                                                    sampler.getNormalizedCoords(),
249*8975f5c5SAndroid Build Coastguard Worker                                                    CL_SAMPLER_ADDRESSING_MODE,
250*8975f5c5SAndroid Build Coastguard Worker                                                    cl::ToCLenum(sampler.getAddressingMode()),
251*8975f5c5SAndroid Build Coastguard Worker                                                    CL_SAMPLER_FILTER_MODE,
252*8975f5c5SAndroid Build Coastguard Worker                                                    cl::ToCLenum(sampler.getFilterMode()),
253*8975f5c5SAndroid Build Coastguard Worker                                                    0u};
254*8975f5c5SAndroid Build Coastguard Worker         nativeSampler =
255*8975f5c5SAndroid Build Coastguard Worker             mNative->getDispatch().clCreateSamplerWithProperties(mNative, propArray, &errorCode);
256*8975f5c5SAndroid Build Coastguard Worker     }
257*8975f5c5SAndroid Build Coastguard Worker     ANGLE_CL_TRY(errorCode);
258*8975f5c5SAndroid Build Coastguard Worker 
259*8975f5c5SAndroid Build Coastguard Worker     *samplerOut = CLSamplerImpl::Ptr(
260*8975f5c5SAndroid Build Coastguard Worker         nativeSampler != nullptr ? new CLSamplerCL(sampler, nativeSampler) : nullptr);
261*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
262*8975f5c5SAndroid Build Coastguard Worker }
263*8975f5c5SAndroid Build Coastguard Worker 
createProgramWithSource(const cl::Program & program,const std::string & source,CLProgramImpl::Ptr * programOut)264*8975f5c5SAndroid Build Coastguard Worker angle::Result CLContextCL::createProgramWithSource(const cl::Program &program,
265*8975f5c5SAndroid Build Coastguard Worker                                                    const std::string &source,
266*8975f5c5SAndroid Build Coastguard Worker                                                    CLProgramImpl::Ptr *programOut)
267*8975f5c5SAndroid Build Coastguard Worker {
268*8975f5c5SAndroid Build Coastguard Worker     cl_int errorCode      = CL_SUCCESS;
269*8975f5c5SAndroid Build Coastguard Worker     const char *sourceStr = source.c_str();
270*8975f5c5SAndroid Build Coastguard Worker     const size_t length   = source.length();
271*8975f5c5SAndroid Build Coastguard Worker 
272*8975f5c5SAndroid Build Coastguard Worker     const cl_program nativeProgram = mNative->getDispatch().clCreateProgramWithSource(
273*8975f5c5SAndroid Build Coastguard Worker         mNative, 1u, &sourceStr, &length, &errorCode);
274*8975f5c5SAndroid Build Coastguard Worker     ANGLE_CL_TRY(errorCode);
275*8975f5c5SAndroid Build Coastguard Worker 
276*8975f5c5SAndroid Build Coastguard Worker     *programOut = CLProgramImpl::Ptr(
277*8975f5c5SAndroid Build Coastguard Worker         nativeProgram != nullptr ? new CLProgramCL(program, nativeProgram) : nullptr);
278*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
279*8975f5c5SAndroid Build Coastguard Worker }
280*8975f5c5SAndroid Build Coastguard Worker 
createProgramWithIL(const cl::Program & program,const void * il,size_t length,CLProgramImpl::Ptr * programOut)281*8975f5c5SAndroid Build Coastguard Worker angle::Result CLContextCL::createProgramWithIL(const cl::Program &program,
282*8975f5c5SAndroid Build Coastguard Worker                                                const void *il,
283*8975f5c5SAndroid Build Coastguard Worker                                                size_t length,
284*8975f5c5SAndroid Build Coastguard Worker                                                CLProgramImpl::Ptr *programOut)
285*8975f5c5SAndroid Build Coastguard Worker {
286*8975f5c5SAndroid Build Coastguard Worker     cl_int errorCode = CL_SUCCESS;
287*8975f5c5SAndroid Build Coastguard Worker 
288*8975f5c5SAndroid Build Coastguard Worker     const cl_program nativeProgram =
289*8975f5c5SAndroid Build Coastguard Worker         mNative->getDispatch().clCreateProgramWithIL(mNative, il, length, &errorCode);
290*8975f5c5SAndroid Build Coastguard Worker     ANGLE_CL_TRY(errorCode);
291*8975f5c5SAndroid Build Coastguard Worker 
292*8975f5c5SAndroid Build Coastguard Worker     *programOut = CLProgramImpl::Ptr(
293*8975f5c5SAndroid Build Coastguard Worker         nativeProgram != nullptr ? new CLProgramCL(program, nativeProgram) : nullptr);
294*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
295*8975f5c5SAndroid Build Coastguard Worker }
296*8975f5c5SAndroid Build Coastguard Worker 
createProgramWithBinary(const cl::Program & program,const size_t * lengths,const unsigned char ** binaries,cl_int * binaryStatus,CLProgramImpl::Ptr * programOut)297*8975f5c5SAndroid Build Coastguard Worker angle::Result CLContextCL::createProgramWithBinary(const cl::Program &program,
298*8975f5c5SAndroid Build Coastguard Worker                                                    const size_t *lengths,
299*8975f5c5SAndroid Build Coastguard Worker                                                    const unsigned char **binaries,
300*8975f5c5SAndroid Build Coastguard Worker                                                    cl_int *binaryStatus,
301*8975f5c5SAndroid Build Coastguard Worker                                                    CLProgramImpl::Ptr *programOut)
302*8975f5c5SAndroid Build Coastguard Worker {
303*8975f5c5SAndroid Build Coastguard Worker     cl_int errorCode = CL_SUCCESS;
304*8975f5c5SAndroid Build Coastguard Worker     std::vector<cl_device_id> nativeDevices;
305*8975f5c5SAndroid Build Coastguard Worker     for (const cl::DevicePtr &device : program.getDevices())
306*8975f5c5SAndroid Build Coastguard Worker     {
307*8975f5c5SAndroid Build Coastguard Worker         nativeDevices.emplace_back(device->getImpl<CLDeviceCL>().getNative());
308*8975f5c5SAndroid Build Coastguard Worker     }
309*8975f5c5SAndroid Build Coastguard Worker 
310*8975f5c5SAndroid Build Coastguard Worker     cl_program nativeProgram = mNative->getDispatch().clCreateProgramWithBinary(
311*8975f5c5SAndroid Build Coastguard Worker         mNative, static_cast<cl_uint>(nativeDevices.size()), nativeDevices.data(), lengths,
312*8975f5c5SAndroid Build Coastguard Worker         binaries, binaryStatus, &errorCode);
313*8975f5c5SAndroid Build Coastguard Worker     ANGLE_CL_TRY(errorCode);
314*8975f5c5SAndroid Build Coastguard Worker 
315*8975f5c5SAndroid Build Coastguard Worker     *programOut = CLProgramImpl::Ptr(
316*8975f5c5SAndroid Build Coastguard Worker         nativeProgram != nullptr ? new CLProgramCL(program, nativeProgram) : nullptr);
317*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
318*8975f5c5SAndroid Build Coastguard Worker }
319*8975f5c5SAndroid Build Coastguard Worker 
createProgramWithBuiltInKernels(const cl::Program & program,const char * kernel_names,CLProgramImpl::Ptr * programOut)320*8975f5c5SAndroid Build Coastguard Worker angle::Result CLContextCL::createProgramWithBuiltInKernels(const cl::Program &program,
321*8975f5c5SAndroid Build Coastguard Worker                                                            const char *kernel_names,
322*8975f5c5SAndroid Build Coastguard Worker                                                            CLProgramImpl::Ptr *programOut)
323*8975f5c5SAndroid Build Coastguard Worker {
324*8975f5c5SAndroid Build Coastguard Worker     cl_int errorCode = CL_SUCCESS;
325*8975f5c5SAndroid Build Coastguard Worker     std::vector<cl_device_id> nativeDevices;
326*8975f5c5SAndroid Build Coastguard Worker     for (const cl::DevicePtr &device : program.getDevices())
327*8975f5c5SAndroid Build Coastguard Worker     {
328*8975f5c5SAndroid Build Coastguard Worker         nativeDevices.emplace_back(device->getImpl<CLDeviceCL>().getNative());
329*8975f5c5SAndroid Build Coastguard Worker     }
330*8975f5c5SAndroid Build Coastguard Worker 
331*8975f5c5SAndroid Build Coastguard Worker     const cl_program nativeProgram = mNative->getDispatch().clCreateProgramWithBuiltInKernels(
332*8975f5c5SAndroid Build Coastguard Worker         mNative, static_cast<cl_uint>(nativeDevices.size()), nativeDevices.data(), kernel_names,
333*8975f5c5SAndroid Build Coastguard Worker         &errorCode);
334*8975f5c5SAndroid Build Coastguard Worker     ANGLE_CL_TRY(errorCode);
335*8975f5c5SAndroid Build Coastguard Worker 
336*8975f5c5SAndroid Build Coastguard Worker     *programOut = CLProgramImpl::Ptr(
337*8975f5c5SAndroid Build Coastguard Worker         nativeProgram != nullptr ? new CLProgramCL(program, nativeProgram) : nullptr);
338*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
339*8975f5c5SAndroid Build Coastguard Worker }
340*8975f5c5SAndroid Build Coastguard Worker 
linkProgram(const cl::Program & program,const cl::DevicePtrs & devices,const char * options,const cl::ProgramPtrs & inputPrograms,cl::Program * notify,CLProgramImpl::Ptr * programOut)341*8975f5c5SAndroid Build Coastguard Worker angle::Result CLContextCL::linkProgram(const cl::Program &program,
342*8975f5c5SAndroid Build Coastguard Worker                                        const cl::DevicePtrs &devices,
343*8975f5c5SAndroid Build Coastguard Worker                                        const char *options,
344*8975f5c5SAndroid Build Coastguard Worker                                        const cl::ProgramPtrs &inputPrograms,
345*8975f5c5SAndroid Build Coastguard Worker                                        cl::Program *notify,
346*8975f5c5SAndroid Build Coastguard Worker                                        CLProgramImpl::Ptr *programOut)
347*8975f5c5SAndroid Build Coastguard Worker {
348*8975f5c5SAndroid Build Coastguard Worker     cl_int errorCode = CL_SUCCESS;
349*8975f5c5SAndroid Build Coastguard Worker     std::vector<cl_device_id> nativeDevices;
350*8975f5c5SAndroid Build Coastguard Worker     for (const cl::DevicePtr &device : devices)
351*8975f5c5SAndroid Build Coastguard Worker     {
352*8975f5c5SAndroid Build Coastguard Worker         nativeDevices.emplace_back(device->getImpl<CLDeviceCL>().getNative());
353*8975f5c5SAndroid Build Coastguard Worker     }
354*8975f5c5SAndroid Build Coastguard Worker     const cl_uint numDevices = static_cast<cl_uint>(nativeDevices.size());
355*8975f5c5SAndroid Build Coastguard Worker     const cl_device_id *const nativeDevicesPtr =
356*8975f5c5SAndroid Build Coastguard Worker         !nativeDevices.empty() ? nativeDevices.data() : nullptr;
357*8975f5c5SAndroid Build Coastguard Worker 
358*8975f5c5SAndroid Build Coastguard Worker     std::vector<cl_program> nativePrograms;
359*8975f5c5SAndroid Build Coastguard Worker     for (const cl::ProgramPtr &inputProgram : inputPrograms)
360*8975f5c5SAndroid Build Coastguard Worker     {
361*8975f5c5SAndroid Build Coastguard Worker         nativePrograms.emplace_back(inputProgram->getImpl<CLProgramCL>().getNative());
362*8975f5c5SAndroid Build Coastguard Worker     }
363*8975f5c5SAndroid Build Coastguard Worker     const cl_uint numInputHeaders = static_cast<cl_uint>(nativePrograms.size());
364*8975f5c5SAndroid Build Coastguard Worker 
365*8975f5c5SAndroid Build Coastguard Worker     const cl::ProgramCB callback   = notify != nullptr ? CLProgramCL::Callback : nullptr;
366*8975f5c5SAndroid Build Coastguard Worker     const cl_program nativeProgram = mNative->getDispatch().clLinkProgram(
367*8975f5c5SAndroid Build Coastguard Worker         mNative, numDevices, nativeDevicesPtr, options, numInputHeaders, nativePrograms.data(),
368*8975f5c5SAndroid Build Coastguard Worker         callback, notify, &errorCode);
369*8975f5c5SAndroid Build Coastguard Worker     ANGLE_CL_TRY(errorCode);
370*8975f5c5SAndroid Build Coastguard Worker 
371*8975f5c5SAndroid Build Coastguard Worker     *programOut = CLProgramImpl::Ptr(
372*8975f5c5SAndroid Build Coastguard Worker         nativeProgram != nullptr ? new CLProgramCL(program, nativeProgram) : nullptr);
373*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
374*8975f5c5SAndroid Build Coastguard Worker }
375*8975f5c5SAndroid Build Coastguard Worker 
createUserEvent(const cl::Event & event,CLEventImpl::Ptr * programOut)376*8975f5c5SAndroid Build Coastguard Worker angle::Result CLContextCL::createUserEvent(const cl::Event &event, CLEventImpl::Ptr *programOut)
377*8975f5c5SAndroid Build Coastguard Worker {
378*8975f5c5SAndroid Build Coastguard Worker     cl_int errorCode = CL_SUCCESS;
379*8975f5c5SAndroid Build Coastguard Worker 
380*8975f5c5SAndroid Build Coastguard Worker     const cl_event nativeEvent = mNative->getDispatch().clCreateUserEvent(mNative, &errorCode);
381*8975f5c5SAndroid Build Coastguard Worker     ANGLE_CL_TRY(errorCode);
382*8975f5c5SAndroid Build Coastguard Worker 
383*8975f5c5SAndroid Build Coastguard Worker     *programOut =
384*8975f5c5SAndroid Build Coastguard Worker         CLEventImpl::Ptr(nativeEvent != nullptr ? new CLEventCL(event, nativeEvent) : nullptr);
385*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
386*8975f5c5SAndroid Build Coastguard Worker }
387*8975f5c5SAndroid Build Coastguard Worker 
waitForEvents(const cl::EventPtrs & events)388*8975f5c5SAndroid Build Coastguard Worker angle::Result CLContextCL::waitForEvents(const cl::EventPtrs &events)
389*8975f5c5SAndroid Build Coastguard Worker {
390*8975f5c5SAndroid Build Coastguard Worker     const std::vector<cl_event> nativeEvents = CLEventCL::Cast(events);
391*8975f5c5SAndroid Build Coastguard Worker     ANGLE_CL_TRY(mNative->getDispatch().clWaitForEvents(static_cast<cl_uint>(nativeEvents.size()),
392*8975f5c5SAndroid Build Coastguard Worker                                                         nativeEvents.data()));
393*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
394*8975f5c5SAndroid Build Coastguard Worker }
395*8975f5c5SAndroid Build Coastguard Worker 
396*8975f5c5SAndroid Build Coastguard Worker }  // namespace rx
397