From ddce12299145e027adbf2774f7dcbed606f2331c Mon Sep 17 00:00:00 2001 From: Bartosz Dunajski Date: Wed, 11 Sep 2024 18:42:55 +0000 Subject: [PATCH] fix: dont program NP state in ULLS if heapless state init is enabled Related-To: HSD-13012223827 Signed-off-by: Bartosz Dunajski --- .../direct_submission_hw.inl | 9 ++++++++- .../direct_submission_tests_2.cpp | 19 ++++++++++++++----- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/shared/source/direct_submission/direct_submission_hw.inl b/shared/source/direct_submission/direct_submission_hw.inl index b266fa27ae..6ae2898b52 100644 --- a/shared/source/direct_submission/direct_submission_hw.inl +++ b/shared/source/direct_submission/direct_submission_hw.inl @@ -18,6 +18,7 @@ #include "shared/source/gmm_helper/gmm_helper.h" #include "shared/source/gmm_helper/gmm_lib.h" #include "shared/source/helpers/aligned_memory.h" +#include "shared/source/helpers/compiler_product_helper.h" #include "shared/source/helpers/definitions/command_encoder_args.h" #include "shared/source/helpers/flush_stamp.h" #include "shared/source/helpers/gfx_core_helper.h" @@ -48,6 +49,7 @@ DirectSubmissionHw::DirectSubmissionHw(const DirectSubmis memoryOperationHandler = inputParams.rootDeviceEnvironment.memoryOperationsInterface.get(); auto &productHelper = inputParams.rootDeviceEnvironment.getHelper(); + auto &compilerProductHelper = inputParams.rootDeviceEnvironment.getHelper(); disableCacheFlush = UllsDefaults::defaultDisableCacheFlush; disableMonitorFence = UllsDefaults::defaultDisableMonitorFence; @@ -76,6 +78,11 @@ DirectSubmissionHw::DirectSubmissionHw(const DirectSubmis if (debugManager.flags.DirectSubmissionInsertExtraMiMemFenceCommands.get() != -1) { miMemFenceRequired = debugManager.flags.DirectSubmissionInsertExtraMiMemFenceCommands.get(); } + + if (miMemFenceRequired && compilerProductHelper.isHeaplessStateInitEnabled(compilerProductHelper.isHeaplessModeEnabled())) { + this->systemMemoryFenceAddressSet = true; + } + if (debugManager.flags.DirectSubmissionInsertSfenceInstructionPriorToSubmission.get() != -1) { sfenceMode = static_cast(debugManager.flags.DirectSubmissionInsertSfenceInstructionPriorToSubmission.get()); } @@ -477,7 +484,7 @@ bool DirectSubmissionHw::initialize(bool submitOnInit, bo this->partitionConfigSet = true; } - if (this->miMemFenceRequired) { + if (this->miMemFenceRequired && !this->systemMemoryFenceAddressSet) { startBufferSize += getSizeSystemMemoryFenceAddress(); dispatchSystemMemoryFenceAddress(); diff --git a/shared/test/unit_test/direct_submission/direct_submission_tests_2.cpp b/shared/test/unit_test/direct_submission/direct_submission_tests_2.cpp index 3e6738485d..79bd62728b 100644 --- a/shared/test/unit_test/direct_submission/direct_submission_tests_2.cpp +++ b/shared/test/unit_test/direct_submission/direct_submission_tests_2.cpp @@ -14,6 +14,7 @@ #include "shared/source/gmm_helper/gmm_helper.h" #include "shared/source/gmm_helper/gmm_lib.h" #include "shared/source/helpers/blit_commands_helper.h" +#include "shared/source/helpers/compiler_product_helper.h" #include "shared/source/helpers/definitions/command_encoder_args.h" #include "shared/source/helpers/flush_stamp.h" #include "shared/source/helpers/gfx_core_helper.h" @@ -48,6 +49,9 @@ struct DirectSubmissionDispatchMiMemFenceTest : public DirectSubmissionDispatchB auto &productHelper = pDevice->getProductHelper(); miMemFenceSupported = pDevice->getHardwareInfo().capabilityTable.isIntegratedDevice ? false : productHelper.isGlobalFenceInDirectSubmissionRequired(pDevice->getHardwareInfo()); + + auto &compilerProductHelper = pDevice->getCompilerProductHelper(); + heaplessStateInit = compilerProductHelper.isHeaplessStateInitEnabled(compilerProductHelper.isHeaplessModeEnabled()); } template @@ -111,35 +115,40 @@ struct DirectSubmissionDispatchMiMemFenceTest : public DirectSubmissionDispatchB } bool miMemFenceSupported = false; + bool heaplessStateInit = false; }; HWTEST_F(DirectSubmissionDispatchMiMemFenceTest, givenMiMemFenceSupportedWhenInitializingDirectSubmissionThenEnableMiMemFenceProgramming) { MockDirectSubmissionHw> directSubmission(*pDevice->getDefaultEngine().commandStreamReceiver); + uint32_t expectedSysMemFenceAddress = heaplessStateInit ? 0 : 1; + EXPECT_EQ(miMemFenceSupported, directSubmission.miMemFenceRequired); - EXPECT_FALSE(directSubmission.systemMemoryFenceAddressSet); + EXPECT_EQ(heaplessStateInit && miMemFenceSupported, directSubmission.systemMemoryFenceAddressSet); EXPECT_TRUE(directSubmission.initialize(true, false)); EXPECT_EQ(miMemFenceSupported, directSubmission.systemMemoryFenceAddressSet); - validateFenceProgramming(directSubmission, 1, 1); + validateFenceProgramming(directSubmission, 1, expectedSysMemFenceAddress); } HWTEST_F(DirectSubmissionDispatchMiMemFenceTest, givenMiMemFenceSupportedWhenDispatchingWithoutInitThenEnableMiMemFenceProgramming) { MockDirectSubmissionHw> directSubmission(*pDevice->getDefaultEngine().commandStreamReceiver); FlushStampTracker flushStamp(true); + uint32_t expectedSysMemFenceAddress = heaplessStateInit ? 0 : 1; + EXPECT_EQ(miMemFenceSupported, directSubmission.miMemFenceRequired); - EXPECT_FALSE(directSubmission.systemMemoryFenceAddressSet); + EXPECT_EQ(heaplessStateInit && miMemFenceSupported, directSubmission.systemMemoryFenceAddressSet); EXPECT_TRUE(directSubmission.initialize(false, false)); - EXPECT_FALSE(directSubmission.systemMemoryFenceAddressSet); + EXPECT_EQ(heaplessStateInit && miMemFenceSupported, directSubmission.systemMemoryFenceAddressSet); EXPECT_TRUE(directSubmission.dispatchCommandBuffer(batchBuffer, flushStamp)); - validateFenceProgramming(directSubmission, 1, 1); + validateFenceProgramming(directSubmission, 1, expectedSysMemFenceAddress); EXPECT_EQ(miMemFenceSupported, directSubmission.systemMemoryFenceAddressSet); }