diff --git a/level_zero/core/source/kernel/kernel_imp.cpp b/level_zero/core/source/kernel/kernel_imp.cpp index 6eba7cfb8f..a2fcc50255 100644 --- a/level_zero/core/source/kernel/kernel_imp.cpp +++ b/level_zero/core/source/kernel/kernel_imp.cpp @@ -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(clChannelType) == CL_INVALID_VALUE || static_cast(clChannelOrder) == CL_INVALID_VALUE) { + return ZE_RESULT_ERROR_UNSUPPORTED_IMAGE_FORMAT; + } NEO::patchNonPointer(ArrayRef(crossThreadData.get(), crossThreadDataSize), arg.metadataPayload.imgWidth, imageInfo.imgDesc.imageWidth); NEO::patchNonPointer(ArrayRef(crossThreadData.get(), crossThreadDataSize), arg.metadataPayload.imgHeight, imageInfo.imgDesc.imageHeight); NEO::patchNonPointer(ArrayRef(crossThreadData.get(), crossThreadDataSize), arg.metadataPayload.imgDepth, imageInfo.imgDesc.imageDepth); diff --git a/level_zero/core/test/black_box_tests/zello_image_view.cpp b/level_zero/core/test/black_box_tests/zello_image_view.cpp index c1ca8ff981..559566e2e7 100644 --- a/level_zero/core/test/black_box_tests/zello_image_view.cpp +++ b/level_zero/core/test/black_box_tests/zello_image_view.cpp @@ -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, diff --git a/level_zero/core/test/unit_tests/sources/kernel/test_kernel.cpp b/level_zero/core/test/unit_tests/sources/kernel/test_kernel.cpp index bdd52b6b0d..15c692b96a 100644 --- a/level_zero/core/test/unit_tests/sources/kernel/test_kernel.cpp +++ b/level_zero/core/test/unit_tests/sources/kernel/test_kernel.cpp @@ -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>>(); 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(pChannelOrder)); } +HWTEST2_F(SetKernelArg, givenInvalidImageLayoutFormatComboAndKernelWhenSetArgImageIsCalledThenUnsupportedReturned, ImageSupport) { + createKernel(); + + auto &imageArg = const_cast(kernel->kernelImmData->getDescriptor().payloadMappings.explicitArgs[3].as()); + 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>>(); + 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(kernel->kernelImmData->getDescriptor().payloadMappings.explicitArgs[3].as()); + 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>>(); + 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();