From bf4d4e71c3560718df42df250baa9b230604fd1b Mon Sep 17 00:00:00 2001 From: "Kulkarni, Ashwin Kumar" Date: Mon, 13 Jan 2025 11:06:48 +0000 Subject: [PATCH] feature: adds support for 3 channel Imageview creation Related-To: NEO-12887 Signed-off-by: Kulkarni, Ashwin Kumar --- level_zero/core/source/image/image_imp.cpp | 14 +- .../unit_tests/sources/image/test_image.cpp | 124 +++++++++++++++++- 2 files changed, 134 insertions(+), 4 deletions(-) diff --git a/level_zero/core/source/image/image_imp.cpp b/level_zero/core/source/image/image_imp.cpp index 3fd7336c16..928ac22838 100644 --- a/level_zero/core/source/image/image_imp.cpp +++ b/level_zero/core/source/image/image_imp.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020-2024 Intel Corporation + * Copyright (C) 2020-2025 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -27,6 +27,7 @@ namespace L0 { ImageAllocatorFn imageFactory[IGFX_MAX_PRODUCT] = {}; +bool getImageDescriptor(const ze_image_desc_t *origImgDesc, ze_image_desc_t *imgDesc); ImageImp::~ImageImp() { if ((isImageView() || imageFromBuffer) && this->device != nullptr) { @@ -86,8 +87,15 @@ ze_result_t ImageImp::createView(Device *device, const ze_image_desc_t *desc, ze image->imgInfo = this->imgInfo; image->imageFromBuffer = this->imageFromBuffer; - auto result = image->initialize(device, desc); - + ze_image_desc_t imgDesc = {}; + bool modified = getImageDescriptor(desc, &imgDesc); + auto result = ZE_RESULT_SUCCESS; + if (modified && this->isMimickedImage()) { + image->setMimickedImage(true); + result = image->initialize(device, &imgDesc); + } else { + result = image->initialize(device, desc); + } if (result != ZE_RESULT_SUCCESS) { image->destroy(); image = nullptr; 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 c690b33a3b..ce4c7eaeb4 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 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020-2024 Intel Corporation + * Copyright (C) 2020-2025 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -346,6 +346,85 @@ HWTEST2_F(ImageView, givenPlanarImageWhenCreateImageViewThenProperPlaneIsCreated zeImageDestroy(planeUV); } +HWTEST2_F(ImageView, given3ChannelImageWhenCreateImageViewIsCalledThenProperViewIsCreated, MatchAny) { + const size_t width = 32; + const size_t height = 32; + const size_t depth = 1; + + ze_image_desc_t srcImgDesc = {ZE_STRUCTURE_TYPE_IMAGE_DESC, + nullptr, + (ZE_IMAGE_FLAG_KERNEL_WRITE | ZE_IMAGE_FLAG_BIAS_UNCACHED), + ZE_IMAGE_TYPE_2D, + {ZE_IMAGE_FORMAT_LAYOUT_8_8_8, ZE_IMAGE_FORMAT_TYPE_UNORM, + ZE_IMAGE_FORMAT_SWIZZLE_R, ZE_IMAGE_FORMAT_SWIZZLE_G, + ZE_IMAGE_FORMAT_SWIZZLE_B, ZE_IMAGE_FORMAT_SWIZZLE_1}, + width, + height, + depth, + 0, + 0}; + + Image *imagePtr; + auto result = Image::create(productFamily, device, &srcImgDesc, &imagePtr); + EXPECT_EQ(result, ZE_RESULT_SUCCESS); + ze_image_handle_t imgHandle = imagePtr->toHandle(); + + ze_image_handle_t viewHandle; + auto ret = L0::Image::fromHandle(imgHandle)->createView(device, &srcImgDesc, &viewHandle); + ASSERT_EQ(ZE_RESULT_SUCCESS, ret); + + auto viewDesc = static_cast(viewHandle)->getImageInfo().imgDesc; + EXPECT_EQ(width, viewDesc.imageWidth); + EXPECT_EQ(height, viewDesc.imageHeight); + + zeImageDestroy(viewHandle); + zeImageDestroy(imgHandle); +} + +HWTEST2_F(ImageView, given3ChannelMickedImageWhenCreateImageViewIsCalledThenProperViewIsCreated, MatchAny) { + const size_t width = 32; + const size_t height = 32; + const size_t depth = 1; + + ze_image_desc_t srcImgDesc = {ZE_STRUCTURE_TYPE_IMAGE_DESC, + nullptr, + (ZE_IMAGE_FLAG_KERNEL_WRITE | ZE_IMAGE_FLAG_BIAS_UNCACHED), + ZE_IMAGE_TYPE_2D, + {ZE_IMAGE_FORMAT_LAYOUT_8_8_8, ZE_IMAGE_FORMAT_TYPE_UNORM, + ZE_IMAGE_FORMAT_SWIZZLE_R, ZE_IMAGE_FORMAT_SWIZZLE_G, + ZE_IMAGE_FORMAT_SWIZZLE_B, ZE_IMAGE_FORMAT_SWIZZLE_1}, + width, + height, + depth, + 0, + 0}; + + Image *imagePtr; + auto result = Image::create(productFamily, device, &srcImgDesc, &imagePtr); + EXPECT_EQ(result, ZE_RESULT_SUCCESS); + ze_image_handle_t imgHandle = imagePtr->toHandle(); + + ze_image_desc_t viewImgDesc = {ZE_STRUCTURE_TYPE_IMAGE_DESC, + nullptr, + (ZE_IMAGE_FLAG_KERNEL_WRITE | ZE_IMAGE_FLAG_BIAS_UNCACHED), + ZE_IMAGE_TYPE_2D, + {ZE_IMAGE_FORMAT_LAYOUT_8, ZE_IMAGE_FORMAT_TYPE_UNORM, + ZE_IMAGE_FORMAT_SWIZZLE_R, ZE_IMAGE_FORMAT_SWIZZLE_X, + ZE_IMAGE_FORMAT_SWIZZLE_X, ZE_IMAGE_FORMAT_SWIZZLE_X}, + width * 3, + height, + depth, + 0, + 0}; + + ze_image_handle_t viewHandle; + auto ret = L0::Image::fromHandle(imgHandle)->createView(device, &viewImgDesc, &viewHandle); + ASSERT_EQ(ZE_RESULT_SUCCESS, ret); + + zeImageDestroy(viewHandle); + zeImageDestroy(imgHandle); +} + HWTEST2_F(ImageView, givenPlanarImageWhenCreateImageWithInvalidStructViewThenProperErrorIsReturned, MatchAny) { const size_t width = 32; const size_t height = 32; @@ -2455,6 +2534,49 @@ HWTEST2_F(ImageCreateExternalMemoryTest, givenNTHandleWhenCreatingInteropImageTh ASSERT_NE(image, nullptr); } +HWTEST2_F(ImageCreateExternalMemoryTest, givenNTHandleOfInteropImageWhenImageViewCreateIsCalledThenSuccessIsReturned, MatchAny) { + const size_t width = 32; + const size_t height = 32; + const size_t depth = 1; + ze_image_desc_t srcImgDesc = {ZE_STRUCTURE_TYPE_IMAGE_DESC, + nullptr, + (ZE_IMAGE_FLAG_KERNEL_WRITE | ZE_IMAGE_FLAG_BIAS_UNCACHED), + ZE_IMAGE_TYPE_2D, + {ZE_IMAGE_FORMAT_LAYOUT_8_8_8, ZE_IMAGE_FORMAT_TYPE_UNORM, + ZE_IMAGE_FORMAT_SWIZZLE_R, ZE_IMAGE_FORMAT_SWIZZLE_G, + ZE_IMAGE_FORMAT_SWIZZLE_B, ZE_IMAGE_FORMAT_SWIZZLE_1}, + width, + height, + depth, + 0, + 0}; + ze_external_memory_import_win32_handle_t importNTHandle = {}; + importNTHandle.handle = &imageHandle; + importNTHandle.flags = ZE_EXTERNAL_MEMORY_TYPE_FLAG_OPAQUE_WIN32; + importNTHandle.stype = ZE_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMPORT_WIN32; + srcImgDesc.pNext = &importNTHandle; + + delete driverHandle->svmAllocsManager; + driverHandle->setMemoryManager(execEnv->memoryManager.get()); + driverHandle->svmAllocsManager = new NEO::SVMAllocsManager(execEnv->memoryManager.get(), false); + + Image *imagePtr; + auto result = Image::create(productFamily, device, &srcImgDesc, &imagePtr); + EXPECT_EQ(result, ZE_RESULT_SUCCESS); + std::unique_ptr image(imagePtr); + + ASSERT_NE(image, nullptr); + + ze_image_handle_t imgHandle = imagePtr->toHandle(); + + ze_image_handle_t viewHandle; + srcImgDesc.pNext = nullptr; + auto ret = L0::Image::fromHandle(imgHandle)->createView(device, &srcImgDesc, &viewHandle); + ASSERT_EQ(ZE_RESULT_SUCCESS, ret); + + zeImageDestroy(viewHandle); +} + HWTEST2_F(ImageCreate, givenFDWhenCreatingImageWith3Channel8bitUintThenSuccessIsReturned, MatchAny) { ze_image_desc_t desc = {};