From 7a476b7bc1cc5e73a89930324052098da7fd2a2a Mon Sep 17 00:00:00 2001 From: Adam Cetnerowski Date: Mon, 15 Oct 2018 09:46:31 +0200 Subject: [PATCH] Correct HostPtr and flag usage in clCreateImage: - Disallow HostPtr flags, when HostPtr is null - Require HostPtr flag, when HostPtr is not null Change-Id: I8f198b7c3d4052128032e1f0575b19e7af6ffac9 Signed-off-by: Adam Cetnerowski --- runtime/api/api.cpp | 4 ++ unit_tests/api/cl_create_image_tests.inl | 83 ++++++++++++++++++++---- 2 files changed, 75 insertions(+), 12 deletions(-) diff --git a/runtime/api/api.cpp b/runtime/api/api.cpp index 63d62011cc..7c26170ab2 100644 --- a/runtime/api/api.cpp +++ b/runtime/api/api.cpp @@ -773,6 +773,10 @@ cl_mem CL_API_CALL clCreateImage(cl_context context, retVal = CL_INVALID_HOST_PTR; break; } + if (!(flags & (CL_MEM_COPY_HOST_PTR | CL_MEM_USE_HOST_PTR)) && hostPtr) { + retVal = CL_INVALID_HOST_PTR; + break; + } image = Image::validateAndCreateImage(pContext, flags, imageFormat, imageDesc, hostPtr, retVal); } while (false); diff --git a/unit_tests/api/cl_create_image_tests.inl b/unit_tests/api/cl_create_image_tests.inl index afa55aed8c..1fec4dd007 100644 --- a/unit_tests/api/cl_create_image_tests.inl +++ b/unit_tests/api/cl_create_image_tests.inl @@ -48,15 +48,13 @@ struct clCreateImageTests : public api_fixture, typedef clCreateImageTests<::testing::Test> clCreateImageTest; -TEST_F(clCreateImageTest, GivenValidParametersWhenCreatingImageThenImageIsCreatedAndSuccessReturned) { - char ptr[10]; - imageDesc.image_row_pitch = 128; +TEST_F(clCreateImageTest, GivenNullHostPtrWhenCreatingImageThenImageIsCreatedAndSuccessReturned) { auto image = clCreateImage( pContext, CL_MEM_READ_WRITE, &imageFormat, &imageDesc, - ptr, + nullptr, &retVal); ASSERT_EQ(CL_SUCCESS, retVal); EXPECT_NE(nullptr, image); @@ -65,6 +63,52 @@ TEST_F(clCreateImageTest, GivenValidParametersWhenCreatingImageThenImageIsCreate EXPECT_EQ(CL_SUCCESS, retVal); } +TEST_F(clCreateImageTest, GivenNonNullHostPtrAndAlignedRowPitchWhenCreatingImageThenImageIsCreatedAndSuccessReturned) { + char hostPtr[4096]; + imageDesc.image_row_pitch = 128; + + auto image = clCreateImage( + pContext, + CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR, + &imageFormat, + &imageDesc, + hostPtr, + &retVal); + ASSERT_EQ(CL_SUCCESS, retVal); + EXPECT_NE(nullptr, image); + + retVal = clReleaseMemObject(image); + EXPECT_EQ(CL_SUCCESS, retVal); +} + +TEST_F(clCreateImageTest, GivenNonNullHostPtrAndUnalignedRowPitchWhenCreatingImageThenInvalidImageDescriptotErrorIsReturned) { + char hostPtr[4096]; + imageDesc.image_row_pitch = 129; + auto image = clCreateImage( + pContext, + CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR, + &imageFormat, + &imageDesc, + hostPtr, + &retVal); + ASSERT_EQ(CL_INVALID_IMAGE_DESCRIPTOR, retVal); + EXPECT_EQ(nullptr, image); +} + +TEST_F(clCreateImageTest, GivenNonNullHostPtrAndSmallRowPitchWhenCreatingImageThenInvalidImageDescriptotErrorIsReturned) { + char hostPtr[4096]; + imageDesc.image_row_pitch = 4; + auto image = clCreateImage( + pContext, + CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR, + &imageFormat, + &imageDesc, + hostPtr, + &retVal); + ASSERT_EQ(CL_INVALID_IMAGE_DESCRIPTOR, retVal); + EXPECT_EQ(nullptr, image); +} + TEST_F(clCreateImageTest, GivenUnrestrictedIntelFlagWhenCreatingImageWithInvalidFlagCombinationThenImageIsCreatedAndSuccessReturned) { cl_mem_flags flags = CL_MEM_READ_WRITE | CL_MEM_WRITE_ONLY | CL_MEM_ACCESS_FLAGS_UNRESTRICTED_INTEL; auto image = clCreateImage( @@ -82,6 +126,19 @@ TEST_F(clCreateImageTest, GivenUnrestrictedIntelFlagWhenCreatingImageWithInvalid EXPECT_EQ(CL_SUCCESS, retVal); } +TEST_F(clCreateImageTest, GivenNotNullHostPtrAndNoHostPtrFlagWhenCreatingImageThenInvalidHostPtrErrorIsReturned) { + char hostPtr[4096]; + auto image = clCreateImage( + pContext, + CL_MEM_READ_WRITE, + &imageFormat, + &imageDesc, + hostPtr, + &retVal); + ASSERT_EQ(CL_INVALID_HOST_PTR, retVal); + EXPECT_EQ(nullptr, image); +} + TEST_F(clCreateImageTest, GivenInvalidFlagBitsWhenCreatingImageThenInvalidValueErrorIsReturned) { cl_mem_flags flags = (1 << 12); auto image = clCreateImage( @@ -135,13 +192,12 @@ TEST_F(clCreateImageTest, GivenInvalidFlagBitsWhenCreatingImageFromAnotherImageT TEST_F(clCreateImageTest, GivenInvalidRowPitchWhenCreatingImageThenInvalidImageDescriptorErrorIsReturned) { imageDesc.image_row_pitch = 655; - char ptr[10]; auto image = clCreateImage( pContext, CL_MEM_READ_WRITE, &imageFormat, &imageDesc, - ptr, + nullptr, &retVal); ASSERT_EQ(CL_INVALID_IMAGE_DESCRIPTOR, retVal); EXPECT_EQ(nullptr, image); @@ -219,13 +275,12 @@ TEST_F(clCreateImageTest, GivenNonZeroPitchWhenCreatingImageFromBufferThenImageI TEST_F(clCreateImageTest, GivenNotNullHostPtrAndRowPitchIsNotGreaterThanWidthTimesElementSizeWhenCreatingImageThenInvalidImageDescriptorErrorIsReturned) { imageDesc.image_row_pitch = 64; - char ptr[10]; auto image = clCreateImage( pContext, CL_MEM_READ_WRITE, &imageFormat, &imageDesc, - ptr, + nullptr, &retVal); ASSERT_EQ(CL_INVALID_IMAGE_DESCRIPTOR, retVal); EXPECT_EQ(nullptr, image); @@ -304,17 +359,21 @@ INSTANTIATE_TEST_CASE_P(CreateImageWithFlags, ::testing::ValuesIn(validFlags)); TEST_P(clCreateImageValidFlags, GivenValidFlagsWhenCreatingImageThenImageIsCreatedAndSuccessReturned) { - - char ptr[128 * 32]; - imageDesc.image_row_pitch = 128; cl_mem_flags flags = GetParam(); + char ptr[10]; + char *hostPtr = nullptr; + + if (flags & CL_MEM_USE_HOST_PTR || + flags & CL_MEM_COPY_HOST_PTR) { + hostPtr = ptr; + } auto image = clCreateImage( pContext, flags, &imageFormat, &imageDesc, - ptr, + hostPtr, &retVal); ASSERT_EQ(CL_SUCCESS, retVal);