diff --git a/opencl/source/mem_obj/image.cpp b/opencl/source/mem_obj/image.cpp index 9be278b77f..b2cf2bc2ec 100644 --- a/opencl/source/mem_obj/image.cpp +++ b/opencl/source/mem_obj/image.cpp @@ -1450,6 +1450,18 @@ cl_int Image::validateRegionAndOrigin(const size_t *origin, const size_t *region } } + if (imgDesc.image_type == CL_MEM_OBJECT_IMAGE1D_ARRAY) { + if (origin[1] + region[1] > imgDesc.image_array_size) { + return CL_INVALID_VALUE; + } + } + + if (imgDesc.image_type == CL_MEM_OBJECT_IMAGE2D_ARRAY) { + if (origin[2] + region[2] > imgDesc.image_array_size) { + return CL_INVALID_VALUE; + } + } + bool notMipMapped = (false == isMipMapped(imgDesc)); if ((imgDesc.image_type == CL_MEM_OBJECT_IMAGE1D || imgDesc.image_type == CL_MEM_OBJECT_IMAGE1D_BUFFER) && diff --git a/opencl/test/unit_test/mem_obj/image_tests.cpp b/opencl/test/unit_test/mem_obj/image_tests.cpp index 736da52ec5..2afcf791bb 100644 --- a/opencl/test/unit_test/mem_obj/image_tests.cpp +++ b/opencl/test/unit_test/mem_obj/image_tests.cpp @@ -1592,6 +1592,7 @@ TEST(ImageTest, givenImageWhenValidateRegionAndOriginIsCalledThenAdditionalOrigi desc.image_height = 1; desc.image_depth = 1; + desc.image_array_size = 1; EXPECT_EQ(CL_SUCCESS, Image::validateRegionAndOrigin(origin, region, desc)); if (imageType == CL_MEM_OBJECT_IMAGE3D) { @@ -1601,6 +1602,28 @@ TEST(ImageTest, givenImageWhenValidateRegionAndOriginIsCalledThenAdditionalOrigi } } +TEST(ImageTest, givenImageArrayWhenValidateRegionAndOriginIsCalledThenAdditionalOriginAndRegionCoordinatesAreAnalyzed) { + size_t region[3]{1, 1, 1}; + size_t origin[3]{}; + cl_image_desc desc = {}; + + desc.image_type = CL_MEM_OBJECT_IMAGE1D_ARRAY; + desc.image_width = 1; + EXPECT_EQ(CL_INVALID_VALUE, Image::validateRegionAndOrigin(origin, region, desc)); + + desc.image_array_size = 1; + EXPECT_EQ(CL_SUCCESS, Image::validateRegionAndOrigin(origin, region, desc)); + + desc.image_type = CL_MEM_OBJECT_IMAGE2D_ARRAY; + desc.image_array_size = 0; + desc.image_width = 1; + desc.image_height = 1; + EXPECT_EQ(CL_INVALID_VALUE, Image::validateRegionAndOrigin(origin, region, desc)); + + desc.image_array_size = 1; + EXPECT_EQ(CL_SUCCESS, Image::validateRegionAndOrigin(origin, region, desc)); +} + typedef ::testing::TestWithParam MipLevelCoordinateTest; TEST_P(MipLevelCoordinateTest, givenMipmappedImageWhenValidateRegionAndOriginIsCalledThenAdditionalOriginCoordinateIsAnalyzed) { @@ -1612,6 +1635,7 @@ TEST_P(MipLevelCoordinateTest, givenMipmappedImageWhenValidateRegionAndOriginIsC desc.image_width = 1; desc.image_height = 1; desc.image_depth = 1; + desc.image_array_size = 1; origin[getMipLevelOriginIdx(desc.image_type)] = 1; EXPECT_EQ(CL_SUCCESS, Image::validateRegionAndOrigin(origin, region, desc)); origin[getMipLevelOriginIdx(desc.image_type)] = 2;