diff --git a/level_zero/core/source/device/device_imp.cpp b/level_zero/core/source/device/device_imp.cpp index f5433d8d56..b571467575 100644 --- a/level_zero/core/source/device/device_imp.cpp +++ b/level_zero/core/source/device/device_imp.cpp @@ -173,13 +173,13 @@ ze_result_t DeviceImp::getCommandQueueGroupProperties(uint32_t *pCount, ze_result_t DeviceImp::createImage(const ze_image_desc_t *desc, ze_image_handle_t *phImage) { auto productFamily = neoDevice->getHardwareInfo().platform.eProductFamily; - *phImage = Image::create(productFamily, this, desc); - - if (!*phImage) { - return ZE_RESULT_ERROR_UNSUPPORTED_IMAGE_FORMAT; + Image *pImage = nullptr; + auto result = Image::create(productFamily, this, desc, &pImage); + if (result == ZE_RESULT_SUCCESS) { + *phImage = pImage->toHandle(); } - return ZE_RESULT_SUCCESS; + return result; } ze_result_t DeviceImp::createSampler(const ze_sampler_desc_t *desc, diff --git a/level_zero/core/source/gen11/icllp/image_icllp.cpp b/level_zero/core/source/gen11/icllp/image_icllp.cpp index 5afb7f859c..59dc245c7d 100644 --- a/level_zero/core/source/gen11/icllp/image_icllp.cpp +++ b/level_zero/core/source/gen11/icllp/image_icllp.cpp @@ -16,7 +16,7 @@ template <> struct ImageProductFamily : public ImageCoreFamily { using ImageCoreFamily::ImageCoreFamily; - bool initialize(Device *device, const ze_image_desc_t *desc) override { + ze_result_t initialize(Device *device, const ze_image_desc_t *desc) override { return ImageCoreFamily::initialize(device, desc); }; }; diff --git a/level_zero/core/source/gen12lp/dg1/image_dg1.cpp b/level_zero/core/source/gen12lp/dg1/image_dg1.cpp index 49a2409094..d6311f418c 100644 --- a/level_zero/core/source/gen12lp/dg1/image_dg1.cpp +++ b/level_zero/core/source/gen12lp/dg1/image_dg1.cpp @@ -16,7 +16,7 @@ template <> struct ImageProductFamily : public ImageCoreFamily { using ImageCoreFamily::ImageCoreFamily; - bool initialize(Device *device, const ze_image_desc_t *desc) override { + ze_result_t initialize(Device *device, const ze_image_desc_t *desc) override { return ImageCoreFamily::initialize(device, desc); }; }; diff --git a/level_zero/core/source/gen12lp/tgllp/image_tgllp.cpp b/level_zero/core/source/gen12lp/tgllp/image_tgllp.cpp index de4194a873..0dcccb7d4f 100644 --- a/level_zero/core/source/gen12lp/tgllp/image_tgllp.cpp +++ b/level_zero/core/source/gen12lp/tgllp/image_tgllp.cpp @@ -16,7 +16,7 @@ template <> struct ImageProductFamily : public ImageCoreFamily { using ImageCoreFamily::ImageCoreFamily; - bool initialize(Device *device, const ze_image_desc_t *desc) override { + ze_result_t initialize(Device *device, const ze_image_desc_t *desc) override { return ImageCoreFamily::initialize(device, desc); }; }; diff --git a/level_zero/core/source/image/image.h b/level_zero/core/source/image/image.h index ff9c23ead2..6f1fbc6ed5 100644 --- a/level_zero/core/source/image/image.h +++ b/level_zero/core/source/image/image.h @@ -29,7 +29,7 @@ struct Image : _ze_image_handle_t { virtual ~Image() = default; virtual ze_result_t destroy() = 0; - static Image *create(uint32_t productFamily, Device *device, const ze_image_desc_t *desc); + static ze_result_t create(uint32_t productFamily, Device *device, const ze_image_desc_t *desc, Image **pImage); virtual NEO::GraphicsAllocation *getAllocation() = 0; virtual void copySurfaceStateToSSH(void *surfaceStateHeap, diff --git a/level_zero/core/source/image/image_hw.h b/level_zero/core/source/image/image_hw.h index 7f3566fd49..bd7667e18f 100644 --- a/level_zero/core/source/image/image_hw.h +++ b/level_zero/core/source/image/image_hw.h @@ -21,8 +21,7 @@ struct ImageCoreFamily : public ImageImp { using GfxFamily = typename NEO::GfxFamilyMapper::GfxFamily; using RENDER_SURFACE_STATE = typename GfxFamily::RENDER_SURFACE_STATE; - bool initialize(Device *device, const ze_image_desc_t *desc) override; - + ze_result_t initialize(Device *device, const ze_image_desc_t *desc) override; void copySurfaceStateToSSH(void *surfaceStateHeap, const uint32_t surfaceStateOffset) override; void copyRedescribedSurfaceStateToSSH(void *surfaceStateHeap, const uint32_t surfaceStateOffset) override; bool isMediaFormat(const ze_image_format_layout_t layout) { diff --git a/level_zero/core/source/image/image_hw.inl b/level_zero/core/source/image/image_hw.inl index 82734a3254..88a8af322d 100644 --- a/level_zero/core/source/image/image_hw.inl +++ b/level_zero/core/source/image/image_hw.inl @@ -21,7 +21,7 @@ namespace L0 { template -bool ImageCoreFamily::initialize(Device *device, const ze_image_desc_t *desc) { +ze_result_t ImageCoreFamily::initialize(Device *device, const ze_image_desc_t *desc) { using RENDER_SURFACE_STATE = typename GfxFamily::RENDER_SURFACE_STATE; bool isMediaFormatLayout = isMediaFormat(desc->format.layout); @@ -36,7 +36,7 @@ bool ImageCoreFamily::initialize(Device *device, const ze_image_d this->device = device; if (imgInfo.surfaceFormat->GMMSurfaceFormat == GMM_FORMAT_INVALID) { - return false; + return ZE_RESULT_ERROR_UNSUPPORTED_IMAGE_FORMAT; } typename RENDER_SURFACE_STATE::SURFACE_TYPE surfaceType; @@ -53,7 +53,7 @@ bool ImageCoreFamily::initialize(Device *device, const ze_image_d surfaceType = RENDER_SURFACE_STATE::SURFACE_TYPE_SURFTYPE_3D; break; default: - return false; + return ZE_RESULT_ERROR_INVALID_ARGUMENT; } imgInfo.linearStorage = surfaceType == RENDER_SURFACE_STATE::SURFACE_TYPE_SURFTYPE_1D; @@ -148,7 +148,7 @@ bool ImageCoreFamily::initialize(Device *device, const ze_image_d } } - return true; + return ZE_RESULT_SUCCESS; } template diff --git a/level_zero/core/source/image/image_imp.cpp b/level_zero/core/source/image/image_imp.cpp index 4a99550007..cd9057d386 100644 --- a/level_zero/core/source/image/image_imp.cpp +++ b/level_zero/core/source/image/image_imp.cpp @@ -26,7 +26,8 @@ ze_result_t ImageImp::destroy() { return ZE_RESULT_SUCCESS; } -Image *Image::create(uint32_t productFamily, Device *device, const ze_image_desc_t *desc) { +ze_result_t Image::create(uint32_t productFamily, Device *device, const ze_image_desc_t *desc, Image **pImage) { + ze_result_t result = ZE_RESULT_SUCCESS; ImageAllocatorFn allocator = nullptr; if (productFamily < IGFX_MAX_PRODUCT) { allocator = imageFactory[productFamily]; @@ -35,12 +36,16 @@ Image *Image::create(uint32_t productFamily, Device *device, const ze_image_desc ImageImp *image = nullptr; if (allocator) { image = static_cast((*allocator)()); - if (!image->initialize(device, desc)) { + result = image->initialize(device, desc); + if (result != ZE_RESULT_SUCCESS) { image->destroy(); image = nullptr; } + } else { + result = ZE_RESULT_ERROR_UNKNOWN; } + *pImage = image; - return image; + return result; } } // namespace L0 diff --git a/level_zero/core/source/image/image_imp.h b/level_zero/core/source/image/image_imp.h index c015049773..4b858decaf 100644 --- a/level_zero/core/source/image/image_imp.h +++ b/level_zero/core/source/image/image_imp.h @@ -16,7 +16,7 @@ namespace L0 { struct ImageImp : public Image { ze_result_t destroy() override; - virtual bool initialize(Device *device, const ze_image_desc_t *desc) = 0; + virtual ze_result_t initialize(Device *device, const ze_image_desc_t *desc) = 0; ~ImageImp() override; 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 266dfa268e..66013cdb93 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 @@ -90,7 +90,10 @@ HWTEST2_F(ImageCreate, givenValidImageDescriptionWhenImageCreateThenImageIsCreat ZE_IMAGE_FORMAT_SWIZZLE_B, ZE_IMAGE_FORMAT_SWIZZLE_A}; - std::unique_ptr image(Image::create(productFamily, device, &zeDesc)); + Image *image_ptr; + auto result = Image::create(productFamily, device, &zeDesc, &image_ptr); + EXPECT_EQ(result, ZE_RESULT_SUCCESS); + std::unique_ptr image(image_ptr); ASSERT_NE(image, nullptr); @@ -124,9 +127,11 @@ HWTEST2_F(ImageCreate, givenValidImageDescriptionWhenImageCreateWithUnsupportedI zeDesc.format = {ZE_IMAGE_FORMAT_LAYOUT_Y216}; - std::unique_ptr image(Image::create(productFamily, device, &zeDesc)); + Image *image_ptr; + auto result = Image::create(productFamily, device, &zeDesc, &image_ptr); - ASSERT_EQ(image, nullptr); + ASSERT_EQ(result, ZE_RESULT_ERROR_UNSUPPORTED_IMAGE_FORMAT); + ASSERT_EQ(image_ptr, nullptr); } class TestImageFormats : public DeviceFixture, public testing::TestWithParam> { @@ -165,8 +170,8 @@ HWTEST2_F(ImageCreate, givenDifferentSwizzleFormatWhenImageInitializeThenCorrect desc.format.w = ZE_IMAGE_FORMAT_SWIZZLE_X; auto imageHW = std::make_unique>>(); - bool ret = imageHW->initialize(device, &desc); - ASSERT_TRUE(ret); + auto ret = imageHW->initialize(device, &desc); + ASSERT_EQ(ZE_RESULT_SUCCESS, ret); auto surfaceState = &imageHW->surfaceState; 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 86f5c80dfb..c1cc12398a 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 @@ -108,7 +108,7 @@ HWTEST2_F(SetKernelArg, givenImageAndKernelWhenSetArgImageThenCrossThreadDataIsS auto imageHW = std::make_unique>>(); auto ret = imageHW->initialize(device, &desc); - ASSERT_EQ(true, ret); + ASSERT_EQ(ZE_RESULT_SUCCESS, ret); auto handle = imageHW->toHandle(); auto imgInfo = imageHW->getImageInfo();