From b6da6471f295ded4ffa8274847af5cdc09dd319a Mon Sep 17 00:00:00 2001 From: Zbigniew Zdanowicz Date: Wed, 22 Dec 2021 19:28:02 +0000 Subject: [PATCH] Add notify parameter to direct submission post sync operations Related-To: NEO-5845 Signed-off-by: Zbigniew Zdanowicz --- .../command_stream_receiver_hw_2_tests.cpp | 4 +- .../windows/device_command_stream_tests.cpp | 4 +- .../command_stream_receiver_hw_base.inl | 4 +- .../direct_submission/direct_submission_hw.h | 3 +- .../direct_submission_hw.inl | 9 +- .../dispatchers/render_dispatcher.inl | 1 + .../common/mocks/mock_direct_submission_hw.h | 1 + .../windows/mock_wddm_direct_submission.h | 1 + .../direct_submission_tests_1.cpp | 60 ++++++------- .../direct_submission_tests_2.cpp | 89 +++++++++++++++++-- .../dispatchers/render_dispatcher_tests.cpp | 29 ++++++ .../linux/drm_direct_submission_tests.cpp | 3 +- .../windows/wddm_direct_submission_tests.cpp | 12 +-- 13 files changed, 164 insertions(+), 56 deletions(-) diff --git a/opencl/test/unit_test/command_stream/command_stream_receiver_hw_2_tests.cpp b/opencl/test/unit_test/command_stream/command_stream_receiver_hw_2_tests.cpp index 585362a460..a70e964595 100644 --- a/opencl/test/unit_test/command_stream/command_stream_receiver_hw_2_tests.cpp +++ b/opencl/test/unit_test/command_stream/command_stream_receiver_hw_2_tests.cpp @@ -1375,7 +1375,7 @@ HWTEST_F(BcsTests, givenBlitterDirectSubmissionEnabledWhenProgrammingBlitterThen csr.blitterDirectSubmission = std::make_unique(*pDevice, *csr.osContext); csr.recordFlusheBatchBuffer = true; DirectSubmission *directSubmission = reinterpret_cast(csr.blitterDirectSubmission.get()); - bool initRet = directSubmission->initialize(true); + bool initRet = directSubmission->initialize(true, false); EXPECT_TRUE(initRet); cl_int retVal = CL_SUCCESS; @@ -1418,7 +1418,7 @@ HWTEST_F(BcsTests, givenBlitterDirectSubmissionEnabledWhenFlushTagUpdateThenBatc csr.blitterDirectSubmission = std::make_unique(*pDevice, *csr.osContext); csr.recordFlusheBatchBuffer = true; DirectSubmission *directSubmission = reinterpret_cast(csr.blitterDirectSubmission.get()); - bool initRet = directSubmission->initialize(true); + bool initRet = directSubmission->initialize(true, false); EXPECT_TRUE(initRet); csr.flushTagUpdate(); diff --git a/opencl/test/unit_test/os_interface/windows/device_command_stream_tests.cpp b/opencl/test/unit_test/os_interface/windows/device_command_stream_tests.cpp index 34ec5a6c53..ddb1b8fc39 100644 --- a/opencl/test/unit_test/os_interface/windows/device_command_stream_tests.cpp +++ b/opencl/test/unit_test/os_interface/windows/device_command_stream_tests.cpp @@ -124,12 +124,12 @@ struct MockWddmCsr : public WddmCommandStreamReceiver { if (!initBlitterDirectSubmission) { directSubmission = std::make_unique< MockWddmDirectSubmission>>(device, osContext); - ret = directSubmission->initialize(true); + ret = directSubmission->initialize(true, false); this->dispatchMode = DispatchMode::ImmediateDispatch; } else { blitterDirectSubmission = std::make_unique< MockWddmDirectSubmission>>(device, osContext); - blitterDirectSubmission->initialize(true); + blitterDirectSubmission->initialize(true, false); } } return ret; diff --git a/shared/source/command_stream/command_stream_receiver_hw_base.inl b/shared/source/command_stream/command_stream_receiver_hw_base.inl index 5e9306f03b..7c46f6ff1c 100644 --- a/shared/source/command_stream/command_stream_receiver_hw_base.inl +++ b/shared/source/command_stream/command_stream_receiver_hw_base.inl @@ -1431,11 +1431,11 @@ inline bool CommandStreamReceiverHw::initDirectSubmission(Device &dev if (!this->isAnyDirectSubmissionEnabled()) { if (EngineHelpers::isBcs(osContext.getEngineType())) { blitterDirectSubmission = DirectSubmissionHw>::create(device, osContext); - ret = blitterDirectSubmission->initialize(submitOnInit); + ret = blitterDirectSubmission->initialize(submitOnInit, this->isUsedNotifyEnableForPostSync()); } else { directSubmission = DirectSubmissionHw>::create(device, osContext); - ret = directSubmission->initialize(submitOnInit); + ret = directSubmission->initialize(submitOnInit, this->isUsedNotifyEnableForPostSync()); } auto directSubmissionController = executionEnvironment.initializeDirectSubmissionController(); if (directSubmissionController) { diff --git a/shared/source/direct_submission/direct_submission_hw.h b/shared/source/direct_submission/direct_submission_hw.h index c612234040..36af8a2fef 100644 --- a/shared/source/direct_submission/direct_submission_hw.h +++ b/shared/source/direct_submission/direct_submission_hw.h @@ -59,7 +59,7 @@ class DirectSubmissionHw { virtual ~DirectSubmissionHw(); - bool initialize(bool submitOnInit); + bool initialize(bool submitOnInit, bool useNotify); MOCKABLE_VIRTUAL bool stopRingBuffer(); @@ -160,5 +160,6 @@ class DirectSubmissionHw { bool disableMonitorFence = false; bool partitionedMode = false; bool partitionConfigSet = true; + bool useNotifyForPostSync = false; }; } // namespace NEO diff --git a/shared/source/direct_submission/direct_submission_hw.inl b/shared/source/direct_submission/direct_submission_hw.inl index 8972cd3ea2..116ff4a9f0 100644 --- a/shared/source/direct_submission/direct_submission_hw.inl +++ b/shared/source/direct_submission/direct_submission_hw.inl @@ -154,7 +154,8 @@ inline void DirectSubmissionHw::cpuCachelineFlush(void *p } template -bool DirectSubmissionHw::initialize(bool submitOnInit) { +bool DirectSubmissionHw::initialize(bool submitOnInit, bool useNotify) { + useNotifyForPostSync = useNotify; bool ret = allocateResources(); initDiagnostic(submitOnInit); @@ -222,7 +223,7 @@ bool DirectSubmissionHw::stopRingBuffer() { if (disableMonitorFence) { TagData currentTagData = {}; getTagAddressValue(currentTagData); - Dispatcher::dispatchMonitorFence(ringCommandStream, currentTagData.tagAddress, currentTagData.tagValue, *hwInfo, false, this->partitionedMode); + Dispatcher::dispatchMonitorFence(ringCommandStream, currentTagData.tagAddress, currentTagData.tagValue, *hwInfo, this->useNotifyForPostSync, this->partitionedMode); } Dispatcher::dispatchStopCommandBuffer(ringCommandStream); @@ -277,7 +278,7 @@ inline void DirectSubmissionHw::dispatchSwitchRingBufferS if (disableMonitorFence) { TagData currentTagData = {}; getTagAddressValue(currentTagData); - Dispatcher::dispatchMonitorFence(ringCommandStream, currentTagData.tagAddress, currentTagData.tagValue, *hwInfo, false, this->partitionedMode); + Dispatcher::dispatchMonitorFence(ringCommandStream, currentTagData.tagAddress, currentTagData.tagValue, *hwInfo, this->useNotifyForPostSync, this->partitionedMode); } Dispatcher::dispatchStartCommandBuffer(ringCommandStream, nextBufferGpuAddress); } @@ -375,7 +376,7 @@ void *DirectSubmissionHw::dispatchWorkloadSection(BatchBu if (!disableMonitorFence) { TagData currentTagData = {}; getTagAddressValue(currentTagData); - Dispatcher::dispatchMonitorFence(ringCommandStream, currentTagData.tagAddress, currentTagData.tagValue, *hwInfo, false, this->partitionedMode); + Dispatcher::dispatchMonitorFence(ringCommandStream, currentTagData.tagAddress, currentTagData.tagValue, *hwInfo, this->useNotifyForPostSync, this->partitionedMode); } dispatchSemaphoreSection(currentQueueWorkCount + 1); diff --git a/shared/source/direct_submission/dispatchers/render_dispatcher.inl b/shared/source/direct_submission/dispatchers/render_dispatcher.inl index 214651e16b..691391b5c5 100644 --- a/shared/source/direct_submission/dispatchers/render_dispatcher.inl +++ b/shared/source/direct_submission/dispatchers/render_dispatcher.inl @@ -35,6 +35,7 @@ inline void RenderDispatcher::dispatchMonitorFence(LinearStream &cmdB PipeControlArgs args; args.dcFlushEnable = MemorySynchronizationCommands::isDcFlushAllowed(true, hwInfo); args.workloadPartitionOffset = partitionedWorkload; + args.notifyEnable = useNotifyEnable; MemorySynchronizationCommands::addPipeControlAndProgramPostSyncOperation( cmdBuffer, POST_SYNC_OPERATION::POST_SYNC_OPERATION_WRITE_IMMEDIATE_DATA, diff --git a/shared/test/common/mocks/mock_direct_submission_hw.h b/shared/test/common/mocks/mock_direct_submission_hw.h index 5078af6f1c..2ee9da63df 100644 --- a/shared/test/common/mocks/mock_direct_submission_hw.h +++ b/shared/test/common/mocks/mock_direct_submission_hw.h @@ -63,6 +63,7 @@ struct MockDirectSubmissionHw : public DirectSubmissionHw using BaseClass::startRingBuffer; using BaseClass::stopRingBuffer; using BaseClass::switchRingBuffersAllocations; + using BaseClass::useNotifyForPostSync; using BaseClass::workloadMode; using BaseClass::workloadModeOneExpectedValue; using BaseClass::workloadModeOneStoreAddress; diff --git a/shared/test/common/mocks/windows/mock_wddm_direct_submission.h b/shared/test/common/mocks/windows/mock_wddm_direct_submission.h index 20dcc56903..93f2d690eb 100644 --- a/shared/test/common/mocks/windows/mock_wddm_direct_submission.h +++ b/shared/test/common/mocks/windows/mock_wddm_direct_submission.h @@ -35,6 +35,7 @@ struct MockWddmDirectSubmission : public WddmDirectSubmissiongetUltCommandStreamReceiver(); csr.directSubmission.reset(&directSubmission); - bool ret = directSubmission.initialize(true); + bool ret = directSubmission.initialize(true, false); EXPECT_TRUE(ret); EXPECT_TRUE(directSubmission.ringStart); @@ -87,7 +87,7 @@ HWTEST_F(DirectSubmissionTest, givenBlitterDirectSubmissionWhenStopThenRingIsNot csr.blitterDirectSubmission.reset(&directSubmission); csr.setupContext(*osContext.get()); - bool ret = directSubmission.initialize(true); + bool ret = directSubmission.initialize(true, false); EXPECT_TRUE(ret); EXPECT_TRUE(directSubmission.ringStart); @@ -114,7 +114,7 @@ HWTEST_F(DirectSubmissionTest, givenDirectSubmissionWhenMakingResourcesResidentT csr.directSubmission.reset(&directSubmission); csr.setupContext(*osContext2.get()); - bool ret = directSubmission.initialize(true); + bool ret = directSubmission.initialize(true, false); EXPECT_TRUE(ret); EXPECT_NE(0x0u, directSubmission.ringCommandStream.getUsed()); GraphicsAllocation *alloc = directSubmission.ringCommandStream.getGraphicsAllocation(); @@ -137,7 +137,7 @@ HWTEST_F(DirectSubmissionTest, givenDirectSubmissionInitializedWhenRingIsStarted *osContext.get()); EXPECT_TRUE(directSubmission.disableCpuCacheFlush); - bool ret = directSubmission.initialize(true); + bool ret = directSubmission.initialize(true, false); EXPECT_TRUE(ret); EXPECT_TRUE(directSubmission.ringStart); @@ -152,7 +152,7 @@ HWTEST_F(DirectSubmissionTest, givenDirectSubmissionInitializedWhenRingIsNotStar MockDirectSubmissionHw> directSubmission(*pDevice, *osContext.get()); - bool ret = directSubmission.initialize(false); + bool ret = directSubmission.initialize(false, false); EXPECT_TRUE(ret); EXPECT_FALSE(directSubmission.ringStart); @@ -168,7 +168,7 @@ HWTEST_F(DirectSubmissionTest, givenDirectSubmissionSwitchBuffersWhenCurrentIsPr MockDirectSubmissionHw> directSubmission(*pDevice, *osContext.get()); - bool ret = directSubmission.initialize(false); + bool ret = directSubmission.initialize(false, false); EXPECT_TRUE(ret); EXPECT_EQ(RingBufferUse::FirstBuffer, directSubmission.currentRingBuffer); @@ -182,7 +182,7 @@ HWTEST_F(DirectSubmissionTest, givenDirectSubmissionSwitchBuffersWhenCurrentIsSe MockDirectSubmissionHw> directSubmission(*pDevice, *osContext.get()); - bool ret = directSubmission.initialize(false); + bool ret = directSubmission.initialize(false, false); EXPECT_TRUE(ret); EXPECT_EQ(RingBufferUse::FirstBuffer, directSubmission.currentRingBuffer); @@ -200,7 +200,7 @@ HWTEST_F(DirectSubmissionTest, givenDirectSubmissionAllocateFailWhenRingIsStarte EXPECT_TRUE(directSubmission.disableCpuCacheFlush); directSubmission.allocateOsResourcesReturn = false; - bool ret = directSubmission.initialize(true); + bool ret = directSubmission.initialize(true, false); EXPECT_FALSE(ret); EXPECT_FALSE(directSubmission.ringStart); @@ -212,7 +212,7 @@ HWTEST_F(DirectSubmissionTest, givenDirectSubmissionSubmitFailWhenRingIsStartedT *osContext.get()); directSubmission.submitReturn = false; - bool ret = directSubmission.initialize(true); + bool ret = directSubmission.initialize(true, false); EXPECT_FALSE(ret); EXPECT_FALSE(directSubmission.ringStart); @@ -223,7 +223,7 @@ HWTEST_F(DirectSubmissionTest, givenDirectSubmissionStartWhenRingIsStartedThenEx MockDirectSubmissionHw> directSubmission(*pDevice, *osContext.get()); - bool ret = directSubmission.initialize(true); + bool ret = directSubmission.initialize(true, false); EXPECT_TRUE(ret); size_t usedSize = directSubmission.ringCommandStream.getUsed(); @@ -236,7 +236,7 @@ HWTEST_F(DirectSubmissionTest, givenDirectSubmissionStartWhenRingIsNotStartedThe MockDirectSubmissionHw> directSubmission(*pDevice, *osContext.get()); - bool ret = directSubmission.initialize(false); + bool ret = directSubmission.initialize(false, false); EXPECT_TRUE(ret); size_t usedSize = directSubmission.ringCommandStream.getUsed(); @@ -250,7 +250,7 @@ HWTEST_F(DirectSubmissionTest, givenDirectSubmissionStartWhenRingIsNotStartedSub MockDirectSubmissionHw> directSubmission(*pDevice, *osContext.get()); - bool ret = directSubmission.initialize(false); + bool ret = directSubmission.initialize(false, false); EXPECT_TRUE(ret); size_t usedSize = directSubmission.ringCommandStream.getUsed(); @@ -265,7 +265,7 @@ HWTEST_F(DirectSubmissionTest, givenDirectSubmissionStartWhenRingIsNotStartedAnd MockDirectSubmissionHw> directSubmission(*pDevice, *osContext.get()); - bool ret = directSubmission.initialize(false); + bool ret = directSubmission.initialize(false, false); EXPECT_TRUE(ret); auto expectedRingBuffer = directSubmission.currentRingBuffer; GraphicsAllocation *oldRingBuffer = directSubmission.ringCommandStream.getGraphicsAllocation(); @@ -287,7 +287,7 @@ HWTEST_F(DirectSubmissionTest, givenDirectSubmissionStopWhenStopRingIsCalledThen MockDirectSubmissionHw> directSubmission(*pDevice, *osContext.get()); - bool ret = directSubmission.initialize(true); + bool ret = directSubmission.initialize(true, false); EXPECT_TRUE(ret); size_t alreadyDispatchedSize = directSubmission.ringCommandStream.getUsed(); uint32_t oldQueueCount = directSubmission.semaphoreData->QueueWorkCount; @@ -355,7 +355,7 @@ HWTEST_F(DirectSubmissionTest, givenDirectSubmissionWhenDispatchSemaphoreThenExp MockDirectSubmissionHw> directSubmission(*pDevice, *osContext.get()); - bool ret = directSubmission.initialize(false); + bool ret = directSubmission.initialize(false, false); EXPECT_TRUE(ret); directSubmission.dispatchSemaphoreSection(1u); @@ -366,7 +366,7 @@ HWTEST_F(DirectSubmissionTest, givenDirectSubmissionWhenDispatchStartSectionThen MockDirectSubmissionHw> directSubmission(*pDevice, *osContext.get()); - bool ret = directSubmission.initialize(false); + bool ret = directSubmission.initialize(false, false); EXPECT_TRUE(ret); directSubmission.dispatchStartSection(1ull); @@ -376,7 +376,7 @@ HWTEST_F(DirectSubmissionTest, givenDirectSubmissionWhenDispatchStartSectionThen HWTEST_F(DirectSubmissionTest, givenDirectSubmissionWhenDispatchSwitchRingBufferSectionThenExpectCorrectSizeUsed) { MockDirectSubmissionHw> directSubmission(*pDevice, *osContext.get()); - bool ret = directSubmission.initialize(false); + bool ret = directSubmission.initialize(false, false); EXPECT_TRUE(ret); directSubmission.dispatchSwitchRingBufferSection(1ull); @@ -388,7 +388,7 @@ HWTEST_F(DirectSubmissionTest, givenDirectSubmissionWhenDispatchFlushSectionThen MockDirectSubmissionHw directSubmission(*pDevice, *osContext.get()); - bool ret = directSubmission.initialize(false); + bool ret = directSubmission.initialize(false, false); EXPECT_TRUE(ret); Dispatcher::dispatchCacheFlush(directSubmission.ringCommandStream, *directSubmission.hwInfo, 0ull); @@ -400,7 +400,7 @@ HWTEST_F(DirectSubmissionTest, givenDirectSubmissionWhenDispatchTagUpdateSection MockDirectSubmissionHw directSubmission(*pDevice, *osContext.get()); - bool ret = directSubmission.initialize(false); + bool ret = directSubmission.initialize(false, false); EXPECT_TRUE(ret); Dispatcher::dispatchMonitorFence(directSubmission.ringCommandStream, 0ull, 0ull, *directSubmission.hwInfo, false, false); EXPECT_NE(0x0u, directSubmission.ringCommandStream.getUsed()); @@ -412,7 +412,7 @@ HWTEST_F(DirectSubmissionTest, givenDirectSubmissionWhenDispatchEndingSectionThe MockDirectSubmissionHw directSubmission(*pDevice, *osContext.get()); - bool ret = directSubmission.initialize(false); + bool ret = directSubmission.initialize(false, false); EXPECT_TRUE(ret); Dispatcher::dispatchStopCommandBuffer(directSubmission.ringCommandStream); @@ -517,7 +517,7 @@ HWTEST_F(DirectSubmissionTest, givenDirectSubmissionWhenSettingAddressInReturnCo MockDirectSubmissionHw> directSubmission(*pDevice, *osContext.get()); - bool ret = directSubmission.initialize(false); + bool ret = directSubmission.initialize(false, false); EXPECT_TRUE(ret); uint64_t returnAddress = 0x1A2BF000; @@ -533,7 +533,7 @@ HWTEST_F(DirectSubmissionTest, whenDirectSubmissionInitializedThenExpectCreatedA std::unique_ptr>> directSubmission = std::make_unique>>(*pDevice, *osContext.get()); - bool ret = directSubmission->initialize(false); + bool ret = directSubmission->initialize(false, false); EXPECT_TRUE(ret); GraphicsAllocation *nulledAllocation = directSubmission->ringBuffer; @@ -544,7 +544,7 @@ HWTEST_F(DirectSubmissionTest, whenDirectSubmissionInitializedThenExpectCreatedA directSubmission = std::make_unique< MockDirectSubmissionHw>>(*pDevice, *osContext.get()); - ret = directSubmission->initialize(false); + ret = directSubmission->initialize(false, false); EXPECT_TRUE(ret); nulledAllocation = directSubmission->ringBuffer2; @@ -555,7 +555,7 @@ HWTEST_F(DirectSubmissionTest, whenDirectSubmissionInitializedThenExpectCreatedA directSubmission = std::make_unique< MockDirectSubmissionHw>>(*pDevice, *osContext.get()); - ret = directSubmission->initialize(false); + ret = directSubmission->initialize(false, false); EXPECT_TRUE(ret); nulledAllocation = directSubmission->semaphores; directSubmission->semaphores = nullptr; @@ -642,7 +642,7 @@ HWTEST_F(DirectSubmissionTest, EXPECT_FALSE(directSubmission.disableMonitorFence); EXPECT_EQ(0u, directSubmission.workloadMode); EXPECT_EQ(nullptr, directSubmission.diagnostic.get()); - bool ret = directSubmission.initialize(false); + bool ret = directSubmission.initialize(false, false); EXPECT_TRUE(ret); EXPECT_FALSE(directSubmission.ringStart); EXPECT_EQ(0u, directSubmission.disabledDiagnosticCalled); @@ -677,7 +677,7 @@ HWTEST_F(DirectSubmissionTest, EXPECT_FALSE(directSubmission.disableMonitorFence); EXPECT_EQ(0u, directSubmission.workloadMode); EXPECT_EQ(nullptr, directSubmission.diagnostic.get()); - bool ret = directSubmission.initialize(true); + bool ret = directSubmission.initialize(true, false); EXPECT_TRUE(ret); EXPECT_TRUE(directSubmission.ringStart); EXPECT_EQ(1u, directSubmission.disabledDiagnosticCalled); @@ -712,7 +712,7 @@ HWTEST_F(DirectSubmissionTest, EXPECT_FALSE(directSubmission.disableMonitorFence); EXPECT_EQ(0u, directSubmission.workloadMode); EXPECT_EQ(nullptr, directSubmission.diagnostic.get()); - bool ret = directSubmission.initialize(false); + bool ret = directSubmission.initialize(false, false); EXPECT_TRUE(ret); EXPECT_FALSE(directSubmission.ringStart); EXPECT_EQ(0u, directSubmission.disabledDiagnosticCalled); @@ -761,7 +761,7 @@ HWTEST_F(DirectSubmissionTest, directSubmission.getDiagnosticModeSection(); expectedSize += expectedExecCount * directSubmission.getSizeDispatch(); - bool ret = directSubmission.initialize(false); + bool ret = directSubmission.initialize(false, false); EXPECT_TRUE(ret); EXPECT_TRUE(directSubmission.ringStart); EXPECT_EQ(0u, directSubmission.disabledDiagnosticCalled); @@ -849,7 +849,7 @@ HWTEST_F(DirectSubmissionTest, EXPECT_EQ(expectedDispatch, directSubmission.getSizeDispatch()); expectedSize += expectedExecCount * expectedDispatch; - bool ret = directSubmission.initialize(false); + bool ret = directSubmission.initialize(false, false); EXPECT_TRUE(ret); EXPECT_TRUE(directSubmission.ringStart); EXPECT_EQ(0u, directSubmission.disabledDiagnosticCalled); @@ -944,7 +944,7 @@ HWCMDTEST_F(IGFX_GEN8_CORE, DirectSubmissionTest, MockDirectSubmissionHw directSubmission(*pDevice, *osContext.get()); - bool ret = directSubmission.initialize(true); + bool ret = directSubmission.initialize(true, false); EXPECT_TRUE(ret); size_t usedSize = directSubmission.ringCommandStream.getUsed(); 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 138b737dbb..b786778585 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 @@ -51,7 +51,7 @@ HWCMDTEST_F(IGFX_XE_HP_CORE, DirectSubmissionDispatchBufferTest, directSubmission.partitionedMode = true; directSubmission.workPartitionAllocation = ultCsr->getWorkPartitionAllocation(); - bool ret = directSubmission.initialize(true); + bool ret = directSubmission.initialize(true, false); EXPECT_TRUE(ret); EXPECT_TRUE(directSubmission.partitionConfigSet); EXPECT_NE(0x0u, directSubmission.ringCommandStream.getUsed()); @@ -303,7 +303,7 @@ HWTEST_F(DirectSubmissionDispatchBufferTest, MockDirectSubmissionHw> directSubmission(*pDevice, *osContext.get()); - bool ret = directSubmission.initialize(true); + bool ret = directSubmission.initialize(true, false); EXPECT_TRUE(ret); EXPECT_NE(0x0u, directSubmission.ringCommandStream.getUsed()); GraphicsAllocation *oldRingAllocation = directSubmission.ringCommandStream.getGraphicsAllocation(); @@ -342,7 +342,7 @@ HWTEST_F(DirectSubmissionDispatchBufferTest, MockDirectSubmissionHw> directSubmission(*pDevice, *osContext.get()); - bool ret = directSubmission.initialize(false); + bool ret = directSubmission.initialize(false, false); EXPECT_TRUE(ret); EXPECT_EQ(0x0u, directSubmission.ringCommandStream.getUsed()); GraphicsAllocation *oldRingAllocation = directSubmission.ringCommandStream.getGraphicsAllocation(); @@ -374,7 +374,7 @@ HWTEST_F(DirectSubmissionDispatchBufferTest, MockDirectSubmissionHw> directSubmission(*pDevice, *osContext.get()); - bool ret = directSubmission.initialize(true); + bool ret = directSubmission.initialize(true, false); EXPECT_TRUE(ret); EXPECT_NE(0x0u, directSubmission.ringCommandStream.getUsed()); GraphicsAllocation *oldRingAllocation = directSubmission.ringCommandStream.getGraphicsAllocation(); @@ -410,7 +410,7 @@ HWTEST_F(DirectSubmissionDispatchBufferTest, MockDirectSubmissionHw> directSubmission(*pDevice, *osContext.get()); - bool ret = directSubmission.initialize(false); + bool ret = directSubmission.initialize(false, false); EXPECT_TRUE(ret); EXPECT_EQ(0u, directSubmission.semaphoreData->QueueWorkCount); EXPECT_EQ(1u, directSubmission.currentQueueWorkCount); @@ -445,7 +445,7 @@ HWTEST_F(DirectSubmissionDispatchBufferTest, givenDirectSubmissionPrintBuffersWh testing::internal::CaptureStdout(); - bool ret = directSubmission.initialize(false); + bool ret = directSubmission.initialize(false, false); EXPECT_TRUE(ret); ret = directSubmission.dispatchCommandBuffer(batchBuffer, flushStamp); EXPECT_TRUE(ret); @@ -482,7 +482,7 @@ HWCMDTEST_F(IGFX_XE_HP_CORE, DirectSubmissionDispatchBufferTest, directSubmission.partitionConfigSet = false; directSubmission.workPartitionAllocation = ultCsr->getWorkPartitionAllocation(); - bool ret = directSubmission.initialize(true); + bool ret = directSubmission.initialize(true, false); EXPECT_TRUE(ret); EXPECT_TRUE(directSubmission.partitionConfigSet); EXPECT_NE(0x0u, directSubmission.ringCommandStream.getUsed()); @@ -543,7 +543,7 @@ HWCMDTEST_F(IGFX_XE_HP_CORE, DirectSubmissionDispatchBufferTest, directSubmission.partitionConfigSet = false; directSubmission.workPartitionAllocation = ultCsr->getWorkPartitionAllocation(); - bool ret = directSubmission.initialize(false); + bool ret = directSubmission.initialize(false, false); EXPECT_TRUE(ret); EXPECT_FALSE(directSubmission.partitionConfigSet); EXPECT_FALSE(directSubmission.ringStart); @@ -578,3 +578,76 @@ HWCMDTEST_F(IGFX_XE_HP_CORE, DirectSubmissionDispatchBufferTest, uint64_t gpuAddress = ultCsr->getWorkPartitionAllocation()->getGpuAddress(); EXPECT_EQ(gpuAddress, loadRegisterMem->getMemoryAddress()); } + +HWTEST_F(DirectSubmissionDispatchBufferTest, + givenRenderDirectSubmissionUsingNotifyEnabledWhenDispatchWorkloadCalledWithMonitorFenceThenExpectPostSyncOperationWithNotifyFlag) { + using PIPE_CONTROL = typename FamilyType::PIPE_CONTROL; + using POST_SYNC_OPERATION = typename PIPE_CONTROL::POST_SYNC_OPERATION; + using Dispatcher = RenderDispatcher; + + FlushStampTracker flushStamp(true); + + MockDirectSubmissionHw directSubmission(*pDevice, + *osContext.get()); + directSubmission.disableMonitorFence = false; + + bool ret = directSubmission.initialize(true, true); + EXPECT_TRUE(ret); + EXPECT_TRUE(directSubmission.useNotifyForPostSync); + + size_t sizeUsedBefore = directSubmission.ringCommandStream.getUsed(); + ret = directSubmission.dispatchCommandBuffer(batchBuffer, flushStamp); + EXPECT_TRUE(ret); + + HardwareParse hwParse; + hwParse.parsePipeControl = true; + hwParse.parseCommands(directSubmission.ringCommandStream, sizeUsedBefore); + hwParse.findHardwareCommands(); + + bool foundFenceUpdate = false; + for (auto it = hwParse.pipeControlList.begin(); it != hwParse.pipeControlList.end(); it++) { + auto pipeControl = genCmdCast(*it); + if (pipeControl->getPostSyncOperation() == POST_SYNC_OPERATION::POST_SYNC_OPERATION_WRITE_IMMEDIATE_DATA) { + foundFenceUpdate = true; + EXPECT_TRUE(pipeControl->getNotifyEnable()); + break; + } + } + EXPECT_TRUE(foundFenceUpdate); +} + +HWTEST_F(DirectSubmissionDispatchBufferTest, + givenBlitterDirectSubmissionUsingNotifyEnabledWhenDispatchWorkloadCalledWithMonitorFenceThenExpectPostSyncOperationWithNotifyFlag) { + using MI_FLUSH_DW = typename FamilyType::MI_FLUSH_DW; + using Dispatcher = BlitterDispatcher; + + FlushStampTracker flushStamp(true); + + MockDirectSubmissionHw directSubmission(*pDevice, + *osContext.get()); + directSubmission.disableMonitorFence = false; + + bool ret = directSubmission.initialize(true, true); + EXPECT_TRUE(ret); + EXPECT_TRUE(directSubmission.useNotifyForPostSync); + + size_t sizeUsedBefore = directSubmission.ringCommandStream.getUsed(); + ret = directSubmission.dispatchCommandBuffer(batchBuffer, flushStamp); + EXPECT_TRUE(ret); + + HardwareParse hwParse; + hwParse.parseCommands(directSubmission.ringCommandStream, sizeUsedBefore); + hwParse.findHardwareCommands(); + auto miFlushList = hwParse.getCommandsList(); + + bool foundFenceUpdate = false; + for (auto it = miFlushList.begin(); it != miFlushList.end(); it++) { + auto miFlush = genCmdCast(*it); + if (miFlush->getPostSyncOperation() == MI_FLUSH_DW::POST_SYNC_OPERATION_WRITE_IMMEDIATE_DATA_QWORD) { + foundFenceUpdate = true; + EXPECT_TRUE(miFlush->getNotifyEnable()); + break; + } + } + EXPECT_TRUE(foundFenceUpdate); +} diff --git a/shared/test/unit_test/direct_submission/dispatchers/render_dispatcher_tests.cpp b/shared/test/unit_test/direct_submission/dispatchers/render_dispatcher_tests.cpp index a5d6c70b90..ef6428827c 100644 --- a/shared/test/unit_test/direct_submission/dispatchers/render_dispatcher_tests.cpp +++ b/shared/test/unit_test/direct_submission/dispatchers/render_dispatcher_tests.cpp @@ -148,3 +148,32 @@ HWCMDTEST_F(IGFX_XE_HP_CORE, RenderDispatcherTest, HWTEST_F(RenderDispatcherTest, givenRenderWhenCheckingForMultiTileSynchronizationSupportThenExpectTrue) { EXPECT_TRUE(RenderDispatcher::isMultiTileSynchronizationSupported()); } + +HWCMDTEST_F(IGFX_XE_HP_CORE, RenderDispatcherTest, + givenRenderDispatcherNotifyFlagTrueWhenAddingMonitorFenceCmdThenExpectPipeControlWithProperAddressAndValueAndNotifyParameter) { + using PIPE_CONTROL = typename FamilyType::PIPE_CONTROL; + using POST_SYNC_OPERATION = typename FamilyType::PIPE_CONTROL::POST_SYNC_OPERATION; + + uint64_t gpuAddress = 0xADD35500ull; + uint64_t value = 0x102030; + + RenderDispatcher::dispatchMonitorFence(cmdBuffer, gpuAddress, value, hardwareInfo, true, false); + + HardwareParse hwParse; + hwParse.parsePipeControl = true; + hwParse.parseCommands(cmdBuffer); + hwParse.findHardwareCommands(); + + bool foundMonitorFence = false; + for (auto &it : hwParse.pipeControlList) { + PIPE_CONTROL *pipeControl = reinterpret_cast(it); + if (pipeControl->getPostSyncOperation() == POST_SYNC_OPERATION::POST_SYNC_OPERATION_WRITE_IMMEDIATE_DATA) { + foundMonitorFence = true; + EXPECT_EQ(gpuAddress, NEO::UnitTestHelper::getPipeControlPostSyncAddress(*pipeControl)); + EXPECT_EQ(value, pipeControl->getImmediateData()); + EXPECT_TRUE(pipeControl->getNotifyEnable()); + break; + } + } + EXPECT_TRUE(foundMonitorFence); +} diff --git a/shared/test/unit_test/direct_submission/linux/drm_direct_submission_tests.cpp b/shared/test/unit_test/direct_submission/linux/drm_direct_submission_tests.cpp index 4dab6b54ef..a1a9c75124 100644 --- a/shared/test/unit_test/direct_submission/linux/drm_direct_submission_tests.cpp +++ b/shared/test/unit_test/direct_submission/linux/drm_direct_submission_tests.cpp @@ -74,6 +74,7 @@ struct MockDrmDirectSubmission : public DrmDirectSubmissioninitialize(false); + bool ret = directSubmission->initialize(false, false); EXPECT_TRUE(ret); } diff --git a/shared/test/unit_test/direct_submission/windows/wddm_direct_submission_tests.cpp b/shared/test/unit_test/direct_submission/windows/wddm_direct_submission_tests.cpp index d9f99effd3..e21a504c55 100644 --- a/shared/test/unit_test/direct_submission/windows/wddm_direct_submission_tests.cpp +++ b/shared/test/unit_test/direct_submission/windows/wddm_direct_submission_tests.cpp @@ -55,7 +55,7 @@ HWTEST_F(WddmDirectSubmissionTest, givenWddmWhenDirectIsInitializedAndStartedThe EXPECT_EQ(1u, wddmDirectSubmission->commandBufferHeader->NeedsMidBatchPreEmptionSupport); - bool ret = wddmDirectSubmission->initialize(true); + bool ret = wddmDirectSubmission->initialize(true, false); EXPECT_TRUE(ret); EXPECT_TRUE(wddmDirectSubmission->ringStart); EXPECT_NE(nullptr, wddmDirectSubmission->ringBuffer); @@ -87,7 +87,7 @@ HWTEST_F(WddmDirectSubmissionTest, givenWddmWhenDirectIsInitializedAndNotStarted EXPECT_EQ(0u, wddmDirectSubmission->commandBufferHeader->NeedsMidBatchPreEmptionSupport); - bool ret = wddmDirectSubmission->initialize(false); + bool ret = wddmDirectSubmission->initialize(false, false); EXPECT_TRUE(ret); EXPECT_FALSE(wddmDirectSubmission->ringStart); EXPECT_NE(nullptr, wddmDirectSubmission->ringBuffer); @@ -112,7 +112,7 @@ HWTEST_F(WddmDirectSubmissionTest, givenWddmWhenSubmitingCmdBufferThenExpectPass MockWddmDirectSubmission> wddmDirectSubmission(*device.get(), *osContext.get()); - bool ret = wddmDirectSubmission.initialize(false); + bool ret = wddmDirectSubmission.initialize(false, false); EXPECT_TRUE(ret); uint64_t gpuAddress = 0xFF00FF000; @@ -231,7 +231,7 @@ HWTEST_F(WddmDirectSubmissionTest, givenWddmWhenSwitchingRingBufferStartedThenEx MockWddmDirectSubmission> wddmDirectSubmission(*device.get(), *osContext.get()); - bool ret = wddmDirectSubmission.initialize(true); + bool ret = wddmDirectSubmission.initialize(true, false); EXPECT_TRUE(ret); size_t usedSpace = wddmDirectSubmission.ringCommandStream.getUsed(); uint64_t expectedGpuVa = wddmDirectSubmission.ringBuffer->getGpuAddress() + usedSpace; @@ -257,7 +257,7 @@ HWTEST_F(WddmDirectSubmissionTest, givenWddmWhenSwitchingRingBufferNotStartedThe MockWddmDirectSubmission> wddmDirectSubmission(*device.get(), *osContext.get()); - bool ret = wddmDirectSubmission.initialize(false); + bool ret = wddmDirectSubmission.initialize(false, false); EXPECT_TRUE(ret); size_t usedSpace = wddmDirectSubmission.ringCommandStream.getUsed(); @@ -284,7 +284,7 @@ HWTEST_F(WddmDirectSubmissionTest, givenWddmWhenSwitchingRingBufferStartedAndWai MockWddmDirectSubmission> wddmDirectSubmission(*device.get(), *osContext.get()); - bool ret = wddmDirectSubmission.initialize(true); + bool ret = wddmDirectSubmission.initialize(true, false); EXPECT_TRUE(ret); uint64_t expectedWaitFence = 0x10ull; wddmDirectSubmission.completionRingBuffers[RingBufferUse::SecondBuffer] = expectedWaitFence;