From 6e9c890890bae639389c2dbd08c4520c4fab6387 Mon Sep 17 00:00:00 2001 From: Bartosz Dunajski Date: Wed, 6 Apr 2022 11:32:56 +0000 Subject: [PATCH] Enable sfence instruction programming for DirectSubmission dispatch Signed-off-by: Bartosz Dunajski --- .../direct_submission/direct_submission_hw.h | 7 +++++++ .../direct_submission_hw.inl | 8 ++++++-- .../direct_submission_tests_2.cpp | 20 +++++++++---------- 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/shared/source/direct_submission/direct_submission_hw.h b/shared/source/direct_submission/direct_submission_hw.h index 1ddd2c3c14..a20f007cbd 100644 --- a/shared/source/direct_submission/direct_submission_hw.h +++ b/shared/source/direct_submission/direct_submission_hw.h @@ -38,6 +38,12 @@ struct TagData { uint64_t tagValue = 0ull; }; +enum class DirectSubmissionSfenceMode : int32_t { + Disabled = 0, + BeforeSemaphoreOnly = 1, + BeforeAndAfterSemaphore = 2 +}; + namespace UllsDefaults { constexpr bool defaultDisableCacheFlush = true; constexpr bool defaultDisableMonitorFence = false; @@ -153,6 +159,7 @@ class DirectSubmissionHw { uint32_t workloadModeOneExpectedValue = 0u; uint32_t activeTiles = 1u; uint32_t postSyncOffset = 0u; + DirectSubmissionSfenceMode sfenceMode = DirectSubmissionSfenceMode::BeforeAndAfterSemaphore; volatile uint32_t reserved = 0u; bool ringStart = false; diff --git a/shared/source/direct_submission/direct_submission_hw.inl b/shared/source/direct_submission/direct_submission_hw.inl index 693d061787..5165f8b3e9 100644 --- a/shared/source/direct_submission/direct_submission_hw.inl +++ b/shared/source/direct_submission/direct_submission_hw.inl @@ -39,6 +39,10 @@ DirectSubmissionHw::DirectSubmissionHw(Device &device, disableCacheFlush = !!DebugManager.flags.DirectSubmissionDisableCacheFlush.get(); } + if (DebugManager.flags.DirectSubmissionInsertSfenceInstructionPriorToSubmission.get() != -1) { + sfenceMode = static_cast(DebugManager.flags.DirectSubmissionInsertSfenceInstructionPriorToSubmission.get()); + } + int32_t disableCacheFlushKey = DebugManager.flags.DirectSubmissionDisableCpuCacheFlush.get(); if (disableCacheFlushKey != -1) { disableCpuCacheFlush = disableCacheFlushKey == 1 ? true : false; @@ -435,14 +439,14 @@ bool DirectSubmissionHw::dispatchCommandBuffer(BatchBuffe reserved = *ringBufferStart; } - if (DebugManager.flags.DirectSubmissionInsertSfenceInstructionPriorToSubmission.get() >= 1) { + if (sfenceMode >= DirectSubmissionSfenceMode::BeforeSemaphoreOnly) { CpuIntrinsics::sfence(); } //unblock GPU semaphoreData->QueueWorkCount = currentQueueWorkCount; - if (DebugManager.flags.DirectSubmissionInsertSfenceInstructionPriorToSubmission.get() == 2) { + if (sfenceMode == DirectSubmissionSfenceMode::BeforeAndAfterSemaphore) { CpuIntrinsics::sfence(); } 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 94c5e0250d..44c56d7ca1 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 @@ -8,6 +8,7 @@ #include "shared/source/command_container/implicit_scaling.h" #include "shared/source/command_stream/submissions_aggregator.h" #include "shared/source/debug_settings/debug_settings_manager.h" +#include "shared/source/direct_submission/direct_submission_hw.h" #include "shared/source/direct_submission/dispatchers/render_dispatcher.h" #include "shared/source/helpers/flush_stamp.h" #include "shared/source/utilities/cpuintrinsics.h" @@ -708,23 +709,22 @@ HWTEST_F(DirectSubmissionDispatchBufferTest, HWTEST_F(DirectSubmissionDispatchBufferTest, givenDebugFlagSetWhenDispatchingWorkloadThenProgramSfenceInstruction) { DebugManagerStateRestore restorer{}; - DebugManager.flags.DirectSubmissionInsertSfenceInstructionPriorToSubmission.set(1); using Dispatcher = BlitterDispatcher; FlushStampTracker flushStamp(true); - MockDirectSubmissionHw directSubmission(*pDevice, *osContext.get()); - EXPECT_TRUE(directSubmission.initialize(true, true)); + for (int32_t debugFlag : {-1, 0, 1, 2}) { + DebugManager.flags.DirectSubmissionInsertSfenceInstructionPriorToSubmission.set(debugFlag); - auto initialCounterValue = CpuIntrinsicsTests::sfenceCounter.load(); + MockDirectSubmissionHw directSubmission(*pDevice, *osContext.get()); + EXPECT_TRUE(directSubmission.initialize(true, true)); - EXPECT_TRUE(directSubmission.dispatchCommandBuffer(batchBuffer, flushStamp)); + auto initialCounterValue = CpuIntrinsicsTests::sfenceCounter.load(); - EXPECT_EQ(initialCounterValue + 1, CpuIntrinsicsTests::sfenceCounter); + EXPECT_TRUE(directSubmission.dispatchCommandBuffer(batchBuffer, flushStamp)); - DebugManager.flags.DirectSubmissionInsertSfenceInstructionPriorToSubmission.set(2); + uint32_t expectedCount = (debugFlag == -1) ? 2 : static_cast(debugFlag); - EXPECT_TRUE(directSubmission.dispatchCommandBuffer(batchBuffer, flushStamp)); - - EXPECT_EQ(initialCounterValue + 3, CpuIntrinsicsTests::sfenceCounter); + EXPECT_EQ(initialCounterValue + expectedCount, CpuIntrinsicsTests::sfenceCounter); + } }