From 11a1b273997f3f9c50f03ad4787b8f81cbb6afb6 Mon Sep 17 00:00:00 2001 From: Maciej Dziuban Date: Mon, 25 Mar 2019 11:03:21 +0100 Subject: [PATCH] Do not program surfaceArray for images with image_array_size == 1 Change-Id: I1e0bd7c3ef7b7edea2f19fb4635b18bff513d264 Signed-off-by: Maciej Dziuban --- runtime/mem_obj/image.inl | 6 +-- unit_tests/mem_obj/image_set_arg_tests.cpp | 45 ++++++++++++++++++++++ 2 files changed, 46 insertions(+), 5 deletions(-) diff --git a/runtime/mem_obj/image.inl b/runtime/mem_obj/image.inl index c8862827d5..f374ef5dc1 100644 --- a/runtime/mem_obj/image.inl +++ b/runtime/mem_obj/image.inl @@ -38,11 +38,7 @@ void ImageHw::setImageArg(void *memory, bool setAsMediaBlockImage, ui imageCount = 1; } - bool isImageArray = (getImageDesc().image_array_size > 0 && - (getImageDesc().image_type == CL_MEM_OBJECT_IMAGE2D_ARRAY || - getImageDesc().image_type == CL_MEM_OBJECT_IMAGE1D_ARRAY)) - ? true - : false; + bool isImageArray = getImageDesc().image_array_size > 1; uint32_t renderTargetViewExtent = static_cast(imageCount); uint32_t minimumArrayElement = 0; diff --git a/unit_tests/mem_obj/image_set_arg_tests.cpp b/unit_tests/mem_obj/image_set_arg_tests.cpp index fe07f03484..50b803413b 100644 --- a/unit_tests/mem_obj/image_set_arg_tests.cpp +++ b/unit_tests/mem_obj/image_set_arg_tests.cpp @@ -187,6 +187,51 @@ HWTEST_F(ImageSetArgTest, givenCubeMapIndexWhenSetKernelArgImageIsCalledThenModi delete src2dImage; } +struct ImageSetArgSurfaceArrayTest : ImageSetArgTest { + template + void testSurfaceArrayProgramming(cl_mem_object_type image_type, size_t image_array_size, bool expectedSurfaceArray) { + using RENDER_SURFACE_STATE = typename FamilyType::RENDER_SURFACE_STATE; + RENDER_SURFACE_STATE surfaceState; + + cl_image_desc imageDesc = Image2dDefaults::imageDesc; + imageDesc.image_array_size = image_array_size; + imageDesc.image_type = image_type; + std::unique_ptr image{Image2dHelper<>::create(context, &imageDesc)}; + image->setCubeFaceIndex(__GMM_NO_CUBE_MAP); + + image->setImageArg(&surfaceState, false, 0); + EXPECT_EQ(expectedSurfaceArray, surfaceState.getSurfaceArray()); + } +}; + +HWTEST_F(ImageSetArgSurfaceArrayTest, givenImage1DArrayAndImageArraySizeIsZeroWhenCallingSetImageArgThenDoNotProgramSurfaceArray) { + testSurfaceArrayProgramming(CL_MEM_OBJECT_IMAGE1D_ARRAY, 0u, false); +} + +HWTEST_F(ImageSetArgSurfaceArrayTest, givenImage2DArrayAndImageArraySizeIsZeroWhenCallingSetImageArgThenDoNotProgramSurfaceArray) { + testSurfaceArrayProgramming(CL_MEM_OBJECT_IMAGE2D_ARRAY, 0u, false); +} + +HWTEST_F(ImageSetArgSurfaceArrayTest, givenImage1DArrayAndImageArraySizeIsOneWhenCallingSetImageArgThenDoNotProgramSurfaceArray) { + testSurfaceArrayProgramming(CL_MEM_OBJECT_IMAGE1D_ARRAY, 1u, false); +} + +HWTEST_F(ImageSetArgSurfaceArrayTest, givenImage2DArrayAndImageArraySizeIsOneWhenCallingSetImageArgThenDoNotProgramSurfaceArray) { + testSurfaceArrayProgramming(CL_MEM_OBJECT_IMAGE2D_ARRAY, 1u, false); +} + +HWTEST_F(ImageSetArgSurfaceArrayTest, givenImage1DArrayAndImageArraySizeIsGreaterThanOneWhenCallingSetImageArgThenProgramSurfaceArray) { + testSurfaceArrayProgramming(CL_MEM_OBJECT_IMAGE1D_ARRAY, 2u, true); +} + +HWTEST_F(ImageSetArgSurfaceArrayTest, givenImage2DArrayAndImageArraySizeIsGreaterThanOneWhenCallingSetImageArgThenProgramSurfaceArray) { + testSurfaceArrayProgramming(CL_MEM_OBJECT_IMAGE2D_ARRAY, 2u, true); +} + +HWTEST_F(ImageSetArgSurfaceArrayTest, givenNonArrayImageWhenCallingSetImageArgThenDoNotProgramSurfaceArray) { + testSurfaceArrayProgramming(CL_MEM_OBJECT_IMAGE1D_BUFFER, 2u, false); +} + HWTEST_F(ImageSetArgTest, givenNonCubeMapIndexWhenSetKernelArgImageIsCalledThenDontModifySurfaceState) { typedef typename FamilyType::RENDER_SURFACE_STATE RENDER_SURFACE_STATE;