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 <adam.cetnerowski@intel.com>
This commit is contained in:
Adam Cetnerowski
2018-10-15 09:46:31 +02:00
committed by sys_ocldev
parent 9c06e1dc5b
commit 7a476b7bc1
2 changed files with 75 additions and 12 deletions

View File

@@ -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);

View File

@@ -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);