diff --git a/level_zero/core/source/kernel/kernel_imp.cpp b/level_zero/core/source/kernel/kernel_imp.cpp index 02cf6b0340..aa109e421e 100644 --- a/level_zero/core/source/kernel/kernel_imp.cpp +++ b/level_zero/core/source/kernel/kernel_imp.cpp @@ -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(this->module); + if (moduleImp->isSPIRv()) { + if (static_cast(clChannelType) == 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/source/module/module_imp.cpp b/level_zero/core/source/module/module_imp.cpp index 8d7b0b5b69..82f4119b1a 100644 --- a/level_zero/core/source/module/module_imp.cpp +++ b/level_zero/core/source/module/module_imp.cpp @@ -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(expDesc); std::vector inputSpirVs; @@ -531,6 +532,7 @@ bool ModuleImp::initialize(const ze_module_desc_t *desc, NEO::Device *neoDevice) success = this->translationUnit->createFromNativeBinary( reinterpret_cast(desc->pInputModule), desc->inputSize); } else if (desc->format == ZE_MODULE_FORMAT_IL_SPIRV) { + this->builtFromSPIRv = true; success = this->translationUnit->buildFromSpirV(reinterpret_cast(desc->pInputModule), static_cast(desc->inputSize), buildOptions.c_str(), diff --git a/level_zero/core/source/module/module_imp.h b/level_zero/core/source/module/module_imp.h index a0711f3149..7073aa1409 100644 --- a/level_zero/core/source/module/module_imp.h +++ b/level_zero/core/source/module/module_imp.h @@ -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 hostGlobalSymbolsMap; + bool builtFromSPIRv = false; bool debugEnabled = false; bool isFullyLinked = false; bool allocatePrivateMemoryPerDispatch = true; 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 fb9b312715..7382c129dd 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 @@ -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, diff --git a/level_zero/core/test/unit_tests/mocks/mock_module.h b/level_zero/core/test/unit_tests/mocks/mock_module.h index 51d2d50c31..0bda6edffc 100644 --- a/level_zero/core/test/unit_tests/mocks/mock_module.h +++ b/level_zero/core/test/unit_tests/mocks/mock_module.h @@ -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; 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 749e5178c3..1cce53e31f 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 @@ -332,6 +332,105 @@ HWTEST2_F(SetKernelArg, givenImageAndKernelWhenSetArgImageThenCrossThreadDataIsS EXPECT_EQ(getClChannelOrder(desc.format), *reinterpret_cast(pChannelOrder)); } +HWTEST2_F(SetKernelArg, givenImageAndKernelFromNativeWhenSetArgImageCalledThenSuccessAndInvalidChannelType, 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_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>>(); + 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(pChannelDataType)); + EXPECT_EQ(CL_INVALID_VALUE, channelDataType); +} + +HWTEST2_F(SetKernelArg, givenImageAndKernelFromSPIRvWhenSetArgImageCalledThenUnsupportedReturned, 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_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>>(); + 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();