diff --git a/opencl/test/unit_test/kernel/kernel_transformable_tests.cpp b/opencl/test/unit_test/kernel/kernel_transformable_tests.cpp index 3f8bad1cd9..ef6bb707c6 100644 --- a/opencl/test/unit_test/kernel/kernel_transformable_tests.cpp +++ b/opencl/test/unit_test/kernel/kernel_transformable_tests.cpp @@ -209,6 +209,8 @@ HWTEST_F(KernelTransformableTest, givenKernelWithImages2dAndTwoTransformableSamp EXPECT_FALSE(secondSurfaceState->getSurfaceArray()); } +HWTEST_EXCLUDE_PRODUCT(KernelTransformableTest, givenKernelWithImages2dAndTwoTransformableSamplersWhenAnyArgIsResetThenImagesAreNotTransformed, IGFX_XE_HP_SDV); + HWTEST_F(KernelTransformableTest, givenKernelWithTwoTransformableImagesAndTwoTransformableSamplersWhenChangeSamplerToNontransformableThenImagesAreTransformedTo3d) { using RENDER_SURFACE_STATE = typename FamilyType::RENDER_SURFACE_STATE; using SURFACE_TYPE = typename RENDER_SURFACE_STATE::SURFACE_TYPE; diff --git a/shared/source/gen12lp/image_core_gen12lp.cpp b/shared/source/gen12lp/image_core_gen12lp.cpp index 210beb6eb5..4c036af4c0 100644 --- a/shared/source/gen12lp/image_core_gen12lp.cpp +++ b/shared/source/gen12lp/image_core_gen12lp.cpp @@ -12,10 +12,8 @@ namespace NEO { using Family = TGLLPFamily; -template <> -void setFilterMode(Family::RENDER_SURFACE_STATE *surfaceState, const HardwareInfo *hwInfo){}; - // clang-format off +#include "shared/source/image/image_bdw_plus.inl" #include "shared/source/image/image_skl_plus.inl" // clang-format on } // namespace NEO diff --git a/shared/source/image/image_bdw_plus.inl b/shared/source/image/image_bdw_plus.inl index 7e49cf6dab..c9e7c2727d 100644 --- a/shared/source/image/image_bdw_plus.inl +++ b/shared/source/image/image_bdw_plus.inl @@ -7,3 +7,8 @@ template <> void setFilterMode(typename Family::RENDER_SURFACE_STATE *surfaceState, const HardwareInfo *hwInfo){}; + +template <> +bool checkIfArrayNeeded(ImageType type, const HardwareInfo *hwInfo) { + return false; +}; \ No newline at end of file diff --git a/shared/source/image/image_surface_state.h b/shared/source/image/image_surface_state.h index efc3e95517..ab3db0592d 100644 --- a/shared/source/image/image_surface_state.h +++ b/shared/source/image/image_surface_state.h @@ -17,6 +17,8 @@ namespace NEO { template void setFilterMode(typename GfxFamily::RENDER_SURFACE_STATE *surfaceState, const HardwareInfo *hwInfo); +template +bool checkIfArrayNeeded(ImageType type, const HardwareInfo *hwInfo); template inline void setImageSurfaceState(typename GfxFamily::RENDER_SURFACE_STATE *surfaceState, const ImageInfo &imageInfo, Gmm *gmm, GmmHelper &gmmHelper, uint32_t cubeFaceIndex, uint64_t gpuAddress, const SurfaceOffsets &surfaceOffsets, bool isNV12Format) { @@ -48,6 +50,7 @@ inline void setImageSurfaceState(typename GfxFamily::RENDER_SURFACE_STATE *surfa renderTargetViewExtent = 1; minimumArrayElement = cubeFaceIndex; } + isImageArray |= checkIfArrayNeeded(imageInfo.imgDesc.imageType, gmmHelper.getHardwareInfo()); surfaceState->setAuxiliarySurfaceMode(AUXILIARY_SURFACE_MODE::AUXILIARY_SURFACE_MODE_AUX_NONE); surfaceState->setAuxiliarySurfacePitch(1u); diff --git a/shared/source/xe_hp_core/image_core_xe_hp_core.cpp b/shared/source/xe_hp_core/image_core_xe_hp_core.cpp index 78edb02f54..e195676edd 100644 --- a/shared/source/xe_hp_core/image_core_xe_hp_core.cpp +++ b/shared/source/xe_hp_core/image_core_xe_hp_core.cpp @@ -5,6 +5,7 @@ * */ +#include "shared/source/helpers/hw_helper.h" #include "shared/source/image/image_surface_state.h" #include "shared/source/xe_hp_core/hw_cmds_base.h" @@ -14,6 +15,13 @@ using Family = XeHpFamily; template <> void setFilterMode(Family::RENDER_SURFACE_STATE *surfaceState, const HardwareInfo *hwInfo) {} +template <> +bool checkIfArrayNeeded(ImageType type, const HardwareInfo *hwInfo) { + if (type == ImageType::Image2D) { + return true; + } + return false; +} // clang-format off #include "shared/source/image/image_skl_plus.inl" // clang-format on diff --git a/shared/test/unit_test/image/CMakeLists.txt b/shared/test/unit_test/image/CMakeLists.txt index 054e5f1bfd..25cdcc3b83 100644 --- a/shared/test/unit_test/image/CMakeLists.txt +++ b/shared/test/unit_test/image/CMakeLists.txt @@ -1,5 +1,5 @@ # -# Copyright (C) 2020 Intel Corporation +# Copyright (C) 2020-2021 Intel Corporation # # SPDX-License-Identifier: MIT # @@ -9,3 +9,5 @@ target_sources(${TARGET_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/image_surface_state_fixture.h ${CMAKE_CURRENT_SOURCE_DIR}/image_surface_state_tests.cpp ) + +add_subdirectories() diff --git a/shared/test/unit_test/image/image_surface_state_tests.cpp b/shared/test/unit_test/image/image_surface_state_tests.cpp index 6314658556..25a584e58d 100644 --- a/shared/test/unit_test/image/image_surface_state_tests.cpp +++ b/shared/test/unit_test/image/image_surface_state_tests.cpp @@ -106,3 +106,62 @@ HWTEST_F(ImageSurfaceStateTests, givenGmmWhenSetAuxParamsForCCSThenAuxiliarySurf mockGmm.isCompressionEnabled = true; EXPECT_TRUE(EncodeSurfaceState::isAuxModeEnabled(castSurfaceState, &mockGmm)); } + +HWTEST_F(ImageSurfaceStateTests, givenHwInfoAndSurfaceStateWhenCheckIfArrayNeededThenFalseReturned) { + EXPECT_FALSE(checkIfArrayNeeded(ImageType::Image2D, &pDevice->getHardwareInfo())); +} +HWTEST_EXCLUDE_PRODUCT(ImageSurfaceStateTests, givenHwInfoAndSurfaceStateWhenCheckIfArrayNeededThenFalseReturned, IGFX_XE_HP_SDV); + +HWTEST2_F(ImageSurfaceStateTests, givenHwInfoAndSurfaceStateWhenSurfaceTypeIsNotSurface2DThenCheckIfArrayReturnFalse, IsXeHpCore) { + EXPECT_FALSE(checkIfArrayNeeded(ImageType::Image1D, &pDevice->getHardwareInfo())); +} +HWTEST2_F(ImageSurfaceStateTests, givenHwInfoWhenSurface2DThenCheckIfArrayReturnTrue, IsXeHpCore) { + EXPECT_TRUE(checkIfArrayNeeded(ImageType::Image2D, &pDevice->getHardwareInfo())); +} + +HWTEST_F(ImageSurfaceStateTests, givenImage2DTypeWhenCheckIfArrayNeededReturnsTureThenArrayFlagIsSet) { + if (!checkIfArrayNeeded(ImageType::Image2D, &pDevice->getHardwareInfo())) { + GTEST_SKIP(); + } + auto size = sizeof(typename FamilyType::RENDER_SURFACE_STATE); + auto surfaceState = std::make_unique(size); + auto castSurfaceState = reinterpret_cast(surfaceState.get()); + + imageInfo.imgDesc.imageType = ImageType::Image2D; + imageInfo.imgDesc.imageDepth = 1; + imageInfo.imgDesc.imageArraySize = 1; + SurfaceOffsets surfaceOffsets = {0, 0, 0, 0}; + const uint32_t cubeFaceIndex = __GMM_NO_CUBE_MAP; + SurfaceFormatInfo surfaceFormatInfo; + surfaceFormatInfo.GenxSurfaceFormat = GFX3DSTATE_SURFACEFORMAT::GFX3DSTATE_SURFACEFORMAT_A32_FLOAT; + imageInfo.surfaceFormat = &surfaceFormatInfo; + + const uint64_t gpuAddress = 0x000001a78a8a8000; + + setImageSurfaceState(castSurfaceState, imageInfo, &mockGmm, *gmmHelper, cubeFaceIndex, gpuAddress, surfaceOffsets, true); + EXPECT_TRUE(castSurfaceState->getSurfaceArray()); +} + +HWTEST_F(ImageSurfaceStateTests, givenImage2DTypeWhenCheckIfArrayNeededReturnsFalseThenArrayFlagIsNotSet) { + if (checkIfArrayNeeded(ImageType::Image2D, &pDevice->getHardwareInfo())) { + GTEST_SKIP(); + } + auto size = sizeof(typename FamilyType::RENDER_SURFACE_STATE); + auto surfaceState = std::make_unique(size); + auto castSurfaceState = reinterpret_cast(surfaceState.get()); + + imageInfo.imgDesc.imageType = ImageType::Image2D; + imageInfo.imgDesc.imageDepth = 1; + imageInfo.imgDesc.imageArraySize = 1; + imageInfo.qPitch = 0; + SurfaceOffsets surfaceOffsets = {0, 0, 0, 0}; + const uint32_t cubeFaceIndex = __GMM_NO_CUBE_MAP; + SurfaceFormatInfo surfaceFormatInfo; + surfaceFormatInfo.GenxSurfaceFormat = GFX3DSTATE_SURFACEFORMAT::GFX3DSTATE_SURFACEFORMAT_A32_FLOAT; + imageInfo.surfaceFormat = &surfaceFormatInfo; + + const uint64_t gpuAddress = 0x000001a78a8a8000; + + setImageSurfaceState(castSurfaceState, imageInfo, &mockGmm, *gmmHelper, cubeFaceIndex, gpuAddress, surfaceOffsets, true); + EXPECT_FALSE(castSurfaceState->getSurfaceArray()); +} \ No newline at end of file