feat(zebin): add sampler metadata support

This commit adds support for sampler's metadata in zebinary and
updates some image's metadata field names.

Resolves: NEO-7257

Signed-off-by: Krystian Chmielewski <krystian.chmielewski@intel.com>
This commit is contained in:
Krystian Chmielewski
2022-08-10 16:11:49 +00:00
committed by Compute-Runtime-Automation
parent 44e1f1ba4b
commit 70ef88c0bb
4 changed files with 371 additions and 118 deletions

View File

@@ -170,6 +170,8 @@ static constexpr ConstStringRef sourceOffset("source_offset");
static constexpr ConstStringRef slmArgAlignment("slm_alignment");
static constexpr ConstStringRef imageType("image_type");
static constexpr ConstStringRef imageTransformable("image_transformable");
static constexpr ConstStringRef samplerType("sampler_type");
namespace ArgType {
static constexpr ConstStringRef localSize("local_size");
static constexpr ConstStringRef groupCount("group_count");
@@ -192,17 +194,56 @@ static constexpr ConstStringRef channelDataType("image_channel_data_type");
static constexpr ConstStringRef channelOrder("image_channel_order");
static constexpr ConstStringRef arraySize("image_array_size");
static constexpr ConstStringRef numSamples("image_num_samples");
static constexpr ConstStringRef numMipLevels("image_mip_levels");
static constexpr ConstStringRef flatBaseOffset("image_flat_base_offset");
static constexpr ConstStringRef flatWidth("image_flat_width");
static constexpr ConstStringRef flatHeight("image_flat_height");
static constexpr ConstStringRef flatPitch("image_flat_pitch");
static constexpr ConstStringRef numMipLevels("image_num_mip_levels");
static constexpr ConstStringRef flatBaseOffset("flat_image_baseoffset");
static constexpr ConstStringRef flatWidth("flat_image_width");
static constexpr ConstStringRef flatHeight("flat_image_height");
static constexpr ConstStringRef flatPitch("flat_image_pitch");
} // namespace Image
namespace Sampler {
static constexpr ConstStringRef snapWa("sampler_snap_wa");
static constexpr ConstStringRef normCoords("sampler_normalized");
static constexpr ConstStringRef addrMode("sampler_address");
namespace Vme {
static constexpr ConstStringRef blockType("vme_mb_block_type");
static constexpr ConstStringRef subpixelMode("vme_subpixel_mode");
static constexpr ConstStringRef sadAdjustMode("vme_sad_adjust_mode");
static constexpr ConstStringRef searchPathType("vme_search_path_type");
} // namespace Vme
} // namespace Sampler
} // namespace ArgType
namespace ImageType {
static constexpr ConstStringRef imageTypeMedia("media");
static constexpr ConstStringRef imageTypeBlock("media_block");
static constexpr ConstStringRef imageTypeBuffer("image_buffer");
static constexpr ConstStringRef imageType1D("image_1d");
static constexpr ConstStringRef imageType1DArray("image_1d_array");
static constexpr ConstStringRef imageType2D("image_2d");
static constexpr ConstStringRef imageType2DArray("image_2d_array");
static constexpr ConstStringRef imageType3D("image_3d");
static constexpr ConstStringRef imageTypeCube("image_cube_array");
static constexpr ConstStringRef imageTypeCubeArray("image_buffer");
static constexpr ConstStringRef imageType2DDepth("image_2d_depth");
static constexpr ConstStringRef imageType2DArrayDepth("image_2d_array_depth");
static constexpr ConstStringRef imageType2DMSAA("image_2d_msaa");
static constexpr ConstStringRef imageType2DMSAADepth("image_2d_msaa_depth");
static constexpr ConstStringRef imageType2DArrayMSAA("image_2d_array_msaa");
static constexpr ConstStringRef imageType2DArrayMSAADepth("image_2d_array_msaa_depth");
static constexpr ConstStringRef imageType2DMedia("image_2d_media");
static constexpr ConstStringRef imageType2DMediaBlock("image_2d_media_block");
} // namespace ImageType
namespace SamplerType {
static constexpr ConstStringRef samplerTypeTexture("texture");
static constexpr ConstStringRef samplerType8x8("sample_8x8");
static constexpr ConstStringRef samplerType2DConsolve8x8("sample_8x8_2dconvolve");
static constexpr ConstStringRef samplerTypeErode8x8("sample_8x8_erode");
static constexpr ConstStringRef samplerTypeDilate8x8("sample_8x8_dilate");
static constexpr ConstStringRef samplerTypeMinMaxFilter8x8("sample_8x8_minmaxfilter");
static constexpr ConstStringRef samplerTypeCentroid8x8("sample_8x8_centroid");
static constexpr ConstStringRef samplerTypeBoolCentroid8x8("sample_8x8_bool_centroid");
static constexpr ConstStringRef samplerTypeBoolSum8x8("sample_8x8_bool_sum");
static constexpr ConstStringRef samplerTypeVD("vd");
static constexpr ConstStringRef samplerTypeVE("ve");
static constexpr ConstStringRef samplerTypeVME("vme");
} // namespace SamplerType
namespace MemoryAddressingMode {
static constexpr ConstStringRef stateless("stateless");
static constexpr ConstStringRef stateful("stateful");
@@ -412,6 +453,13 @@ enum ArgType : uint8_t {
ArgTypeImageFlatWidth,
ArgTypeImageFlatHeight,
ArgTypeImageFlatPitch,
ArgTypeSamplerSnapWa,
ArgTypeSamplerNormCoords,
ArgTypeSamplerAddrMode,
ArgTypeVmeMbBlockType,
ArgTypeVmeSubpixelMode,
ArgTypeVmeSadAdjustMode,
ArgTypeVmeSearchPathType,
ArgTypeMax
};
@@ -463,11 +511,42 @@ enum AccessType : uint8_t {
enum ImageType : uint8_t {
ImageTypeUnknown,
ImageTypeMedia,
ImageTypeMediaBlock,
ImageTypeBuffer,
ImageType1D,
ImageType1DArray,
ImageType2D,
ImageType2DArray,
ImageType3D,
ImageTypeCube,
ImageTypeCubeArray,
ImageType2DDepth,
ImageType2DArrayDepth,
ImageType2DMSAA,
ImageType2DMSAADepth,
ImageType2DArrayMSAA,
ImageType2DArrayMSAADepth,
ImageType2DMedia,
ImageType2DMediaBlock,
ImageTypeMax
};
enum SamplerType : uint8_t {
SamplerTypeUnknown,
SamplerTypeTexture,
SamplerType8x8,
SamplerType2DConvolve8x8,
SamplerTypeErode8x8,
SamplerTypeDilate8x8,
SamplerTypeMinMaxFilter8x8,
SamplerTypeCentroid8x8,
SamplerTypeBoolCentroid8x8,
SamplerTypeBoolSum8x8,
SamplerTypeVME,
SamplerTypeVE,
SamplerTypeVD,
SamplerTypeMax
};
using ArgTypeT = ArgType;
using OffseT = int32_t;
using SourceOffseT = int32_t;
@@ -499,6 +578,7 @@ struct PayloadArgumentBaseT {
SlmAlignmentT slmArgAlignment = Defaults::slmArgAlignment;
ImageType imageType = ImageTypeUnknown;
bool imageTransformable = false;
SamplerType samplerType = SamplerTypeUnknown;
};
} // namespace PayloadArgument

View File

@@ -17,10 +17,12 @@ namespace ArgType {
using namespace Tags::Kernel::PayloadArgument::ArgType;
using namespace Tags::Kernel::PerThreadPayloadArgument::ArgType;
using namespace Tags::Kernel::PayloadArgument::ArgType::Image;
using namespace Tags::Kernel::PayloadArgument::ArgType::Sampler;
using namespace Tags::Kernel::PayloadArgument::ArgType::Sampler::Vme;
using ArgType = Types::Kernel::ArgType;
static constexpr ConstStringRef name = "argument type";
static constexpr LookupArray<ConstStringRef, ArgType, 27> lookup({{{packedLocalIds, ArgType::ArgTypePackedLocalIds},
static constexpr LookupArray<ConstStringRef, ArgType, 34> lookup({{{packedLocalIds, ArgType::ArgTypePackedLocalIds},
{localId, ArgType::ArgTypeLocalId},
{localSize, ArgType::ArgTypeLocalSize},
{groupCount, ArgType::ArgTypeGroupCount},
@@ -46,7 +48,14 @@ static constexpr LookupArray<ConstStringRef, ArgType, 27> lookup({{{packedLocalI
{flatBaseOffset, ArgType::ArgTypeImageFlatBaseOffset},
{flatWidth, ArgType::ArgTypeImageFlatWidth},
{flatHeight, ArgType::ArgTypeImageFlatHeight},
{flatPitch, ArgType::ArgTypeImageFlatPitch}}});
{flatPitch, ArgType::ArgTypeImageFlatPitch},
{snapWa, ArgType::ArgTypeSamplerSnapWa},
{normCoords, ArgType::ArgTypeSamplerNormCoords},
{addrMode, ArgType::ArgTypeSamplerAddrMode},
{blockType, ArgType::ArgTypeVmeMbBlockType},
{subpixelMode, ArgType::ArgTypeVmeSubpixelMode},
{sadAdjustMode, ArgType::ArgTypeVmeSadAdjustMode},
{searchPathType, ArgType::ArgTypeVmeSearchPathType}}});
static_assert(lookup.size() == ArgType::ArgTypeMax - 1, "Every enum field must be present");
} // namespace ArgType
namespace MemoryAddressingMode {
@@ -103,11 +112,42 @@ namespace ImageType {
using namespace Tags::Kernel::PayloadArgument::ImageType;
using ImageType = Types::Kernel::PayloadArgument::ImageType;
static constexpr ConstStringRef name = "image type";
static constexpr LookupArray<ConstStringRef, ImageType, 2> lookup({{{imageTypeMedia, ImageType::ImageTypeMedia},
{imageTypeBlock, ImageType::ImageTypeMediaBlock}}});
static constexpr LookupArray<ConstStringRef, ImageType, 16> lookup({{{imageTypeBuffer, ImageType::ImageTypeBuffer},
{imageType1D, ImageType::ImageType1D},
{imageType1DArray, ImageType::ImageType1DArray},
{imageType2D, ImageType::ImageType2D},
{imageType2DArray, ImageType::ImageType2DArray},
{imageType3D, ImageType::ImageType3D},
{imageTypeCube, ImageType::ImageTypeCube},
{imageTypeCubeArray, ImageType::ImageTypeCubeArray},
{imageType2DDepth, ImageType::ImageType2DDepth},
{imageType2DArrayDepth, ImageType::ImageType2DArrayDepth},
{imageType2DMSAA, ImageType::ImageType2DMSAA},
{imageType2DMSAADepth, ImageType::ImageType2DMSAADepth},
{imageType2DArrayMSAA, ImageType::ImageType2DArrayMSAA},
{imageType2DArrayMSAADepth, ImageType::ImageType2DArrayMSAADepth},
{imageType2DMedia, ImageType::ImageType2DMedia},
{imageType2DMediaBlock, ImageType::ImageType2DMediaBlock}}});
static_assert(lookup.size() == ImageType::ImageTypeMax - 1, "Every enum field must be present");
} // namespace ImageType
namespace SamplerType {
using namespace Tags::Kernel::PayloadArgument::SamplerType;
using SamplerType = Types::Kernel::PayloadArgument::SamplerType;
static constexpr ConstStringRef name = "sampler type";
static constexpr LookupArray<ConstStringRef, SamplerType, 12> lookup({{{samplerTypeTexture, SamplerType::SamplerTypeTexture},
{samplerType8x8, SamplerType::SamplerType8x8},
{samplerType2DConsolve8x8, SamplerType::SamplerType2DConvolve8x8},
{samplerTypeErode8x8, SamplerType::SamplerTypeErode8x8},
{samplerTypeDilate8x8, SamplerType::SamplerTypeDilate8x8},
{samplerTypeMinMaxFilter8x8, SamplerType::SamplerTypeMinMaxFilter8x8},
{samplerTypeCentroid8x8, SamplerType::SamplerTypeBoolCentroid8x8},
{samplerTypeBoolCentroid8x8, SamplerType::SamplerTypeBoolCentroid8x8},
{samplerTypeBoolSum8x8, SamplerType::SamplerTypeBoolSum8x8},
{samplerTypeVME, SamplerType::SamplerTypeVME},
{samplerTypeVE, SamplerType::SamplerTypeVE},
{samplerTypeVD, SamplerType::SamplerTypeVD}}});
static_assert(lookup.size() == SamplerType::SamplerTypeMax - 1, "Every enum field must be present");
} // namespace SamplerType
template <typename T>
struct EnumLooker {};
@@ -147,4 +187,9 @@ struct EnumLooker<Types::Kernel::PayloadArgument::ImageType> {
static constexpr ConstStringRef name = ImageType::name;
static constexpr auto members = ImageType::lookup;
};
template <>
struct EnumLooker<Types::Kernel::PayloadArgument::SamplerType> {
static constexpr ConstStringRef name = SamplerType::name;
static constexpr auto members = SamplerType::lookup;
};
} // namespace NEO::Zebin::ZeInfo::EnumLookup

View File

@@ -16,6 +16,7 @@
#include "shared/source/device_binary_format/elf/zeinfo_enum_lookup.h"
#include "shared/source/device_binary_format/yaml/yaml_parser.h"
#include "shared/source/helpers/ptr_math.h"
#include "shared/source/kernel/kernel_arg_descriptor_extended_vme.h"
#include "shared/source/program/kernel_info.h"
#include "shared/source/program/program_info.h"
#include "shared/source/utilities/stackvec.h"
@@ -501,6 +502,8 @@ DecodeError readZeInfoPayloadArguments(const NEO::Yaml::YamlParser &parser, cons
validPayload &= readZeInfoEnumChecked(parser, payloadArgumentMemberNd, payloadArgMetadata.imageType, context, outErrReason);
} else if (NEO::Elf::ZebinKernelMetadata::Tags::Kernel::PayloadArgument::imageTransformable == key) {
validPayload &= readZeInfoValueChecked(parser, payloadArgumentMemberNd, payloadArgMetadata.imageTransformable, context, outErrReason);
} else if (NEO::Elf::ZebinKernelMetadata::Tags::Kernel::PayloadArgument::samplerType == key) {
validPayload &= readZeInfoEnumChecked(parser, payloadArgumentMemberNd, payloadArgMetadata.samplerType, context, outErrReason);
} else {
outWarning.append("DeviceBinaryFormat::Zebin::" + NEO::Elf::SectionsNamesZebin::zeInfo.str() + " : Unknown entry \"" + key.str() + "\" for payload argument in context of " + context.str() + "\n");
}
@@ -674,6 +677,17 @@ NEO::DecodeError populateArgDescriptor(const NEO::Elf::ZebinKernelMetadata::Type
NEO::DecodeError populateArgDescriptor(const NEO::Elf::ZebinKernelMetadata::Types::Kernel::PayloadArgument::PayloadArgumentBaseT &src, NEO::KernelDescriptor &dst, uint32_t &crossThreadDataSize,
std::string &outErrReason, std::string &outWarning) {
crossThreadDataSize = std::max<uint32_t>(crossThreadDataSize, src.offset + src.size);
auto &explicitArgs = dst.payloadMappings.explicitArgs;
auto getVmeDescriptor = [&src, &dst]() {
auto &argsExt = dst.payloadMappings.explicitArgsExtendedDescriptors;
argsExt.resize(dst.payloadMappings.explicitArgs.size());
if (argsExt[src.argIndex] == nullptr) {
argsExt[src.argIndex] = std::make_unique<ArgDescVme>();
}
return static_cast<ArgDescVme *>(argsExt[src.argIndex].get());
};
switch (src.argType) {
default:
outErrReason.append("DeviceBinaryFormat::Zebin : Invalid arg type in cross thread data section in context of : " + dst.kernelMetadata.kernelName + ".\n");
@@ -686,7 +700,8 @@ NEO::DecodeError populateArgDescriptor(const NEO::Elf::ZebinKernelMetadata::Type
}
case NEO::Elf::ZebinKernelMetadata::Types::Kernel::ArgTypeArgBypointer: {
auto &argTraits = dst.payloadMappings.explicitArgs[src.argIndex].getTraits();
auto &arg = dst.payloadMappings.explicitArgs[src.argIndex];
auto &argTraits = arg.getTraits();
switch (src.addrspace) {
default:
UNRECOVERABLE_IF(NEO::Elf::ZebinKernelMetadata::Types::Kernel::PayloadArgument::AddressSpaceUnknown != src.addrspace);
@@ -708,15 +723,23 @@ NEO::DecodeError populateArgDescriptor(const NEO::Elf::ZebinKernelMetadata::Type
case NEO::Elf::ZebinKernelMetadata::Types::Kernel::PayloadArgument::AddressSpaceImage: {
dst.payloadMappings.explicitArgs[src.argIndex].as<ArgDescImage>(true);
auto &extendedInfo = dst.payloadMappings.explicitArgs[src.argIndex].getExtendedTypeInfo();
extendedInfo.isMediaImage = (src.imageType == NEO::Elf::ZebinKernelMetadata::Types::Kernel::PayloadArgument::ImageType::ImageTypeMedia);
extendedInfo.isMediaBlockImage = (src.imageType == NEO::Elf::ZebinKernelMetadata::Types::Kernel::PayloadArgument::ImageType::ImageTypeMediaBlock);
extendedInfo.isMediaImage = (src.imageType == NEO::Elf::ZebinKernelMetadata::Types::Kernel::PayloadArgument::ImageType::ImageType2DMedia);
extendedInfo.isMediaBlockImage = (src.imageType == NEO::Elf::ZebinKernelMetadata::Types::Kernel::PayloadArgument::ImageType::ImageType2DMediaBlock);
extendedInfo.isTransformable = src.imageTransformable;
dst.kernelAttributes.flags.usesImages = true;
} break;
case NEO::Elf::ZebinKernelMetadata::Types::Kernel::PayloadArgument::AddressSpaceSampler: {
using SamplerType = NEO::Elf::ZebinKernelMetadata::Types::Kernel::PayloadArgument::SamplerType;
dst.payloadMappings.explicitArgs[src.argIndex].as<ArgDescSampler>(true);
auto &extendedInfo = arg.getExtendedTypeInfo();
extendedInfo.isAccelerator = (src.samplerType == SamplerType::SamplerTypeVME) ||
(src.samplerType == SamplerType::SamplerTypeVE) ||
(src.samplerType == SamplerType::SamplerTypeVD);
const bool usesVme = src.samplerType == SamplerType::SamplerTypeVME;
extendedInfo.hasVmeExtendedDescriptor = usesVme;
dst.kernelAttributes.flags.usesVme = usesVme;
dst.kernelAttributes.flags.usesSamplers = true;
} break;
case NEO::Elf::ZebinKernelMetadata::Types::Kernel::PayloadArgument::AddressSpaceSampler:
static constexpr auto maxSamplerStateSize = 16U;
static constexpr auto maxIndirectSamplerStateSize = 64U;
dst.payloadMappings.explicitArgs[src.argIndex].as<ArgDescSampler>(true).bindful = maxIndirectSamplerStateSize + maxSamplerStateSize * src.samplerIndex;
break;
}
switch (src.accessType) {
@@ -744,6 +767,12 @@ NEO::DecodeError populateArgDescriptor(const NEO::Elf::ZebinKernelMetadata::Type
outErrReason.append("Invalid or missing memory addressing mode for arg idx : " + std::to_string(src.argIndex) + " in context of : " + dst.kernelMetadata.kernelName + ".\n");
return DecodeError::InvalidBinary;
case NEO::Elf::ZebinKernelMetadata::Types::Kernel::PayloadArgument::MemoryAddressingModeStateful:
if (dst.payloadMappings.explicitArgs[src.argIndex].is<NEO::ArgDescriptor::ArgTSampler>()) {
static constexpr auto maxSamplerStateSize = 16U;
static constexpr auto maxIndirectSamplerStateSize = 64U;
auto &sampler = dst.payloadMappings.explicitArgs[src.argIndex].as<ArgDescSampler>();
sampler.bindful = maxIndirectSamplerStateSize + maxSamplerStateSize * src.samplerIndex;
}
break;
case NEO::Elf::ZebinKernelMetadata::Types::Kernel::PayloadArgument::MemoryAddressingModeStateless:
if (false == dst.payloadMappings.explicitArgs[src.argIndex].is<NEO::ArgDescriptor::ArgTPointer>()) {
@@ -868,65 +897,81 @@ NEO::DecodeError populateArgDescriptor(const NEO::Elf::ZebinKernelMetadata::Type
break;
}
case NEO::Elf::ZebinKernelMetadata::Types::Kernel::ArgTypeImageHeight: {
auto &arg = dst.payloadMappings.explicitArgs[src.argIndex].as<ArgDescImage>();
arg.metadataPayload.imgHeight = src.offset;
} break;
case NEO::Elf::ZebinKernelMetadata::Types::Kernel::ArgTypeImageHeight:
explicitArgs[src.argIndex].as<ArgDescImage>(true).metadataPayload.imgHeight = src.offset;
break;
case NEO::Elf::ZebinKernelMetadata::Types::Kernel::ArgTypeImageWidth: {
auto &arg = dst.payloadMappings.explicitArgs[src.argIndex].as<ArgDescImage>();
arg.metadataPayload.imgWidth = src.offset;
} break;
case NEO::Elf::ZebinKernelMetadata::Types::Kernel::ArgTypeImageWidth:
explicitArgs[src.argIndex].as<ArgDescImage>(true).metadataPayload.imgWidth = src.offset;
break;
case NEO::Elf::ZebinKernelMetadata::Types::Kernel::ArgTypeImageDepth: {
auto &arg = dst.payloadMappings.explicitArgs[src.argIndex].as<ArgDescImage>();
arg.metadataPayload.imgDepth = src.offset;
} break;
case NEO::Elf::ZebinKernelMetadata::Types::Kernel::ArgTypeImageDepth:
explicitArgs[src.argIndex].as<ArgDescImage>(true).metadataPayload.imgDepth = src.offset;
break;
case NEO::Elf::ZebinKernelMetadata::Types::Kernel::ArgTypeImageChannelDataType: {
auto &arg = dst.payloadMappings.explicitArgs[src.argIndex].as<ArgDescImage>();
arg.metadataPayload.channelDataType = src.offset;
} break;
case NEO::Elf::ZebinKernelMetadata::Types::Kernel::ArgTypeImageChannelDataType:
explicitArgs[src.argIndex].as<ArgDescImage>(true).metadataPayload.channelDataType = src.offset;
break;
case NEO::Elf::ZebinKernelMetadata::Types::Kernel::ArgTypeImageChannelOrder: {
auto &arg = dst.payloadMappings.explicitArgs[src.argIndex].as<ArgDescImage>();
arg.metadataPayload.channelOrder = src.offset;
} break;
case NEO::Elf::ZebinKernelMetadata::Types::Kernel::ArgTypeImageChannelOrder:
explicitArgs[src.argIndex].as<ArgDescImage>(true).metadataPayload.channelOrder = src.offset;
break;
case NEO::Elf::ZebinKernelMetadata::Types::Kernel::ArgTypeImageArraySize: {
auto &arg = dst.payloadMappings.explicitArgs[src.argIndex].as<ArgDescImage>();
arg.metadataPayload.arraySize = src.offset;
} break;
case NEO::Elf::ZebinKernelMetadata::Types::Kernel::ArgTypeImageArraySize:
explicitArgs[src.argIndex].as<ArgDescImage>(true).metadataPayload.arraySize = src.offset;
break;
case NEO::Elf::ZebinKernelMetadata::Types::Kernel::ArgTypeImageNumSamples: {
auto &arg = dst.payloadMappings.explicitArgs[src.argIndex].as<ArgDescImage>();
arg.metadataPayload.numSamples = src.offset;
} break;
case NEO::Elf::ZebinKernelMetadata::Types::Kernel::ArgTypeImageNumSamples:
explicitArgs[src.argIndex].as<ArgDescImage>(true).metadataPayload.numSamples = src.offset;
break;
case NEO::Elf::ZebinKernelMetadata::Types::Kernel::ArgTypeImageMipLevels: {
auto &arg = dst.payloadMappings.explicitArgs[src.argIndex].as<ArgDescImage>();
arg.metadataPayload.numMipLevels = src.offset;
} break;
case NEO::Elf::ZebinKernelMetadata::Types::Kernel::ArgTypeImageMipLevels:
explicitArgs[src.argIndex].as<ArgDescImage>(true).metadataPayload.numMipLevels = src.offset;
break;
case NEO::Elf::ZebinKernelMetadata::Types::Kernel::ArgTypeImageFlatBaseOffset: {
auto &arg = dst.payloadMappings.explicitArgs[src.argIndex].as<ArgDescImage>();
arg.metadataPayload.flatBaseOffset = src.offset;
} break;
case NEO::Elf::ZebinKernelMetadata::Types::Kernel::ArgTypeImageFlatBaseOffset:
explicitArgs[src.argIndex].as<ArgDescImage>(true).metadataPayload.flatBaseOffset = src.offset;
break;
case NEO::Elf::ZebinKernelMetadata::Types::Kernel::ArgTypeImageFlatWidth: {
auto &arg = dst.payloadMappings.explicitArgs[src.argIndex].as<ArgDescImage>();
arg.metadataPayload.flatWidth = src.offset;
} break;
case NEO::Elf::ZebinKernelMetadata::Types::Kernel::ArgTypeImageFlatWidth:
explicitArgs[src.argIndex].as<ArgDescImage>(true).metadataPayload.flatWidth = src.offset;
break;
case NEO::Elf::ZebinKernelMetadata::Types::Kernel::ArgTypeImageFlatHeight: {
auto &arg = dst.payloadMappings.explicitArgs[src.argIndex].as<ArgDescImage>();
arg.metadataPayload.flatHeight = src.offset;
} break;
case NEO::Elf::ZebinKernelMetadata::Types::Kernel::ArgTypeImageFlatHeight:
explicitArgs[src.argIndex].as<ArgDescImage>(true).metadataPayload.flatHeight = src.offset;
break;
case NEO::Elf::ZebinKernelMetadata::Types::Kernel::ArgTypeImageFlatPitch: {
auto &arg = dst.payloadMappings.explicitArgs[src.argIndex].as<ArgDescImage>();
arg.metadataPayload.flatPitch = src.offset;
} break;
case NEO::Elf::ZebinKernelMetadata::Types::Kernel::ArgTypeImageFlatPitch:
explicitArgs[src.argIndex].as<ArgDescImage>(true).metadataPayload.flatPitch = src.offset;
break;
case NEO::Elf::ZebinKernelMetadata::Types::Kernel::ArgTypeSamplerAddrMode:
explicitArgs[src.argIndex].as<ArgDescSampler>(true).metadataPayload.samplerAddressingMode = src.offset;
break;
case NEO::Elf::ZebinKernelMetadata::Types::Kernel::ArgTypeSamplerNormCoords:
explicitArgs[src.argIndex].as<ArgDescSampler>(true).metadataPayload.samplerNormalizedCoords = src.offset;
break;
case NEO::Elf::ZebinKernelMetadata::Types::Kernel::ArgTypeSamplerSnapWa:
explicitArgs[src.argIndex].as<ArgDescSampler>(true).metadataPayload.samplerSnapWa = src.offset;
break;
case NEO::Elf::ZebinKernelMetadata::Types::Kernel::ArgTypeVmeMbBlockType:
getVmeDescriptor()->mbBlockType = src.offset;
break;
case NEO::Elf::ZebinKernelMetadata::Types::Kernel::ArgTypeVmeSubpixelMode:
getVmeDescriptor()->subpixelMode = src.offset;
break;
case NEO::Elf::ZebinKernelMetadata::Types::Kernel::ArgTypeVmeSadAdjustMode:
getVmeDescriptor()->sadAdjustMode = src.offset;
break;
case NEO::Elf::ZebinKernelMetadata::Types::Kernel::ArgTypeVmeSearchPathType:
getVmeDescriptor()->searchPathType = src.offset;
break;
}
return DecodeError::Success;
}

View File

@@ -11,6 +11,7 @@
#include "shared/source/device_binary_format/zebin_decoder.h"
#include "shared/source/helpers/ptr_math.h"
#include "shared/source/helpers/string.h"
#include "shared/source/kernel/kernel_arg_descriptor_extended_vme.h"
#include "shared/source/program/kernel_info.h"
#include "shared/source/program/program_info.h"
#include "shared/test/common/device_binary_format/zebin_tests.h"
@@ -3897,47 +3898,6 @@ TEST(PopulateArgDescriptorCrossthreadPalyoad, GivenPointerArgWhenAddressSpaceIsI
EXPECT_TRUE(programInfo.kernelInfos[0]->kernelDescriptor.payloadMappings.explicitArgs[0].is<NEO::ArgDescriptor::ArgTImage>());
}
TEST(PopulateArgDescriptorCrossthreadPalyoad, GivenPointerArgWhenAddressSpaceIsSamplerThenPopulatesArgDescriptorAccordingly) {
using AddressSpace = NEO::KernelArgMetadata::AddressSpaceQualifier;
using namespace NEO::Elf::ZebinKernelMetadata::Tags::Kernel::PayloadArgument::AddrSpace;
std::string zeinfo = R"===(
kernels:
- name : 'some_kernel'
execution_env:
simd_size: 32
payload_arguments:
- arg_type : arg_bypointer
arg_index : 0
addrspace: sampler
access_type: readwrite
addrmode: stateful
)===";
NEO::ProgramInfo programInfo;
ZebinTestData::ValidEmptyProgram zebin;
zebin.appendSection(NEO::Elf::SHT_PROGBITS, NEO::Elf::SectionsNamesZebin::textPrefix.str() + "some_kernel", {});
std::string errors, warnings;
auto elf = NEO::Elf::decodeElf(zebin.storage, errors, warnings);
ASSERT_NE(nullptr, elf.elfFileHeader) << errors << " " << warnings;
NEO::Yaml::YamlParser parser;
bool parseSuccess = parser.parse(zeinfo, errors, warnings);
ASSERT_TRUE(parseSuccess) << errors << " " << warnings;
NEO::ZebinSections zebinSections;
auto extractErr = NEO::extractZebinSections(elf, zebinSections, errors, warnings);
ASSERT_EQ(NEO::DecodeError::Success, extractErr) << errors << " " << warnings;
auto &kernelNode = *parser.createChildrenRange(*parser.findNodeWithKeyDfs("kernels")).begin();
auto err = NEO::populateKernelDescriptor(programInfo, elf, zebinSections, parser, kernelNode, errors, warnings);
EXPECT_EQ(NEO::DecodeError::Success, err);
EXPECT_TRUE(errors.empty()) << errors;
EXPECT_TRUE(warnings.empty()) << warnings;
ASSERT_EQ(1U, programInfo.kernelInfos.size());
ASSERT_EQ(1U, programInfo.kernelInfos[0]->kernelDescriptor.payloadMappings.explicitArgs.size());
EXPECT_TRUE(programInfo.kernelInfos[0]->kernelDescriptor.payloadMappings.explicitArgs[0].is<NEO::ArgDescriptor::ArgTSampler>());
}
TEST(PopulateArgDescriptorCrossthreadPalyoad, GivenPointerArgWhenAccessQualifierIsKnownThenPopulatesArgDescriptorAccordingly) {
using AccessQualifier = NEO::KernelArgMetadata::AccessQualifier;
using namespace NEO::Elf::ZebinKernelMetadata::Tags::Kernel::PayloadArgument::AccessType;
@@ -4900,6 +4860,7 @@ TEST(PopulateArgDescriptorCrossthreadPayload, GivenArgTypePrintfBufferWhenOffset
ASSERT_EQ(32U, printfSurfaceAddress.stateless);
EXPECT_EQ(8U, printfSurfaceAddress.pointerSize);
}
TEST(PopulateArgDescriptorCrossthreadPayload, GivenValidImageArgumentWithImageMetadataThenPopulatesKernelDescriptor) {
NEO::ConstStringRef zeinfo = R"===(
kernels:
@@ -4914,7 +4875,7 @@ TEST(PopulateArgDescriptorCrossthreadPayload, GivenValidImageArgumentWithImageMe
addrmode: stateful
addrspace: image
access_type: readwrite
image_type: media
image_type: image_2d_media
image_transformable: true
- arg_type: arg_bypointer
offset: 0
@@ -4923,7 +4884,7 @@ TEST(PopulateArgDescriptorCrossthreadPayload, GivenValidImageArgumentWithImageMe
addrmode: stateful
addrspace: image
access_type: readwrite
image_type: media_block
image_type: image_2d_media_block
- arg_type: image_height
offset: 0
size: 4
@@ -4952,23 +4913,23 @@ TEST(PopulateArgDescriptorCrossthreadPayload, GivenValidImageArgumentWithImageMe
offset: 24
size: 4
arg_index: 1
- arg_type: image_mip_levels
- arg_type: image_num_mip_levels
offset: 28
size: 4
arg_index: 1
- arg_type: image_flat_base_offset
- arg_type: flat_image_baseoffset
offset: 32
size: 8
arg_index: 1
- arg_type: image_flat_width
- arg_type: flat_image_width
offset: 40
size: 4
arg_index: 1
- arg_type: image_flat_height
- arg_type: flat_image_height
offset: 44
size: 4
arg_index: 1
- arg_type: image_flat_pitch
- arg_type: flat_image_pitch
offset: 48
size: 4
arg_index: 1
@@ -5022,6 +4983,128 @@ TEST(PopulateArgDescriptorCrossthreadPayload, GivenValidImageArgumentWithImageMe
EXPECT_EQ(48U, imgMetadata.flatPitch);
}
TEST(PopulateArgDescriptorCrossthreadPayload, GivenValidSamplerArgumentWithMetadataThenPopulatesKernelDescriptor) {
NEO::ConstStringRef zeinfo = R"===(
kernels:
- name : some_kernel
execution_env:
simd_size: 32
payload_arguments:
- arg_type: arg_bypointer
offset: 0
size: 0
arg_index: 0
addrmode: stateful
addrspace: sampler
access_type: readwrite
sampler_index: 0
- arg_type: arg_bypointer
offset: 0
size: 0
arg_index: 1
addrmode: stateful
addrspace: sampler
access_type: readwrite
sampler_index: 1
sampler_type: vd
- arg_type: arg_bypointer
offset: 0
size: 0
arg_index: 2
addrmode: stateful
addrspace: sampler
access_type: readwrite
sampler_index: 2
sampler_type: ve
- arg_type: sampler_snap_wa
offset: 0
size: 4
arg_index: 2
- arg_type: sampler_normalized
offset: 4
size: 4
arg_index: 2
- arg_type: sampler_address
offset: 8
size: 4
arg_index: 2
- arg_type: arg_bypointer
offset: 12
size: 0
arg_index: 3
addrmode: bindless
addrspace: sampler
access_type: readwrite
sampler_type: vme
- arg_type: vme_mb_block_type
offset: 20
size: 4
arg_index: 3
- arg_type: vme_subpixel_mode
offset: 24
size: 4
arg_index: 3
- arg_type: vme_sad_adjust_mode
offset: 28
size: 4
arg_index: 3
- arg_type: vme_search_path_type
offset: 32
size: 4
arg_index: 3
)===";
NEO::ProgramInfo programInfo;
ZebinTestData::ValidEmptyProgram zebin;
zebin.appendSection(NEO::Elf::SHT_PROGBITS, NEO::Elf::SectionsNamesZebin::textPrefix.str() + "some_kernel", {});
std::string errors, warnings;
auto elf = NEO::Elf::decodeElf(zebin.storage, errors, warnings);
ASSERT_NE(nullptr, elf.elfFileHeader) << errors << " " << warnings;
NEO::Yaml::YamlParser parser;
bool parseSuccess = parser.parse(zeinfo, errors, warnings);
ASSERT_TRUE(parseSuccess) << errors << " " << warnings;
NEO::ZebinSections zebinSections;
auto extractErr = NEO::extractZebinSections(elf, zebinSections, errors, warnings);
ASSERT_EQ(NEO::DecodeError::Success, extractErr) << errors << " " << warnings;
auto &kernelNode = *parser.createChildrenRange(*parser.findNodeWithKeyDfs("kernels")).begin();
auto err = NEO::populateKernelDescriptor(programInfo, elf, zebinSections, parser, kernelNode, errors, warnings);
EXPECT_EQ(NEO::DecodeError::Success, err);
EXPECT_TRUE(errors.empty()) << errors;
EXPECT_TRUE(warnings.empty()) << warnings;
const auto &kd = programInfo.kernelInfos[0]->kernelDescriptor;
auto &args = kd.payloadMappings.explicitArgs;
auto &sampler0 = args[0].as<ArgDescSampler>();
EXPECT_EQ(64U, sampler0.bindful);
auto &sampler1 = args[1].as<ArgDescSampler>();
EXPECT_TRUE(args[1].getExtendedTypeInfo().isAccelerator);
EXPECT_EQ(80U, sampler1.bindful);
auto &sampler2 = args[2].as<ArgDescSampler>();
EXPECT_TRUE(args[2].getExtendedTypeInfo().isAccelerator);
EXPECT_EQ(96U, sampler2.bindful);
EXPECT_EQ(0U, sampler2.metadataPayload.samplerSnapWa);
EXPECT_EQ(4U, sampler2.metadataPayload.samplerNormalizedCoords);
EXPECT_EQ(8U, sampler2.metadataPayload.samplerAddressingMode);
auto &sampler3 = args[3].as<ArgDescSampler>();
EXPECT_TRUE(args[3].getExtendedTypeInfo().isAccelerator);
EXPECT_TRUE(args[3].getExtendedTypeInfo().hasVmeExtendedDescriptor);
EXPECT_EQ(12U, sampler3.bindless);
auto vmePayload = static_cast<NEO::ArgDescVme *>(kd.payloadMappings.explicitArgsExtendedDescriptors[3].get());
EXPECT_EQ(20U, vmePayload->mbBlockType);
EXPECT_EQ(24U, vmePayload->subpixelMode);
EXPECT_EQ(28U, vmePayload->sadAdjustMode);
EXPECT_EQ(32U, vmePayload->searchPathType);
EXPECT_TRUE(kd.kernelAttributes.flags.usesSamplers);
EXPECT_TRUE(kd.kernelAttributes.flags.usesVme);
}
class IntelGTNotesFixture : public ::testing::Test {
protected:
void SetUp() override {