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