Report Unsupported Image Format for invalid types for L0

- If channel type or channel order is invalid for the layout, type, or
swizzle passed by the the user, then return unsupported image format.

Signed-off-by: Neil R Spruit <neil.r.spruit@intel.com>
This commit is contained in:
Neil R Spruit
2022-04-12 20:51:15 +00:00
committed by Compute-Runtime-Automation
parent 3c3dab8fe0
commit d6ac8cdd03
3 changed files with 97 additions and 7 deletions

View File

@@ -665,6 +665,10 @@ 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 Channel Type or Channel Order cannot be matched to a CL type, then return unsupported
if (static_cast<int>(clChannelType) == CL_INVALID_VALUE || static_cast<int>(clChannelOrder) == 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);

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2021 Intel Corporation
* Copyright (C) 2021-2022 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
@@ -75,7 +75,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,

View File

@@ -262,10 +262,10 @@ HWTEST2_F(SetKernelArg, givenImageAndKernelWhenSetArgImageThenCrossThreadDataIsS
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;
desc.format.x = ZE_IMAGE_FORMAT_SWIZZLE_R;
desc.format.y = ZE_IMAGE_FORMAT_SWIZZLE_G;
desc.format.z = ZE_IMAGE_FORMAT_SWIZZLE_B;
desc.format.w = ZE_IMAGE_FORMAT_SWIZZLE_1;
auto imageHW = std::make_unique<WhiteBox<::L0::ImageCoreFamily<gfxCoreFamily>>>();
auto ret = imageHW->initialize(device, &desc);
@@ -275,7 +275,7 @@ HWTEST2_F(SetKernelArg, givenImageAndKernelWhenSetArgImageThenCrossThreadDataIsS
auto imgInfo = imageHW->getImageInfo();
auto pixelSize = imgInfo.surfaceFormat->ImageElementSizeInBytes;
kernel->setArgImage(3, sizeof(imageHW.get()), &handle);
EXPECT_EQ(kernel->setArgImage(3, sizeof(imageHW.get()), &handle), ZE_RESULT_SUCCESS);
auto crossThreadData = kernel->getCrossThreadData();
@@ -316,6 +316,92 @@ HWTEST2_F(SetKernelArg, givenImageAndKernelWhenSetArgImageThenCrossThreadDataIsS
EXPECT_EQ(getClChannelOrder(desc.format), *reinterpret_cast<const cl_channel_order *>(pChannelOrder));
}
HWTEST2_F(SetKernelArg, givenInvalidImageLayoutFormatComboAndKernelWhenSetArgImageIsCalledThenUnsupportedReturned, 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_32_32_32_32;
desc.format.type = ZE_IMAGE_FORMAT_TYPE_UNORM;
desc.width = 11;
desc.height = 13;
desc.depth = 17;
desc.format.x = ZE_IMAGE_FORMAT_SWIZZLE_R;
desc.format.y = ZE_IMAGE_FORMAT_SWIZZLE_G;
desc.format.z = ZE_IMAGE_FORMAT_SWIZZLE_B;
desc.format.w = ZE_IMAGE_FORMAT_SWIZZLE_1;
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();
EXPECT_EQ(kernel->setArgImage(3, sizeof(imageHW.get()), &handle), ZE_RESULT_ERROR_UNSUPPORTED_IMAGE_FORMAT);
}
HWTEST2_F(SetKernelArg, givenInvalidImageSwizzleAndKernelWhenSetArgImageIsCallednThenUnsupportedReturned, 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_8_8_8_8;
desc.format.type = ZE_IMAGE_FORMAT_TYPE_UINT;
desc.width = 11;
desc.height = 13;
desc.depth = 17;
desc.format.x = ZE_IMAGE_FORMAT_SWIZZLE_1;
desc.format.y = ZE_IMAGE_FORMAT_SWIZZLE_G;
desc.format.z = ZE_IMAGE_FORMAT_SWIZZLE_B;
desc.format.w = ZE_IMAGE_FORMAT_SWIZZLE_1;
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();
EXPECT_EQ(kernel->setArgImage(3, sizeof(imageHW.get()), &handle), ZE_RESULT_ERROR_UNSUPPORTED_IMAGE_FORMAT);
}
HWTEST2_F(SetKernelArg, givenSamplerAndKernelWhenSetArgSamplerThenCrossThreadDataIsSet, ImageSupport) {
createKernel();