diff --git a/shared/source/device_binary_format/elf/zebin_elf.h b/shared/source/device_binary_format/elf/zebin_elf.h index f0a2e63f3d..5cf7185349 100644 --- a/shared/source/device_binary_format/elf/zebin_elf.h +++ b/shared/source/device_binary_format/elf/zebin_elf.h @@ -216,6 +216,7 @@ constexpr ConstStringRef printfBuffer("printf_buffer"); constexpr ConstStringRef workDimensions("work_dimensions"); constexpr ConstStringRef implicitArgBuffer("implicit_arg_buffer"); constexpr ConstStringRef syncBuffer("sync_buffer"); +constexpr ConstStringRef rtGlobalBuffer("rt_global_buffer"); namespace Image { constexpr ConstStringRef width("image_width"); @@ -573,6 +574,7 @@ enum ArgType : uint8_t { ArgTypeVmeSadAdjustMode, ArgTypeVmeSearchPathType, ArgTypeSyncBuffer, + ArgTypeRtGlobalBuffer, ArgTypeMax }; diff --git a/shared/source/device_binary_format/elf/zeinfo_enum_lookup.h b/shared/source/device_binary_format/elf/zeinfo_enum_lookup.h index b40e27c98c..a02f41a728 100644 --- a/shared/source/device_binary_format/elf/zeinfo_enum_lookup.h +++ b/shared/source/device_binary_format/elf/zeinfo_enum_lookup.h @@ -22,7 +22,7 @@ using namespace Tags::Kernel::PayloadArgument::ArgType::Sampler::Vme; using ArgType = Types::Kernel::ArgType; constexpr ConstStringRef name = "argument type"; -constexpr LookupArray lookup({{{packedLocalIds, ArgType::ArgTypePackedLocalIds}, +constexpr LookupArray lookup({{{packedLocalIds, ArgType::ArgTypePackedLocalIds}, {localId, ArgType::ArgTypeLocalId}, {localSize, ArgType::ArgTypeLocalSize}, {groupCount, ArgType::ArgTypeGroupCount}, @@ -56,7 +56,8 @@ constexpr LookupArray lookup({{{packedLocalIds, Arg {subpixelMode, ArgType::ArgTypeVmeSubpixelMode}, {sadAdjustMode, ArgType::ArgTypeVmeSadAdjustMode}, {searchPathType, ArgType::ArgTypeVmeSearchPathType}, - {syncBuffer, ArgType::ArgTypeSyncBuffer}}}); + {syncBuffer, ArgType::ArgTypeSyncBuffer}, + {rtGlobalBuffer, ArgType::ArgTypeRtGlobalBuffer}}}); static_assert(lookup.size() == ArgType::ArgTypeMax - 1, "Every enum field must be present"); } // namespace ArgType diff --git a/shared/source/device_binary_format/zebin_decoder.cpp b/shared/source/device_binary_format/zebin_decoder.cpp index a4b6e96d63..c3fe1fdd1a 100644 --- a/shared/source/device_binary_format/zebin_decoder.cpp +++ b/shared/source/device_binary_format/zebin_decoder.cpp @@ -1096,6 +1096,11 @@ NEO::DecodeError populateArgDescriptor(const NEO::Elf::ZebinKernelMetadata::Type case NEO::Elf::ZebinKernelMetadata::Types::Kernel::ArgTypeVmeSearchPathType: getVmeDescriptor()->searchPathType = src.offset; break; + + case NEO::Elf::ZebinKernelMetadata::Types::Kernel::ArgTypeRtGlobalBuffer: + dst.payloadMappings.implicitArgs.rtDispatchGlobals.pointerSize = src.size; + dst.payloadMappings.implicitArgs.rtDispatchGlobals.stateless = src.offset; + break; } return DecodeError::Success; diff --git a/shared/test/unit_test/device_binary_format/zebin_decoder_tests.cpp b/shared/test/unit_test/device_binary_format/zebin_decoder_tests.cpp index 6ce7730eae..8d0e7a71c4 100644 --- a/shared/test/unit_test/device_binary_format/zebin_decoder_tests.cpp +++ b/shared/test/unit_test/device_binary_format/zebin_decoder_tests.cpp @@ -5624,6 +5624,24 @@ TEST(PopulateArgDescriptorCrossthreadPayload, GivenArgTypeWorkDimensionsWhenSize } } +TEST(PopulateArgDescriptor, GivenValidArgOfTypeRTGlobalBufferThenRtGlobalBufferIsPopulatedCorrectly) { + NEO::KernelDescriptor kernelDescriptor; + NEO::Elf::ZebinKernelMetadata::Types::Kernel::PayloadArgument::PayloadArgumentBaseT rtGlobalBufferArg; + rtGlobalBufferArg.argType = NEO::Elf::ZebinKernelMetadata::Types::Kernel::ArgTypeRtGlobalBuffer; + rtGlobalBufferArg.size = 8; + rtGlobalBufferArg.offset = 32; + + uint32_t crossThreadDataSize = 0U; + std::string errors, warnings; + auto err = NEO::populateArgDescriptor(rtGlobalBufferArg, kernelDescriptor, crossThreadDataSize, errors, warnings); + EXPECT_EQ(NEO::DecodeError::Success, err); + EXPECT_TRUE(errors.empty()); + EXPECT_TRUE(warnings.empty()); + EXPECT_EQ(40U, crossThreadDataSize); + EXPECT_EQ(8U, kernelDescriptor.payloadMappings.implicitArgs.rtDispatchGlobals.pointerSize); + EXPECT_EQ(32U, kernelDescriptor.payloadMappings.implicitArgs.rtDispatchGlobals.stateless); +} + TEST(PopulateArgDescriptorCrossthreadPayload, GivenArgTypePrintfBufferWhenOffsetAndSizeIsValidThenPopulatesKernelDescriptor) { NEO::ConstStringRef zeinfo = R"===( kernels: