From b3ab20e3e3907fc4ad4510e357b615be847524c6 Mon Sep 17 00:00:00 2001 From: Piotr Zdunowski Date: Mon, 10 Aug 2020 10:25:07 +0200 Subject: [PATCH] Use blitter for global buffer patching on DG1. Resolves: NEO-4919 Change-Id: Ib2eb180b5b984fd284ff5d9297d0578b361afb92 Signed-off-by: Piotr Zdunowski --- opencl/test/unit_test/gen12lp/dg1/hw_helper_tests_dg1.cpp | 5 +++++ opencl/test/unit_test/helpers/hw_helper_tests.cpp | 8 ++++++++ shared/source/compiler_interface/linker.cpp | 2 +- shared/source/gen12lp/helpers_gen12lp.cpp | 4 ++++ shared/source/gen12lp/helpers_gen12lp.h | 1 + shared/source/gen12lp/helpers_gen12lp_dg1.cpp | 8 ++++++++ shared/source/gen12lp/hw_helper_gen12lp.cpp | 5 +++++ shared/source/helpers/hw_helper.h | 3 +++ shared/source/helpers/hw_helper_base.inl | 5 +++++ 9 files changed, 40 insertions(+), 1 deletion(-) diff --git a/opencl/test/unit_test/gen12lp/dg1/hw_helper_tests_dg1.cpp b/opencl/test/unit_test/gen12lp/dg1/hw_helper_tests_dg1.cpp index 1347598d76..0564673f69 100644 --- a/opencl/test/unit_test/gen12lp/dg1/hw_helper_tests_dg1.cpp +++ b/opencl/test/unit_test/gen12lp/dg1/hw_helper_tests_dg1.cpp @@ -75,3 +75,8 @@ DG1TEST_F(HwHelperTestDg1, givenDg1AndVariousSteppingsWhenGettingIsWorkaroundReq } } } + +DG1TEST_F(HwHelperTestDg1, givenDg1WhenPatchingGlobalBuffersThenUseBlitter) { + HwHelper &hwHelper = HwHelper::get(hardwareInfo.platform.eRenderCoreFamily); + EXPECT_TRUE(hwHelper.forceBlitterUseForGlobalBuffers(hardwareInfo)); +} diff --git a/opencl/test/unit_test/helpers/hw_helper_tests.cpp b/opencl/test/unit_test/helpers/hw_helper_tests.cpp index 0d0e5887f4..e5579a6d24 100644 --- a/opencl/test/unit_test/helpers/hw_helper_tests.cpp +++ b/opencl/test/unit_test/helpers/hw_helper_tests.cpp @@ -949,6 +949,14 @@ HWTEST_F(HwHelperTest, whenGettingIsBlitCopyRequiredForLocalMemoryThenCorrectVal EXPECT_TRUE(helper.isBlitCopyRequiredForLocalMemory(*defaultHwInfo)); } +HWTEST_F(HwHelperTest, whenPatchingGlobalBuffersThenDontForceBlitter) { + if (hardwareInfo.platform.eRenderCoreFamily == IGFX_GEN12LP_CORE) { + GTEST_SKIP(); + } + HwHelper &hwHelper = HwHelper::get(hardwareInfo.platform.eRenderCoreFamily); + EXPECT_FALSE(hwHelper.forceBlitterUseForGlobalBuffers(hardwareInfo)); +} + HWTEST_F(HwHelperTest, givenVariousDebugKeyValuesWhenGettingLocalMemoryAccessModeThenCorrectValueIsReturned) { struct MockHwHelper : HwHelperHw { using HwHelper::getDefaultLocalMemoryAccessMode; diff --git a/shared/source/compiler_interface/linker.cpp b/shared/source/compiler_interface/linker.cpp index 679fc3c1e1..848c67ae4e 100644 --- a/shared/source/compiler_interface/linker.cpp +++ b/shared/source/compiler_interface/linker.cpp @@ -267,7 +267,7 @@ void Linker::patchDataSegments(const SegmentInfo &globalVariablesSegInfo, const if (pDevice && initData) { auto &hwInfo = pDevice->getHardwareInfo(); auto &helper = HwHelper::get(hwInfo.platform.eRenderCoreFamily); - if (dst->isAllocatedInLocalMemoryPool() && helper.isBlitCopyRequiredForLocalMemory(hwInfo)) { + if (dst->isAllocatedInLocalMemoryPool() && (helper.isBlitCopyRequiredForLocalMemory(hwInfo) || helper.forceBlitterUseForGlobalBuffers(hwInfo))) { useBlitter = true; } } diff --git a/shared/source/gen12lp/helpers_gen12lp.cpp b/shared/source/gen12lp/helpers_gen12lp.cpp index 7ea631576c..5bdc289541 100644 --- a/shared/source/gen12lp/helpers_gen12lp.cpp +++ b/shared/source/gen12lp/helpers_gen12lp.cpp @@ -63,5 +63,9 @@ bool is3DPipelineSelectWARequired(const HardwareInfo &hwInfo) { return hwInfo.platform.eProductFamily == IGFX_TIGERLAKE_LP; } +bool forceBlitterUseForGlobalBuffers(const HardwareInfo &hwInfo) { + return false; +} + } // namespace Gen12LPHelpers } // namespace NEO diff --git a/shared/source/gen12lp/helpers_gen12lp.h b/shared/source/gen12lp/helpers_gen12lp.h index 7bca55292c..1222ea795f 100644 --- a/shared/source/gen12lp/helpers_gen12lp.h +++ b/shared/source/gen12lp/helpers_gen12lp.h @@ -36,6 +36,7 @@ void setAdditionalPipelineSelectFields(void *pipelineSelectCmd, bool isOffsetToSkipSetFFIDGPWARequired(const HardwareInfo &hwInfo); bool isForceEmuInt32DivRemSPWARequired(const HardwareInfo &hwInfo); bool is3DPipelineSelectWARequired(const HardwareInfo &hwInfo); +bool forceBlitterUseForGlobalBuffers(const HardwareInfo &hwInfo); } // namespace Gen12LPHelpers } // namespace NEO diff --git a/shared/source/gen12lp/helpers_gen12lp_dg1.cpp b/shared/source/gen12lp/helpers_gen12lp_dg1.cpp index d0ab416b2e..cc7d9e249e 100644 --- a/shared/source/gen12lp/helpers_gen12lp_dg1.cpp +++ b/shared/source/gen12lp/helpers_gen12lp_dg1.cpp @@ -85,5 +85,13 @@ bool is3DPipelineSelectWARequired(const HardwareInfo &hwInfo) { return (hwInfo.platform.eProductFamily == IGFX_TIGERLAKE_LP || hwInfo.platform.eProductFamily == IGFX_DG1); } +bool forceBlitterUseForGlobalBuffers(const HardwareInfo &hwInfo) { + if (hwInfo.platform.eProductFamily == PRODUCT_FAMILY::IGFX_DG1) { + return true; + } + + return false; +} + } // namespace Gen12LPHelpers } // namespace NEO diff --git a/shared/source/gen12lp/hw_helper_gen12lp.cpp b/shared/source/gen12lp/hw_helper_gen12lp.cpp index 3892e1905a..5ea06dfdcc 100644 --- a/shared/source/gen12lp/hw_helper_gen12lp.cpp +++ b/shared/source/gen12lp/hw_helper_gen12lp.cpp @@ -174,6 +174,11 @@ void HwHelperHw::addEngineToEngineGroup(std::vector +bool HwHelperHw::forceBlitterUseForGlobalBuffers(const HardwareInfo &hwInfo) const { + return Gen12LPHelpers::forceBlitterUseForGlobalBuffers(hwInfo); +} + template <> void MemorySynchronizationCommands::addPipeControlWA(LinearStream &commandStream, uint64_t gpuAddress, const HardwareInfo &hwInfo) { using PIPE_CONTROL = typename Family::PIPE_CONTROL; diff --git a/shared/source/helpers/hw_helper.h b/shared/source/helpers/hw_helper.h index 81ab33f40c..4007d1ba1e 100644 --- a/shared/source/helpers/hw_helper.h +++ b/shared/source/helpers/hw_helper.h @@ -71,6 +71,7 @@ class HwHelper { virtual bool checkResourceCompatibility(GraphicsAllocation &graphicsAllocation) = 0; virtual bool allowRenderCompression(const HardwareInfo &hwInfo) const = 0; virtual bool isBlitCopyRequiredForLocalMemory(const HardwareInfo &hwInfo) const = 0; + virtual bool forceBlitterUseForGlobalBuffers(const HardwareInfo &hwInfo) const = 0; virtual LocalMemoryAccessMode getLocalMemoryAccessMode(const HardwareInfo &hwInfo) const = 0; static bool renderCompressedBuffersSupported(const HardwareInfo &hwInfo); static bool renderCompressedImagesSupported(const HardwareInfo &hwInfo); @@ -306,6 +307,8 @@ class HwHelperHw : public HwHelper { bool isBlitCopyRequiredForLocalMemory(const HardwareInfo &hwInfo) const override; + bool forceBlitterUseForGlobalBuffers(const HardwareInfo &hwInfo) const override; + LocalMemoryAccessMode getLocalMemoryAccessMode(const HardwareInfo &hwInfo) const override; bool isBankOverrideRequired(const HardwareInfo &hwInfo) const override; diff --git a/shared/source/helpers/hw_helper_base.inl b/shared/source/helpers/hw_helper_base.inl index 6c26de39a9..1347866662 100644 --- a/shared/source/helpers/hw_helper_base.inl +++ b/shared/source/helpers/hw_helper_base.inl @@ -412,6 +412,11 @@ inline bool HwHelperHw::isBlitCopyRequiredForLocalMemory(const Hardwa return (hwHelper.getLocalMemoryAccessMode(hwInfo) == LocalMemoryAccessMode::CpuAccessDisallowed); } +template +inline bool HwHelperHw::forceBlitterUseForGlobalBuffers(const HardwareInfo &hwInfo) const { + return false; +} + template LocalMemoryAccessMode HwHelperHw::getLocalMemoryAccessMode(const HardwareInfo &hwInfo) const { switch (static_cast(DebugManager.flags.ForceLocalMemoryAccessMode.get())) {