diff --git a/level_zero/core/source/CMakeLists.txt b/level_zero/core/source/CMakeLists.txt index 71d8f9e715..b107aad43e 100644 --- a/level_zero/core/source/CMakeLists.txt +++ b/level_zero/core/source/CMakeLists.txt @@ -50,6 +50,8 @@ set(L0_RUNTIME_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/kernel/kernel_imp.cpp ${CMAKE_CURRENT_SOURCE_DIR}/kernel/kernel_imp.h ${CMAKE_CURRENT_SOURCE_DIR}/image/image.h + ${CMAKE_CURRENT_SOURCE_DIR}/image/image_format_desc_helper.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/image/image_format_desc_helper.h ${CMAKE_CURRENT_SOURCE_DIR}/image/image_formats.h ${CMAKE_CURRENT_SOURCE_DIR}/image/image_hw.h ${CMAKE_CURRENT_SOURCE_DIR}/image/image_hw.inl diff --git a/level_zero/core/source/image/image_format_desc_helper.cpp b/level_zero/core/source/image/image_format_desc_helper.cpp new file mode 100644 index 0000000000..28dae9e337 --- /dev/null +++ b/level_zero/core/source/image/image_format_desc_helper.cpp @@ -0,0 +1,116 @@ +/* + * Copyright (C) 2020 Intel Corporation + * + * SPDX-License-Identifier: MIT + * + */ + +#include "level_zero/core/source/image/image_format_desc_helper.h" + +#include "shared/source/utilities/compiler_support.h" + +namespace L0 { + +cl_channel_type getClChannelDataType(const ze_image_format_desc_t &imgDescription) { + switch (imgDescription.layout) { + case ZE_IMAGE_FORMAT_LAYOUT_8: + case ZE_IMAGE_FORMAT_LAYOUT_8_8: + case ZE_IMAGE_FORMAT_LAYOUT_8_8_8_8: + if (imgDescription.type == ZE_IMAGE_FORMAT_TYPE_UINT) + return CL_UNSIGNED_INT8; + if (imgDescription.type == ZE_IMAGE_FORMAT_TYPE_SINT) + return CL_SIGNED_INT8; + if (imgDescription.type == ZE_IMAGE_FORMAT_TYPE_UNORM) + return CL_UNORM_INT8; + if (imgDescription.type == ZE_IMAGE_FORMAT_TYPE_SNORM) + return CL_SNORM_INT8; + break; + case ZE_IMAGE_FORMAT_LAYOUT_16: + case ZE_IMAGE_FORMAT_LAYOUT_16_16: + case ZE_IMAGE_FORMAT_LAYOUT_16_16_16_16: + if (imgDescription.type == ZE_IMAGE_FORMAT_TYPE_UINT) + return CL_UNSIGNED_INT16; + if (imgDescription.type == ZE_IMAGE_FORMAT_TYPE_SINT) + return CL_SIGNED_INT16; + if (imgDescription.type == ZE_IMAGE_FORMAT_TYPE_UNORM) + return CL_UNORM_INT16; + if (imgDescription.type == ZE_IMAGE_FORMAT_TYPE_SNORM) + return CL_SNORM_INT16; + + return CL_HALF_FLOAT; + CPP_ATTRIBUTE_FALLTHROUGH; + case ZE_IMAGE_FORMAT_LAYOUT_32: + case ZE_IMAGE_FORMAT_LAYOUT_32_32: + case ZE_IMAGE_FORMAT_LAYOUT_32_32_32_32: + if (imgDescription.type == ZE_IMAGE_FORMAT_TYPE_UINT) + return CL_UNSIGNED_INT32; + if (imgDescription.type == ZE_IMAGE_FORMAT_TYPE_SINT) + return CL_SIGNED_INT32; + if (imgDescription.type == ZE_IMAGE_FORMAT_TYPE_FLOAT) + return CL_FLOAT; + break; + case ZE_IMAGE_FORMAT_LAYOUT_10_10_10_2: + if (imgDescription.type == ZE_IMAGE_FORMAT_TYPE_UNORM) + return CL_UNORM_INT_101010_2; + break; + case ZE_IMAGE_FORMAT_LAYOUT_5_6_5: + if (imgDescription.type == ZE_IMAGE_FORMAT_TYPE_UNORM) + return CL_UNORM_SHORT_565; + break; + case ZE_IMAGE_FORMAT_LAYOUT_5_5_5_1: + if (imgDescription.type == ZE_IMAGE_FORMAT_TYPE_UNORM) + return CL_UNORM_SHORT_555; + break; + case ZE_IMAGE_FORMAT_LAYOUT_NV12: + if (imgDescription.type == ZE_IMAGE_FORMAT_TYPE_UNORM) + return CL_NV12_INTEL; + break; + case ZE_IMAGE_FORMAT_LAYOUT_YUYV: + if (imgDescription.type == ZE_IMAGE_FORMAT_TYPE_UNORM) + return CL_YUYV_INTEL; + break; + case ZE_IMAGE_FORMAT_LAYOUT_VYUY: + if (imgDescription.type == ZE_IMAGE_FORMAT_TYPE_UNORM) + return CL_VYUY_INTEL; + break; + case ZE_IMAGE_FORMAT_LAYOUT_YVYU: + if (imgDescription.type == ZE_IMAGE_FORMAT_TYPE_UNORM) + return CL_YVYU_INTEL; + break; + case ZE_IMAGE_FORMAT_LAYOUT_UYVY: + if (imgDescription.type == ZE_IMAGE_FORMAT_TYPE_UNORM) + return CL_UYVY_INTEL; + break; + default: + break; + } + + return CL_INVALID_VALUE; +} + +cl_channel_order getClChannelOrder(const ze_image_format_desc_t &imgDescription) { + swizzles imgSwizzles{imgDescription.x, imgDescription.y, imgDescription.z, imgDescription.w}; + + if (imgSwizzles == swizzles{ZE_IMAGE_FORMAT_SWIZZLE_R, ZE_IMAGE_FORMAT_SWIZZLE_0, ZE_IMAGE_FORMAT_SWIZZLE_0, ZE_IMAGE_FORMAT_SWIZZLE_1}) + return CL_R; + if (imgSwizzles == swizzles{ZE_IMAGE_FORMAT_SWIZZLE_0, ZE_IMAGE_FORMAT_SWIZZLE_0, ZE_IMAGE_FORMAT_SWIZZLE_0, ZE_IMAGE_FORMAT_SWIZZLE_A}) + return CL_A; + if (imgSwizzles == swizzles{ZE_IMAGE_FORMAT_SWIZZLE_R, ZE_IMAGE_FORMAT_SWIZZLE_G, ZE_IMAGE_FORMAT_SWIZZLE_0, ZE_IMAGE_FORMAT_SWIZZLE_1}) + return CL_RG; + if (imgSwizzles == swizzles{ZE_IMAGE_FORMAT_SWIZZLE_R, ZE_IMAGE_FORMAT_SWIZZLE_0, ZE_IMAGE_FORMAT_SWIZZLE_0, ZE_IMAGE_FORMAT_SWIZZLE_A}) + return CL_RA; + if (imgSwizzles == swizzles{ZE_IMAGE_FORMAT_SWIZZLE_R, ZE_IMAGE_FORMAT_SWIZZLE_G, ZE_IMAGE_FORMAT_SWIZZLE_B, ZE_IMAGE_FORMAT_SWIZZLE_1}) + return CL_RGB; + if (imgSwizzles == swizzles{ZE_IMAGE_FORMAT_SWIZZLE_R, ZE_IMAGE_FORMAT_SWIZZLE_G, ZE_IMAGE_FORMAT_SWIZZLE_B, ZE_IMAGE_FORMAT_SWIZZLE_A}) + return CL_RGBA; + if (imgSwizzles == swizzles{ZE_IMAGE_FORMAT_SWIZZLE_B, ZE_IMAGE_FORMAT_SWIZZLE_G, ZE_IMAGE_FORMAT_SWIZZLE_R, ZE_IMAGE_FORMAT_SWIZZLE_A}) + return CL_BGRA; + if (imgSwizzles == swizzles{ZE_IMAGE_FORMAT_SWIZZLE_A, ZE_IMAGE_FORMAT_SWIZZLE_R, ZE_IMAGE_FORMAT_SWIZZLE_G, ZE_IMAGE_FORMAT_SWIZZLE_B}) + return CL_ARGB; + if (imgSwizzles == swizzles{ZE_IMAGE_FORMAT_SWIZZLE_A, ZE_IMAGE_FORMAT_SWIZZLE_B, ZE_IMAGE_FORMAT_SWIZZLE_G, ZE_IMAGE_FORMAT_SWIZZLE_R}) + return CL_ABGR; + + return CL_INVALID_VALUE; +} + +} // namespace L0 diff --git a/level_zero/core/source/image/image_format_desc_helper.h b/level_zero/core/source/image/image_format_desc_helper.h new file mode 100644 index 0000000000..b51340107b --- /dev/null +++ b/level_zero/core/source/image/image_format_desc_helper.h @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2020 Intel Corporation + * + * SPDX-License-Identifier: MIT + * + */ + +#pragma once + +#include "level_zero/core/source/image/image.h" + +namespace L0 { + +struct swizzles { + ze_image_format_swizzle_t x; + ze_image_format_swizzle_t y; + ze_image_format_swizzle_t z; + ze_image_format_swizzle_t w; + + bool operator==(const swizzles &rhs) { + if (x != rhs.x) + return false; + if (y != rhs.y) + return false; + if (z != rhs.z) + return false; + if (w != rhs.w) + return false; + + return true; + } +}; + +cl_channel_type getClChannelDataType(const ze_image_format_desc_t &imgDescription); +cl_channel_order getClChannelOrder(const ze_image_format_desc_t &imgDescription); + +} // namespace L0 diff --git a/level_zero/core/source/kernel/kernel_imp.cpp b/level_zero/core/source/kernel/kernel_imp.cpp index a39e568797..3366d55190 100644 --- a/level_zero/core/source/kernel/kernel_imp.cpp +++ b/level_zero/core/source/kernel/kernel_imp.cpp @@ -22,6 +22,7 @@ #include "level_zero/core/source/device/device.h" #include "level_zero/core/source/image/image.h" +#include "level_zero/core/source/image/image_format_desc_helper.h" #include "level_zero/core/source/module/module.h" #include "level_zero/core/source/module/module_imp.h" #include "level_zero/core/source/printf_handler/printf_handler.h" @@ -513,11 +514,15 @@ 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); 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); NEO::patchNonPointer(ArrayRef(crossThreadData.get(), crossThreadDataSize), arg.metadataPayload.numSamples, imageInfo.imgDesc.numSamples); NEO::patchNonPointer(ArrayRef(crossThreadData.get(), crossThreadDataSize), arg.metadataPayload.arraySize, imageInfo.imgDesc.imageArraySize); + NEO::patchNonPointer(ArrayRef(crossThreadData.get(), crossThreadDataSize), arg.metadataPayload.channelDataType, clChannelType); + NEO::patchNonPointer(ArrayRef(crossThreadData.get(), crossThreadDataSize), arg.metadataPayload.channelOrder, clChannelOrder); NEO::patchNonPointer(ArrayRef(crossThreadData.get(), crossThreadDataSize), arg.metadataPayload.numMipLevels, imageInfo.imgDesc.numMipLevels); auto pixelSize = imageInfo.surfaceFormat->ImageElementSizeInBytes; diff --git a/level_zero/core/test/unit_tests/sources/image/test_image.cpp b/level_zero/core/test/unit_tests/sources/image/test_image.cpp index e40a8d06db..c6a60f6453 100644 --- a/level_zero/core/test/unit_tests/sources/image/test_image.cpp +++ b/level_zero/core/test/unit_tests/sources/image/test_image.cpp @@ -13,6 +13,7 @@ #include "test.h" +#include "level_zero/core/source/image/image_format_desc_helper.h" #include "level_zero/core/source/image/image_formats.h" #include "level_zero/core/source/image/image_hw.h" #include "level_zero/core/test/unit_tests/fixtures/device_fixture.h" @@ -291,5 +292,164 @@ INSTANTIATE_TEST_CASE_P( TestImageFormats, testing::ValuesIn(validFormats)); +TEST(ImageFormatDescHelperTest, givenUnsupportedImageFormatLayoutAndTypeThenProperClEnumIsReturned) { + auto invalid = static_cast(CL_INVALID_VALUE); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_8, ZE_IMAGE_FORMAT_TYPE_FLOAT}), invalid); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_8_8, ZE_IMAGE_FORMAT_TYPE_FLOAT}), invalid); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_8_8_8_8, ZE_IMAGE_FORMAT_TYPE_FLOAT}), invalid); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_32, ZE_IMAGE_FORMAT_TYPE_UNORM}), invalid); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_10_10_10_2, ZE_IMAGE_FORMAT_TYPE_FLOAT}), invalid); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_11_11_10, ZE_IMAGE_FORMAT_TYPE_UINT}), invalid); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_11_11_10, ZE_IMAGE_FORMAT_TYPE_SINT}), invalid); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_11_11_10, ZE_IMAGE_FORMAT_TYPE_UNORM}), invalid); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_11_11_10, ZE_IMAGE_FORMAT_TYPE_SNORM}), invalid); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_5_6_5, ZE_IMAGE_FORMAT_TYPE_UINT}), invalid); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_5_6_5, ZE_IMAGE_FORMAT_TYPE_SINT}), invalid); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_5_6_5, ZE_IMAGE_FORMAT_TYPE_SNORM}), invalid); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_5_6_5, ZE_IMAGE_FORMAT_TYPE_FLOAT}), invalid); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_5_5_5_1, ZE_IMAGE_FORMAT_TYPE_UINT}), invalid); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_5_5_5_1, ZE_IMAGE_FORMAT_TYPE_SINT}), invalid); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_5_5_5_1, ZE_IMAGE_FORMAT_TYPE_SNORM}), invalid); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_5_5_5_1, ZE_IMAGE_FORMAT_TYPE_FLOAT}), invalid); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_4_4_4_4, ZE_IMAGE_FORMAT_TYPE_UINT}), invalid); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_4_4_4_4, ZE_IMAGE_FORMAT_TYPE_SINT}), invalid); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_4_4_4_4, ZE_IMAGE_FORMAT_TYPE_SNORM}), invalid); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_4_4_4_4, ZE_IMAGE_FORMAT_TYPE_FLOAT}), invalid); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_NV12, ZE_IMAGE_FORMAT_TYPE_UINT}), invalid); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_NV12, ZE_IMAGE_FORMAT_TYPE_SINT}), invalid); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_NV12, ZE_IMAGE_FORMAT_TYPE_SNORM}), invalid); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_NV12, ZE_IMAGE_FORMAT_TYPE_FLOAT}), invalid); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_YUYV, ZE_IMAGE_FORMAT_TYPE_UINT}), invalid); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_YUYV, ZE_IMAGE_FORMAT_TYPE_SINT}), invalid); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_YUYV, ZE_IMAGE_FORMAT_TYPE_SNORM}), invalid); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_YUYV, ZE_IMAGE_FORMAT_TYPE_FLOAT}), invalid); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_VYUY, ZE_IMAGE_FORMAT_TYPE_UINT}), invalid); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_VYUY, ZE_IMAGE_FORMAT_TYPE_SINT}), invalid); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_VYUY, ZE_IMAGE_FORMAT_TYPE_SNORM}), invalid); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_VYUY, ZE_IMAGE_FORMAT_TYPE_FLOAT}), invalid); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_YVYU, ZE_IMAGE_FORMAT_TYPE_UINT}), invalid); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_YVYU, ZE_IMAGE_FORMAT_TYPE_SINT}), invalid); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_YVYU, ZE_IMAGE_FORMAT_TYPE_SNORM}), invalid); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_YVYU, ZE_IMAGE_FORMAT_TYPE_FLOAT}), invalid); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_UYVY, ZE_IMAGE_FORMAT_TYPE_UINT}), invalid); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_UYVY, ZE_IMAGE_FORMAT_TYPE_SINT}), invalid); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_UYVY, ZE_IMAGE_FORMAT_TYPE_SNORM}), invalid); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_UYVY, ZE_IMAGE_FORMAT_TYPE_FLOAT}), invalid); +} + +TEST(ImageFormatDescHelperTest, givenSupportedImageFormatLayoutAndTypeThenProperClEnumIsReturned) { + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_8, ZE_IMAGE_FORMAT_TYPE_UINT}), static_cast(CL_UNSIGNED_INT8)); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_8, ZE_IMAGE_FORMAT_TYPE_SINT}), static_cast(CL_SIGNED_INT8)); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_8, ZE_IMAGE_FORMAT_TYPE_UNORM}), static_cast(CL_UNORM_INT8)); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_8, ZE_IMAGE_FORMAT_TYPE_SNORM}), static_cast(CL_SNORM_INT8)); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_16, ZE_IMAGE_FORMAT_TYPE_UINT}), static_cast(CL_UNSIGNED_INT16)); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_16, ZE_IMAGE_FORMAT_TYPE_SINT}), static_cast(CL_SIGNED_INT16)); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_16, ZE_IMAGE_FORMAT_TYPE_UNORM}), static_cast(CL_UNORM_INT16)); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_16, ZE_IMAGE_FORMAT_TYPE_SNORM}), static_cast(CL_SNORM_INT16)); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_16, ZE_IMAGE_FORMAT_TYPE_FLOAT}), static_cast(CL_HALF_FLOAT)); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_32, ZE_IMAGE_FORMAT_TYPE_UINT}), static_cast(CL_UNSIGNED_INT32)); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_32, ZE_IMAGE_FORMAT_TYPE_SINT}), static_cast(CL_SIGNED_INT32)); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_32, ZE_IMAGE_FORMAT_TYPE_FLOAT}), static_cast(CL_FLOAT)); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_8_8, ZE_IMAGE_FORMAT_TYPE_UINT}), static_cast(CL_UNSIGNED_INT8)); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_8_8, ZE_IMAGE_FORMAT_TYPE_SINT}), static_cast(CL_SIGNED_INT8)); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_8_8, ZE_IMAGE_FORMAT_TYPE_UNORM}), static_cast(CL_UNORM_INT8)); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_8_8, ZE_IMAGE_FORMAT_TYPE_SNORM}), static_cast(CL_SNORM_INT8)); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_8_8_8_8, ZE_IMAGE_FORMAT_TYPE_UINT}), static_cast(CL_UNSIGNED_INT8)); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_8_8_8_8, ZE_IMAGE_FORMAT_TYPE_SINT}), static_cast(CL_SIGNED_INT8)); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_8_8_8_8, ZE_IMAGE_FORMAT_TYPE_UNORM}), static_cast(CL_UNORM_INT8)); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_8_8_8_8, ZE_IMAGE_FORMAT_TYPE_SNORM}), static_cast(CL_SNORM_INT8)); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_16_16, ZE_IMAGE_FORMAT_TYPE_UINT}), static_cast(CL_UNSIGNED_INT16)); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_16_16, ZE_IMAGE_FORMAT_TYPE_SINT}), static_cast(CL_SIGNED_INT16)); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_16_16, ZE_IMAGE_FORMAT_TYPE_UNORM}), static_cast(CL_UNORM_INT16)); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_16_16, ZE_IMAGE_FORMAT_TYPE_SNORM}), static_cast(CL_SNORM_INT16)); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_16_16, ZE_IMAGE_FORMAT_TYPE_FLOAT}), static_cast(CL_HALF_FLOAT)); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_16_16_16_16, ZE_IMAGE_FORMAT_TYPE_UINT}), static_cast(CL_UNSIGNED_INT16)); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_16_16_16_16, ZE_IMAGE_FORMAT_TYPE_SINT}), static_cast(CL_SIGNED_INT16)); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_16_16_16_16, ZE_IMAGE_FORMAT_TYPE_UNORM}), static_cast(CL_UNORM_INT16)); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_16_16_16_16, ZE_IMAGE_FORMAT_TYPE_SNORM}), static_cast(CL_SNORM_INT16)); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_16_16_16_16, ZE_IMAGE_FORMAT_TYPE_FLOAT}), static_cast(CL_HALF_FLOAT)); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_32_32, ZE_IMAGE_FORMAT_TYPE_UINT}), static_cast(CL_UNSIGNED_INT32)); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_32_32, ZE_IMAGE_FORMAT_TYPE_SINT}), static_cast(CL_SIGNED_INT32)); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_32_32, ZE_IMAGE_FORMAT_TYPE_FLOAT}), static_cast(CL_FLOAT)); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_32_32_32_32, ZE_IMAGE_FORMAT_TYPE_UINT}), static_cast(CL_UNSIGNED_INT32)); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_32_32_32_32, ZE_IMAGE_FORMAT_TYPE_SINT}), static_cast(CL_SIGNED_INT32)); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_32_32_32_32, ZE_IMAGE_FORMAT_TYPE_FLOAT}), static_cast(CL_FLOAT)); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_10_10_10_2, ZE_IMAGE_FORMAT_TYPE_UNORM}), static_cast(CL_UNORM_INT_101010_2)); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_5_6_5, ZE_IMAGE_FORMAT_TYPE_UNORM}), static_cast(CL_UNORM_SHORT_565)); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_5_5_5_1, ZE_IMAGE_FORMAT_TYPE_UNORM}), static_cast(CL_UNORM_SHORT_555)); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_NV12, ZE_IMAGE_FORMAT_TYPE_UNORM}), static_cast(CL_NV12_INTEL)); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_YUYV, ZE_IMAGE_FORMAT_TYPE_UNORM}), static_cast(CL_YUYV_INTEL)); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_VYUY, ZE_IMAGE_FORMAT_TYPE_UNORM}), static_cast(CL_VYUY_INTEL)); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_YVYU, ZE_IMAGE_FORMAT_TYPE_UNORM}), static_cast(CL_YVYU_INTEL)); + EXPECT_EQ(getClChannelDataType({ZE_IMAGE_FORMAT_LAYOUT_UYVY, ZE_IMAGE_FORMAT_TYPE_UNORM}), static_cast(CL_UYVY_INTEL)); +} + +TEST(ImageFormatDescHelperTest, givenSwizzlesThenEqualityIsProperlyDetermined) { + swizzles ref{ZE_IMAGE_FORMAT_SWIZZLE_R, ZE_IMAGE_FORMAT_SWIZZLE_G, ZE_IMAGE_FORMAT_SWIZZLE_B, ZE_IMAGE_FORMAT_SWIZZLE_A}; + EXPECT_FALSE((ref == swizzles{ZE_IMAGE_FORMAT_SWIZZLE_0, ZE_IMAGE_FORMAT_SWIZZLE_0, ZE_IMAGE_FORMAT_SWIZZLE_0, ZE_IMAGE_FORMAT_SWIZZLE_0})); + EXPECT_FALSE((ref == swizzles{ZE_IMAGE_FORMAT_SWIZZLE_R, ZE_IMAGE_FORMAT_SWIZZLE_0, ZE_IMAGE_FORMAT_SWIZZLE_0, ZE_IMAGE_FORMAT_SWIZZLE_0})); + EXPECT_FALSE((ref == swizzles{ZE_IMAGE_FORMAT_SWIZZLE_R, ZE_IMAGE_FORMAT_SWIZZLE_G, ZE_IMAGE_FORMAT_SWIZZLE_0, ZE_IMAGE_FORMAT_SWIZZLE_0})); + EXPECT_FALSE((ref == swizzles{ZE_IMAGE_FORMAT_SWIZZLE_R, ZE_IMAGE_FORMAT_SWIZZLE_G, ZE_IMAGE_FORMAT_SWIZZLE_B, ZE_IMAGE_FORMAT_SWIZZLE_0})); + EXPECT_TRUE((ref == swizzles{ZE_IMAGE_FORMAT_SWIZZLE_R, ZE_IMAGE_FORMAT_SWIZZLE_G, ZE_IMAGE_FORMAT_SWIZZLE_B, ZE_IMAGE_FORMAT_SWIZZLE_A})); +} + +TEST(ImageFormatDescHelperTest, givenSupportedSwizzlesThenProperClEnumIsReturned) { + ze_image_format_desc_t format{}; + + format.x = ZE_IMAGE_FORMAT_SWIZZLE_R; + format.y = ZE_IMAGE_FORMAT_SWIZZLE_0; + format.z = ZE_IMAGE_FORMAT_SWIZZLE_0; + format.w = ZE_IMAGE_FORMAT_SWIZZLE_1; + EXPECT_EQ(getClChannelOrder(format), static_cast(CL_R)); + + format.x = ZE_IMAGE_FORMAT_SWIZZLE_0; + format.y = ZE_IMAGE_FORMAT_SWIZZLE_0; + format.z = ZE_IMAGE_FORMAT_SWIZZLE_0; + format.w = ZE_IMAGE_FORMAT_SWIZZLE_A; + EXPECT_EQ(getClChannelOrder(format), static_cast(CL_A)); + + format.x = ZE_IMAGE_FORMAT_SWIZZLE_R; + format.y = ZE_IMAGE_FORMAT_SWIZZLE_G; + format.z = ZE_IMAGE_FORMAT_SWIZZLE_0; + format.w = ZE_IMAGE_FORMAT_SWIZZLE_1; + EXPECT_EQ(getClChannelOrder(format), static_cast(CL_RG)); + + format.x = ZE_IMAGE_FORMAT_SWIZZLE_R; + format.y = ZE_IMAGE_FORMAT_SWIZZLE_0; + format.z = ZE_IMAGE_FORMAT_SWIZZLE_0; + format.w = ZE_IMAGE_FORMAT_SWIZZLE_A; + EXPECT_EQ(getClChannelOrder(format), static_cast(CL_RA)); + + format.x = ZE_IMAGE_FORMAT_SWIZZLE_R; + format.y = ZE_IMAGE_FORMAT_SWIZZLE_G; + format.z = ZE_IMAGE_FORMAT_SWIZZLE_B; + format.w = ZE_IMAGE_FORMAT_SWIZZLE_1; + EXPECT_EQ(getClChannelOrder(format), static_cast(CL_RGB)); + + format.x = ZE_IMAGE_FORMAT_SWIZZLE_R; + format.y = ZE_IMAGE_FORMAT_SWIZZLE_G; + format.z = ZE_IMAGE_FORMAT_SWIZZLE_B; + format.w = ZE_IMAGE_FORMAT_SWIZZLE_A; + EXPECT_EQ(getClChannelOrder(format), static_cast(CL_RGBA)); + + format.x = ZE_IMAGE_FORMAT_SWIZZLE_A; + format.y = ZE_IMAGE_FORMAT_SWIZZLE_R; + format.z = ZE_IMAGE_FORMAT_SWIZZLE_G; + format.w = ZE_IMAGE_FORMAT_SWIZZLE_B; + EXPECT_EQ(getClChannelOrder(format), static_cast(CL_ARGB)); + + format.x = ZE_IMAGE_FORMAT_SWIZZLE_A; + format.y = ZE_IMAGE_FORMAT_SWIZZLE_B; + format.z = ZE_IMAGE_FORMAT_SWIZZLE_G; + format.w = ZE_IMAGE_FORMAT_SWIZZLE_R; + EXPECT_EQ(getClChannelOrder(format), static_cast(CL_ABGR)); + + format.x = ZE_IMAGE_FORMAT_SWIZZLE_B; + format.y = ZE_IMAGE_FORMAT_SWIZZLE_G; + format.z = ZE_IMAGE_FORMAT_SWIZZLE_R; + format.w = ZE_IMAGE_FORMAT_SWIZZLE_A; + EXPECT_EQ(getClChannelOrder(format), static_cast(CL_BGRA)); +} + } // namespace ult } // namespace L0 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 28738d6f54..e81e0fe491 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 @@ -9,6 +9,7 @@ #include "test.h" +#include "level_zero/core/source/image/image_format_desc_helper.h" #include "level_zero/core/source/image/image_hw.h" #include "level_zero/core/source/sampler/sampler_hw.h" #include "level_zero/core/test/unit_tests/fixtures/device_fixture.h" @@ -80,12 +81,14 @@ HWTEST2_F(SetKernelArg, givenImageAndKernelWhenSetArgImageThenCrossThreadDataIsS imageArg.metadataPayload.arraySize = 0x18; imageArg.metadataPayload.numSamples = 0x1c; - imageArg.metadataPayload.numMipLevels = 0x20; + imageArg.metadataPayload.channelDataType = 0x20; + imageArg.metadataPayload.channelOrder = 0x24; + imageArg.metadataPayload.numMipLevels = 0x28; - imageArg.metadataPayload.flatWidth = 0x28; - imageArg.metadataPayload.flatHeight = 0x30; - imageArg.metadataPayload.flatPitch = 0x38; - imageArg.metadataPayload.flatBaseOffset = 0x40; + imageArg.metadataPayload.flatWidth = 0x30; + imageArg.metadataPayload.flatHeight = 0x38; + imageArg.metadataPayload.flatPitch = 0x40; + imageArg.metadataPayload.flatBaseOffset = 0x48; ze_image_desc_t desc = {}; @@ -142,6 +145,12 @@ HWTEST2_F(SetKernelArg, givenImageAndKernelWhenSetArgImageThenCrossThreadDataIsS auto pFlatPitch = ptrOffset(crossThreadData, imageArg.metadataPayload.flatPitch); EXPECT_EQ(imgInfo.imgDesc.imageRowPitch - 1u, *pFlatPitch); + + auto pChannelDataType = ptrOffset(crossThreadData, imageArg.metadataPayload.channelDataType); + EXPECT_EQ(getClChannelDataType(desc.format), *reinterpret_cast(pChannelDataType)); + + auto pChannelOrder = ptrOffset(crossThreadData, imageArg.metadataPayload.channelOrder); + EXPECT_EQ(getClChannelOrder(desc.format), *reinterpret_cast(pChannelOrder)); } HWTEST2_F(SetKernelArg, givenSamplerAndKernelWhenSetArgSamplerThenCrossThreadDataIsSet, ImageSupport) {