From 286acf30a3c0b855cc5ab7a5d88688bef0e4f895 Mon Sep 17 00:00:00 2001 From: Maciej Plewka Date: Wed, 9 Apr 2025 12:37:50 +0000 Subject: [PATCH] fix: Dispatch residency fence when stopping ulls on windows Related-To: NEO-14396, HSD-18041496023, HSD-13012953666, NEO-14611 Signed-off-by: Maciej Plewka --- .../direct_submission/direct_submission_hw.h | 4 + .../direct_submission_hw.inl | 6 +- .../linux/drm_direct_submission.h | 2 + .../linux/drm_direct_submission.inl | 12 +++ .../windows/wddm_direct_submission.h | 2 + .../windows/wddm_direct_submission.inl | 14 +++ .../direct_submission_tests_1.cpp | 49 ---------- .../direct_submission_tests_2.cpp | 28 ------ .../linux/drm_direct_submission_tests.cpp | 98 +++++++++++++++++++ .../windows/wddm_direct_submission_tests.cpp | 78 +++++++++++++++ .../windows/mock_wddm_direct_submission.h | 18 ++++ 11 files changed, 230 insertions(+), 81 deletions(-) diff --git a/shared/source/direct_submission/direct_submission_hw.h b/shared/source/direct_submission/direct_submission_hw.h index 3a378626a4..3573f5692c 100644 --- a/shared/source/direct_submission/direct_submission_hw.h +++ b/shared/source/direct_submission/direct_submission_hw.h @@ -191,6 +191,10 @@ class DirectSubmissionHw { void dispatchDiagnosticModeSection(); size_t getDiagnosticModeSection(); void setImmWritePostSyncOffset(); + virtual void dispatchStopRingBufferSection(){}; + virtual size_t dispatchStopRingBufferSectionSize() { + return 0; + }; virtual bool isCompleted(uint32_t ringBufferIndex) = 0; diff --git a/shared/source/direct_submission/direct_submission_hw.inl b/shared/source/direct_submission/direct_submission_hw.inl index 35f1b85227..1259e60bc2 100644 --- a/shared/source/direct_submission/direct_submission_hw.inl +++ b/shared/source/direct_submission/direct_submission_hw.inl @@ -537,9 +537,7 @@ bool DirectSubmissionHw::stopRingBuffer(bool blocking) { void *flushPtr = ringCommandStream.getSpace(0); Dispatcher::dispatchCacheFlush(ringCommandStream, this->rootDeviceEnvironment, gpuVaForMiFlush); if (disableMonitorFence) { - TagData currentTagData = {}; - getTagAddressValueForRingSwitch(currentTagData); - Dispatcher::dispatchMonitorFence(ringCommandStream, currentTagData.tagAddress, currentTagData.tagValue, this->rootDeviceEnvironment, this->partitionedMode, this->dcFlushRequired, this->notifyKmdDuringMonitorFence); + dispatchStopRingBufferSection(); } Dispatcher::dispatchStopCommandBuffer(ringCommandStream); @@ -647,7 +645,7 @@ inline size_t DirectSubmissionHw::getSizeEnd(bool relaxed (Dispatcher::getSizeStartCommandBuffer() - Dispatcher::getSizeStopCommandBuffer()) + MemoryConstants::cacheLineSize; if (disableMonitorFence) { - size += Dispatcher::getSizeMonitorFence(rootDeviceEnvironment); + size += dispatchStopRingBufferSectionSize(); } if (this->relaxedOrderingEnabled && relaxedOrderingSchedulerRequired) { size += getSizeDispatchRelaxedOrderingQueueStall(); diff --git a/shared/source/direct_submission/linux/drm_direct_submission.h b/shared/source/direct_submission/linux/drm_direct_submission.h index b08993b795..96ba42a173 100644 --- a/shared/source/direct_submission/linux/drm_direct_submission.h +++ b/shared/source/direct_submission/linux/drm_direct_submission.h @@ -35,6 +35,8 @@ class DrmDirectSubmission : public DirectSubmissionHw { void ensureRingCompletion() override; void handleSwitchRingBuffers(ResidencyContainer *allocationsForResidency) override; + void dispatchStopRingBufferSection() override; + size_t dispatchStopRingBufferSectionSize() override; uint64_t updateTagValue(bool requireMonitorFence) override; void getTagAddressValue(TagData &tagData) override; void getTagAddressValueForRingSwitch(TagData &tagData) override; diff --git a/shared/source/direct_submission/linux/drm_direct_submission.inl b/shared/source/direct_submission/linux/drm_direct_submission.inl index d7ec230da3..c022c72ceb 100644 --- a/shared/source/direct_submission/linux/drm_direct_submission.inl +++ b/shared/source/direct_submission/linux/drm_direct_submission.inl @@ -242,6 +242,18 @@ void DrmDirectSubmission::handleStopRingBuffer() { } } +template +void DrmDirectSubmission::dispatchStopRingBufferSection() { + TagData currentTagData = {}; + getTagAddressValue(currentTagData); + Dispatcher::dispatchMonitorFence(this->ringCommandStream, currentTagData.tagAddress, currentTagData.tagValue, this->rootDeviceEnvironment, this->partitionedMode, this->dcFlushRequired, this->notifyKmdDuringMonitorFence); +} + +template +size_t DrmDirectSubmission::dispatchStopRingBufferSectionSize() { + return Dispatcher::getSizeMonitorFence(this->rootDeviceEnvironment); +} + template void DrmDirectSubmission::handleSwitchRingBuffers(ResidencyContainer *allocationsForResidency) { if (this->disableMonitorFence) { diff --git a/shared/source/direct_submission/windows/wddm_direct_submission.h b/shared/source/direct_submission/windows/wddm_direct_submission.h index 8b68ae6f2d..0210475872 100644 --- a/shared/source/direct_submission/windows/wddm_direct_submission.h +++ b/shared/source/direct_submission/windows/wddm_direct_submission.h @@ -45,6 +45,8 @@ class WddmDirectSubmission : public DirectSubmissionHw { bool isCompleted(uint32_t ringBufferIndex) override; MOCKABLE_VIRTUAL void updateMonitorFenceValueForResidencyList(ResidencyContainer *allocationsForResidency); void makeGlobalFenceAlwaysResident() override; + void dispatchStopRingBufferSection() override; + size_t dispatchStopRingBufferSectionSize() override; TagData ringBufferEndCompletionTagData{}; OsContextWin *osContextWin; diff --git a/shared/source/direct_submission/windows/wddm_direct_submission.inl b/shared/source/direct_submission/windows/wddm_direct_submission.inl index e369a136f0..187d2c8b27 100644 --- a/shared/source/direct_submission/windows/wddm_direct_submission.inl +++ b/shared/source/direct_submission/windows/wddm_direct_submission.inl @@ -128,6 +128,7 @@ template void WddmDirectSubmission::handleStopRingBuffer() { if (this->disableMonitorFence) { updateTagValueImplForSwitchRingBuffer(this->currentRingBuffer); + updateTagValueImpl(this->currentRingBuffer); } } @@ -198,6 +199,19 @@ void WddmDirectSubmission::getTagAddressValueForRingSwitc tagData.tagValue = this->ringBufferEndCompletionTagData.tagValue + 1; } +template +void WddmDirectSubmission::dispatchStopRingBufferSection() { + TagData currentTagData = {}; + getTagAddressValueForRingSwitch(currentTagData); + Dispatcher::dispatchMonitorFence(this->ringCommandStream, currentTagData.tagAddress, currentTagData.tagValue, this->rootDeviceEnvironment, this->partitionedMode, this->dcFlushRequired, this->notifyKmdDuringMonitorFence); + getTagAddressValue(currentTagData); + Dispatcher::dispatchMonitorFence(this->ringCommandStream, currentTagData.tagAddress, currentTagData.tagValue, this->rootDeviceEnvironment, this->partitionedMode, this->dcFlushRequired, this->notifyKmdDuringMonitorFence); +} + +template +size_t WddmDirectSubmission::dispatchStopRingBufferSectionSize() { + return 2 * Dispatcher::getSizeMonitorFence(this->rootDeviceEnvironment); +} template inline bool WddmDirectSubmission::isCompleted(uint32_t ringBufferIndex) { auto taskCount = this->ringBuffers[ringBufferIndex].completionFenceForSwitch; diff --git a/shared/test/unit_test/direct_submission/direct_submission_tests_1.cpp b/shared/test/unit_test/direct_submission/direct_submission_tests_1.cpp index 7462b8ed8e..a9a2c2c37f 100644 --- a/shared/test/unit_test/direct_submission/direct_submission_tests_1.cpp +++ b/shared/test/unit_test/direct_submission/direct_submission_tests_1.cpp @@ -454,55 +454,6 @@ HWTEST_F(DirectSubmissionTest, givenDirectSubmissionStopWhenStopRingIsCalledThen EXPECT_EQ(oldQueueCount + 1, directSubmission.semaphoreData->queueWorkCount); } -HWTEST_F(DirectSubmissionTest, - givenDirectSubmissionDisableMonitorFenceWhenStopRingIsCalledThenExpectStopCommandAndMonitorFenceDispatched) { - using PIPE_CONTROL = typename FamilyType::PIPE_CONTROL; - using MI_BATCH_BUFFER_END = typename FamilyType::MI_BATCH_BUFFER_END; - using Dispatcher = RenderDispatcher; - - MockDirectSubmissionHw regularDirectSubmission(*pDevice->getDefaultEngine().commandStreamReceiver); - regularDirectSubmission.disableMonitorFence = false; - size_t regularSizeEnd = regularDirectSubmission.getSizeEnd(false); - - MockDirectSubmissionHw directSubmission(*pDevice->getDefaultEngine().commandStreamReceiver); - - bool ret = directSubmission.allocateResources(); - directSubmission.ringStart = true; - - EXPECT_TRUE(ret); - - size_t tagUpdateSize = Dispatcher::getSizeMonitorFence(directSubmission.rootDeviceEnvironment); - - size_t disabledSizeEnd = directSubmission.getSizeEnd(false); - EXPECT_EQ(disabledSizeEnd, regularSizeEnd + tagUpdateSize); - - directSubmission.tagValueSetValue = 0x4343123ull; - directSubmission.tagAddressSetValue = 0xBEEF00000ull; - directSubmission.stopRingBuffer(false); - size_t expectedDispatchSize = disabledSizeEnd; - EXPECT_LE(directSubmission.ringCommandStream.getUsed(), expectedDispatchSize); - EXPECT_GE(directSubmission.ringCommandStream.getUsed() + MemoryConstants::cacheLineSize, expectedDispatchSize); - - HardwareParse hwParse; - hwParse.parsePipeControl = true; - hwParse.parseCommands(directSubmission.ringCommandStream, 0); - hwParse.findHardwareCommands(); - MI_BATCH_BUFFER_END *bbEnd = hwParse.getCommand(); - EXPECT_NE(nullptr, bbEnd); - - bool foundFenceUpdate = false; - for (auto it = hwParse.pipeControlList.begin(); it != hwParse.pipeControlList.end(); it++) { - auto pipeControl = genCmdCast(*it); - uint64_t data = pipeControl->getImmediateData(); - if ((directSubmission.tagAddressSetValue == NEO::UnitTestHelper::getPipeControlPostSyncAddress(*pipeControl)) && - (directSubmission.tagValueSetValue == data)) { - foundFenceUpdate = true; - break; - } - } - EXPECT_TRUE(foundFenceUpdate); -} - HWTEST_F(DirectSubmissionTest, givenDirectSubmissionWhenDispatchSemaphoreThenExpectCorrectSizeUsed) { MockDirectSubmissionHw> directSubmission(*pDevice->getDefaultEngine().commandStreamReceiver); 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 94890b32d0..78b54c7619 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 @@ -2730,34 +2730,6 @@ HWTEST2_F(DirectSubmissionRelaxedOrderingTests, givenBbWithNonStallingCmdsAndWit } } -HWTEST2_F(DirectSubmissionRelaxedOrderingTests, givenRelaxedOrderingSchedulerRequiredWhenAskingForCmdsSizeThenReturnCorrectValue, IsAtLeastXeHpcCore) { - using Dispatcher = RenderDispatcher; - MockDirectSubmissionHw directSubmission(*pDevice->getDefaultEngine().commandStreamReceiver); - - size_t expectedBaseSemaphoreSectionSize = directSubmission.getSizePrefetchMitigation(); - if (directSubmission.isDisablePrefetcherRequired) { - expectedBaseSemaphoreSectionSize += 2 * directSubmission.getSizeDisablePrefetcher(); - } - - if (directSubmission.miMemFenceRequired) { - expectedBaseSemaphoreSectionSize += MemorySynchronizationCommands::getSizeForSingleAdditionalSynchronizationForDirectSubmission(pDevice->getRootDeviceEnvironment()); - } - - EXPECT_EQ(expectedBaseSemaphoreSectionSize + RelaxedOrderingHelper::DynamicSchedulerSizeAndOffsetSection::totalSize, directSubmission.getSizeSemaphoreSection(true)); - EXPECT_EQ(expectedBaseSemaphoreSectionSize + EncodeSemaphore::getSizeMiSemaphoreWait(), directSubmission.getSizeSemaphoreSection(false)); - - size_t expectedBaseEndSize = Dispatcher::getSizeStopCommandBuffer() + - Dispatcher::getSizeCacheFlush(directSubmission.rootDeviceEnvironment) + - (Dispatcher::getSizeStartCommandBuffer() - Dispatcher::getSizeStopCommandBuffer()) + - MemoryConstants::cacheLineSize; - if (directSubmission.disableMonitorFence) { - expectedBaseEndSize += Dispatcher::getSizeMonitorFence(pDevice->getRootDeviceEnvironment()); - } - - EXPECT_EQ(expectedBaseEndSize + directSubmission.getSizeDispatchRelaxedOrderingQueueStall(), directSubmission.getSizeEnd(true)); - EXPECT_EQ(expectedBaseEndSize, directSubmission.getSizeEnd(false)); -} - HWTEST2_F(DirectSubmissionRelaxedOrderingTests, givenSchedulerRequiredWhenDispatchingReturnPtrsThenAddOffset, IsAtLeastXeHpcCore) { using MI_LOAD_REGISTER_IMM = typename FamilyType::MI_LOAD_REGISTER_IMM; 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 08829c4006..0c3d886ae3 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 @@ -10,6 +10,7 @@ #include "shared/source/direct_submission/dispatchers/blitter_dispatcher.h" #include "shared/source/direct_submission/dispatchers/render_dispatcher.h" #include "shared/source/direct_submission/linux/drm_direct_submission.h" +#include "shared/source/direct_submission/relaxed_ordering_helper.h" #include "shared/source/helpers/compiler_product_helper.h" #include "shared/source/helpers/flush_stamp.h" #include "shared/source/os_interface/linux/drm_gem_close_worker.h" @@ -82,7 +83,12 @@ struct MockDrmDirectSubmission : public DrmDirectSubmissioncallBaseGetCpuTimePoint ? BaseClass::getCpuTimePoint() : cpuTimePointReturnValue; } + void getTagAddressValue(TagData &tagData) override { + if (setTagAddressValue) { + tagData.tagAddress = tagAddressSetValue; + tagData.tagValue = tagValueSetValue; + } else { + BaseClass::getTagAddressValue(tagData); + } + } std::chrono::steady_clock::time_point cpuTimePointReturnValue{}; bool callBaseGetCpuTimePoint = true; + uint64_t tagAddressSetValue = MemoryConstants::pageSize; + uint64_t tagValueSetValue = 1ull; + bool setTagAddressValue = false; }; using namespace NEO; @@ -1325,4 +1345,82 @@ HWTEST_F(DrmDirectSubmissionTest, givenGpuHangWhenWaitCalledThenGpuHangDetected) EXPECT_EQ(0, drm->ioctlCount.getResetStats); directSubmission.wait(1); EXPECT_EQ(1, drm->ioctlCount.getResetStats); +} + +HWTEST_F(DrmDirectSubmissionTest, + givenDirectSubmissionDisableMonitorFenceWhenStopRingIsCalledThenExpectStopCommandAndMonitorFenceDispatched) { + using PIPE_CONTROL = typename FamilyType::PIPE_CONTROL; + using MI_BATCH_BUFFER_END = typename FamilyType::MI_BATCH_BUFFER_END; + using Dispatcher = RenderDispatcher; + + MockDrmDirectSubmission regularDirectSubmission(*device->getDefaultEngine().commandStreamReceiver); + regularDirectSubmission.disableMonitorFence = false; + size_t regularSizeEnd = regularDirectSubmission.getSizeEnd(false); + + MockDrmDirectSubmission directSubmission(*device->getDefaultEngine().commandStreamReceiver); + directSubmission.setTagAddressValue = true; + bool ret = directSubmission.allocateResources(); + directSubmission.ringStart = true; + + EXPECT_TRUE(ret); + + size_t tagUpdateSize = Dispatcher::getSizeMonitorFence(directSubmission.rootDeviceEnvironment); + + size_t disabledSizeEnd = directSubmission.getSizeEnd(false); + EXPECT_EQ(disabledSizeEnd, regularSizeEnd + tagUpdateSize); + + directSubmission.tagValueSetValue = 0x4343123ull; + directSubmission.tagAddressSetValue = 0xBEEF00000ull; + directSubmission.stopRingBuffer(false); + size_t expectedDispatchSize = disabledSizeEnd; + EXPECT_LE(directSubmission.ringCommandStream.getUsed(), expectedDispatchSize); + EXPECT_GE(directSubmission.ringCommandStream.getUsed() + MemoryConstants::cacheLineSize, expectedDispatchSize); + + HardwareParse hwParse; + hwParse.parsePipeControl = true; + hwParse.parseCommands(directSubmission.ringCommandStream, 0); + hwParse.findHardwareCommands(); + MI_BATCH_BUFFER_END *bbEnd = hwParse.getCommand(); + EXPECT_NE(nullptr, bbEnd); + + bool foundFenceUpdate = false; + for (auto it = hwParse.pipeControlList.begin(); it != hwParse.pipeControlList.end(); it++) { + auto pipeControl = genCmdCast(*it); + uint64_t data = pipeControl->getImmediateData(); + if ((directSubmission.tagAddressSetValue == NEO::UnitTestHelper::getPipeControlPostSyncAddress(*pipeControl)) && + (directSubmission.tagValueSetValue == data)) { + foundFenceUpdate = true; + break; + } + } + EXPECT_TRUE(foundFenceUpdate); +} + +HWTEST2_F(DrmDirectSubmissionTest, givenRelaxedOrderingSchedulerRequiredWhenAskingForCmdsSizeThenReturnCorrectValue, IsAtLeastXeHpcCore) { + using Dispatcher = RenderDispatcher; + MockDrmDirectSubmission directSubmission(*device->getDefaultEngine().commandStreamReceiver); + + size_t expectedBaseSemaphoreSectionSize = directSubmission.getSizePrefetchMitigation(); + if (directSubmission.isDisablePrefetcherRequired) { + expectedBaseSemaphoreSectionSize += 2 * directSubmission.getSizeDisablePrefetcher(); + } + + directSubmission.relaxedOrderingEnabled = true; + if (directSubmission.miMemFenceRequired) { + expectedBaseSemaphoreSectionSize += MemorySynchronizationCommands::getSizeForSingleAdditionalSynchronizationForDirectSubmission(device->getRootDeviceEnvironment()); + } + + EXPECT_EQ(expectedBaseSemaphoreSectionSize + RelaxedOrderingHelper::DynamicSchedulerSizeAndOffsetSection::totalSize, directSubmission.getSizeSemaphoreSection(true)); + EXPECT_EQ(expectedBaseSemaphoreSectionSize + EncodeSemaphore::getSizeMiSemaphoreWait(), directSubmission.getSizeSemaphoreSection(false)); + + size_t expectedBaseEndSize = Dispatcher::getSizeStopCommandBuffer() + + Dispatcher::getSizeCacheFlush(directSubmission.rootDeviceEnvironment) + + (Dispatcher::getSizeStartCommandBuffer() - Dispatcher::getSizeStopCommandBuffer()) + + MemoryConstants::cacheLineSize; + if (directSubmission.disableMonitorFence) { + expectedBaseEndSize += Dispatcher::getSizeMonitorFence(device->getRootDeviceEnvironment()); + } + + EXPECT_EQ(expectedBaseEndSize + directSubmission.getSizeDispatchRelaxedOrderingQueueStall(), directSubmission.getSizeEnd(true)); + EXPECT_EQ(expectedBaseEndSize, directSubmission.getSizeEnd(false)); } \ No newline at end of file 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 fe57601362..90d017f6f9 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 @@ -7,6 +7,7 @@ #include "shared/source/command_stream/submissions_aggregator.h" #include "shared/source/direct_submission/dispatchers/render_dispatcher.h" +#include "shared/source/direct_submission/relaxed_ordering_helper.h" #include "shared/source/gmm_helper/gmm_helper.h" #include "shared/source/helpers/compiler_product_helper.h" #include "shared/source/helpers/flush_stamp.h" @@ -1220,4 +1221,81 @@ TEST(DirectSubmissionControllerWindowsTest, givenDirectSubmissionControllerWhenC EXPECT_EQ(1u, SysCalls::timeBeginPeriodLastValue); EXPECT_EQ(1u, SysCalls::timeEndPeriodLastValue); } + +HWTEST_F(WddmDirectSubmissionTest, + givenDirectSubmissionDisableMonitorFenceWhenStopRingIsCalledThenExpectStopCommandAndMonitorFenceDispatched) { + using PIPE_CONTROL = typename FamilyType::PIPE_CONTROL; + using MI_BATCH_BUFFER_END = typename FamilyType::MI_BATCH_BUFFER_END; + using Dispatcher = RenderDispatcher; + + MockWddmDirectSubmission regularDirectSubmission(*device->getDefaultEngine().commandStreamReceiver); + regularDirectSubmission.disableMonitorFence = false; + size_t regularSizeEnd = regularDirectSubmission.getSizeEnd(false); + + MockWddmDirectSubmission directSubmission(*device->getDefaultEngine().commandStreamReceiver); + directSubmission.setTagAddressValue = true; + bool ret = directSubmission.allocateResources(); + directSubmission.ringStart = true; + + EXPECT_TRUE(ret); + + size_t tagUpdateSize = 2 * Dispatcher::getSizeMonitorFence(directSubmission.rootDeviceEnvironment); + + size_t disabledSizeEnd = directSubmission.getSizeEnd(false); + EXPECT_EQ(disabledSizeEnd, regularSizeEnd + tagUpdateSize); + + directSubmission.tagValueSetValue = 0x4343123ull; + directSubmission.tagAddressSetValue = 0xBEEF00000ull; + directSubmission.stopRingBuffer(false); + size_t expectedDispatchSize = disabledSizeEnd; + EXPECT_LE(directSubmission.ringCommandStream.getUsed(), expectedDispatchSize); + EXPECT_GE(directSubmission.ringCommandStream.getUsed() + MemoryConstants::cacheLineSize, expectedDispatchSize); + + HardwareParse hwParse; + hwParse.parsePipeControl = true; + hwParse.parseCommands(directSubmission.ringCommandStream, 0); + hwParse.findHardwareCommands(); + MI_BATCH_BUFFER_END *bbEnd = hwParse.getCommand(); + EXPECT_NE(nullptr, bbEnd); + + bool foundFenceUpdate = false; + for (auto it = hwParse.pipeControlList.begin(); it != hwParse.pipeControlList.end(); it++) { + auto pipeControl = genCmdCast(*it); + uint64_t data = pipeControl->getImmediateData(); + if ((directSubmission.tagAddressSetValue == NEO::UnitTestHelper::getPipeControlPostSyncAddress(*pipeControl)) && + (directSubmission.tagValueSetValue == data)) { + foundFenceUpdate = true; + break; + } + } + EXPECT_TRUE(foundFenceUpdate); +} + +HWTEST2_F(WddmDirectSubmissionTest, givenRelaxedOrderingSchedulerRequiredWhenAskingForCmdsSizeThenReturnCorrectValue, IsAtLeastXeHpcCore) { + using Dispatcher = RenderDispatcher; + MockWddmDirectSubmission directSubmission(*device->getDefaultEngine().commandStreamReceiver); + + size_t expectedBaseSemaphoreSectionSize = directSubmission.getSizePrefetchMitigation(); + if (directSubmission.isDisablePrefetcherRequired) { + expectedBaseSemaphoreSectionSize += 2 * directSubmission.getSizeDisablePrefetcher(); + } + + directSubmission.relaxedOrderingEnabled = true; + if (directSubmission.miMemFenceRequired) { + expectedBaseSemaphoreSectionSize += MemorySynchronizationCommands::getSizeForSingleAdditionalSynchronizationForDirectSubmission(device->getRootDeviceEnvironment()); + } + + EXPECT_EQ(expectedBaseSemaphoreSectionSize + RelaxedOrderingHelper::DynamicSchedulerSizeAndOffsetSection::totalSize, directSubmission.getSizeSemaphoreSection(true)); + EXPECT_EQ(expectedBaseSemaphoreSectionSize + EncodeSemaphore::getSizeMiSemaphoreWait(), directSubmission.getSizeSemaphoreSection(false)); + + size_t expectedBaseEndSize = Dispatcher::getSizeStopCommandBuffer() + + Dispatcher::getSizeCacheFlush(directSubmission.rootDeviceEnvironment) + + (Dispatcher::getSizeStartCommandBuffer() - Dispatcher::getSizeStopCommandBuffer()) + + MemoryConstants::cacheLineSize; + if (directSubmission.disableMonitorFence) { + expectedBaseEndSize += 2 * Dispatcher::getSizeMonitorFence(device->getRootDeviceEnvironment()); + } + EXPECT_EQ(expectedBaseEndSize + directSubmission.getSizeDispatchRelaxedOrderingQueueStall(), directSubmission.getSizeEnd(true)); + EXPECT_EQ(expectedBaseEndSize, directSubmission.getSizeEnd(false)); +} } // namespace NEO diff --git a/shared/test/unit_test/mocks/windows/mock_wddm_direct_submission.h b/shared/test/unit_test/mocks/windows/mock_wddm_direct_submission.h index 39102b1cfd..7eb821ea97 100644 --- a/shared/test/unit_test/mocks/windows/mock_wddm_direct_submission.h +++ b/shared/test/unit_test/mocks/windows/mock_wddm_direct_submission.h @@ -22,8 +22,12 @@ struct MockWddmDirectSubmission : public WddmDirectSubmission