xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/vulkan/CLDeviceVk.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 // 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