From 853d870d1c4abd9c0c8fa03f0f2c5681d79d7d66 Mon Sep 17 00:00:00 2001 From: Filip Hazubski Date: Tue, 21 Apr 2020 13:45:26 +0200 Subject: [PATCH] Return CL_INVALID_OPERATION when creating an image Error is returned when images are not supported. Related-To: NEO-4368 Change-Id: I1e7098f7c450dbaefc546ab4cfdaebbb5376def4 Signed-off-by: Filip Hazubski --- opencl/source/mem_obj/image.cpp | 4 +++ .../unit_test/api/cl_create_image_tests.cpp | 33 +++++++++++++++++++ .../device/get_device_info_tests.cpp | 2 ++ .../mem_obj/image2d_from_buffer_tests.cpp | 11 +++++++ .../mem_obj/image_validate_tests.cpp | 5 +++ .../unit_test/mem_obj/nv12_image_tests.cpp | 4 +++ .../unit_test/test_macros/test_checks.cpp | 7 ++++ .../test/unit_test/test_macros/test_checks.h | 7 ++++ 8 files changed, 73 insertions(+) diff --git a/opencl/source/mem_obj/image.cpp b/opencl/source/mem_obj/image.cpp index bde1a907ec..dab34f663f 100644 --- a/opencl/source/mem_obj/image.cpp +++ b/opencl/source/mem_obj/image.cpp @@ -476,6 +476,10 @@ cl_int Image::validate(Context *context, Image *parentImage = castToObject(imageDesc->mem_object); Buffer *parentBuffer = castToObject(imageDesc->mem_object); if (imageDesc->image_type == CL_MEM_OBJECT_IMAGE2D) { + if ((imageDesc->mem_object != nullptr) && (pClDevice->getSharedDeviceInfo().imageSupport == false)) { + return CL_INVALID_OPERATION; + } + pClDevice->getCap(reinterpret_cast(maxWidth), srcSize, retSize); pClDevice->getCap(reinterpret_cast(maxHeight), srcSize, retSize); if (imageDesc->image_width > *maxWidth || diff --git a/opencl/test/unit_test/api/cl_create_image_tests.cpp b/opencl/test/unit_test/api/cl_create_image_tests.cpp index 06d3fa4b85..69d7c97eeb 100644 --- a/opencl/test/unit_test/api/cl_create_image_tests.cpp +++ b/opencl/test/unit_test/api/cl_create_image_tests.cpp @@ -11,6 +11,7 @@ #include "opencl/source/context/context.h" #include "opencl/test/unit_test/helpers/unit_test_helper.h" #include "opencl/test/unit_test/mocks/mock_cl_device.h" +#include "opencl/test/unit_test/test_macros/test_checks.h" #include "cl_api_tests.h" @@ -308,7 +309,34 @@ TEST_F(clCreateImageTest, GivenNullHostPtrAndNonZeroRowPitchWhenCreatingImageThe EXPECT_EQ(CL_INVALID_MEM_OBJECT, retVal); } +TEST_F(clCreateImageTest, GivenDeviceNotSupportingImagesWhenCreatingImageFromBufferThenInvalidOperationErrorIsReturned) { + + auto hardwareInfo = *defaultHwInfo; + hardwareInfo.capabilityTable.supportsImages = false; + auto pClDevice = std::make_unique(MockDevice::createWithNewExecutionEnvironment(&hardwareInfo, 0)); + cl_device_id deviceId = pClDevice.get(); + auto pContext = std::unique_ptr(Context::create(nullptr, ClDeviceVector(&deviceId, 1), nullptr, nullptr, retVal)); + + auto buffer = clCreateBuffer(pContext.get(), CL_MEM_READ_WRITE, 4096 * 9, nullptr, nullptr); + imageDesc.mem_object = buffer; + imageDesc.image_type = CL_MEM_OBJECT_IMAGE2D; + + auto image = clCreateImage( + pContext.get(), + CL_MEM_READ_WRITE, + &imageFormat, + &imageDesc, + nullptr, + &retVal); + + EXPECT_EQ(nullptr, image); + EXPECT_EQ(CL_INVALID_OPERATION, retVal); + + clReleaseMemObject(buffer); +} + TEST_F(clCreateImageTest, GivenNonZeroPitchWhenCreatingImageFromBufferThenImageIsCreatedAndSuccessReturned) { + REQUIRE_IMAGES_OR_SKIP(pContext); auto buffer = clCreateBuffer(pContext, CL_MEM_READ_WRITE, 4096 * 9, nullptr, nullptr); auto &helper = HwHelper::get(renderCoreFamily); @@ -505,6 +533,7 @@ INSTANTIATE_TEST_CASE_P(CreateImageWithFlags, ::testing::ValuesIn(flagsWithUnrestrictedIntel)); TEST_P(clCreateImageFlagsUnrestrictedIntel, GivenFlagsIncludingUnrestrictedIntelWhenCreatingImageThenImageIsCreatedAndSuccessReturned) { + REQUIRE_IMAGES_OR_SKIP(pContext); imageFormat.image_channel_order = CL_NV12_INTEL; ImageFlags imageFlags = GetParam(); @@ -555,6 +584,7 @@ INSTANTIATE_TEST_CASE_P(CreateImageWithFlags, ::testing::ValuesIn(validFlagsAndParentFlags)); TEST_P(clCreateImageValidFlagsAndParentFlagsCombinations, GivenValidFlagsAndParentFlagsWhenCreatingImageThenImageIsCreatedAndSuccessReturned) { + REQUIRE_IMAGES_OR_SKIP(pContext); imageFormat.image_channel_order = CL_NV12_INTEL; ImageFlags imageFlags = GetParam(); @@ -845,6 +875,7 @@ TEST_F(clCreateImageWithPropertiesINTELTest, GivenInvalidPropertyKeyWhenCreating typedef clCreateImageTests<::testing::Test> clCreateImageFromImageTest; TEST_F(clCreateImageFromImageTest, GivenImage2dWhenCreatingImage2dFromImageWithTheSameDescriptorAndValidFormatThenImageIsCreatedAndSuccessReturned) { + REQUIRE_IMAGES_OR_SKIP(pContext); imageFormat.image_channel_order = CL_BGRA; @@ -902,6 +933,7 @@ TEST_F(clCreateImageFromImageTest, GivenImage2dWhenCreatingImage2dFromImageWithT } TEST_F(clCreateImageFromImageTest, GivenImage2dWhenCreatingImage2dFromImageWithDifferentDescriptorAndValidFormatThenInvalidImageFormatDescriptorErrorIsReturned) { + REQUIRE_IMAGES_OR_SKIP(pContext); imageFormat.image_channel_order = CL_BGRA; @@ -956,6 +988,7 @@ TEST_F(clCreateImageFromImageTest, GivenImage2dWhenCreatingImage2dFromImageWithD } TEST_F(clCreateImageFromImageTest, GivenImage2dWhenCreatingImage2dFromImageWithTheSameDescriptorAndNotValidFormatThenInvalidImageFormatDescriptorErrorIsReturned) { + REQUIRE_IMAGES_OR_SKIP(pContext); imageFormat.image_channel_order = CL_BGRA; diff --git a/opencl/test/unit_test/device/get_device_info_tests.cpp b/opencl/test/unit_test/device/get_device_info_tests.cpp index e29c8d035e..f097adff5b 100644 --- a/opencl/test/unit_test/device/get_device_info_tests.cpp +++ b/opencl/test/unit_test/device/get_device_info_tests.cpp @@ -345,6 +345,7 @@ TEST(GetDeviceInfo, GivenImageSupportEnabledWhenGettingImageBaseAddressAlignment nullptr); EXPECT_EQ(CL_SUCCESS, retVal); + EXPECT_NE(0u, value); } TEST(GetDeviceInfo, GivenImageSupportDisabledWhenGettingImageMaxArraySizeThenZeroIsReturned) { @@ -438,6 +439,7 @@ TEST(GetDeviceInfo, GivenImageSupportEnabledWhenGettingImagePitchAlignmentThenCo nullptr); EXPECT_EQ(CL_SUCCESS, retVal); + EXPECT_NE(0u, value); } TEST(GetDeviceInfo, GivenNumSimultaneousInteropsWhenGettingDeviceInfoThenCorrectValueIsReturned) { diff --git a/opencl/test/unit_test/mem_obj/image2d_from_buffer_tests.cpp b/opencl/test/unit_test/mem_obj/image2d_from_buffer_tests.cpp index 16a02a4fb6..c97d702170 100644 --- a/opencl/test/unit_test/mem_obj/image2d_from_buffer_tests.cpp +++ b/opencl/test/unit_test/mem_obj/image2d_from_buffer_tests.cpp @@ -17,6 +17,7 @@ #include "opencl/test/unit_test/helpers/raii_hw_helper.h" #include "opencl/test/unit_test/mocks/mock_context.h" #include "opencl/test/unit_test/mocks/mock_gmm.h" +#include "opencl/test/unit_test/test_macros/test_checks.h" #include "test.h" using namespace NEO; @@ -101,6 +102,7 @@ TEST_F(Image2dFromBufferTest, CalculateRowPitch) { delete imageFromBuffer; } TEST_F(Image2dFromBufferTest, givenInvalidRowPitchWhenCreateImage2dFromBufferThenReturnsError) { + REQUIRE_IMAGES_OR_SKIP(&context); char ptr[10]; imageDesc.image_row_pitch = 255; cl_mem_flags flags = CL_MEM_READ_ONLY; @@ -121,6 +123,7 @@ TEST_F(Image2dFromBufferTest, givenRowPitchThatIsGreaterThenComputedWhenImageIsC } TEST_F(Image2dFromBufferTest, InvalidHostPtrAlignment) { + REQUIRE_IMAGES_OR_SKIP(&context); std::unique_ptr myHostPtr(malloc(size + 1), free); ASSERT_NE(nullptr, myHostPtr); void *nonAlignedHostPtr = myHostPtr.get(); @@ -141,6 +144,7 @@ TEST_F(Image2dFromBufferTest, InvalidHostPtrAlignment) { } TEST_F(Image2dFromBufferTest, givenInvalidFlagsWhenValidateIsCalledThenReturnError) { + REQUIRE_IMAGES_OR_SKIP(&context); cl_mem_flags flags[] = {CL_MEM_USE_HOST_PTR, CL_MEM_COPY_HOST_PTR}; for (auto flag : flags) { @@ -151,6 +155,7 @@ TEST_F(Image2dFromBufferTest, givenInvalidFlagsWhenValidateIsCalledThenReturnErr } TEST_F(Image2dFromBufferTest, givenOneChannel8BitColorsNoRowPitchSpecifiedAndTooLargeImageWhenValidatingSurfaceFormatThenReturnError) { + REQUIRE_IMAGES_OR_SKIP(&context); imageDesc.image_height = 1 + castToObject(imageDesc.mem_object)->getSize() / imageDesc.image_width; cl_mem_flags flags = CL_MEM_READ_ONLY; imageFormat.image_channel_data_type = CL_UNORM_INT8; @@ -162,6 +167,7 @@ TEST_F(Image2dFromBufferTest, givenOneChannel8BitColorsNoRowPitchSpecifiedAndToo } TEST_F(Image2dFromBufferTest, givenOneChannel16BitColorsNoRowPitchSpecifiedAndTooLargeImageWhenValidatingSurfaceFormatThenReturnError) { + REQUIRE_IMAGES_OR_SKIP(&context); imageDesc.image_height = 1 + castToObject(imageDesc.mem_object)->getSize() / imageDesc.image_width / 2; cl_mem_flags flags = CL_MEM_READ_ONLY; imageFormat.image_channel_data_type = CL_UNORM_INT16; @@ -173,6 +179,7 @@ TEST_F(Image2dFromBufferTest, givenOneChannel16BitColorsNoRowPitchSpecifiedAndTo } TEST_F(Image2dFromBufferTest, givenFourChannel8BitColorsNoRowPitchSpecifiedAndTooLargeImageWhenValidatingSurfaceFormatThenReturnError) { + REQUIRE_IMAGES_OR_SKIP(&context); imageDesc.image_height = 1 + castToObject(imageDesc.mem_object)->getSize() / imageDesc.image_width / 4; cl_mem_flags flags = CL_MEM_READ_ONLY; imageFormat.image_channel_data_type = CL_UNORM_INT8; @@ -184,6 +191,7 @@ TEST_F(Image2dFromBufferTest, givenFourChannel8BitColorsNoRowPitchSpecifiedAndTo } TEST_F(Image2dFromBufferTest, givenFourChannel16BitColorsNoRowPitchSpecifiedAndTooLargeImageWhenValidatingSurfaceFormatThenReturnError) { + REQUIRE_IMAGES_OR_SKIP(&context); imageDesc.image_height = 1 + castToObject(imageDesc.mem_object)->getSize() / imageDesc.image_width / 8; cl_mem_flags flags = CL_MEM_READ_ONLY; imageFormat.image_channel_data_type = CL_UNORM_INT16; @@ -195,6 +203,7 @@ TEST_F(Image2dFromBufferTest, givenFourChannel16BitColorsNoRowPitchSpecifiedAndT } TEST_F(Image2dFromBufferTest, givenFourChannel8BitColorsAndNotTooLargeRowPitchSpecifiedWhenValidatingSurfaceFormatThenDoNotReturnError) { + REQUIRE_IMAGES_OR_SKIP(&context); imageDesc.image_height = castToObject(imageDesc.mem_object)->getSize() / imageDesc.image_width; imageDesc.image_row_pitch = imageDesc.image_width; cl_mem_flags flags = CL_MEM_READ_ONLY; @@ -207,6 +216,7 @@ TEST_F(Image2dFromBufferTest, givenFourChannel8BitColorsAndNotTooLargeRowPitchSp } TEST_F(Image2dFromBufferTest, givenFourChannel8BitColorsAndTooLargeRowPitchSpecifiedWhenValidatingSurfaceFormatThenReturnError) { + REQUIRE_IMAGES_OR_SKIP(&context); const auto pitchAlignment = &ClDeviceInfoTable::Map::getValue(*context.getDevice(0u)); imageDesc.image_height = castToObject(imageDesc.mem_object)->getSize() / imageDesc.image_width; imageDesc.image_row_pitch = imageDesc.image_width + *pitchAlignment; @@ -220,6 +230,7 @@ TEST_F(Image2dFromBufferTest, givenFourChannel8BitColorsAndTooLargeRowPitchSpeci } TEST_F(Image2dFromBufferTest, givenUnalignedImageWidthAndNoSpaceInBufferForAlignmentWhenValidatingSurfaceFormatThenReturnError) { + REQUIRE_IMAGES_OR_SKIP(&context); static_cast(context.getDevice(0))->deviceInfo.imagePitchAlignment = 128; imageDesc.image_width = 64; imageDesc.image_height = castToObject(imageDesc.mem_object)->getSize() / imageDesc.image_width; diff --git a/opencl/test/unit_test/mem_obj/image_validate_tests.cpp b/opencl/test/unit_test/mem_obj/image_validate_tests.cpp index 0d590ac996..08d3b0100c 100644 --- a/opencl/test/unit_test/mem_obj/image_validate_tests.cpp +++ b/opencl/test/unit_test/mem_obj/image_validate_tests.cpp @@ -14,6 +14,7 @@ #include "opencl/test/unit_test/fixtures/image_fixture.h" #include "opencl/test/unit_test/mocks/mock_context.h" #include "opencl/test/unit_test/mocks/mock_graphics_allocation.h" +#include "opencl/test/unit_test/test_macros/test_checks.h" #include "gtest/gtest.h" @@ -893,6 +894,8 @@ TEST(ImageValidatorTest, givenNV12Image2dAsParentImageWhenValidateImageZeroSized NullImage image; cl_image_desc descriptor; MockContext context; + REQUIRE_IMAGES_OR_SKIP(&context); + void *dummyPtr = reinterpret_cast(0x17); ClSurfaceFormatInfo surfaceFormat = {}; image.imageFormat.image_channel_order = CL_NV12_INTEL; @@ -909,6 +912,8 @@ TEST(ImageValidatorTest, givenNonNV12Image2dAsParentImageWhenValidateImageZeroSi NullImage image; cl_image_desc descriptor; MockContext context; + REQUIRE_IMAGES_OR_SKIP(&context); + void *dummyPtr = reinterpret_cast(0x17); ClSurfaceFormatInfo surfaceFormat; image.imageFormat.image_channel_order = CL_BGRA; diff --git a/opencl/test/unit_test/mem_obj/nv12_image_tests.cpp b/opencl/test/unit_test/mem_obj/nv12_image_tests.cpp index ba3985bc63..91c1fd0220 100644 --- a/opencl/test/unit_test/mem_obj/nv12_image_tests.cpp +++ b/opencl/test/unit_test/mem_obj/nv12_image_tests.cpp @@ -20,6 +20,7 @@ #include "opencl/test/unit_test/mocks/mock_command_queue.h" #include "opencl/test/unit_test/mocks/mock_context.h" #include "opencl/test/unit_test/mocks/mock_gmm_resource_info.h" +#include "opencl/test/unit_test/test_macros/test_checks.h" #include "test.h" #include "gtest/gtest.h" @@ -138,6 +139,7 @@ TEST_F(Nv12ImageTest, invalidNV12ImageFlag) { } TEST_F(Nv12ImageTest, validateNV12YPlane) { + REQUIRE_IMAGES_OR_SKIP(&context); auto image = createImageWithFlags(CL_MEM_READ_ONLY | CL_MEM_ACCESS_FLAGS_UNRESTRICTED_INTEL); @@ -153,6 +155,7 @@ TEST_F(Nv12ImageTest, validateNV12YPlane) { } TEST_F(Nv12ImageTest, validateNV12YUVPlane) { + REQUIRE_IMAGES_OR_SKIP(&context); auto image = createImageWithFlags(CL_MEM_READ_ONLY | CL_MEM_ACCESS_FLAGS_UNRESTRICTED_INTEL); @@ -168,6 +171,7 @@ TEST_F(Nv12ImageTest, validateNV12YUVPlane) { } TEST_F(Nv12ImageTest, givenNV12ImageWhenInvalidDepthIsPassedThenValidateFails) { + REQUIRE_IMAGES_OR_SKIP(&context); auto image = createImageWithFlags(CL_MEM_READ_ONLY | CL_MEM_ACCESS_FLAGS_UNRESTRICTED_INTEL); diff --git a/opencl/test/unit_test/test_macros/test_checks.cpp b/opencl/test/unit_test/test_macros/test_checks.cpp index 17dd24a811..d34e82365f 100644 --- a/opencl/test/unit_test/test_macros/test_checks.cpp +++ b/opencl/test/unit_test/test_macros/test_checks.cpp @@ -7,10 +7,17 @@ #include "opencl/test/unit_test/test_macros/test_checks.h" +#include "shared/source/device/device_info.h" + #include "opencl/source/cl_device/cl_device.h" +#include "opencl/source/context/context.h" using namespace NEO; bool TestChecks::supportsSvm(const ClDevice *pClDevice) { return supportsSvm(&pClDevice->getDevice()); } + +bool TestChecks::supportsImages(const Context *pContext) { + return pContext->getDevice(0)->getSharedDeviceInfo().imageSupport; +} diff --git a/opencl/test/unit_test/test_macros/test_checks.h b/opencl/test/unit_test/test_macros/test_checks.h index 171ad9f8b7..6ca3990413 100644 --- a/opencl/test/unit_test/test_macros/test_checks.h +++ b/opencl/test/unit_test/test_macros/test_checks.h @@ -9,11 +9,18 @@ namespace NEO { class ClDevice; +class Context; namespace TestChecks { bool supportsSvm(const ClDevice *pClDevice); +bool supportsImages(const Context *pContext); } // namespace TestChecks } // namespace NEO #include "shared/test/unit_test/test_macros/test_checks.h" + +#define REQUIRE_IMAGES_OR_SKIP(param) \ + if (NEO::TestChecks::supportsImages(param) == false) { \ + GTEST_SKIP(); \ + }