diff --git a/runtime/mem_obj/image.cpp b/runtime/mem_obj/image.cpp index 2cffcf9505..96b0ec9939 100644 --- a/runtime/mem_obj/image.cpp +++ b/runtime/mem_obj/image.cpp @@ -186,6 +186,11 @@ Image *Image::create(Context *context, imgInfo.preferRenderCompression = MemObjHelper::isSuitableForRenderCompression(!imgInfo.linearStorage, memoryProperties, context->peekContextType(), true); + if (!context->getDevice(0)->getDeviceInfo().imageSupport && !imgInfo.linearStorage) { + errcodeRet = CL_INVALID_OPERATION; + return nullptr; + } + switch (imageDesc->image_type) { case CL_MEM_OBJECT_IMAGE3D: hostPtrMinSize = hostPtrSlicePitch * imageDepth; @@ -1039,11 +1044,6 @@ Image *Image::validateAndCreateImage(Context *context, return nullptr; } - if (!context->getDevice(0)->getDeviceInfo().imageSupport) { - errcodeRet = CL_INVALID_OPERATION; - return nullptr; - } - errcodeRet = Image::validateImageFormat(imageFormat); if (errcodeRet != CL_SUCCESS) { return nullptr; diff --git a/unit_tests/api/cl_create_image_tests.cpp b/unit_tests/api/cl_create_image_tests.cpp index 3ba78ad495..8b7ddc732a 100644 --- a/unit_tests/api/cl_create_image_tests.cpp +++ b/unit_tests/api/cl_create_image_tests.cpp @@ -7,6 +7,7 @@ #include "runtime/context/context.h" #include "runtime/helpers/hw_info.h" +#include "unit_tests/helpers/unit_test_helper.h" #include "unit_tests/mocks/mock_device.h" #include "cl_api_tests.h" @@ -64,7 +65,7 @@ TEST_F(clCreateImageTest, GivenNullHostPtrWhenCreatingImageThenImageIsCreatedAnd EXPECT_EQ(CL_SUCCESS, retVal); } -TEST_F(clCreateImageTest, GivenDeviceThatDoesntSupportImagesWhenCreatingImageThenInvalidOperationErrorIsReturned) { +HWTEST_F(clCreateImageTest, GivenDeviceThatDoesntSupportImagesWhenCreatingTiledImageThenInvalidOperationErrorIsReturned) { auto device = static_cast(pContext->getDevice(0)); device->deviceInfo.imageSupport = CL_FALSE; cl_bool imageSupportInfo = CL_TRUE; @@ -79,8 +80,43 @@ TEST_F(clCreateImageTest, GivenDeviceThatDoesntSupportImagesWhenCreatingImageThe &imageDesc, nullptr, &retVal); - EXPECT_EQ(CL_INVALID_OPERATION, retVal); - EXPECT_EQ(nullptr, image); + if (UnitTestHelper::tiledImagesSupported) { + EXPECT_EQ(CL_INVALID_OPERATION, retVal); + EXPECT_EQ(nullptr, image); + } else { + EXPECT_EQ(CL_SUCCESS, retVal); + EXPECT_NE(nullptr, image); + + retVal = clReleaseMemObject(image); + EXPECT_EQ(CL_SUCCESS, retVal); + } +} + +HWTEST_F(clCreateImageTest, GivenDeviceThatDoesntSupportImagesWhenCreatingNonTiledImageThenCreate) { + auto device = static_cast(pContext->getDevice(0)); + device->deviceInfo.imageSupport = CL_FALSE; + cl_bool imageSupportInfo = CL_TRUE; + auto status = clGetDeviceInfo(devices[0], CL_DEVICE_IMAGE_SUPPORT, sizeof(imageSupportInfo), &imageSupportInfo, nullptr); + EXPECT_EQ(CL_SUCCESS, status); + cl_bool expectedValue = CL_FALSE; + EXPECT_EQ(expectedValue, imageSupportInfo); + + imageDesc.image_type = CL_MEM_OBJECT_IMAGE1D; + imageDesc.image_height = 1; + + auto image = clCreateImage( + pContext, + CL_MEM_READ_WRITE, + &imageFormat, + &imageDesc, + nullptr, + &retVal); + + EXPECT_EQ(CL_SUCCESS, retVal); + EXPECT_NE(nullptr, image); + + retVal = clReleaseMemObject(image); + EXPECT_EQ(CL_SUCCESS, retVal); } TEST_F(clCreateImageTest, GivenNonNullHostPtrAndAlignedRowPitchWhenCreatingImageThenImageIsCreatedAndSuccessReturned) {