xref: /aosp_15_r20/external/angle/src/libANGLE/CLDevice.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 // CLDevice.cpp: Implements the cl::Device class.
7*8975f5c5SAndroid Build Coastguard Worker 
8*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/CLDevice.h"
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/CLPlatform.h"
11*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/cl_utils.h"
12*8975f5c5SAndroid Build Coastguard Worker 
13*8975f5c5SAndroid Build Coastguard Worker #include "common/string_utils.h"
14*8975f5c5SAndroid Build Coastguard Worker 
15*8975f5c5SAndroid Build Coastguard Worker #include <cstring>
16*8975f5c5SAndroid Build Coastguard Worker 
17*8975f5c5SAndroid Build Coastguard Worker namespace cl
18*8975f5c5SAndroid Build Coastguard Worker {
19*8975f5c5SAndroid Build Coastguard Worker 
getInfo(DeviceInfo name,size_t valueSize,void * value,size_t * valueSizeRet) const20*8975f5c5SAndroid Build Coastguard Worker angle::Result Device::getInfo(DeviceInfo name,
21*8975f5c5SAndroid Build Coastguard Worker                               size_t valueSize,
22*8975f5c5SAndroid Build Coastguard Worker                               void *value,
23*8975f5c5SAndroid Build Coastguard Worker                               size_t *valueSizeRet) const
24*8975f5c5SAndroid Build Coastguard Worker {
25*8975f5c5SAndroid Build Coastguard Worker     static_assert(std::is_same<cl_uint, cl_bool>::value &&
26*8975f5c5SAndroid Build Coastguard Worker                       std::is_same<cl_uint, cl_device_mem_cache_type>::value &&
27*8975f5c5SAndroid Build Coastguard Worker                       std::is_same<cl_uint, cl_device_local_mem_type>::value &&
28*8975f5c5SAndroid Build Coastguard Worker                       std::is_same<cl_uint, cl_version>::value &&
29*8975f5c5SAndroid Build Coastguard Worker                       std::is_same<cl_ulong, cl_device_type>::value &&
30*8975f5c5SAndroid Build Coastguard Worker                       std::is_same<cl_ulong, cl_device_fp_config>::value &&
31*8975f5c5SAndroid Build Coastguard Worker                       std::is_same<cl_ulong, cl_device_exec_capabilities>::value &&
32*8975f5c5SAndroid Build Coastguard Worker                       std::is_same<cl_ulong, cl_command_queue_properties>::value &&
33*8975f5c5SAndroid Build Coastguard Worker                       std::is_same<cl_ulong, cl_device_affinity_domain>::value &&
34*8975f5c5SAndroid Build Coastguard Worker                       std::is_same<cl_ulong, cl_device_svm_capabilities>::value &&
35*8975f5c5SAndroid Build Coastguard Worker                       std::is_same<cl_ulong, cl_device_atomic_capabilities>::value &&
36*8975f5c5SAndroid Build Coastguard Worker                       std::is_same<cl_ulong, cl_device_device_enqueue_capabilities>::value,
37*8975f5c5SAndroid Build Coastguard Worker                   "OpenCL type mismatch");
38*8975f5c5SAndroid Build Coastguard Worker 
39*8975f5c5SAndroid Build Coastguard Worker     cl_uint valUInt   = 0u;
40*8975f5c5SAndroid Build Coastguard Worker     cl_ulong valULong = 0u;
41*8975f5c5SAndroid Build Coastguard Worker     size_t valSizeT   = 0u;
42*8975f5c5SAndroid Build Coastguard Worker     void *valPointer  = nullptr;
43*8975f5c5SAndroid Build Coastguard Worker     std::vector<char> valString;
44*8975f5c5SAndroid Build Coastguard Worker 
45*8975f5c5SAndroid Build Coastguard Worker     const void *copyValue = nullptr;
46*8975f5c5SAndroid Build Coastguard Worker     size_t copySize       = 0u;
47*8975f5c5SAndroid Build Coastguard Worker 
48*8975f5c5SAndroid Build Coastguard Worker     // The info names are sorted within their type group in the order they appear in the OpenCL
49*8975f5c5SAndroid Build Coastguard Worker     // specification, so it is easier to compare them side-by-side when looking for changes.
50*8975f5c5SAndroid Build Coastguard Worker     // https://www.khronos.org/registry/OpenCL/specs/3.0-unified/html/OpenCL_API.html#clGetDeviceInfo
51*8975f5c5SAndroid Build Coastguard Worker     switch (name)
52*8975f5c5SAndroid Build Coastguard Worker     {
53*8975f5c5SAndroid Build Coastguard Worker         // Handle all cl_uint and aliased types
54*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::VendorID:
55*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::MaxComputeUnits:
56*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::PreferredVectorWidthChar:
57*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::PreferredVectorWidthShort:
58*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::PreferredVectorWidthInt:
59*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::PreferredVectorWidthLong:
60*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::PreferredVectorWidthFloat:
61*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::PreferredVectorWidthDouble:
62*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::PreferredVectorWidthHalf:
63*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::NativeVectorWidthChar:
64*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::NativeVectorWidthShort:
65*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::NativeVectorWidthInt:
66*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::NativeVectorWidthLong:
67*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::NativeVectorWidthFloat:
68*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::NativeVectorWidthDouble:
69*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::NativeVectorWidthHalf:
70*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::MaxClockFrequency:
71*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::AddressBits:
72*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::MaxReadImageArgs:
73*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::MaxWriteImageArgs:
74*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::MaxReadWriteImageArgs:
75*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::MaxSamplers:
76*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::MaxPipeArgs:
77*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::PipeMaxActiveReservations:
78*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::PipeMaxPacketSize:
79*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::MinDataTypeAlignSize:
80*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::GlobalMemCacheType:
81*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::GlobalMemCachelineSize:
82*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::MaxConstantArgs:
83*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::LocalMemType:
84*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::ErrorCorrectionSupport:
85*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::HostUnifiedMemory:
86*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::EndianLittle:
87*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::Available:
88*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::CompilerAvailable:
89*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::LinkerAvailable:
90*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::QueueOnDevicePreferredSize:
91*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::MaxOnDeviceQueues:
92*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::MaxOnDeviceEvents:
93*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::PreferredInteropUserSync:
94*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::PartitionMaxSubDevices:
95*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::PreferredPlatformAtomicAlignment:
96*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::PreferredGlobalAtomicAlignment:
97*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::PreferredLocalAtomicAlignment:
98*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::MaxNumSubGroups:
99*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::SubGroupIndependentForwardProgress:
100*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::NonUniformWorkGroupSupport:
101*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::WorkGroupCollectiveFunctionsSupport:
102*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::GenericAddressSpaceSupport:
103*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::PipeSupport:
104*8975f5c5SAndroid Build Coastguard Worker             ANGLE_TRY(mImpl->getInfoUInt(name, &valUInt));
105*8975f5c5SAndroid Build Coastguard Worker             copyValue = &valUInt;
106*8975f5c5SAndroid Build Coastguard Worker             copySize  = sizeof(valUInt);
107*8975f5c5SAndroid Build Coastguard Worker             break;
108*8975f5c5SAndroid Build Coastguard Worker 
109*8975f5c5SAndroid Build Coastguard Worker         // Handle all cl_ulong and aliased types
110*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::SingleFpConfig:
111*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::DoubleFpConfig:
112*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::GlobalMemCacheSize:
113*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::GlobalMemSize:
114*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::MaxConstantBufferSize:
115*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::LocalMemSize:
116*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::QueueOnHostProperties:
117*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::QueueOnDeviceProperties:
118*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::PartitionAffinityDomain:
119*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::SVM_Capabilities:
120*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::AtomicMemoryCapabilities:
121*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::AtomicFenceCapabilities:
122*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::DeviceEnqueueCapabilities:
123*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::HalfFpConfig:
124*8975f5c5SAndroid Build Coastguard Worker             ANGLE_TRY(mImpl->getInfoULong(name, &valULong));
125*8975f5c5SAndroid Build Coastguard Worker             copyValue = &valULong;
126*8975f5c5SAndroid Build Coastguard Worker             copySize  = sizeof(valULong);
127*8975f5c5SAndroid Build Coastguard Worker             break;
128*8975f5c5SAndroid Build Coastguard Worker 
129*8975f5c5SAndroid Build Coastguard Worker         // Handle all size_t and aliased types
130*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::MaxWorkGroupSize:
131*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::MaxParameterSize:
132*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::MaxGlobalVariableSize:
133*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::GlobalVariablePreferredTotalSize:
134*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::ProfilingTimerResolution:
135*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::PrintfBufferSize:
136*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::PreferredWorkGroupSizeMultiple:
137*8975f5c5SAndroid Build Coastguard Worker             ANGLE_TRY(mImpl->getInfoSizeT(name, &valSizeT));
138*8975f5c5SAndroid Build Coastguard Worker             copyValue = &valSizeT;
139*8975f5c5SAndroid Build Coastguard Worker             copySize  = sizeof(valSizeT);
140*8975f5c5SAndroid Build Coastguard Worker             break;
141*8975f5c5SAndroid Build Coastguard Worker 
142*8975f5c5SAndroid Build Coastguard Worker         // Handle all string types
143*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::Name:
144*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::Vendor:
145*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::DriverVersion:
146*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::Profile:
147*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::OpenCL_C_Version:
148*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::LatestConformanceVersionPassed:
149*8975f5c5SAndroid Build Coastguard Worker             ANGLE_TRY(mImpl->getInfoStringLength(name, &copySize));
150*8975f5c5SAndroid Build Coastguard Worker             valString.resize(copySize, '\0');
151*8975f5c5SAndroid Build Coastguard Worker             ANGLE_TRY(mImpl->getInfoString(name, copySize, valString.data()));
152*8975f5c5SAndroid Build Coastguard Worker             copyValue = valString.data();
153*8975f5c5SAndroid Build Coastguard Worker             break;
154*8975f5c5SAndroid Build Coastguard Worker 
155*8975f5c5SAndroid Build Coastguard Worker         // Handle all cached values
156*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::Type:
157*8975f5c5SAndroid Build Coastguard Worker             copyValue = &mInfo.type;
158*8975f5c5SAndroid Build Coastguard Worker             copySize  = sizeof(mInfo.type);
159*8975f5c5SAndroid Build Coastguard Worker             break;
160*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::MaxWorkItemDimensions:
161*8975f5c5SAndroid Build Coastguard Worker             valUInt   = static_cast<cl_uint>(mInfo.maxWorkItemSizes.size());
162*8975f5c5SAndroid Build Coastguard Worker             copyValue = &valUInt;
163*8975f5c5SAndroid Build Coastguard Worker             copySize  = sizeof(valUInt);
164*8975f5c5SAndroid Build Coastguard Worker             break;
165*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::MaxWorkItemSizes:
166*8975f5c5SAndroid Build Coastguard Worker             copyValue = mInfo.maxWorkItemSizes.data();
167*8975f5c5SAndroid Build Coastguard Worker             copySize  = mInfo.maxWorkItemSizes.size() *
168*8975f5c5SAndroid Build Coastguard Worker                        sizeof(decltype(mInfo.maxWorkItemSizes)::value_type);
169*8975f5c5SAndroid Build Coastguard Worker             break;
170*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::MaxMemAllocSize:
171*8975f5c5SAndroid Build Coastguard Worker             copyValue = &mInfo.maxMemAllocSize;
172*8975f5c5SAndroid Build Coastguard Worker             copySize  = sizeof(mInfo.maxMemAllocSize);
173*8975f5c5SAndroid Build Coastguard Worker             break;
174*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::ImageSupport:
175*8975f5c5SAndroid Build Coastguard Worker             copyValue = &mInfo.imageSupport;
176*8975f5c5SAndroid Build Coastguard Worker             copySize  = sizeof(mInfo.imageSupport);
177*8975f5c5SAndroid Build Coastguard Worker             break;
178*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::IL_Version:
179*8975f5c5SAndroid Build Coastguard Worker             copyValue = mInfo.IL_Version.c_str();
180*8975f5c5SAndroid Build Coastguard Worker             copySize  = mInfo.IL_Version.length() + 1u;
181*8975f5c5SAndroid Build Coastguard Worker             break;
182*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::ILsWithVersion:
183*8975f5c5SAndroid Build Coastguard Worker             copyValue = mInfo.ILsWithVersion.data();
184*8975f5c5SAndroid Build Coastguard Worker             copySize =
185*8975f5c5SAndroid Build Coastguard Worker                 mInfo.ILsWithVersion.size() * sizeof(decltype(mInfo.ILsWithVersion)::value_type);
186*8975f5c5SAndroid Build Coastguard Worker             break;
187*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::Image2D_MaxWidth:
188*8975f5c5SAndroid Build Coastguard Worker             copyValue = &mInfo.image2D_MaxWidth;
189*8975f5c5SAndroid Build Coastguard Worker             copySize  = sizeof(mInfo.image2D_MaxWidth);
190*8975f5c5SAndroid Build Coastguard Worker             break;
191*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::Image2D_MaxHeight:
192*8975f5c5SAndroid Build Coastguard Worker             copyValue = &mInfo.image2D_MaxHeight;
193*8975f5c5SAndroid Build Coastguard Worker             copySize  = sizeof(mInfo.image2D_MaxHeight);
194*8975f5c5SAndroid Build Coastguard Worker             break;
195*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::Image3D_MaxWidth:
196*8975f5c5SAndroid Build Coastguard Worker             copyValue = &mInfo.image3D_MaxWidth;
197*8975f5c5SAndroid Build Coastguard Worker             copySize  = sizeof(mInfo.image3D_MaxWidth);
198*8975f5c5SAndroid Build Coastguard Worker             break;
199*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::Image3D_MaxHeight:
200*8975f5c5SAndroid Build Coastguard Worker             copyValue = &mInfo.image3D_MaxHeight;
201*8975f5c5SAndroid Build Coastguard Worker             copySize  = sizeof(mInfo.image3D_MaxHeight);
202*8975f5c5SAndroid Build Coastguard Worker             break;
203*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::Image3D_MaxDepth:
204*8975f5c5SAndroid Build Coastguard Worker             copyValue = &mInfo.image3D_MaxDepth;
205*8975f5c5SAndroid Build Coastguard Worker             copySize  = sizeof(mInfo.image3D_MaxDepth);
206*8975f5c5SAndroid Build Coastguard Worker             break;
207*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::ImageMaxBufferSize:
208*8975f5c5SAndroid Build Coastguard Worker             copyValue = &mInfo.imageMaxBufferSize;
209*8975f5c5SAndroid Build Coastguard Worker             copySize  = sizeof(mInfo.imageMaxBufferSize);
210*8975f5c5SAndroid Build Coastguard Worker             break;
211*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::ImageMaxArraySize:
212*8975f5c5SAndroid Build Coastguard Worker             copyValue = &mInfo.imageMaxArraySize;
213*8975f5c5SAndroid Build Coastguard Worker             copySize  = sizeof(mInfo.imageMaxArraySize);
214*8975f5c5SAndroid Build Coastguard Worker             break;
215*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::ImagePitchAlignment:
216*8975f5c5SAndroid Build Coastguard Worker             copyValue = &mInfo.imagePitchAlignment;
217*8975f5c5SAndroid Build Coastguard Worker             copySize  = sizeof(mInfo.imagePitchAlignment);
218*8975f5c5SAndroid Build Coastguard Worker             break;
219*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::ImageBaseAddressAlignment:
220*8975f5c5SAndroid Build Coastguard Worker             copyValue = &mInfo.imageBaseAddressAlignment;
221*8975f5c5SAndroid Build Coastguard Worker             copySize  = sizeof(mInfo.imageBaseAddressAlignment);
222*8975f5c5SAndroid Build Coastguard Worker             break;
223*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::MemBaseAddrAlign:
224*8975f5c5SAndroid Build Coastguard Worker             copyValue = &mInfo.memBaseAddrAlign;
225*8975f5c5SAndroid Build Coastguard Worker             copySize  = sizeof(mInfo.memBaseAddrAlign);
226*8975f5c5SAndroid Build Coastguard Worker             break;
227*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::ExecutionCapabilities:
228*8975f5c5SAndroid Build Coastguard Worker             copyValue = &mInfo.execCapabilities;
229*8975f5c5SAndroid Build Coastguard Worker             copySize  = sizeof(mInfo.execCapabilities);
230*8975f5c5SAndroid Build Coastguard Worker             break;
231*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::QueueOnDeviceMaxSize:
232*8975f5c5SAndroid Build Coastguard Worker             copyValue = &mInfo.queueOnDeviceMaxSize;
233*8975f5c5SAndroid Build Coastguard Worker             copySize  = sizeof(mInfo.queueOnDeviceMaxSize);
234*8975f5c5SAndroid Build Coastguard Worker             break;
235*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::BuiltInKernels:
236*8975f5c5SAndroid Build Coastguard Worker             copyValue = mInfo.builtInKernels.c_str();
237*8975f5c5SAndroid Build Coastguard Worker             copySize  = mInfo.builtInKernels.length() + 1u;
238*8975f5c5SAndroid Build Coastguard Worker             break;
239*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::BuiltInKernelsWithVersion:
240*8975f5c5SAndroid Build Coastguard Worker             copyValue = mInfo.builtInKernelsWithVersion.data();
241*8975f5c5SAndroid Build Coastguard Worker             copySize  = mInfo.builtInKernelsWithVersion.size() *
242*8975f5c5SAndroid Build Coastguard Worker                        sizeof(decltype(mInfo.builtInKernelsWithVersion)::value_type);
243*8975f5c5SAndroid Build Coastguard Worker             break;
244*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::Version:
245*8975f5c5SAndroid Build Coastguard Worker             copyValue = mInfo.versionStr.c_str();
246*8975f5c5SAndroid Build Coastguard Worker             copySize  = mInfo.versionStr.length() + 1u;
247*8975f5c5SAndroid Build Coastguard Worker             break;
248*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::NumericVersion:
249*8975f5c5SAndroid Build Coastguard Worker             copyValue = &mInfo.version;
250*8975f5c5SAndroid Build Coastguard Worker             copySize  = sizeof(mInfo.version);
251*8975f5c5SAndroid Build Coastguard Worker             break;
252*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::OpenCL_C_AllVersions:
253*8975f5c5SAndroid Build Coastguard Worker             copyValue = mInfo.OpenCL_C_AllVersions.data();
254*8975f5c5SAndroid Build Coastguard Worker             copySize  = mInfo.OpenCL_C_AllVersions.size() *
255*8975f5c5SAndroid Build Coastguard Worker                        sizeof(decltype(mInfo.OpenCL_C_AllVersions)::value_type);
256*8975f5c5SAndroid Build Coastguard Worker             break;
257*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::OpenCL_C_Features:
258*8975f5c5SAndroid Build Coastguard Worker             copyValue = mInfo.OpenCL_C_Features.data();
259*8975f5c5SAndroid Build Coastguard Worker             copySize  = mInfo.OpenCL_C_Features.size() *
260*8975f5c5SAndroid Build Coastguard Worker                        sizeof(decltype(mInfo.OpenCL_C_Features)::value_type);
261*8975f5c5SAndroid Build Coastguard Worker             break;
262*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::Extensions:
263*8975f5c5SAndroid Build Coastguard Worker             copyValue = mInfo.extensions.c_str();
264*8975f5c5SAndroid Build Coastguard Worker             copySize  = mInfo.extensions.length() + 1u;
265*8975f5c5SAndroid Build Coastguard Worker             break;
266*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::ExtensionsWithVersion:
267*8975f5c5SAndroid Build Coastguard Worker             copyValue = mInfo.extensionsWithVersion.data();
268*8975f5c5SAndroid Build Coastguard Worker             copySize  = mInfo.extensionsWithVersion.size() *
269*8975f5c5SAndroid Build Coastguard Worker                        sizeof(decltype(mInfo.extensionsWithVersion)::value_type);
270*8975f5c5SAndroid Build Coastguard Worker             break;
271*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::PartitionProperties:
272*8975f5c5SAndroid Build Coastguard Worker             copyValue = mInfo.partitionProperties.data();
273*8975f5c5SAndroid Build Coastguard Worker             copySize  = mInfo.partitionProperties.size() *
274*8975f5c5SAndroid Build Coastguard Worker                        sizeof(decltype(mInfo.partitionProperties)::value_type);
275*8975f5c5SAndroid Build Coastguard Worker             break;
276*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::PartitionType:
277*8975f5c5SAndroid Build Coastguard Worker             copyValue = mInfo.partitionType.data();
278*8975f5c5SAndroid Build Coastguard Worker             copySize =
279*8975f5c5SAndroid Build Coastguard Worker                 mInfo.partitionType.size() * sizeof(decltype(mInfo.partitionType)::value_type);
280*8975f5c5SAndroid Build Coastguard Worker             break;
281*8975f5c5SAndroid Build Coastguard Worker 
282*8975f5c5SAndroid Build Coastguard Worker         // Handle all mapped values
283*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::Platform:
284*8975f5c5SAndroid Build Coastguard Worker             valPointer = mPlatform.getNative();
285*8975f5c5SAndroid Build Coastguard Worker             copyValue  = &valPointer;
286*8975f5c5SAndroid Build Coastguard Worker             copySize   = sizeof(valPointer);
287*8975f5c5SAndroid Build Coastguard Worker             break;
288*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::ParentDevice:
289*8975f5c5SAndroid Build Coastguard Worker             valPointer = Device::CastNative(mParent.get());
290*8975f5c5SAndroid Build Coastguard Worker             copyValue  = &valPointer;
291*8975f5c5SAndroid Build Coastguard Worker             copySize   = sizeof(valPointer);
292*8975f5c5SAndroid Build Coastguard Worker             break;
293*8975f5c5SAndroid Build Coastguard Worker         case DeviceInfo::ReferenceCount:
294*8975f5c5SAndroid Build Coastguard Worker             valUInt   = isRoot() ? 1u : getRefCount();
295*8975f5c5SAndroid Build Coastguard Worker             copyValue = &valUInt;
296*8975f5c5SAndroid Build Coastguard Worker             copySize  = sizeof(valUInt);
297*8975f5c5SAndroid Build Coastguard Worker             break;
298*8975f5c5SAndroid Build Coastguard Worker 
299*8975f5c5SAndroid Build Coastguard Worker         default:
300*8975f5c5SAndroid Build Coastguard Worker             ASSERT(false);
301*8975f5c5SAndroid Build Coastguard Worker             ANGLE_CL_RETURN_ERROR(CL_INVALID_VALUE);
302*8975f5c5SAndroid Build Coastguard Worker     }
303*8975f5c5SAndroid Build Coastguard Worker 
304*8975f5c5SAndroid Build Coastguard Worker     if (value != nullptr)
305*8975f5c5SAndroid Build Coastguard Worker     {
306*8975f5c5SAndroid Build Coastguard Worker         // CL_INVALID_VALUE if size in bytes specified by param_value_size is < size of return
307*8975f5c5SAndroid Build Coastguard Worker         // type as specified in the Device Queries table and param_value is not a NULL value
308*8975f5c5SAndroid Build Coastguard Worker         if (valueSize < copySize)
309*8975f5c5SAndroid Build Coastguard Worker         {
310*8975f5c5SAndroid Build Coastguard Worker             ANGLE_CL_RETURN_ERROR(CL_INVALID_VALUE);
311*8975f5c5SAndroid Build Coastguard Worker         }
312*8975f5c5SAndroid Build Coastguard Worker         if (copyValue != nullptr)
313*8975f5c5SAndroid Build Coastguard Worker         {
314*8975f5c5SAndroid Build Coastguard Worker             std::memcpy(value, copyValue, copySize);
315*8975f5c5SAndroid Build Coastguard Worker         }
316*8975f5c5SAndroid Build Coastguard Worker     }
317*8975f5c5SAndroid Build Coastguard Worker     if (valueSizeRet != nullptr)
318*8975f5c5SAndroid Build Coastguard Worker     {
319*8975f5c5SAndroid Build Coastguard Worker         *valueSizeRet = copySize;
320*8975f5c5SAndroid Build Coastguard Worker     }
321*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
322*8975f5c5SAndroid Build Coastguard Worker }
323*8975f5c5SAndroid Build Coastguard Worker 
createSubDevices(const cl_device_partition_property * properties,cl_uint numDevices,cl_device_id * subDevices,cl_uint * numDevicesRet)324*8975f5c5SAndroid Build Coastguard Worker angle::Result Device::createSubDevices(const cl_device_partition_property *properties,
325*8975f5c5SAndroid Build Coastguard Worker                                        cl_uint numDevices,
326*8975f5c5SAndroid Build Coastguard Worker                                        cl_device_id *subDevices,
327*8975f5c5SAndroid Build Coastguard Worker                                        cl_uint *numDevicesRet)
328*8975f5c5SAndroid Build Coastguard Worker {
329*8975f5c5SAndroid Build Coastguard Worker     if (subDevices == nullptr)
330*8975f5c5SAndroid Build Coastguard Worker     {
331*8975f5c5SAndroid Build Coastguard Worker         numDevices = 0u;
332*8975f5c5SAndroid Build Coastguard Worker     }
333*8975f5c5SAndroid Build Coastguard Worker     rx::CLDeviceImpl::CreateFuncs subDeviceCreateFuncs;
334*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(mImpl->createSubDevices(properties, numDevices, subDeviceCreateFuncs, numDevicesRet));
335*8975f5c5SAndroid Build Coastguard Worker     cl::DeviceType type = mInfo.type;
336*8975f5c5SAndroid Build Coastguard Worker     type.clear(CL_DEVICE_TYPE_DEFAULT);
337*8975f5c5SAndroid Build Coastguard Worker     DevicePtrs devices;
338*8975f5c5SAndroid Build Coastguard Worker     devices.reserve(subDeviceCreateFuncs.size());
339*8975f5c5SAndroid Build Coastguard Worker     while (!subDeviceCreateFuncs.empty())
340*8975f5c5SAndroid Build Coastguard Worker     {
341*8975f5c5SAndroid Build Coastguard Worker         devices.emplace_back(new Device(mPlatform, this, type, subDeviceCreateFuncs.front()));
342*8975f5c5SAndroid Build Coastguard Worker         // Release initialization reference, lifetime controlled by RefPointer.
343*8975f5c5SAndroid Build Coastguard Worker         devices.back()->release();
344*8975f5c5SAndroid Build Coastguard Worker         if (!devices.back()->mInfo.isValid())
345*8975f5c5SAndroid Build Coastguard Worker         {
346*8975f5c5SAndroid Build Coastguard Worker             return angle::Result::Stop;
347*8975f5c5SAndroid Build Coastguard Worker         }
348*8975f5c5SAndroid Build Coastguard Worker         subDeviceCreateFuncs.pop_front();
349*8975f5c5SAndroid Build Coastguard Worker     }
350*8975f5c5SAndroid Build Coastguard Worker     for (DevicePtr &subDevice : devices)
351*8975f5c5SAndroid Build Coastguard Worker     {
352*8975f5c5SAndroid Build Coastguard Worker         *subDevices++ = subDevice.release();
353*8975f5c5SAndroid Build Coastguard Worker     }
354*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
355*8975f5c5SAndroid Build Coastguard Worker }
356*8975f5c5SAndroid Build Coastguard Worker 
357*8975f5c5SAndroid Build Coastguard Worker Device::~Device() = default;
358*8975f5c5SAndroid Build Coastguard Worker 
supportsBuiltInKernel(const std::string & name) const359*8975f5c5SAndroid Build Coastguard Worker bool Device::supportsBuiltInKernel(const std::string &name) const
360*8975f5c5SAndroid Build Coastguard Worker {
361*8975f5c5SAndroid Build Coastguard Worker     return angle::ContainsToken(mInfo.builtInKernels, ';', name);
362*8975f5c5SAndroid Build Coastguard Worker }
363*8975f5c5SAndroid Build Coastguard Worker 
supportsNativeImageDimensions(const cl_image_desc & desc) const364*8975f5c5SAndroid Build Coastguard Worker bool Device::supportsNativeImageDimensions(const cl_image_desc &desc) const
365*8975f5c5SAndroid Build Coastguard Worker {
366*8975f5c5SAndroid Build Coastguard Worker     switch (FromCLenum<MemObjectType>(desc.image_type))
367*8975f5c5SAndroid Build Coastguard Worker     {
368*8975f5c5SAndroid Build Coastguard Worker         case MemObjectType::Image1D:
369*8975f5c5SAndroid Build Coastguard Worker             return desc.image_width <= mInfo.image2D_MaxWidth;
370*8975f5c5SAndroid Build Coastguard Worker         case MemObjectType::Image2D:
371*8975f5c5SAndroid Build Coastguard Worker             return desc.image_width <= mInfo.image2D_MaxWidth &&
372*8975f5c5SAndroid Build Coastguard Worker                    desc.image_height <= mInfo.image2D_MaxHeight;
373*8975f5c5SAndroid Build Coastguard Worker         case MemObjectType::Image3D:
374*8975f5c5SAndroid Build Coastguard Worker             return desc.image_width <= mInfo.image3D_MaxWidth &&
375*8975f5c5SAndroid Build Coastguard Worker                    desc.image_height <= mInfo.image3D_MaxHeight &&
376*8975f5c5SAndroid Build Coastguard Worker                    desc.image_depth <= mInfo.image3D_MaxDepth;
377*8975f5c5SAndroid Build Coastguard Worker         case MemObjectType::Image1D_Array:
378*8975f5c5SAndroid Build Coastguard Worker             return desc.image_width <= mInfo.image2D_MaxWidth &&
379*8975f5c5SAndroid Build Coastguard Worker                    desc.image_array_size <= mInfo.imageMaxArraySize;
380*8975f5c5SAndroid Build Coastguard Worker         case MemObjectType::Image2D_Array:
381*8975f5c5SAndroid Build Coastguard Worker             return desc.image_width <= mInfo.image2D_MaxWidth &&
382*8975f5c5SAndroid Build Coastguard Worker                    desc.image_height <= mInfo.image2D_MaxHeight &&
383*8975f5c5SAndroid Build Coastguard Worker                    desc.image_array_size <= mInfo.imageMaxArraySize;
384*8975f5c5SAndroid Build Coastguard Worker         case MemObjectType::Image1D_Buffer:
385*8975f5c5SAndroid Build Coastguard Worker             return desc.image_width <= mInfo.imageMaxBufferSize;
386*8975f5c5SAndroid Build Coastguard Worker         default:
387*8975f5c5SAndroid Build Coastguard Worker             ASSERT(false);
388*8975f5c5SAndroid Build Coastguard Worker             break;
389*8975f5c5SAndroid Build Coastguard Worker     }
390*8975f5c5SAndroid Build Coastguard Worker     return false;
391*8975f5c5SAndroid Build Coastguard Worker }
392*8975f5c5SAndroid Build Coastguard Worker 
supportsImageDimensions(const ImageDescriptor & desc) const393*8975f5c5SAndroid Build Coastguard Worker bool Device::supportsImageDimensions(const ImageDescriptor &desc) const
394*8975f5c5SAndroid Build Coastguard Worker {
395*8975f5c5SAndroid Build Coastguard Worker     switch (desc.type)
396*8975f5c5SAndroid Build Coastguard Worker     {
397*8975f5c5SAndroid Build Coastguard Worker         case MemObjectType::Image1D:
398*8975f5c5SAndroid Build Coastguard Worker             return desc.width <= mInfo.image2D_MaxWidth;
399*8975f5c5SAndroid Build Coastguard Worker         case MemObjectType::Image2D:
400*8975f5c5SAndroid Build Coastguard Worker             return desc.width <= mInfo.image2D_MaxWidth && desc.height <= mInfo.image2D_MaxHeight;
401*8975f5c5SAndroid Build Coastguard Worker         case MemObjectType::Image3D:
402*8975f5c5SAndroid Build Coastguard Worker             return desc.width <= mInfo.image3D_MaxWidth && desc.height <= mInfo.image3D_MaxHeight &&
403*8975f5c5SAndroid Build Coastguard Worker                    desc.depth <= mInfo.image3D_MaxDepth;
404*8975f5c5SAndroid Build Coastguard Worker         case MemObjectType::Image1D_Array:
405*8975f5c5SAndroid Build Coastguard Worker             return desc.width <= mInfo.image2D_MaxWidth &&
406*8975f5c5SAndroid Build Coastguard Worker                    desc.arraySize <= mInfo.imageMaxArraySize;
407*8975f5c5SAndroid Build Coastguard Worker         case MemObjectType::Image2D_Array:
408*8975f5c5SAndroid Build Coastguard Worker             return desc.width <= mInfo.image2D_MaxWidth && desc.height <= mInfo.image2D_MaxHeight &&
409*8975f5c5SAndroid Build Coastguard Worker                    desc.arraySize <= mInfo.imageMaxArraySize;
410*8975f5c5SAndroid Build Coastguard Worker         case MemObjectType::Image1D_Buffer:
411*8975f5c5SAndroid Build Coastguard Worker             return desc.width <= mInfo.imageMaxBufferSize;
412*8975f5c5SAndroid Build Coastguard Worker         default:
413*8975f5c5SAndroid Build Coastguard Worker             ASSERT(false);
414*8975f5c5SAndroid Build Coastguard Worker             break;
415*8975f5c5SAndroid Build Coastguard Worker     }
416*8975f5c5SAndroid Build Coastguard Worker     return false;
417*8975f5c5SAndroid Build Coastguard Worker }
418*8975f5c5SAndroid Build Coastguard Worker 
hasDeviceEnqueueCaps() const419*8975f5c5SAndroid Build Coastguard Worker bool Device::hasDeviceEnqueueCaps() const
420*8975f5c5SAndroid Build Coastguard Worker {
421*8975f5c5SAndroid Build Coastguard Worker     return mInfo.queueOnDeviceMaxSize > 0;
422*8975f5c5SAndroid Build Coastguard Worker }
423*8975f5c5SAndroid Build Coastguard Worker 
supportsNonUniformWorkGroups() const424*8975f5c5SAndroid Build Coastguard Worker bool Device::supportsNonUniformWorkGroups() const
425*8975f5c5SAndroid Build Coastguard Worker {
426*8975f5c5SAndroid Build Coastguard Worker     cl_bool support = false;
427*8975f5c5SAndroid Build Coastguard Worker 
428*8975f5c5SAndroid Build Coastguard Worker     if (IsError(mImpl->getInfoUInt(DeviceInfo::NonUniformWorkGroupSupport, &support)))
429*8975f5c5SAndroid Build Coastguard Worker     {
430*8975f5c5SAndroid Build Coastguard Worker         UNREACHABLE();
431*8975f5c5SAndroid Build Coastguard Worker     }
432*8975f5c5SAndroid Build Coastguard Worker     return support;
433*8975f5c5SAndroid Build Coastguard Worker }
434*8975f5c5SAndroid Build Coastguard Worker 
Device(Platform & platform,Device * parent,DeviceType type,const rx::CLDeviceImpl::CreateFunc & createFunc)435*8975f5c5SAndroid Build Coastguard Worker Device::Device(Platform &platform,
436*8975f5c5SAndroid Build Coastguard Worker                Device *parent,
437*8975f5c5SAndroid Build Coastguard Worker                DeviceType type,
438*8975f5c5SAndroid Build Coastguard Worker                const rx::CLDeviceImpl::CreateFunc &createFunc)
439*8975f5c5SAndroid Build Coastguard Worker     : mPlatform(platform), mParent(parent), mImpl(createFunc(*this)), mInfo(mImpl->createInfo(type))
440*8975f5c5SAndroid Build Coastguard Worker {}
441*8975f5c5SAndroid Build Coastguard Worker 
442*8975f5c5SAndroid Build Coastguard Worker }  // namespace cl
443