88#include " shared/test/common/fixtures/memory_management_fixture.h"
99#include " shared/test/common/helpers/kernel_binary_helper.h"
1010#include " shared/test/common/test_macros/test.h"
11+ #include < shared/test/common/mocks/mock_modules_zebin.h>
1112
1213#include " opencl/source/kernel/kernel.h"
1314#include " opencl/test/unit_test/fixtures/cl_device_fixture.h"
@@ -208,3 +209,168 @@ TEST_F(KernelArgInfoTest, GivenParamWhenGettingKernelArgNameThenCorrectValueIsRe
208209 EXPECT_EQ (0 , strcmp (paramValue, expectedArgName));
209210 delete[] paramValue;
210211}
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