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 // CLDeviceVk.cpp: Implements the class methods for CLDeviceVk.
7*8975f5c5SAndroid Build Coastguard Worker
8*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/CLDeviceVk.h"
9*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/CLPlatformVk.h"
10*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/vk_renderer.h"
11*8975f5c5SAndroid Build Coastguard Worker
12*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/cl_types.h"
13*8975f5c5SAndroid Build Coastguard Worker
14*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Display.h"
15*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/cl_utils.h"
16*8975f5c5SAndroid Build Coastguard Worker
17*8975f5c5SAndroid Build Coastguard Worker namespace rx
18*8975f5c5SAndroid Build Coastguard Worker {
19*8975f5c5SAndroid Build Coastguard Worker
CLDeviceVk(const cl::Device & device,vk::Renderer * renderer)20*8975f5c5SAndroid Build Coastguard Worker CLDeviceVk::CLDeviceVk(const cl::Device &device, vk::Renderer *renderer)
21*8975f5c5SAndroid Build Coastguard Worker : CLDeviceImpl(device), mRenderer(renderer)
22*8975f5c5SAndroid Build Coastguard Worker {
23*8975f5c5SAndroid Build Coastguard Worker const VkPhysicalDeviceProperties &props = mRenderer->getPhysicalDeviceProperties();
24*8975f5c5SAndroid Build Coastguard Worker
25*8975f5c5SAndroid Build Coastguard Worker // Setup initial device mInfo fields
26*8975f5c5SAndroid Build Coastguard Worker // TODO(aannestrand) Create cl::Caps and use for device creation
27*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/42266954
28*8975f5c5SAndroid Build Coastguard Worker mInfoString = {
29*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::Name, std::string(props.deviceName)},
30*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::Vendor, mRenderer->getVendorString()},
31*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::DriverVersion, mRenderer->getVersionString(true)},
32*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::Version, std::string("OpenCL 3.0 " + mRenderer->getVersionString(true))},
33*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::Profile, std::string("FULL_PROFILE")},
34*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::OpenCL_C_Version, std::string("OpenCL C 1.2 ")},
35*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::LatestConformanceVersionPassed, std::string("FIXME")}};
36*8975f5c5SAndroid Build Coastguard Worker mInfoSizeT = {
37*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::MaxWorkGroupSize, props.limits.maxComputeWorkGroupInvocations},
38*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::MaxGlobalVariableSize, 0},
39*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::GlobalVariablePreferredTotalSize, 0},
40*8975f5c5SAndroid Build Coastguard Worker
41*8975f5c5SAndroid Build Coastguard Worker // TODO(aannestrand) Update these hardcoded platform/device queries
42*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/42266935
43*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::MaxParameterSize, 1024},
44*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::ProfilingTimerResolution, 1},
45*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::PrintfBufferSize, 1024 * 1024},
46*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::PreferredWorkGroupSizeMultiple, 16},
47*8975f5c5SAndroid Build Coastguard Worker };
48*8975f5c5SAndroid Build Coastguard Worker mInfoULong = {
49*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::LocalMemSize, props.limits.maxComputeSharedMemorySize},
50*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::SVM_Capabilities, 0},
51*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::QueueOnDeviceProperties, 0},
52*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::PartitionAffinityDomain, 0},
53*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::DeviceEnqueueCapabilities, 0},
54*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::QueueOnHostProperties, CL_QUEUE_PROFILING_ENABLE},
55*8975f5c5SAndroid Build Coastguard Worker
56*8975f5c5SAndroid Build Coastguard Worker // TODO(aannestrand) Update these hardcoded platform/device queries
57*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/42266935
58*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::HalfFpConfig, 0},
59*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::DoubleFpConfig, 0},
60*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::GlobalMemCacheSize, 0},
61*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::GlobalMemSize, 1024 * 1024 * 1024},
62*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::MaxConstantBufferSize, 64 * 1024},
63*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::SingleFpConfig, CL_FP_ROUND_TO_NEAREST | CL_FP_INF_NAN | CL_FP_FMA},
64*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::AtomicMemoryCapabilities,
65*8975f5c5SAndroid Build Coastguard Worker CL_DEVICE_ATOMIC_ORDER_RELAXED | CL_DEVICE_ATOMIC_SCOPE_WORK_GROUP},
66*8975f5c5SAndroid Build Coastguard Worker // TODO (http://anglebug.com/379669750) Add these based on the Vulkan features query
67*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::AtomicFenceCapabilities, CL_DEVICE_ATOMIC_ORDER_RELAXED |
68*8975f5c5SAndroid Build Coastguard Worker CL_DEVICE_ATOMIC_ORDER_ACQ_REL |
69*8975f5c5SAndroid Build Coastguard Worker CL_DEVICE_ATOMIC_SCOPE_WORK_GROUP |
70*8975f5c5SAndroid Build Coastguard Worker // non-mandatory
71*8975f5c5SAndroid Build Coastguard Worker CL_DEVICE_ATOMIC_SCOPE_WORK_ITEM},
72*8975f5c5SAndroid Build Coastguard Worker };
73*8975f5c5SAndroid Build Coastguard Worker mInfoUInt = {
74*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::VendorID, props.vendorID},
75*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::MaxReadImageArgs, props.limits.maxPerStageDescriptorSampledImages},
76*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::MaxWriteImageArgs, props.limits.maxPerStageDescriptorStorageImages},
77*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::MaxReadWriteImageArgs, props.limits.maxPerStageDescriptorStorageImages},
78*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::GlobalMemCachelineSize,
79*8975f5c5SAndroid Build Coastguard Worker static_cast<cl_uint>(props.limits.nonCoherentAtomSize)},
80*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::Available, CL_TRUE},
81*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::LinkerAvailable, CL_TRUE},
82*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::CompilerAvailable, CL_TRUE},
83*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::MaxOnDeviceQueues, 0},
84*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::MaxOnDeviceEvents, 0},
85*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::QueueOnDeviceMaxSize, 0},
86*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::QueueOnDevicePreferredSize, 0},
87*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::MaxPipeArgs, 0},
88*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::PipeMaxPacketSize, 0},
89*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::PipeSupport, CL_FALSE},
90*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::PipeMaxActiveReservations, 0},
91*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::ErrorCorrectionSupport, CL_FALSE},
92*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::PreferredInteropUserSync, CL_TRUE},
93*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::ExecutionCapabilities, CL_EXEC_KERNEL},
94*8975f5c5SAndroid Build Coastguard Worker
95*8975f5c5SAndroid Build Coastguard Worker // TODO(aannestrand) Update these hardcoded platform/device queries
96*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/42266935
97*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::AddressBits, 32},
98*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::EndianLittle, CL_TRUE},
99*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::LocalMemType, CL_LOCAL},
100*8975f5c5SAndroid Build Coastguard Worker // TODO (http://anglebug.com/379669750) Vulkan reports a big sampler count number, we dont
101*8975f5c5SAndroid Build Coastguard Worker // need that many and set it to minimum req for now.
102*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::MaxSamplers, 16u},
103*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::MaxConstantArgs, 8},
104*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::MaxNumSubGroups, 0},
105*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::MaxComputeUnits, 4},
106*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::MaxClockFrequency, 555},
107*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::MaxWorkItemDimensions, 3},
108*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::MinDataTypeAlignSize, 128},
109*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::GlobalMemCacheType, CL_NONE},
110*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::HostUnifiedMemory, CL_TRUE},
111*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::NativeVectorWidthChar, 4},
112*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::NativeVectorWidthShort, 2},
113*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::NativeVectorWidthInt, 1},
114*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::NativeVectorWidthLong, 1},
115*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::NativeVectorWidthFloat, 1},
116*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::NativeVectorWidthDouble, 1},
117*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::NativeVectorWidthHalf, 0},
118*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::PartitionMaxSubDevices, 0},
119*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::PreferredVectorWidthInt, 1},
120*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::PreferredVectorWidthLong, 1},
121*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::PreferredVectorWidthChar, 4},
122*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::PreferredVectorWidthHalf, 0},
123*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::PreferredVectorWidthShort, 2},
124*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::PreferredVectorWidthFloat, 1},
125*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::PreferredVectorWidthDouble, 0},
126*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::PreferredLocalAtomicAlignment, 0},
127*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::PreferredGlobalAtomicAlignment, 0},
128*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::PreferredPlatformAtomicAlignment, 0},
129*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::NonUniformWorkGroupSupport, CL_FALSE},
130*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::GenericAddressSpaceSupport, CL_FALSE},
131*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::SubGroupIndependentForwardProgress, CL_FALSE},
132*8975f5c5SAndroid Build Coastguard Worker {cl::DeviceInfo::WorkGroupCollectiveFunctionsSupport, CL_FALSE},
133*8975f5c5SAndroid Build Coastguard Worker };
134*8975f5c5SAndroid Build Coastguard Worker }
135*8975f5c5SAndroid Build Coastguard Worker
136*8975f5c5SAndroid Build Coastguard Worker CLDeviceVk::~CLDeviceVk() = default;
137*8975f5c5SAndroid Build Coastguard Worker
createInfo(cl::DeviceType type) const138*8975f5c5SAndroid Build Coastguard Worker CLDeviceImpl::Info CLDeviceVk::createInfo(cl::DeviceType type) const
139*8975f5c5SAndroid Build Coastguard Worker {
140*8975f5c5SAndroid Build Coastguard Worker Info info(type);
141*8975f5c5SAndroid Build Coastguard Worker
142*8975f5c5SAndroid Build Coastguard Worker const VkPhysicalDeviceProperties &properties = mRenderer->getPhysicalDeviceProperties();
143*8975f5c5SAndroid Build Coastguard Worker
144*8975f5c5SAndroid Build Coastguard Worker info.maxWorkItemSizes.push_back(properties.limits.maxComputeWorkGroupSize[0]);
145*8975f5c5SAndroid Build Coastguard Worker info.maxWorkItemSizes.push_back(properties.limits.maxComputeWorkGroupSize[1]);
146*8975f5c5SAndroid Build Coastguard Worker info.maxWorkItemSizes.push_back(properties.limits.maxComputeWorkGroupSize[2]);
147*8975f5c5SAndroid Build Coastguard Worker
148*8975f5c5SAndroid Build Coastguard Worker // TODO(aannestrand) Update these hardcoded platform/device queries
149*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/42266935
150*8975f5c5SAndroid Build Coastguard Worker info.maxMemAllocSize = 1 << 30;
151*8975f5c5SAndroid Build Coastguard Worker info.memBaseAddrAlign = 1024;
152*8975f5c5SAndroid Build Coastguard Worker
153*8975f5c5SAndroid Build Coastguard Worker info.imageSupport = CL_TRUE;
154*8975f5c5SAndroid Build Coastguard Worker
155*8975f5c5SAndroid Build Coastguard Worker info.image2D_MaxWidth = properties.limits.maxImageDimension2D;
156*8975f5c5SAndroid Build Coastguard Worker info.image2D_MaxHeight = properties.limits.maxImageDimension2D;
157*8975f5c5SAndroid Build Coastguard Worker info.image3D_MaxWidth = properties.limits.maxImageDimension3D;
158*8975f5c5SAndroid Build Coastguard Worker info.image3D_MaxHeight = properties.limits.maxImageDimension3D;
159*8975f5c5SAndroid Build Coastguard Worker info.image3D_MaxDepth = properties.limits.maxImageDimension3D;
160*8975f5c5SAndroid Build Coastguard Worker // TODO (http://anglebug.com/379669750) For now set it minimum requirement.
161*8975f5c5SAndroid Build Coastguard Worker info.imageMaxBufferSize = 65536;
162*8975f5c5SAndroid Build Coastguard Worker info.imageMaxArraySize = properties.limits.maxImageArrayLayers;
163*8975f5c5SAndroid Build Coastguard Worker info.imagePitchAlignment = 0u;
164*8975f5c5SAndroid Build Coastguard Worker info.imageBaseAddressAlignment = 0u;
165*8975f5c5SAndroid Build Coastguard Worker
166*8975f5c5SAndroid Build Coastguard Worker info.execCapabilities = CL_EXEC_KERNEL;
167*8975f5c5SAndroid Build Coastguard Worker info.queueOnDeviceMaxSize = 0u;
168*8975f5c5SAndroid Build Coastguard Worker info.builtInKernels = "";
169*8975f5c5SAndroid Build Coastguard Worker info.version = CL_MAKE_VERSION(3, 0, 0);
170*8975f5c5SAndroid Build Coastguard Worker info.versionStr = "OpenCL 3.0 " + mRenderer->getVersionString(true);
171*8975f5c5SAndroid Build Coastguard Worker info.OpenCL_C_AllVersions = {{CL_MAKE_VERSION(1, 0, 0), "OpenCL C"},
172*8975f5c5SAndroid Build Coastguard Worker {CL_MAKE_VERSION(1, 1, 0), "OpenCL C"},
173*8975f5c5SAndroid Build Coastguard Worker {CL_MAKE_VERSION(1, 2, 0), "OpenCL C"},
174*8975f5c5SAndroid Build Coastguard Worker {CL_MAKE_VERSION(3, 0, 0), "OpenCL C"}};
175*8975f5c5SAndroid Build Coastguard Worker
176*8975f5c5SAndroid Build Coastguard Worker info.OpenCL_C_Features = {};
177*8975f5c5SAndroid Build Coastguard Worker info.ILsWithVersion = {};
178*8975f5c5SAndroid Build Coastguard Worker info.builtInKernelsWithVersion = {};
179*8975f5c5SAndroid Build Coastguard Worker info.partitionProperties = {};
180*8975f5c5SAndroid Build Coastguard Worker info.partitionType = {};
181*8975f5c5SAndroid Build Coastguard Worker info.IL_Version = "";
182*8975f5c5SAndroid Build Coastguard Worker
183*8975f5c5SAndroid Build Coastguard Worker // Below extensions are required as of OpenCL 1.1, add their versioned strings
184*8975f5c5SAndroid Build Coastguard Worker NameVersionVector versionedExtensionList = {
185*8975f5c5SAndroid Build Coastguard Worker // Below extensions are required as of OpenCL 1.1
186*8975f5c5SAndroid Build Coastguard Worker cl_name_version{.version = CL_MAKE_VERSION(1, 0, 0),
187*8975f5c5SAndroid Build Coastguard Worker .name = "cl_khr_byte_addressable_store"},
188*8975f5c5SAndroid Build Coastguard Worker cl_name_version{.version = CL_MAKE_VERSION(1, 0, 0),
189*8975f5c5SAndroid Build Coastguard Worker .name = "cl_khr_global_int32_base_atomics"},
190*8975f5c5SAndroid Build Coastguard Worker cl_name_version{.version = CL_MAKE_VERSION(1, 0, 0),
191*8975f5c5SAndroid Build Coastguard Worker .name = "cl_khr_global_int32_extended_atomics"},
192*8975f5c5SAndroid Build Coastguard Worker cl_name_version{.version = CL_MAKE_VERSION(1, 0, 0),
193*8975f5c5SAndroid Build Coastguard Worker .name = "cl_khr_local_int32_base_atomics"},
194*8975f5c5SAndroid Build Coastguard Worker cl_name_version{.version = CL_MAKE_VERSION(1, 0, 0),
195*8975f5c5SAndroid Build Coastguard Worker .name = "cl_khr_local_int32_extended_atomics"},
196*8975f5c5SAndroid Build Coastguard Worker };
197*8975f5c5SAndroid Build Coastguard Worker info.initializeVersionedExtensions(std::move(versionedExtensionList));
198*8975f5c5SAndroid Build Coastguard Worker
199*8975f5c5SAndroid Build Coastguard Worker return info;
200*8975f5c5SAndroid Build Coastguard Worker }
201*8975f5c5SAndroid Build Coastguard Worker
getInfoUInt(cl::DeviceInfo name,cl_uint * value) const202*8975f5c5SAndroid Build Coastguard Worker angle::Result CLDeviceVk::getInfoUInt(cl::DeviceInfo name, cl_uint *value) const
203*8975f5c5SAndroid Build Coastguard Worker {
204*8975f5c5SAndroid Build Coastguard Worker if (mInfoUInt.count(name))
205*8975f5c5SAndroid Build Coastguard Worker {
206*8975f5c5SAndroid Build Coastguard Worker *value = mInfoUInt.at(name);
207*8975f5c5SAndroid Build Coastguard Worker return angle::Result::Continue;
208*8975f5c5SAndroid Build Coastguard Worker }
209*8975f5c5SAndroid Build Coastguard Worker ANGLE_CL_RETURN_ERROR(CL_INVALID_VALUE);
210*8975f5c5SAndroid Build Coastguard Worker }
211*8975f5c5SAndroid Build Coastguard Worker
getInfoULong(cl::DeviceInfo name,cl_ulong * value) const212*8975f5c5SAndroid Build Coastguard Worker angle::Result CLDeviceVk::getInfoULong(cl::DeviceInfo name, cl_ulong *value) const
213*8975f5c5SAndroid Build Coastguard Worker {
214*8975f5c5SAndroid Build Coastguard Worker if (mInfoULong.count(name))
215*8975f5c5SAndroid Build Coastguard Worker {
216*8975f5c5SAndroid Build Coastguard Worker *value = mInfoULong.at(name);
217*8975f5c5SAndroid Build Coastguard Worker return angle::Result::Continue;
218*8975f5c5SAndroid Build Coastguard Worker }
219*8975f5c5SAndroid Build Coastguard Worker ANGLE_CL_RETURN_ERROR(CL_INVALID_VALUE);
220*8975f5c5SAndroid Build Coastguard Worker }
221*8975f5c5SAndroid Build Coastguard Worker
getInfoSizeT(cl::DeviceInfo name,size_t * value) const222*8975f5c5SAndroid Build Coastguard Worker angle::Result CLDeviceVk::getInfoSizeT(cl::DeviceInfo name, size_t *value) const
223*8975f5c5SAndroid Build Coastguard Worker {
224*8975f5c5SAndroid Build Coastguard Worker if (mInfoSizeT.count(name))
225*8975f5c5SAndroid Build Coastguard Worker {
226*8975f5c5SAndroid Build Coastguard Worker *value = mInfoSizeT.at(name);
227*8975f5c5SAndroid Build Coastguard Worker return angle::Result::Continue;
228*8975f5c5SAndroid Build Coastguard Worker }
229*8975f5c5SAndroid Build Coastguard Worker ANGLE_CL_RETURN_ERROR(CL_INVALID_VALUE);
230*8975f5c5SAndroid Build Coastguard Worker }
231*8975f5c5SAndroid Build Coastguard Worker
getInfoStringLength(cl::DeviceInfo name,size_t * value) const232*8975f5c5SAndroid Build Coastguard Worker angle::Result CLDeviceVk::getInfoStringLength(cl::DeviceInfo name, size_t *value) const
233*8975f5c5SAndroid Build Coastguard Worker {
234*8975f5c5SAndroid Build Coastguard Worker if (mInfoString.count(name))
235*8975f5c5SAndroid Build Coastguard Worker {
236*8975f5c5SAndroid Build Coastguard Worker *value = mInfoString.at(name).length() + 1;
237*8975f5c5SAndroid Build Coastguard Worker return angle::Result::Continue;
238*8975f5c5SAndroid Build Coastguard Worker }
239*8975f5c5SAndroid Build Coastguard Worker ANGLE_CL_RETURN_ERROR(CL_INVALID_VALUE);
240*8975f5c5SAndroid Build Coastguard Worker }
241*8975f5c5SAndroid Build Coastguard Worker
getInfoString(cl::DeviceInfo name,size_t size,char * value) const242*8975f5c5SAndroid Build Coastguard Worker angle::Result CLDeviceVk::getInfoString(cl::DeviceInfo name, size_t size, char *value) const
243*8975f5c5SAndroid Build Coastguard Worker {
244*8975f5c5SAndroid Build Coastguard Worker if (mInfoString.count(name))
245*8975f5c5SAndroid Build Coastguard Worker {
246*8975f5c5SAndroid Build Coastguard Worker std::strcpy(value, mInfoString.at(name).c_str());
247*8975f5c5SAndroid Build Coastguard Worker return angle::Result::Continue;
248*8975f5c5SAndroid Build Coastguard Worker }
249*8975f5c5SAndroid Build Coastguard Worker ANGLE_CL_RETURN_ERROR(CL_INVALID_VALUE);
250*8975f5c5SAndroid Build Coastguard Worker }
251*8975f5c5SAndroid Build Coastguard Worker
createSubDevices(const cl_device_partition_property * properties,cl_uint numDevices,CreateFuncs & subDevices,cl_uint * numDevicesRet)252*8975f5c5SAndroid Build Coastguard Worker angle::Result CLDeviceVk::createSubDevices(const cl_device_partition_property *properties,
253*8975f5c5SAndroid Build Coastguard Worker cl_uint numDevices,
254*8975f5c5SAndroid Build Coastguard Worker CreateFuncs &subDevices,
255*8975f5c5SAndroid Build Coastguard Worker cl_uint *numDevicesRet)
256*8975f5c5SAndroid Build Coastguard Worker {
257*8975f5c5SAndroid Build Coastguard Worker UNIMPLEMENTED();
258*8975f5c5SAndroid Build Coastguard Worker ANGLE_CL_RETURN_ERROR(CL_OUT_OF_RESOURCES);
259*8975f5c5SAndroid Build Coastguard Worker }
260*8975f5c5SAndroid Build Coastguard Worker
selectWorkGroupSize(const cl::NDRange & ndrange) const261*8975f5c5SAndroid Build Coastguard Worker cl::WorkgroupSize CLDeviceVk::selectWorkGroupSize(const cl::NDRange &ndrange) const
262*8975f5c5SAndroid Build Coastguard Worker {
263*8975f5c5SAndroid Build Coastguard Worker // Limit total work-group size to the Vulkan device's limit
264*8975f5c5SAndroid Build Coastguard Worker const VkPhysicalDeviceProperties &props = mRenderer->getPhysicalDeviceProperties();
265*8975f5c5SAndroid Build Coastguard Worker uint32_t maxSize = static_cast<uint32_t>(mInfoSizeT.at(cl::DeviceInfo::MaxWorkGroupSize));
266*8975f5c5SAndroid Build Coastguard Worker maxSize = std::min(maxSize, 64u);
267*8975f5c5SAndroid Build Coastguard Worker
268*8975f5c5SAndroid Build Coastguard Worker bool keepIncreasing = false;
269*8975f5c5SAndroid Build Coastguard Worker cl::WorkgroupSize localSize = {1, 1, 1};
270*8975f5c5SAndroid Build Coastguard Worker do
271*8975f5c5SAndroid Build Coastguard Worker {
272*8975f5c5SAndroid Build Coastguard Worker keepIncreasing = false;
273*8975f5c5SAndroid Build Coastguard Worker for (cl_uint i = 0; i < ndrange.workDimensions; i++)
274*8975f5c5SAndroid Build Coastguard Worker {
275*8975f5c5SAndroid Build Coastguard Worker cl::WorkgroupSize newLocalSize = localSize;
276*8975f5c5SAndroid Build Coastguard Worker newLocalSize[i] *= 2;
277*8975f5c5SAndroid Build Coastguard Worker
278*8975f5c5SAndroid Build Coastguard Worker // TODO: Add support for non-uniform WGS
279*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/42267067
280*8975f5c5SAndroid Build Coastguard Worker if (ndrange.globalWorkSize[i] % newLocalSize[i] == 0 &&
281*8975f5c5SAndroid Build Coastguard Worker newLocalSize[i] <= props.limits.maxComputeWorkGroupCount[i] &&
282*8975f5c5SAndroid Build Coastguard Worker newLocalSize[0] * newLocalSize[1] * newLocalSize[2] <= maxSize)
283*8975f5c5SAndroid Build Coastguard Worker {
284*8975f5c5SAndroid Build Coastguard Worker localSize = newLocalSize;
285*8975f5c5SAndroid Build Coastguard Worker keepIncreasing = true;
286*8975f5c5SAndroid Build Coastguard Worker }
287*8975f5c5SAndroid Build Coastguard Worker }
288*8975f5c5SAndroid Build Coastguard Worker } while (keepIncreasing);
289*8975f5c5SAndroid Build Coastguard Worker
290*8975f5c5SAndroid Build Coastguard Worker return localSize;
291*8975f5c5SAndroid Build Coastguard Worker }
292*8975f5c5SAndroid Build Coastguard Worker
293*8975f5c5SAndroid Build Coastguard Worker } // namespace rx
294