8
8
#include " shared/test/common/fixtures/memory_management_fixture.h"
9
9
#include " shared/test/common/helpers/kernel_binary_helper.h"
10
10
#include " shared/test/common/test_macros/test.h"
11
+ #include < shared/test/common/mocks/mock_modules_zebin.h>
11
12
12
13
#include " opencl/source/kernel/kernel.h"
13
14
#include " opencl/test/unit_test/fixtures/cl_device_fixture.h"
@@ -208,3 +209,168 @@ TEST_F(KernelArgInfoTest, GivenParamWhenGettingKernelArgNameThenCorrectValueIsRe
208
209
EXPECT_EQ (0 , strcmp (paramValue, expectedArgName));
209
210
delete[] paramValue;
210
211
}
212
+
213
+ TEST_F (KernelArgInfoTest, givenNonZebinBinaryAndNoExplicitArgsMetadataWhenQueryingArgsInfoThenReturnError) {
214
+ constexpr auto mockDeviceBinarySize = 0x10 ;
215
+ uint8_t mockDeviceBinary[mockDeviceBinarySize]{0 };
216
+
217
+ auto &buildInfo = pProgram->buildInfos [rootDeviceIndex];
218
+ buildInfo.unpackedDeviceBinary .reset (reinterpret_cast <char *>(mockDeviceBinary));
219
+ buildInfo.unpackedDeviceBinarySize = mockDeviceBinarySize;
220
+ ASSERT_FALSE (NEO::isDeviceBinaryFormat<NEO::DeviceBinaryFormat::Zebin>(ArrayRef<uint8_t >::fromAny (mockDeviceBinary, mockDeviceBinarySize)));
221
+
222
+ auto &kernelDescriptor = const_cast <KernelDescriptor &>(pKernel->getDescriptor ());
223
+ kernelDescriptor.explicitArgsExtendedMetadata .clear ();
224
+ ASSERT_TRUE (kernelDescriptor.explicitArgsExtendedMetadata .empty ());
225
+
226
+ retVal = pKernel->getArgInfo (
227
+ 0 ,
228
+ CL_KERNEL_ARG_NAME,
229
+ 0 ,
230
+ nullptr ,
231
+ 0 );
232
+
233
+ EXPECT_EQ (CL_KERNEL_ARG_INFO_NOT_AVAILABLE, retVal);
234
+ buildInfo.unpackedDeviceBinary .release ();
235
+ }
236
+
237
+ TEST_F (KernelArgInfoTest, givenZebinBinaryAndErrorOnRetrievingArgsMetadataFromKernelsMiscInfoWhenQueryingArgsInfoThenReturnError) {
238
+ ZebinTestData::ValidEmptyProgram zebin;
239
+ ASSERT_TRUE (isDeviceBinaryFormat<NEO::DeviceBinaryFormat::Zebin>(ArrayRef<const uint8_t >::fromAny (zebin.storage .data (), zebin.storage .size ())));
240
+
241
+ auto &buildInfo = pProgram->buildInfos [rootDeviceIndex];
242
+ buildInfo.unpackedDeviceBinary .reset (reinterpret_cast <char *>(zebin.storage .data ()));
243
+ buildInfo.unpackedDeviceBinarySize = zebin.storage .size ();
244
+ ASSERT_EQ (std::string::npos, buildInfo.kernelMiscInfoPos );
245
+
246
+ auto &kernelDescriptor = const_cast <KernelDescriptor &>(pKernel->getDescriptor ());
247
+ kernelDescriptor.explicitArgsExtendedMetadata .clear ();
248
+ ASSERT_TRUE (kernelDescriptor.explicitArgsExtendedMetadata .empty ());
249
+
250
+ retVal = pKernel->getArgInfo (
251
+ 0 ,
252
+ CL_KERNEL_ARG_NAME,
253
+ 0 ,
254
+ nullptr ,
255
+ 0 );
256
+
257
+ EXPECT_EQ (CL_KERNEL_ARG_INFO_NOT_AVAILABLE, retVal);
258
+ buildInfo.unpackedDeviceBinary .release ();
259
+ }
260
+
261
+ TEST_F (KernelArgInfoTest, givenZebinBinaryWithProperKernelsMiscInfoAndNoExplicitArgsMetadataWhenQueryingArgInfoThenRetrieveItFromKernelsMiscInfo) {
262
+ std::string zeInfo = R"===( '
263
+ kernels:
264
+ - name: CopyBuffer
265
+ execution_env:
266
+ simd_size: 32
267
+ payload_arguments:
268
+ - arg_type: arg_bypointer
269
+ offset: 0
270
+ size: 0
271
+ arg_index: 0
272
+ addrmode: stateful
273
+ addrspace: global
274
+ access_type: readwrite
275
+ - arg_type: arg_bypointer
276
+ offset: 32
277
+ size: 8
278
+ arg_index: 0
279
+ addrmode: stateless
280
+ addrspace: global
281
+ access_type: readwrite
282
+ - arg_type: enqueued_local_size
283
+ offset: 40
284
+ size: 12
285
+ kernels_misc_info:
286
+ - name: CopyBuffer
287
+ args_info:
288
+ - index: 0
289
+ name: a
290
+ address_qualifier: __global
291
+ access_qualifier: NONE
292
+ type_name: 'int*;8'
293
+ type_qualifiers: NONE
294
+ )===" ;
295
+ std::vector<uint8_t > storage;
296
+ MockElfEncoder<> elfEncoder;
297
+ auto &elfHeader = elfEncoder.getElfFileHeader ();
298
+ elfHeader.type = NEO::Elf::ET_ZEBIN_EXE;
299
+ elfHeader.machine = pProgram->getExecutionEnvironment ().rootDeviceEnvironments [rootDeviceIndex]->getHardwareInfo ()->platform .eProductFamily ;
300
+ const uint8_t testKernelData[0x10 ] = {0u };
301
+
302
+ elfEncoder.appendSection (NEO::Elf::SHT_PROGBITS, NEO::Elf::SectionsNamesZebin::textPrefix.str () + " CopyBuffer" , testKernelData);
303
+ elfEncoder.appendSection (NEO::Elf::SHT_ZEBIN_ZEINFO, NEO::Elf::SectionsNamesZebin::zeInfo, zeInfo);
304
+ storage = elfEncoder.encode ();
305
+ elfHeader = *reinterpret_cast <NEO::Elf::ElfFileHeader<NEO::Elf::EI_CLASS_64> *>(storage.data ());
306
+
307
+ auto &buildInfo = pProgram->buildInfos [rootDeviceIndex];
308
+
309
+ // set kernels_misc_info pos manually, as we are not invoking decodeZebin() or processProgramInfo() in this test
310
+ ProgramInfo programInfo;
311
+ setKernelMiscInfoPosition (zeInfo, programInfo);
312
+ buildInfo.kernelMiscInfoPos = programInfo.kernelMiscInfoPos ;
313
+ buildInfo.unpackedDeviceBinary .reset (reinterpret_cast <char *>(storage.data ()));
314
+ buildInfo.unpackedDeviceBinarySize = storage.size ();
315
+
316
+ auto &kernelDescriptor = const_cast <KernelDescriptor &>(pKernel->getDescriptor ());
317
+ kernelDescriptor.explicitArgsExtendedMetadata .clear ();
318
+ ASSERT_TRUE (kernelDescriptor.explicitArgsExtendedMetadata .empty ());
319
+
320
+ std::array<cl_kernel_arg_info, 5 > paramNames = {
321
+ CL_KERNEL_ARG_NAME,
322
+ CL_KERNEL_ARG_ADDRESS_QUALIFIER,
323
+ CL_KERNEL_ARG_ACCESS_QUALIFIER,
324
+ CL_KERNEL_ARG_TYPE_NAME,
325
+ CL_KERNEL_ARG_TYPE_QUALIFIER,
326
+ };
327
+ cl_uint argInd = 0 ;
328
+ constexpr size_t maxParamValueSize{0x10 };
329
+ size_t paramValueSize = 0 ;
330
+ size_t paramValueSizeRet = 0 ;
331
+
332
+ for (const auto ¶mName : paramNames) {
333
+ char paramValue[maxParamValueSize]{0 };
334
+
335
+ retVal = pKernel->getArgInfo (
336
+ argInd,
337
+ paramName,
338
+ paramValueSize,
339
+ nullptr ,
340
+ ¶mValueSizeRet);
341
+ EXPECT_NE (0u , paramValueSizeRet);
342
+ ASSERT_EQ (CL_SUCCESS, retVal);
343
+
344
+ ASSERT_LT (paramValueSizeRet, maxParamValueSize);
345
+ paramValueSize = paramValueSizeRet;
346
+
347
+ retVal = pKernel->getArgInfo (
348
+ argInd,
349
+ paramName,
350
+ paramValueSize,
351
+ paramValue,
352
+ nullptr );
353
+ ASSERT_EQ (CL_SUCCESS, retVal);
354
+ switch (paramName) {
355
+ case (CL_KERNEL_ARG_NAME):
356
+ EXPECT_EQ (0 , strcmp (paramValue, " a" ));
357
+ break ;
358
+ case (CL_KERNEL_ARG_ADDRESS_QUALIFIER):
359
+ EXPECT_EQ (*(reinterpret_cast <cl_kernel_arg_address_qualifier *>(paramValue)), static_cast <cl_uint>(CL_KERNEL_ARG_ADDRESS_GLOBAL));
360
+ break ;
361
+ case (CL_KERNEL_ARG_ACCESS_QUALIFIER):
362
+ EXPECT_EQ (*(reinterpret_cast <cl_kernel_arg_access_qualifier *>(paramValue)), static_cast <cl_uint>(CL_KERNEL_ARG_ACCESS_NONE));
363
+ break ;
364
+ case (CL_KERNEL_ARG_TYPE_NAME):
365
+ EXPECT_EQ (0 , strcmp (paramValue, " 'int*;8'" ));
366
+ break ;
367
+ case (CL_KERNEL_ARG_TYPE_QUALIFIER):
368
+ EXPECT_EQ (*(reinterpret_cast <cl_kernel_arg_type_qualifier *>(paramValue)), static_cast <cl_ulong>(CL_KERNEL_ARG_TYPE_NONE));
369
+ break ;
370
+ default :
371
+ ASSERT_TRUE (false );
372
+ break ;
373
+ }
374
+ }
375
+ buildInfo.unpackedDeviceBinary .release ();
376
+ }
0 commit comments