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, ©Size));
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