mirror of
https://github.com/intel/compute-runtime.git
synced 2026-01-04 15:53:45 +08:00
Verify L0 Image Format Support for SPIRv
- Check that the Image Format is valid for the image argument to a SPIRv module. If the Image is invalid return ZE_RESULT_ERROR_UNSUPPORTED_IMAGE_FORMAT. Signed-off-by: Neil R Spruit <neil.r.spruit@intel.com>
This commit is contained in:
committed by
Compute-Runtime-Automation
parent
ab76a39691
commit
0101e80b00
@@ -672,6 +672,14 @@ ze_result_t KernelImp::setArgImage(uint32_t argIndex, size_t argSize, const void
|
||||
auto imageInfo = image->getImageInfo();
|
||||
auto clChannelType = getClChannelDataType(image->getImageDesc().format);
|
||||
auto clChannelOrder = getClChannelOrder(image->getImageDesc().format);
|
||||
|
||||
// If the Module was built from a SPIRv, then the supported channel data type must be in the CL types otherwise it is unsupported.
|
||||
ModuleImp *moduleImp = reinterpret_cast<ModuleImp *>(this->module);
|
||||
if (moduleImp->isSPIRv()) {
|
||||
if (static_cast<int>(clChannelType) == CL_INVALID_VALUE) {
|
||||
return ZE_RESULT_ERROR_UNSUPPORTED_IMAGE_FORMAT;
|
||||
}
|
||||
}
|
||||
NEO::patchNonPointer<uint32_t, size_t>(ArrayRef<uint8_t>(crossThreadData.get(), crossThreadDataSize), arg.metadataPayload.imgWidth, imageInfo.imgDesc.imageWidth);
|
||||
NEO::patchNonPointer<uint32_t, size_t>(ArrayRef<uint8_t>(crossThreadData.get(), crossThreadDataSize), arg.metadataPayload.imgHeight, imageInfo.imgDesc.imageHeight);
|
||||
NEO::patchNonPointer<uint32_t, size_t>(ArrayRef<uint8_t>(crossThreadData.get(), crossThreadDataSize), arg.metadataPayload.imgDepth, imageInfo.imgDesc.imageDepth);
|
||||
|
||||
@@ -473,6 +473,7 @@ bool ModuleImp::initialize(const ze_module_desc_t *desc, NEO::Device *neoDevice)
|
||||
if (desc->format != ZE_MODULE_FORMAT_IL_SPIRV) {
|
||||
return false;
|
||||
}
|
||||
this->builtFromSPIRv = true;
|
||||
const ze_module_program_exp_desc_t *programExpDesc =
|
||||
reinterpret_cast<const ze_module_program_exp_desc_t *>(expDesc);
|
||||
std::vector<const char *> inputSpirVs;
|
||||
@@ -531,6 +532,7 @@ bool ModuleImp::initialize(const ze_module_desc_t *desc, NEO::Device *neoDevice)
|
||||
success = this->translationUnit->createFromNativeBinary(
|
||||
reinterpret_cast<const char *>(desc->pInputModule), desc->inputSize);
|
||||
} else if (desc->format == ZE_MODULE_FORMAT_IL_SPIRV) {
|
||||
this->builtFromSPIRv = true;
|
||||
success = this->translationUnit->buildFromSpirV(reinterpret_cast<const char *>(desc->pInputModule),
|
||||
static_cast<uint32_t>(desc->inputSize),
|
||||
buildOptions.c_str(),
|
||||
|
||||
@@ -123,6 +123,8 @@ struct ModuleImp : public Module {
|
||||
|
||||
bool isDebugEnabled() const override;
|
||||
|
||||
bool isSPIRv() { return builtFromSPIRv; }
|
||||
|
||||
bool shouldAllocatePrivateMemoryPerDispatch() const override {
|
||||
return allocatePrivateMemoryPerDispatch;
|
||||
}
|
||||
@@ -162,6 +164,7 @@ struct ModuleImp : public Module {
|
||||
|
||||
std::unordered_map<std::string, HostGlobalSymbol> hostGlobalSymbolsMap;
|
||||
|
||||
bool builtFromSPIRv = false;
|
||||
bool debugEnabled = false;
|
||||
bool isFullyLinked = false;
|
||||
bool allocatePrivateMemoryPerDispatch = true;
|
||||
|
||||
@@ -72,7 +72,7 @@ void testAppendImageViewNV12Copy(ze_context_handle_t &context, ze_device_handle_
|
||||
nullptr,
|
||||
(ZE_IMAGE_FLAG_BIAS_UNCACHED),
|
||||
ZE_IMAGE_TYPE_2D,
|
||||
{ZE_IMAGE_FORMAT_LAYOUT_NV12, ZE_IMAGE_FORMAT_TYPE_UINT,
|
||||
{ZE_IMAGE_FORMAT_LAYOUT_NV12, ZE_IMAGE_FORMAT_TYPE_UNORM,
|
||||
ZE_IMAGE_FORMAT_SWIZZLE_R, ZE_IMAGE_FORMAT_SWIZZLE_G,
|
||||
ZE_IMAGE_FORMAT_SWIZZLE_B, ZE_IMAGE_FORMAT_SWIZZLE_A},
|
||||
width,
|
||||
|
||||
@@ -21,6 +21,7 @@ template <>
|
||||
struct WhiteBox<::L0::Module> : public ::L0::ModuleImp {
|
||||
using BaseClass = ::L0::ModuleImp;
|
||||
using BaseClass::BaseClass;
|
||||
using BaseClass::builtFromSPIRv;
|
||||
using BaseClass::copyPatchedSegments;
|
||||
using BaseClass::device;
|
||||
using BaseClass::exportedFunctionsSurface;
|
||||
|
||||
@@ -332,6 +332,105 @@ HWTEST2_F(SetKernelArg, givenImageAndKernelWhenSetArgImageThenCrossThreadDataIsS
|
||||
EXPECT_EQ(getClChannelOrder(desc.format), *reinterpret_cast<const cl_channel_order *>(pChannelOrder));
|
||||
}
|
||||
|
||||
HWTEST2_F(SetKernelArg, givenImageAndKernelFromNativeWhenSetArgImageCalledThenSuccessAndInvalidChannelType, ImageSupport) {
|
||||
createKernel();
|
||||
|
||||
auto &imageArg = const_cast<NEO::ArgDescImage &>(kernel->kernelImmData->getDescriptor().payloadMappings.explicitArgs[3].as<NEO::ArgDescImage>());
|
||||
imageArg.metadataPayload.imgWidth = 0x1c;
|
||||
imageArg.metadataPayload.imgHeight = 0x18;
|
||||
imageArg.metadataPayload.imgDepth = 0x14;
|
||||
|
||||
imageArg.metadataPayload.arraySize = 0x10;
|
||||
imageArg.metadataPayload.numSamples = 0xc;
|
||||
imageArg.metadataPayload.channelDataType = 0x8;
|
||||
imageArg.metadataPayload.channelOrder = 0x4;
|
||||
imageArg.metadataPayload.numMipLevels = 0x0;
|
||||
|
||||
imageArg.metadataPayload.flatWidth = 0x30;
|
||||
imageArg.metadataPayload.flatHeight = 0x2c;
|
||||
imageArg.metadataPayload.flatPitch = 0x28;
|
||||
imageArg.metadataPayload.flatBaseOffset = 0x20;
|
||||
|
||||
ze_image_desc_t desc = {};
|
||||
|
||||
desc.stype = ZE_STRUCTURE_TYPE_IMAGE_DESC;
|
||||
desc.type = ZE_IMAGE_TYPE_3D;
|
||||
desc.format.layout = ZE_IMAGE_FORMAT_LAYOUT_10_10_10_2;
|
||||
desc.format.type = ZE_IMAGE_FORMAT_TYPE_UINT;
|
||||
desc.width = 11;
|
||||
desc.height = 13;
|
||||
desc.depth = 17;
|
||||
|
||||
desc.format.x = ZE_IMAGE_FORMAT_SWIZZLE_A;
|
||||
desc.format.y = ZE_IMAGE_FORMAT_SWIZZLE_0;
|
||||
desc.format.z = ZE_IMAGE_FORMAT_SWIZZLE_1;
|
||||
desc.format.w = ZE_IMAGE_FORMAT_SWIZZLE_X;
|
||||
|
||||
auto imageHW = std::make_unique<WhiteBox<::L0::ImageCoreFamily<gfxCoreFamily>>>();
|
||||
auto ret = imageHW->initialize(device, &desc);
|
||||
ASSERT_EQ(ZE_RESULT_SUCCESS, ret);
|
||||
|
||||
auto handle = imageHW->toHandle();
|
||||
L0::ModuleImp *moduleImp = (L0::ModuleImp *)(module.get());
|
||||
EXPECT_FALSE(moduleImp->isSPIRv());
|
||||
|
||||
EXPECT_EQ(ZE_RESULT_SUCCESS, kernel->setArgImage(3, sizeof(imageHW.get()), &handle));
|
||||
|
||||
auto crossThreadData = kernel->getCrossThreadData();
|
||||
|
||||
auto pChannelDataType = ptrOffset(crossThreadData, imageArg.metadataPayload.channelDataType);
|
||||
int channelDataType = (int)(*reinterpret_cast<const cl_channel_type *>(pChannelDataType));
|
||||
EXPECT_EQ(CL_INVALID_VALUE, channelDataType);
|
||||
}
|
||||
|
||||
HWTEST2_F(SetKernelArg, givenImageAndKernelFromSPIRvWhenSetArgImageCalledThenUnsupportedReturned, ImageSupport) {
|
||||
createKernel();
|
||||
|
||||
auto &imageArg = const_cast<NEO::ArgDescImage &>(kernel->kernelImmData->getDescriptor().payloadMappings.explicitArgs[3].as<NEO::ArgDescImage>());
|
||||
imageArg.metadataPayload.imgWidth = 0x1c;
|
||||
imageArg.metadataPayload.imgHeight = 0x18;
|
||||
imageArg.metadataPayload.imgDepth = 0x14;
|
||||
|
||||
imageArg.metadataPayload.arraySize = 0x10;
|
||||
imageArg.metadataPayload.numSamples = 0xc;
|
||||
imageArg.metadataPayload.channelDataType = 0x8;
|
||||
imageArg.metadataPayload.channelOrder = 0x4;
|
||||
imageArg.metadataPayload.numMipLevels = 0x0;
|
||||
|
||||
imageArg.metadataPayload.flatWidth = 0x30;
|
||||
imageArg.metadataPayload.flatHeight = 0x2c;
|
||||
imageArg.metadataPayload.flatPitch = 0x28;
|
||||
imageArg.metadataPayload.flatBaseOffset = 0x20;
|
||||
|
||||
ze_image_desc_t desc = {};
|
||||
|
||||
desc.stype = ZE_STRUCTURE_TYPE_IMAGE_DESC;
|
||||
desc.type = ZE_IMAGE_TYPE_3D;
|
||||
desc.format.layout = ZE_IMAGE_FORMAT_LAYOUT_10_10_10_2;
|
||||
desc.format.type = ZE_IMAGE_FORMAT_TYPE_UINT;
|
||||
desc.width = 11;
|
||||
desc.height = 13;
|
||||
desc.depth = 17;
|
||||
|
||||
desc.format.x = ZE_IMAGE_FORMAT_SWIZZLE_A;
|
||||
desc.format.y = ZE_IMAGE_FORMAT_SWIZZLE_0;
|
||||
desc.format.z = ZE_IMAGE_FORMAT_SWIZZLE_1;
|
||||
desc.format.w = ZE_IMAGE_FORMAT_SWIZZLE_X;
|
||||
|
||||
auto imageHW = std::make_unique<WhiteBox<::L0::ImageCoreFamily<gfxCoreFamily>>>();
|
||||
auto ret = imageHW->initialize(device, &desc);
|
||||
ASSERT_EQ(ZE_RESULT_SUCCESS, ret);
|
||||
|
||||
auto handle = imageHW->toHandle();
|
||||
|
||||
WhiteBox<::L0::Module> *moduleImp = whiteboxCast(module.get());
|
||||
moduleImp->builtFromSPIRv = true;
|
||||
EXPECT_TRUE(moduleImp->isSPIRv());
|
||||
kernel->module = moduleImp;
|
||||
|
||||
EXPECT_EQ(ZE_RESULT_ERROR_UNSUPPORTED_IMAGE_FORMAT, kernel->setArgImage(3, sizeof(imageHW.get()), &handle));
|
||||
}
|
||||
|
||||
HWTEST2_F(SetKernelArg, givenSamplerAndKernelWhenSetArgSamplerThenCrossThreadDataIsSet, ImageSupport) {
|
||||
createKernel();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user