diff --git a/opencl/source/mem_obj/image.h b/opencl/source/mem_obj/image.h index 3fce093c2a..78348383fb 100644 --- a/opencl/source/mem_obj/image.h +++ b/opencl/source/mem_obj/image.h @@ -16,6 +16,7 @@ namespace NEO { class GfxCoreHelper; class Gmm; class Image; +class ReleaseHelper; struct HardwareInfo; struct KernelInfo; struct SurfaceFormatInfo; @@ -343,6 +344,7 @@ class ImageHw : public Image { void appendSurfaceStateExt(void *memory); void transformImage2dArrayTo3d(void *memory) override; void transformImage3dTo2dArray(void *memory) override; + static void adjustDepthLimitations(RENDER_SURFACE_STATE *surfaceState, uint32_t minArrayElement, uint32_t renderTargetViewExtent, uint32_t depth, uint32_t mipCount, bool is3DUavOrRtv, ReleaseHelper *releaseHelper); static Image *create(Context *context, const MemoryProperties &memoryProperties, cl_mem_flags flags, diff --git a/opencl/source/mem_obj/image.inl b/opencl/source/mem_obj/image.inl index ad43d66a58..1d3d4f130b 100644 --- a/opencl/source/mem_obj/image.inl +++ b/opencl/source/mem_obj/image.inl @@ -13,6 +13,7 @@ #include "shared/source/helpers/aligned_memory.h" #include "shared/source/helpers/populate_factory.h" #include "shared/source/image/image_surface_state.h" +#include "shared/source/release_helper/release_helper.h" #include "opencl/source/helpers/cl_validators.h" #include "opencl/source/helpers/surface_formats.h" @@ -110,7 +111,7 @@ void ImageHw::setImageArg(void *memory, bool setAsMediaBlockImage, ui this->plane); auto releaseHelper = executionEnvironment->rootDeviceEnvironments[rootDeviceIndex]->getReleaseHelper(); - EncodeSurfaceState::adjustDepthLimitations(surfaceState, minArrayElement, renderTargetViewExtent, depth, mipCount, is3DUAVOrRTV, releaseHelper); + adjustDepthLimitations(surfaceState, minArrayElement, renderTargetViewExtent, depth, mipCount, is3DUAVOrRTV, releaseHelper); appendSurfaceStateParams(surfaceState, rootDeviceIndex, useGlobalAtomics); appendSurfaceStateExt(surfaceState); } @@ -217,6 +218,14 @@ void ImageHw::transformImage3dTo2dArray(void *memory) { surfaceState->setSurfaceArray(true); } +template +void ImageHw::adjustDepthLimitations(RENDER_SURFACE_STATE *surfaceState, uint32_t minArrayElement, uint32_t renderTargetViewExtent, uint32_t depth, uint32_t mipCount, bool is3DUavOrRtv, ReleaseHelper *releaseHelper) { + if (is3DUavOrRtv && releaseHelper && releaseHelper->shouldAdjustDepth()) { + auto newDepth = std::min(depth, (renderTargetViewExtent + minArrayElement) << mipCount); + surfaceState->setDepth(newDepth); + } +} + template inline void ImageHw::setMediaSurfaceRotation(void *memory) { using MEDIA_SURFACE_STATE = typename GfxFamily::MEDIA_SURFACE_STATE; diff --git a/opencl/test/unit_test/mem_obj/image_tests.cpp b/opencl/test/unit_test/mem_obj/image_tests.cpp index 3b26854dd0..34fdb97ad4 100644 --- a/opencl/test/unit_test/mem_obj/image_tests.cpp +++ b/opencl/test/unit_test/mem_obj/image_tests.cpp @@ -19,6 +19,7 @@ #include "shared/test/common/mocks/mock_gmm.h" #include "shared/test/common/mocks/mock_gmm_resource_info.h" #include "shared/test/common/mocks/mock_memory_manager.h" +#include "shared/test/common/mocks/mock_release_helper.h" #include "shared/test/common/test_macros/test.h" #include "shared/test/common/test_macros/test_checks_shared.h" @@ -1894,4 +1895,61 @@ TEST(ImageTest, givenImageWhenFalsePassedToSet3DUavOrRtvThenValueInImageIsSetToF MockImageBase img; img.setAs3DUavOrRtvImage(false); EXPECT_FALSE(img.is3DUAVOrRTV); +} + +using ImageAdjustDepthTests = ::testing::Test; + +HWTEST_F(ImageAdjustDepthTests, givenSurfaceStateWhenImage3DRTVOrUAVThenDepthCalculationIsDone) { + + typename FamilyType::RENDER_SURFACE_STATE ss; + uint32_t minArrayElement = 1; + uint32_t renderTargetViewExtent = 1; + uint32_t originalDepth = 10; + uint32_t mipCount = 1; + ss.setDepth(originalDepth); + auto releaseHelper = std::make_unique(); + releaseHelper->shouldAdjustDepthResult = true; + + ImageHw::adjustDepthLimitations(&ss, minArrayElement, renderTargetViewExtent, originalDepth, mipCount, true, releaseHelper.get()); + EXPECT_NE(ss.getDepth(), originalDepth); +} + +HWTEST_F(ImageAdjustDepthTests, givenSurfaceStateWhenImageIsNot3DRTVOrUAVThenDepthCalculationIsDone) { + typename FamilyType::RENDER_SURFACE_STATE ss; + uint32_t minArrayElement = 1; + uint32_t renderTargetViewExtent = 1; + uint32_t originalDepth = 10; + uint32_t mipCount = 1; + ss.setDepth(originalDepth); + auto releaseHelper = std::make_unique(); + releaseHelper->shouldAdjustDepthResult = true; + + ImageHw::adjustDepthLimitations(&ss, minArrayElement, renderTargetViewExtent, originalDepth, mipCount, false, releaseHelper.get()); + EXPECT_EQ(ss.getDepth(), originalDepth); +} + +HWTEST_F(ImageAdjustDepthTests, givenSurfaceStateWhenAdjustDepthReturnFalseThenOriginalDepthIsUsed) { + typename FamilyType::RENDER_SURFACE_STATE ss; + uint32_t minArrayElement = 1; + uint32_t renderTargetViewExtent = 1; + uint32_t originalDepth = 10; + uint32_t mipCount = 1; + ss.setDepth(originalDepth); + auto releaseHelper = std::make_unique(); + releaseHelper->shouldAdjustDepthResult = false; + + ImageHw::adjustDepthLimitations(&ss, minArrayElement, renderTargetViewExtent, originalDepth, mipCount, true, releaseHelper.get()); + EXPECT_EQ(ss.getDepth(), originalDepth); +} + +HWTEST_F(ImageAdjustDepthTests, givenSurfaceStateWhenReeaseHelperIsNullprThenOriginalDepthIsUsed) { + typename FamilyType::RENDER_SURFACE_STATE ss; + uint32_t minArrayElement = 1; + uint32_t renderTargetViewExtent = 1; + uint32_t originalDepth = 10; + uint32_t mipCount = 1; + ss.setDepth(originalDepth); + ReleaseHelper *releaseHelper = nullptr; + ImageHw::adjustDepthLimitations(&ss, minArrayElement, renderTargetViewExtent, originalDepth, mipCount, true, releaseHelper); + EXPECT_EQ(ss.getDepth(), originalDepth); } \ No newline at end of file diff --git a/shared/source/command_container/command_encoder.inl b/shared/source/command_container/command_encoder.inl index a5797662a2..b8b09af68a 100644 --- a/shared/source/command_container/command_encoder.inl +++ b/shared/source/command_container/command_encoder.inl @@ -537,10 +537,6 @@ template void EncodeSurfaceState::appendParamsForImageFromBuffer(R_SURFACE_STATE *surfaceState) { } -template -void EncodeSurfaceState::adjustDepthLimitations(R_SURFACE_STATE *surfaceState, uint32_t minArrayElement, uint32_t renderTargetViewExtent, uint32_t depth, uint32_t mipCount, bool is3DUavOrRtv, ReleaseHelper *releaseHelper) { -} - template void EncodeSurfaceState::encodeImplicitScalingParams(const EncodeSurfaceStateArgs &args) {} diff --git a/shared/source/command_container/encode_surface_state.h b/shared/source/command_container/encode_surface_state.h index 6e44d34519..091b45a248 100644 --- a/shared/source/command_container/encode_surface_state.h +++ b/shared/source/command_container/encode_surface_state.h @@ -60,7 +60,6 @@ struct EncodeSurfaceState { static void setFlagsForMediaCompression(R_SURFACE_STATE *surfaceState, Gmm *gmm); static void disableCompressionFlags(R_SURFACE_STATE *surfaceState); static void appendParamsForImageFromBuffer(R_SURFACE_STATE *surfaceState); - static void adjustDepthLimitations(R_SURFACE_STATE *surfaceState, uint32_t minArrayElement, uint32_t renderTargetViewExtent, uint32_t depth, uint32_t mipCount, bool is3DUavOrRtv, ReleaseHelper *releaseHelper); }; } // namespace NEO \ No newline at end of file diff --git a/shared/test/unit_test/command_container/command_encoder_tests.cpp b/shared/test/unit_test/command_container/command_encoder_tests.cpp index 6cadc0ef0c..a3dcd89677 100644 --- a/shared/test/unit_test/command_container/command_encoder_tests.cpp +++ b/shared/test/unit_test/command_container/command_encoder_tests.cpp @@ -295,20 +295,4 @@ HWTEST2_F(CommandEncoderTests, whenForcingLowQualityFilteringAndAppendSamplerSta EXPECT_EQ(SAMPLER_STATE::LOW_QUALITY_FILTER_DISABLE, state.getLowQualityFilter()); productHelper.adjustSamplerState(&state, *defaultHwInfo); EXPECT_EQ(SAMPLER_STATE::LOW_QUALITY_FILTER_ENABLE, state.getLowQualityFilter()); -} - -HWTEST_F(CommandEncoderTests, givenSurfaceStateWhenAdjustDepthLimitationsCalledThenSurfaceStateNotChanged) { - typename FamilyType::RENDER_SURFACE_STATE ss; - uint32_t minArrayElement = 1; - uint32_t renderTargetViewExtent = 1; - uint32_t originalDepth = 10; - uint32_t mipCount = 1; - - MockExecutionEnvironment mockExecutionEnvironment{}; - auto releaseHelper = mockExecutionEnvironment.rootDeviceEnvironments[0]->getReleaseHelper(); - - ss.setDepth(originalDepth); - auto origSS = ss; - EncodeSurfaceState::adjustDepthLimitations(&ss, minArrayElement, renderTargetViewExtent, originalDepth, mipCount, true, releaseHelper); - EXPECT_EQ(memcmp(&ss, &origSS, sizeof(typename FamilyType::RENDER_SURFACE_STATE)), 0); -} +} \ No newline at end of file