xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/vulkan/CLContextVk.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 // CLContextVk.cpp: Implements the class methods for CLContextVk.
7*8975f5c5SAndroid Build Coastguard Worker 
8*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/CLContextVk.h"
9*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/CLCommandQueueVk.h"
10*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/CLEventVk.h"
11*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/CLMemoryVk.h"
12*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/CLProgramVk.h"
13*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/CLSamplerVk.h"
14*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/DisplayVk.h"
15*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/vk_renderer.h"
16*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/vk_utils.h"
17*8975f5c5SAndroid Build Coastguard Worker 
18*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/CLBuffer.h"
19*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/CLContext.h"
20*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/CLEvent.h"
21*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/CLImage.h"
22*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/CLProgram.h"
23*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/cl_utils.h"
24*8975f5c5SAndroid Build Coastguard Worker 
25*8975f5c5SAndroid Build Coastguard Worker namespace rx
26*8975f5c5SAndroid Build Coastguard Worker {
27*8975f5c5SAndroid Build Coastguard Worker 
CLContextVk(const cl::Context & context,const cl::DevicePtrs devicePtrs)28*8975f5c5SAndroid Build Coastguard Worker CLContextVk::CLContextVk(const cl::Context &context, const cl::DevicePtrs devicePtrs)
29*8975f5c5SAndroid Build Coastguard Worker     : CLContextImpl(context),
30*8975f5c5SAndroid Build Coastguard Worker       vk::Context(getPlatform()->getRenderer()),
31*8975f5c5SAndroid Build Coastguard Worker       mAssociatedDevices(devicePtrs)
32*8975f5c5SAndroid Build Coastguard Worker {
33*8975f5c5SAndroid Build Coastguard Worker     mDeviceQueueIndex = mRenderer->getDefaultDeviceQueueIndex();
34*8975f5c5SAndroid Build Coastguard Worker }
35*8975f5c5SAndroid Build Coastguard Worker 
~CLContextVk()36*8975f5c5SAndroid Build Coastguard Worker CLContextVk::~CLContextVk()
37*8975f5c5SAndroid Build Coastguard Worker {
38*8975f5c5SAndroid Build Coastguard Worker     mDescriptorSetLayoutCache.destroy(getRenderer());
39*8975f5c5SAndroid Build Coastguard Worker     mPipelineLayoutCache.destroy(getRenderer());
40*8975f5c5SAndroid Build Coastguard Worker }
41*8975f5c5SAndroid Build Coastguard Worker 
handleError(VkResult errorCode,const char * file,const char * function,unsigned int line)42*8975f5c5SAndroid Build Coastguard Worker void CLContextVk::handleError(VkResult errorCode,
43*8975f5c5SAndroid Build Coastguard Worker                               const char *file,
44*8975f5c5SAndroid Build Coastguard Worker                               const char *function,
45*8975f5c5SAndroid Build Coastguard Worker                               unsigned int line)
46*8975f5c5SAndroid Build Coastguard Worker {
47*8975f5c5SAndroid Build Coastguard Worker     ASSERT(errorCode != VK_SUCCESS);
48*8975f5c5SAndroid Build Coastguard Worker 
49*8975f5c5SAndroid Build Coastguard Worker     CLenum clErrorCode = CL_SUCCESS;
50*8975f5c5SAndroid Build Coastguard Worker     switch (errorCode)
51*8975f5c5SAndroid Build Coastguard Worker     {
52*8975f5c5SAndroid Build Coastguard Worker         case VK_ERROR_TOO_MANY_OBJECTS:
53*8975f5c5SAndroid Build Coastguard Worker         case VK_ERROR_OUT_OF_HOST_MEMORY:
54*8975f5c5SAndroid Build Coastguard Worker         case VK_ERROR_OUT_OF_DEVICE_MEMORY:
55*8975f5c5SAndroid Build Coastguard Worker             clErrorCode = CL_OUT_OF_HOST_MEMORY;
56*8975f5c5SAndroid Build Coastguard Worker             break;
57*8975f5c5SAndroid Build Coastguard Worker         default:
58*8975f5c5SAndroid Build Coastguard Worker             clErrorCode = CL_INVALID_OPERATION;
59*8975f5c5SAndroid Build Coastguard Worker     }
60*8975f5c5SAndroid Build Coastguard Worker     ERR() << "Internal Vulkan error (" << errorCode << "): " << VulkanResultString(errorCode);
61*8975f5c5SAndroid Build Coastguard Worker     ERR() << "  CL error (" << clErrorCode << ")";
62*8975f5c5SAndroid Build Coastguard Worker 
63*8975f5c5SAndroid Build Coastguard Worker     if (errorCode == VK_ERROR_DEVICE_LOST)
64*8975f5c5SAndroid Build Coastguard Worker     {
65*8975f5c5SAndroid Build Coastguard Worker         handleDeviceLost();
66*8975f5c5SAndroid Build Coastguard Worker     }
67*8975f5c5SAndroid Build Coastguard Worker     ANGLE_CL_SET_ERROR(clErrorCode);
68*8975f5c5SAndroid Build Coastguard Worker }
69*8975f5c5SAndroid Build Coastguard Worker 
handleDeviceLost() const70*8975f5c5SAndroid Build Coastguard Worker void CLContextVk::handleDeviceLost() const
71*8975f5c5SAndroid Build Coastguard Worker {
72*8975f5c5SAndroid Build Coastguard Worker     // For now just notify the renderer
73*8975f5c5SAndroid Build Coastguard Worker     getRenderer()->notifyDeviceLost();
74*8975f5c5SAndroid Build Coastguard Worker }
75*8975f5c5SAndroid Build Coastguard Worker 
getDevices(cl::DevicePtrs * devicePtrsOut) const76*8975f5c5SAndroid Build Coastguard Worker angle::Result CLContextVk::getDevices(cl::DevicePtrs *devicePtrsOut) const
77*8975f5c5SAndroid Build Coastguard Worker {
78*8975f5c5SAndroid Build Coastguard Worker     ASSERT(!mAssociatedDevices.empty());
79*8975f5c5SAndroid Build Coastguard Worker     *devicePtrsOut = mAssociatedDevices;
80*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
81*8975f5c5SAndroid Build Coastguard Worker }
82*8975f5c5SAndroid Build Coastguard Worker 
createCommandQueue(const cl::CommandQueue & commandQueue,CLCommandQueueImpl::Ptr * commandQueueOut)83*8975f5c5SAndroid Build Coastguard Worker angle::Result CLContextVk::createCommandQueue(const cl::CommandQueue &commandQueue,
84*8975f5c5SAndroid Build Coastguard Worker                                               CLCommandQueueImpl::Ptr *commandQueueOut)
85*8975f5c5SAndroid Build Coastguard Worker {
86*8975f5c5SAndroid Build Coastguard Worker     CLCommandQueueVk *queueImpl = new CLCommandQueueVk(commandQueue);
87*8975f5c5SAndroid Build Coastguard Worker     if (queueImpl == nullptr)
88*8975f5c5SAndroid Build Coastguard Worker     {
89*8975f5c5SAndroid Build Coastguard Worker         ANGLE_CL_RETURN_ERROR(CL_OUT_OF_HOST_MEMORY);
90*8975f5c5SAndroid Build Coastguard Worker     }
91*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(queueImpl->init());
92*8975f5c5SAndroid Build Coastguard Worker     *commandQueueOut = CLCommandQueueVk::Ptr(std::move(queueImpl));
93*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
94*8975f5c5SAndroid Build Coastguard Worker }
95*8975f5c5SAndroid Build Coastguard Worker 
createBuffer(const cl::Buffer & buffer,void * hostPtr,CLMemoryImpl::Ptr * bufferOut)96*8975f5c5SAndroid Build Coastguard Worker angle::Result CLContextVk::createBuffer(const cl::Buffer &buffer,
97*8975f5c5SAndroid Build Coastguard Worker                                         void *hostPtr,
98*8975f5c5SAndroid Build Coastguard Worker                                         CLMemoryImpl::Ptr *bufferOut)
99*8975f5c5SAndroid Build Coastguard Worker {
100*8975f5c5SAndroid Build Coastguard Worker     CLBufferVk *memory = new (std::nothrow) CLBufferVk(buffer);
101*8975f5c5SAndroid Build Coastguard Worker     if (memory == nullptr)
102*8975f5c5SAndroid Build Coastguard Worker     {
103*8975f5c5SAndroid Build Coastguard Worker         ANGLE_CL_RETURN_ERROR(CL_OUT_OF_HOST_MEMORY);
104*8975f5c5SAndroid Build Coastguard Worker     }
105*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(memory->create(hostPtr));
106*8975f5c5SAndroid Build Coastguard Worker     *bufferOut = CLMemoryImpl::Ptr(memory);
107*8975f5c5SAndroid Build Coastguard Worker     mAssociatedObjects->mMemories.emplace(buffer.getNative());
108*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
109*8975f5c5SAndroid Build Coastguard Worker }
110*8975f5c5SAndroid Build Coastguard Worker 
createImage(const cl::Image & image,void * hostPtr,CLMemoryImpl::Ptr * imageOut)111*8975f5c5SAndroid Build Coastguard Worker angle::Result CLContextVk::createImage(const cl::Image &image,
112*8975f5c5SAndroid Build Coastguard Worker                                        void *hostPtr,
113*8975f5c5SAndroid Build Coastguard Worker                                        CLMemoryImpl::Ptr *imageOut)
114*8975f5c5SAndroid Build Coastguard Worker {
115*8975f5c5SAndroid Build Coastguard Worker     CLImageVk *memory = new (std::nothrow) CLImageVk(image);
116*8975f5c5SAndroid Build Coastguard Worker     if (memory == nullptr)
117*8975f5c5SAndroid Build Coastguard Worker     {
118*8975f5c5SAndroid Build Coastguard Worker         ANGLE_CL_RETURN_ERROR(CL_OUT_OF_HOST_MEMORY);
119*8975f5c5SAndroid Build Coastguard Worker     }
120*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(memory->create(hostPtr));
121*8975f5c5SAndroid Build Coastguard Worker     *imageOut = CLMemoryImpl::Ptr(memory);
122*8975f5c5SAndroid Build Coastguard Worker     mAssociatedObjects->mMemories.emplace(image.getNative());
123*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
124*8975f5c5SAndroid Build Coastguard Worker }
125*8975f5c5SAndroid Build Coastguard Worker 
getVkFormatFromCL(cl_image_format format)126*8975f5c5SAndroid Build Coastguard Worker VkFormat CLContextVk::getVkFormatFromCL(cl_image_format format)
127*8975f5c5SAndroid Build Coastguard Worker {
128*8975f5c5SAndroid Build Coastguard Worker     angle::FormatID formatID;
129*8975f5c5SAndroid Build Coastguard Worker     switch (format.image_channel_order)
130*8975f5c5SAndroid Build Coastguard Worker     {
131*8975f5c5SAndroid Build Coastguard Worker         case CL_R:
132*8975f5c5SAndroid Build Coastguard Worker             formatID = angle::Format::CLRFormatToID(format.image_channel_data_type);
133*8975f5c5SAndroid Build Coastguard Worker             break;
134*8975f5c5SAndroid Build Coastguard Worker         case CL_RG:
135*8975f5c5SAndroid Build Coastguard Worker             formatID = angle::Format::CLRGFormatToID(format.image_channel_data_type);
136*8975f5c5SAndroid Build Coastguard Worker             break;
137*8975f5c5SAndroid Build Coastguard Worker         case CL_RGB:
138*8975f5c5SAndroid Build Coastguard Worker             formatID = angle::Format::CLRGBFormatToID(format.image_channel_data_type);
139*8975f5c5SAndroid Build Coastguard Worker             break;
140*8975f5c5SAndroid Build Coastguard Worker         case CL_RGBA:
141*8975f5c5SAndroid Build Coastguard Worker             formatID = angle::Format::CLRGBAFormatToID(format.image_channel_data_type);
142*8975f5c5SAndroid Build Coastguard Worker             break;
143*8975f5c5SAndroid Build Coastguard Worker         case CL_BGRA:
144*8975f5c5SAndroid Build Coastguard Worker             formatID = angle::Format::CLBGRAFormatToID(format.image_channel_data_type);
145*8975f5c5SAndroid Build Coastguard Worker             break;
146*8975f5c5SAndroid Build Coastguard Worker         case CL_sRGBA:
147*8975f5c5SAndroid Build Coastguard Worker             formatID = angle::Format::CLsRGBAFormatToID(format.image_channel_data_type);
148*8975f5c5SAndroid Build Coastguard Worker             break;
149*8975f5c5SAndroid Build Coastguard Worker         default:
150*8975f5c5SAndroid Build Coastguard Worker             return VK_FORMAT_UNDEFINED;
151*8975f5c5SAndroid Build Coastguard Worker     }
152*8975f5c5SAndroid Build Coastguard Worker     return getPlatform()->getRenderer()->getFormat(formatID).getActualRenderableImageVkFormat(
153*8975f5c5SAndroid Build Coastguard Worker         getPlatform()->getRenderer());
154*8975f5c5SAndroid Build Coastguard Worker }
155*8975f5c5SAndroid Build Coastguard Worker 
getSupportedImageFormats(cl::MemFlags flags,cl::MemObjectType imageType,cl_uint numEntries,cl_image_format * imageFormats,cl_uint * numImageFormats)156*8975f5c5SAndroid Build Coastguard Worker angle::Result CLContextVk::getSupportedImageFormats(cl::MemFlags flags,
157*8975f5c5SAndroid Build Coastguard Worker                                                     cl::MemObjectType imageType,
158*8975f5c5SAndroid Build Coastguard Worker                                                     cl_uint numEntries,
159*8975f5c5SAndroid Build Coastguard Worker                                                     cl_image_format *imageFormats,
160*8975f5c5SAndroid Build Coastguard Worker                                                     cl_uint *numImageFormats)
161*8975f5c5SAndroid Build Coastguard Worker {
162*8975f5c5SAndroid Build Coastguard Worker     VkPhysicalDevice physicalDevice = getPlatform()->getRenderer()->getPhysicalDevice();
163*8975f5c5SAndroid Build Coastguard Worker     std::vector<cl_image_format> supportedFormats;
164*8975f5c5SAndroid Build Coastguard Worker     std::vector<cl_image_format> minSupportedFormats;
165*8975f5c5SAndroid Build Coastguard Worker     if (flags.intersects((CL_MEM_READ_ONLY | CL_MEM_WRITE_ONLY)))
166*8975f5c5SAndroid Build Coastguard Worker     {
167*8975f5c5SAndroid Build Coastguard Worker         minSupportedFormats.insert(minSupportedFormats.end(),
168*8975f5c5SAndroid Build Coastguard Worker                                    std::begin(kMinSupportedFormatsReadOrWrite),
169*8975f5c5SAndroid Build Coastguard Worker                                    std::end(kMinSupportedFormatsReadOrWrite));
170*8975f5c5SAndroid Build Coastguard Worker     }
171*8975f5c5SAndroid Build Coastguard Worker     else
172*8975f5c5SAndroid Build Coastguard Worker     {
173*8975f5c5SAndroid Build Coastguard Worker         minSupportedFormats.insert(minSupportedFormats.end(),
174*8975f5c5SAndroid Build Coastguard Worker                                    std::begin(kMinSupportedFormatsReadAndWrite),
175*8975f5c5SAndroid Build Coastguard Worker                                    std::end(kMinSupportedFormatsReadAndWrite));
176*8975f5c5SAndroid Build Coastguard Worker     }
177*8975f5c5SAndroid Build Coastguard Worker     for (cl_image_format format : minSupportedFormats)
178*8975f5c5SAndroid Build Coastguard Worker     {
179*8975f5c5SAndroid Build Coastguard Worker         VkFormatProperties formatProperties;
180*8975f5c5SAndroid Build Coastguard Worker         VkFormat vkFormat = getVkFormatFromCL(format);
181*8975f5c5SAndroid Build Coastguard Worker         ASSERT(vkFormat != VK_FORMAT_UNDEFINED);
182*8975f5c5SAndroid Build Coastguard Worker         vkGetPhysicalDeviceFormatProperties(physicalDevice, vkFormat, &formatProperties);
183*8975f5c5SAndroid Build Coastguard Worker         if (formatProperties.optimalTilingFeatures != 0)
184*8975f5c5SAndroid Build Coastguard Worker         {
185*8975f5c5SAndroid Build Coastguard Worker             supportedFormats.push_back(format);
186*8975f5c5SAndroid Build Coastguard Worker         }
187*8975f5c5SAndroid Build Coastguard Worker     }
188*8975f5c5SAndroid Build Coastguard Worker     if (numImageFormats != nullptr)
189*8975f5c5SAndroid Build Coastguard Worker     {
190*8975f5c5SAndroid Build Coastguard Worker         *numImageFormats = static_cast<cl_uint>(supportedFormats.size());
191*8975f5c5SAndroid Build Coastguard Worker     }
192*8975f5c5SAndroid Build Coastguard Worker     if (imageFormats != nullptr)
193*8975f5c5SAndroid Build Coastguard Worker     {
194*8975f5c5SAndroid Build Coastguard Worker         memcpy(imageFormats, supportedFormats.data(),
195*8975f5c5SAndroid Build Coastguard Worker                sizeof(cl_image_format) *
196*8975f5c5SAndroid Build Coastguard Worker                    std::min(static_cast<cl_uint>(supportedFormats.size()), numEntries));
197*8975f5c5SAndroid Build Coastguard Worker     }
198*8975f5c5SAndroid Build Coastguard Worker 
199*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
200*8975f5c5SAndroid Build Coastguard Worker }
201*8975f5c5SAndroid Build Coastguard Worker 
createSampler(const cl::Sampler & sampler,CLSamplerImpl::Ptr * samplerOut)202*8975f5c5SAndroid Build Coastguard Worker angle::Result CLContextVk::createSampler(const cl::Sampler &sampler, CLSamplerImpl::Ptr *samplerOut)
203*8975f5c5SAndroid Build Coastguard Worker {
204*8975f5c5SAndroid Build Coastguard Worker     CLSamplerVk *samplerVk = new (std::nothrow) CLSamplerVk(sampler);
205*8975f5c5SAndroid Build Coastguard Worker     if (samplerVk == nullptr)
206*8975f5c5SAndroid Build Coastguard Worker     {
207*8975f5c5SAndroid Build Coastguard Worker         ANGLE_CL_RETURN_ERROR(CL_OUT_OF_HOST_MEMORY);
208*8975f5c5SAndroid Build Coastguard Worker     }
209*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(samplerVk->create());
210*8975f5c5SAndroid Build Coastguard Worker     *samplerOut = CLSamplerImpl::Ptr(samplerVk);
211*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
212*8975f5c5SAndroid Build Coastguard Worker }
213*8975f5c5SAndroid Build Coastguard Worker 
createProgramWithSource(const cl::Program & program,const std::string & source,CLProgramImpl::Ptr * programOut)214*8975f5c5SAndroid Build Coastguard Worker angle::Result CLContextVk::createProgramWithSource(const cl::Program &program,
215*8975f5c5SAndroid Build Coastguard Worker                                                    const std::string &source,
216*8975f5c5SAndroid Build Coastguard Worker                                                    CLProgramImpl::Ptr *programOut)
217*8975f5c5SAndroid Build Coastguard Worker {
218*8975f5c5SAndroid Build Coastguard Worker     CLProgramVk *programVk = new (std::nothrow) CLProgramVk(program);
219*8975f5c5SAndroid Build Coastguard Worker     if (programVk == nullptr)
220*8975f5c5SAndroid Build Coastguard Worker     {
221*8975f5c5SAndroid Build Coastguard Worker         ANGLE_CL_RETURN_ERROR(CL_OUT_OF_HOST_MEMORY);
222*8975f5c5SAndroid Build Coastguard Worker     }
223*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(programVk->init());
224*8975f5c5SAndroid Build Coastguard Worker     *programOut = CLProgramImpl::Ptr(std::move(programVk));
225*8975f5c5SAndroid Build Coastguard Worker 
226*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
227*8975f5c5SAndroid Build Coastguard Worker }
228*8975f5c5SAndroid Build Coastguard Worker 
createProgramWithIL(const cl::Program & program,const void * il,size_t length,CLProgramImpl::Ptr * programOut)229*8975f5c5SAndroid Build Coastguard Worker angle::Result CLContextVk::createProgramWithIL(const cl::Program &program,
230*8975f5c5SAndroid Build Coastguard Worker                                                const void *il,
231*8975f5c5SAndroid Build Coastguard Worker                                                size_t length,
232*8975f5c5SAndroid Build Coastguard Worker                                                CLProgramImpl::Ptr *programOut)
233*8975f5c5SAndroid Build Coastguard Worker {
234*8975f5c5SAndroid Build Coastguard Worker     UNIMPLEMENTED();
235*8975f5c5SAndroid Build Coastguard Worker     ANGLE_CL_RETURN_ERROR(CL_OUT_OF_RESOURCES);
236*8975f5c5SAndroid Build Coastguard Worker }
237*8975f5c5SAndroid Build Coastguard Worker 
createProgramWithBinary(const cl::Program & program,const size_t * lengths,const unsigned char ** binaries,cl_int * binaryStatus,CLProgramImpl::Ptr * programOut)238*8975f5c5SAndroid Build Coastguard Worker angle::Result CLContextVk::createProgramWithBinary(const cl::Program &program,
239*8975f5c5SAndroid Build Coastguard Worker                                                    const size_t *lengths,
240*8975f5c5SAndroid Build Coastguard Worker                                                    const unsigned char **binaries,
241*8975f5c5SAndroid Build Coastguard Worker                                                    cl_int *binaryStatus,
242*8975f5c5SAndroid Build Coastguard Worker                                                    CLProgramImpl::Ptr *programOut)
243*8975f5c5SAndroid Build Coastguard Worker {
244*8975f5c5SAndroid Build Coastguard Worker     CLProgramVk *programVk = new (std::nothrow) CLProgramVk(program);
245*8975f5c5SAndroid Build Coastguard Worker     if (programVk == nullptr)
246*8975f5c5SAndroid Build Coastguard Worker     {
247*8975f5c5SAndroid Build Coastguard Worker         ANGLE_CL_RETURN_ERROR(CL_OUT_OF_HOST_MEMORY);
248*8975f5c5SAndroid Build Coastguard Worker     }
249*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(programVk->init(lengths, binaries, binaryStatus));
250*8975f5c5SAndroid Build Coastguard Worker     *programOut = CLProgramImpl::Ptr(std::move(programVk));
251*8975f5c5SAndroid Build Coastguard Worker 
252*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
253*8975f5c5SAndroid Build Coastguard Worker }
254*8975f5c5SAndroid Build Coastguard Worker 
createProgramWithBuiltInKernels(const cl::Program & program,const char * kernel_names,CLProgramImpl::Ptr * programOut)255*8975f5c5SAndroid Build Coastguard Worker angle::Result CLContextVk::createProgramWithBuiltInKernels(const cl::Program &program,
256*8975f5c5SAndroid Build Coastguard Worker                                                            const char *kernel_names,
257*8975f5c5SAndroid Build Coastguard Worker                                                            CLProgramImpl::Ptr *programOut)
258*8975f5c5SAndroid Build Coastguard Worker {
259*8975f5c5SAndroid Build Coastguard Worker     UNIMPLEMENTED();
260*8975f5c5SAndroid Build Coastguard Worker     ANGLE_CL_RETURN_ERROR(CL_OUT_OF_RESOURCES);
261*8975f5c5SAndroid Build Coastguard Worker }
262*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)263*8975f5c5SAndroid Build Coastguard Worker angle::Result CLContextVk::linkProgram(const cl::Program &program,
264*8975f5c5SAndroid Build Coastguard Worker                                        const cl::DevicePtrs &devices,
265*8975f5c5SAndroid Build Coastguard Worker                                        const char *options,
266*8975f5c5SAndroid Build Coastguard Worker                                        const cl::ProgramPtrs &inputPrograms,
267*8975f5c5SAndroid Build Coastguard Worker                                        cl::Program *notify,
268*8975f5c5SAndroid Build Coastguard Worker                                        CLProgramImpl::Ptr *programOut)
269*8975f5c5SAndroid Build Coastguard Worker {
270*8975f5c5SAndroid Build Coastguard Worker     const cl::DevicePtrs &devicePtrs = !devices.empty() ? devices : mContext.getDevices();
271*8975f5c5SAndroid Build Coastguard Worker 
272*8975f5c5SAndroid Build Coastguard Worker     CLProgramVk::Ptr programImpl = CLProgramVk::Ptr(new (std::nothrow) CLProgramVk(program));
273*8975f5c5SAndroid Build Coastguard Worker     if (programImpl == nullptr)
274*8975f5c5SAndroid Build Coastguard Worker     {
275*8975f5c5SAndroid Build Coastguard Worker         ANGLE_CL_RETURN_ERROR(CL_OUT_OF_HOST_MEMORY);
276*8975f5c5SAndroid Build Coastguard Worker     }
277*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(programImpl->init());
278*8975f5c5SAndroid Build Coastguard Worker 
279*8975f5c5SAndroid Build Coastguard Worker     cl::DevicePtrs linkDeviceList;
280*8975f5c5SAndroid Build Coastguard Worker     CLProgramVk::LinkProgramsList linkProgramsList;
281*8975f5c5SAndroid Build Coastguard Worker     cl::BitField libraryOrObject(CL_PROGRAM_BINARY_TYPE_LIBRARY |
282*8975f5c5SAndroid Build Coastguard Worker                                  CL_PROGRAM_BINARY_TYPE_COMPILED_OBJECT);
283*8975f5c5SAndroid Build Coastguard Worker     for (const cl::DevicePtr &devicePtr : devicePtrs)
284*8975f5c5SAndroid Build Coastguard Worker     {
285*8975f5c5SAndroid Build Coastguard Worker         CLProgramVk::LinkPrograms linkPrograms;
286*8975f5c5SAndroid Build Coastguard Worker         for (const cl::ProgramPtr &inputProgram : inputPrograms)
287*8975f5c5SAndroid Build Coastguard Worker         {
288*8975f5c5SAndroid Build Coastguard Worker             const CLProgramVk::DeviceProgramData *deviceProgramData =
289*8975f5c5SAndroid Build Coastguard Worker                 inputProgram->getImpl<CLProgramVk>().getDeviceProgramData(devicePtr->getNative());
290*8975f5c5SAndroid Build Coastguard Worker 
291*8975f5c5SAndroid Build Coastguard Worker             // Should be valid at this point
292*8975f5c5SAndroid Build Coastguard Worker             ASSERT(deviceProgramData != nullptr);
293*8975f5c5SAndroid Build Coastguard Worker 
294*8975f5c5SAndroid Build Coastguard Worker             if (libraryOrObject.intersects(deviceProgramData->binaryType))
295*8975f5c5SAndroid Build Coastguard Worker             {
296*8975f5c5SAndroid Build Coastguard Worker                 linkPrograms.push_back(deviceProgramData);
297*8975f5c5SAndroid Build Coastguard Worker             }
298*8975f5c5SAndroid Build Coastguard Worker         }
299*8975f5c5SAndroid Build Coastguard Worker         if (!linkPrograms.empty())
300*8975f5c5SAndroid Build Coastguard Worker         {
301*8975f5c5SAndroid Build Coastguard Worker             linkDeviceList.push_back(devicePtr);
302*8975f5c5SAndroid Build Coastguard Worker             linkProgramsList.push_back(linkPrograms);
303*8975f5c5SAndroid Build Coastguard Worker         }
304*8975f5c5SAndroid Build Coastguard Worker     }
305*8975f5c5SAndroid Build Coastguard Worker 
306*8975f5c5SAndroid Build Coastguard Worker     programImpl->setBuildStatus(linkDeviceList, CL_BUILD_IN_PROGRESS);
307*8975f5c5SAndroid Build Coastguard Worker 
308*8975f5c5SAndroid Build Coastguard Worker     // Perform link
309*8975f5c5SAndroid Build Coastguard Worker     if (notify)
310*8975f5c5SAndroid Build Coastguard Worker     {
311*8975f5c5SAndroid Build Coastguard Worker         std::shared_ptr<angle::WaitableEvent> asyncEvent =
312*8975f5c5SAndroid Build Coastguard Worker             mContext.getPlatform().getMultiThreadPool()->postWorkerTask(
313*8975f5c5SAndroid Build Coastguard Worker                 std::make_shared<CLAsyncBuildTask>(
314*8975f5c5SAndroid Build Coastguard Worker                     programImpl.get(), linkDeviceList, std::string(options ? options : ""), "",
315*8975f5c5SAndroid Build Coastguard Worker                     CLProgramVk::BuildType::LINK, linkProgramsList, notify));
316*8975f5c5SAndroid Build Coastguard Worker         ASSERT(asyncEvent != nullptr);
317*8975f5c5SAndroid Build Coastguard Worker     }
318*8975f5c5SAndroid Build Coastguard Worker     else
319*8975f5c5SAndroid Build Coastguard Worker     {
320*8975f5c5SAndroid Build Coastguard Worker         if (!programImpl->buildInternal(linkDeviceList, std::string(options ? options : ""), "",
321*8975f5c5SAndroid Build Coastguard Worker                                         CLProgramVk::BuildType::LINK, linkProgramsList))
322*8975f5c5SAndroid Build Coastguard Worker         {
323*8975f5c5SAndroid Build Coastguard Worker             ANGLE_CL_RETURN_ERROR(CL_LINK_PROGRAM_FAILURE);
324*8975f5c5SAndroid Build Coastguard Worker         }
325*8975f5c5SAndroid Build Coastguard Worker     }
326*8975f5c5SAndroid Build Coastguard Worker 
327*8975f5c5SAndroid Build Coastguard Worker     *programOut = std::move(programImpl);
328*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
329*8975f5c5SAndroid Build Coastguard Worker }
330*8975f5c5SAndroid Build Coastguard Worker 
createUserEvent(const cl::Event & event,CLEventImpl::Ptr * eventOut)331*8975f5c5SAndroid Build Coastguard Worker angle::Result CLContextVk::createUserEvent(const cl::Event &event, CLEventImpl::Ptr *eventOut)
332*8975f5c5SAndroid Build Coastguard Worker {
333*8975f5c5SAndroid Build Coastguard Worker     *eventOut = CLEventImpl::Ptr(new (std::nothrow) CLEventVk(event));
334*8975f5c5SAndroid Build Coastguard Worker     if (*eventOut == nullptr)
335*8975f5c5SAndroid Build Coastguard Worker     {
336*8975f5c5SAndroid Build Coastguard Worker         ANGLE_CL_RETURN_ERROR(CL_OUT_OF_HOST_MEMORY);
337*8975f5c5SAndroid Build Coastguard Worker     }
338*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
339*8975f5c5SAndroid Build Coastguard Worker }
340*8975f5c5SAndroid Build Coastguard Worker 
waitForEvents(const cl::EventPtrs & events)341*8975f5c5SAndroid Build Coastguard Worker angle::Result CLContextVk::waitForEvents(const cl::EventPtrs &events)
342*8975f5c5SAndroid Build Coastguard Worker {
343*8975f5c5SAndroid Build Coastguard Worker     for (auto &event : events)
344*8975f5c5SAndroid Build Coastguard Worker     {
345*8975f5c5SAndroid Build Coastguard Worker         CLEventVk *eventVk = &event.get()->getImpl<CLEventVk>();
346*8975f5c5SAndroid Build Coastguard Worker         if (eventVk->isUserEvent())
347*8975f5c5SAndroid Build Coastguard Worker         {
348*8975f5c5SAndroid Build Coastguard Worker             ANGLE_TRY(eventVk->waitForUserEventStatus());
349*8975f5c5SAndroid Build Coastguard Worker         }
350*8975f5c5SAndroid Build Coastguard Worker         else
351*8975f5c5SAndroid Build Coastguard Worker         {
352*8975f5c5SAndroid Build Coastguard Worker             // TODO rework this to instead (flush w/ ResourceUse serial wait) once we move away from
353*8975f5c5SAndroid Build Coastguard Worker             // spawning a submit-thread/Task for flush routine
354*8975f5c5SAndroid Build Coastguard Worker             // https://anglebug.com/42267107
355*8975f5c5SAndroid Build Coastguard Worker             ANGLE_TRY(event->getCommandQueue()->finish());
356*8975f5c5SAndroid Build Coastguard Worker         }
357*8975f5c5SAndroid Build Coastguard Worker     }
358*8975f5c5SAndroid Build Coastguard Worker 
359*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
360*8975f5c5SAndroid Build Coastguard Worker }
361*8975f5c5SAndroid Build Coastguard Worker 
362*8975f5c5SAndroid Build Coastguard Worker }  // namespace rx
363