diff --git a/shared/source/direct_submission/direct_submission_hw.h b/shared/source/direct_submission/direct_submission_hw.h index ad6d591b60..d26a0f70fe 100644 --- a/shared/source/direct_submission/direct_submission_hw.h +++ b/shared/source/direct_submission/direct_submission_hw.h @@ -105,8 +105,9 @@ class DirectSubmissionHw { virtual bool allocateOsResources() = 0; virtual bool submit(uint64_t gpuAddress, size_t size) = 0; virtual bool handleResidency() = 0; - virtual void handleNewResourcesSubmission(); - virtual size_t getSizeNewResourceHandler(); + void handleNewResourcesSubmission(); + bool isNewResourceHandleNeeded(); + size_t getSizeNewResourceHandler(); virtual void handleStopRingBuffer(){}; virtual uint64_t switchRingBuffers(); virtual void handleSwitchRingBuffers() = 0; diff --git a/shared/source/direct_submission/direct_submission_hw.inl b/shared/source/direct_submission/direct_submission_hw.inl index 4c4cb79799..e663001456 100644 --- a/shared/source/direct_submission/direct_submission_hw.inl +++ b/shared/source/direct_submission/direct_submission_hw.inl @@ -1000,11 +1000,28 @@ inline void DirectSubmissionHw::setReturnAddress(void *re template inline void DirectSubmissionHw::handleNewResourcesSubmission() { + if (isNewResourceHandleNeeded()) { + auto tlbFlushCounter = this->osContext.peekTlbFlushCounter(); + Dispatcher::dispatchTlbFlush(this->ringCommandStream, this->gpuVaForMiFlush, this->rootDeviceEnvironment); + this->osContext.setTlbFlushed(tlbFlushCounter); + } } template -inline size_t DirectSubmissionHw::getSizeNewResourceHandler() { - return 0u; +size_t DirectSubmissionHw::getSizeNewResourceHandler() { + // Overestimate to avoid race + return Dispatcher::getSizeTlbFlush(this->rootDeviceEnvironment); +} + +template +bool DirectSubmissionHw::isNewResourceHandleNeeded() { + auto newResourcesBound = this->osContext.isTlbFlushRequired(); + + if (DebugManager.flags.DirectSubmissionNewResourceTlbFlush.get() != -1) { + newResourcesBound = DebugManager.flags.DirectSubmissionNewResourceTlbFlush.get(); + } + + return newResourcesBound; } template diff --git a/shared/source/direct_submission/linux/drm_direct_submission.h b/shared/source/direct_submission/linux/drm_direct_submission.h index b1f6e6147a..aaf8b90334 100644 --- a/shared/source/direct_submission/linux/drm_direct_submission.h +++ b/shared/source/direct_submission/linux/drm_direct_submission.h @@ -27,9 +27,6 @@ class DrmDirectSubmission : public DirectSubmissionHw { bool submit(uint64_t gpuAddress, size_t size) override; bool handleResidency() override; - bool isNewResourceHandleNeeded(); - void handleNewResourcesSubmission() override; - size_t getSizeNewResourceHandler() override; void handleStopRingBuffer() override; void handleSwitchRingBuffers() override; uint64_t updateTagValue() override; diff --git a/shared/source/direct_submission/linux/drm_direct_submission.inl b/shared/source/direct_submission/linux/drm_direct_submission.inl index afcf79ea12..8d5bde6bc7 100644 --- a/shared/source/direct_submission/linux/drm_direct_submission.inl +++ b/shared/source/direct_submission/linux/drm_direct_submission.inl @@ -189,35 +189,6 @@ bool DrmDirectSubmission::handleResidency() { return true; } -template -bool DrmDirectSubmission::isNewResourceHandleNeeded() { - auto osContextLinux = static_cast(&this->osContext); - auto newResourcesBound = osContextLinux->isTlbFlushRequired(); - - if (DebugManager.flags.DirectSubmissionNewResourceTlbFlush.get() != -1) { - newResourcesBound = DebugManager.flags.DirectSubmissionNewResourceTlbFlush.get(); - } - - return newResourcesBound; -} - -template -void DrmDirectSubmission::handleNewResourcesSubmission() { - if (isNewResourceHandleNeeded()) { - auto osContextLinux = static_cast(&this->osContext); - auto tlbFlushCounter = osContextLinux->peekTlbFlushCounter(); - - Dispatcher::dispatchTlbFlush(this->ringCommandStream, this->gpuVaForMiFlush, this->rootDeviceEnvironment); - osContextLinux->setTlbFlushed(tlbFlushCounter); - } -} - -template -size_t DrmDirectSubmission::getSizeNewResourceHandler() { - // Overestimate to avoid race - return Dispatcher::getSizeTlbFlush(this->rootDeviceEnvironment); -} - template void DrmDirectSubmission::handleStopRingBuffer() { if (this->disableMonitorFence) { diff --git a/shared/source/os_interface/linux/os_context_linux.h b/shared/source/os_interface/linux/os_context_linux.h index a0fe7f2198..c4236cdca9 100644 --- a/shared/source/os_interface/linux/os_context_linux.h +++ b/shared/source/os_interface/linux/os_context_linux.h @@ -7,7 +7,6 @@ #pragma once -#include "shared/source/helpers/mt_helpers.h" #include "shared/source/memory_manager/definitions/engine_limits.h" #include "shared/source/os_interface/os_context.h" @@ -28,18 +27,6 @@ class OsContextLinux : public OsContext { void setEngineFlag(unsigned int engineFlag) { this->engineFlag = engineFlag; } const std::vector &getDrmContextIds() const { return drmContextIds; } const std::vector &getDrmVmIds() const { return drmVmIds; } - void setNewResourceBound() { - tlbFlushCounter++; - }; - - uint32_t peekTlbFlushCounter() const { return tlbFlushCounter.load(); } - - void setTlbFlushed(uint32_t newCounter) { - NEO::MultiThreadHelpers::interlockedMax(lastFlushedTlbFlushCounter, newCounter); - }; - bool isTlbFlushRequired() const { - return (tlbFlushCounter.load() > lastFlushedTlbFlushCounter.load()); - }; bool isDirectSubmissionSupported(const HardwareInfo &hwInfo) const override; Drm &getDrm() const; void waitForPagingFence(); @@ -62,8 +49,6 @@ class OsContextLinux : public OsContext { protected: bool initializeContext() override; - std::atomic tlbFlushCounter{0}; - std::atomic lastFlushedTlbFlushCounter{0}; unsigned int engineFlag = 0; std::vector drmContextIds; std::vector drmVmIds; diff --git a/shared/source/os_interface/os_context.h b/shared/source/os_interface/os_context.h index c6a69240c5..981b16ff5c 100644 --- a/shared/source/os_interface/os_context.h +++ b/shared/source/os_interface/os_context.h @@ -7,6 +7,7 @@ #pragma once #include "shared/source/helpers/engine_node_helper.h" +#include "shared/source/helpers/mt_helpers.h" #include "shared/source/utilities/reference_tracked_object.h" #include @@ -57,9 +58,25 @@ class OsContext : public ReferenceTrackedObject { uint32_t getRootDeviceIndex() { return rootDeviceIndex; } + void setNewResourceBound() { + tlbFlushCounter++; + }; + + uint32_t peekTlbFlushCounter() const { return tlbFlushCounter.load(); } + + void setTlbFlushed(uint32_t newCounter) { + NEO::MultiThreadHelpers::interlockedMax(lastFlushedTlbFlushCounter, newCounter); + }; + bool isTlbFlushRequired() const { + return (tlbFlushCounter.load() > lastFlushedTlbFlushCounter.load()); + }; + protected: virtual bool initializeContext() { return true; } + std::atomic tlbFlushCounter{0}; + std::atomic lastFlushedTlbFlushCounter{0}; + const uint32_t rootDeviceIndex; const uint32_t contextId; const DeviceBitfield deviceBitfield; diff --git a/shared/source/os_interface/windows/wddm/wddm.cpp b/shared/source/os_interface/windows/wddm/wddm.cpp index d5a5382abc..27cf4764d2 100644 --- a/shared/source/os_interface/windows/wddm/wddm.cpp +++ b/shared/source/os_interface/windows/wddm/wddm.cpp @@ -511,6 +511,7 @@ bool Wddm::makeResident(const D3DKMT_HANDLE *handles, uint32_t count, bool cantT } kmDafListener->notifyMakeResident(featureTable->flags.ftrKmdDaf, getAdapter(), device, handles, count, getGdi()->escape); + this->setNewResourceBoundToPageTable(); return success; } @@ -1249,4 +1250,17 @@ void Wddm::populateIpVersion(HardwareInfo &hwInfo) { } } +void Wddm::setNewResourceBoundToPageTable() { + if (!this->rootDeviceEnvironment.getProductHelper().isTlbFlushRequired()) { + return; + } + for (auto rootDeviceIndex = 0u; rootDeviceIndex < rootDeviceEnvironment.executionEnvironment.rootDeviceEnvironments.size(); rootDeviceIndex++) { + if (rootDeviceEnvironment.executionEnvironment.rootDeviceEnvironments[rootDeviceIndex].get() == &rootDeviceEnvironment) { + for (const auto &engine : rootDeviceEnvironment.executionEnvironment.memoryManager->getRegisteredEngines(rootDeviceIndex)) { + engine.osContext->setNewResourceBound(); + } + } + } +} + } // namespace NEO diff --git a/shared/source/os_interface/windows/wddm/wddm.h b/shared/source/os_interface/windows/wddm/wddm.h index 6b5c9902e4..3a5fd45fff 100644 --- a/shared/source/os_interface/windows/wddm/wddm.h +++ b/shared/source/os_interface/windows/wddm/wddm.h @@ -224,6 +224,7 @@ class Wddm : public DriverModel { void setPlatformSupportEvictIfNecessaryFlag(const ProductHelper &productHelper); void populateAdditionalAdapterInfoOptions(const ADAPTER_INFO_KMD &adapterInfo); void populateIpVersion(HardwareInfo &hwInfo); + void setNewResourceBoundToPageTable(); GMM_GFX_PARTITIONING gfxPartition{}; ADAPTER_BDF adapterBDF{}; diff --git a/shared/test/common/mocks/mock_direct_submission_hw.h b/shared/test/common/mocks/mock_direct_submission_hw.h index bc72998687..6634b8ecc8 100644 --- a/shared/test/common/mocks/mock_direct_submission_hw.h +++ b/shared/test/common/mocks/mock_direct_submission_hw.h @@ -44,6 +44,7 @@ struct MockDirectSubmissionHw : public DirectSubmissionHw using BaseClass::getSizeDispatch; using BaseClass::getSizeDispatchRelaxedOrderingQueueStall; using BaseClass::getSizeEnd; + using BaseClass::getSizeNewResourceHandler; using BaseClass::getSizePartitionRegisterConfigurationSection; using BaseClass::getSizePrefetchMitigation; using BaseClass::getSizeSemaphoreSection; diff --git a/shared/test/common/mocks/mock_wddm.h b/shared/test/common/mocks/mock_wddm.h index e34dc4196f..c994344ab4 100644 --- a/shared/test/common/mocks/mock_wddm.h +++ b/shared/test/common/mocks/mock_wddm.h @@ -53,6 +53,7 @@ class WddmMock : public Wddm { using Wddm::populateIpVersion; using Wddm::residencyLogger; using Wddm::rootDeviceEnvironment; + using Wddm::setNewResourceBoundToPageTable; using Wddm::setPlatformSupportEvictIfNecessaryFlag; using Wddm::temporaryResources; using Wddm::timestampFrequency; 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 6a1c5b6bec..6d095dadc9 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 @@ -568,7 +568,7 @@ HWTEST_F(DirectSubmissionTest, givenDirectSubmissionWhenGetDispatchSizeThenExpec size_t expectedSize = directSubmission.getSizeStartSection() + Dispatcher::getSizeCacheFlush(directSubmission.rootDeviceEnvironment) + Dispatcher::getSizeMonitorFence(directSubmission.rootDeviceEnvironment) + - directSubmission.getSizeSemaphoreSection(false); + directSubmission.getSizeSemaphoreSection(false) + directSubmission.getSizeNewResourceHandler(); size_t actualSize = directSubmission.getSizeDispatch(false, false); EXPECT_EQ(expectedSize, actualSize); @@ -585,7 +585,7 @@ HWTEST_F(DirectSubmissionTest, size_t expectedSize = Dispatcher::getSizeStoreDwordCommand() + Dispatcher::getSizeCacheFlush(directSubmission.rootDeviceEnvironment) + Dispatcher::getSizeMonitorFence(directSubmission.rootDeviceEnvironment) + - directSubmission.getSizeSemaphoreSection(false); + directSubmission.getSizeSemaphoreSection(false) + directSubmission.getSizeNewResourceHandler(); size_t actualSize = directSubmission.getSizeDispatch(false, false); EXPECT_EQ(expectedSize, actualSize); } @@ -600,7 +600,7 @@ HWTEST_F(DirectSubmissionTest, directSubmission.workloadMode = 2; size_t expectedSize = Dispatcher::getSizeCacheFlush(directSubmission.rootDeviceEnvironment) + Dispatcher::getSizeMonitorFence(directSubmission.rootDeviceEnvironment) + - directSubmission.getSizeSemaphoreSection(false); + directSubmission.getSizeSemaphoreSection(false) + directSubmission.getSizeNewResourceHandler(); size_t actualSize = directSubmission.getSizeDispatch(false, false); EXPECT_EQ(expectedSize, actualSize); } @@ -613,7 +613,7 @@ HWTEST_F(DirectSubmissionTest, directSubmission.disableCacheFlush = true; size_t expectedSize = directSubmission.getSizeStartSection() + Dispatcher::getSizeMonitorFence(directSubmission.rootDeviceEnvironment) + - directSubmission.getSizeSemaphoreSection(false); + directSubmission.getSizeSemaphoreSection(false) + directSubmission.getSizeNewResourceHandler(); size_t actualSize = directSubmission.getSizeDispatch(false, false); EXPECT_EQ(expectedSize, actualSize); @@ -628,7 +628,7 @@ HWTEST_F(DirectSubmissionTest, directSubmission.disableMonitorFence = true; size_t expectedSize = directSubmission.getSizeStartSection() + Dispatcher::getSizeCacheFlush(directSubmission.rootDeviceEnvironment) + - directSubmission.getSizeSemaphoreSection(false); + directSubmission.getSizeSemaphoreSection(false) + directSubmission.getSizeNewResourceHandler(); size_t actualSize = directSubmission.getSizeDispatch(false, false); EXPECT_EQ(expectedSize, actualSize); @@ -946,7 +946,7 @@ HWTEST_F(DirectSubmissionTest, size_t expectedSize = Dispatcher::getSizePreemption() + directSubmission.getSizeSemaphoreSection(false) + directSubmission.getDiagnosticModeSection(); - expectedSize += expectedExecCount * directSubmission.getSizeDispatch(false, false); + expectedSize += expectedExecCount * (directSubmission.getSizeDispatch(false, false) - directSubmission.getSizeNewResourceHandler()); if (directSubmission.miMemFenceRequired) { expectedSize += directSubmission.getSizeSystemMemoryFenceAddress(); @@ -1051,7 +1051,7 @@ HWTEST_F(DirectSubmissionTest, size_t expectedSize = Dispatcher::getSizePreemption() + directSubmission.getSizeSemaphoreSection(false); size_t expectedDispatch = directSubmission.getSizeSemaphoreSection(false); - EXPECT_EQ(expectedDispatch, directSubmission.getSizeDispatch(false, false)); + EXPECT_EQ(expectedDispatch, directSubmission.getSizeDispatch(false, false) - directSubmission.getSizeNewResourceHandler()); expectedSize += expectedExecCount * expectedDispatch; if (directSubmission.miMemFenceRequired) { 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 8002d525e7..9f87303dd1 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 @@ -244,7 +244,7 @@ HWCMDTEST_F(IGFX_XE_HP_CORE, DirectSubmissionDispatchBufferTest, EXPECT_EQ(1u, directSubmission.submitCount); EXPECT_EQ(2u, directSubmission.handleResidencyCount); - EXPECT_EQ(directSubmission.getSizeDispatch(false, false), directSubmission.ringCommandStream.getUsed()); + EXPECT_EQ(directSubmission.getSizeDispatch(false, false) - directSubmission.getSizeNewResourceHandler(), directSubmission.ringCommandStream.getUsed()); EXPECT_TRUE(directSubmission.ringStart); HardwareParse hwParse; @@ -431,7 +431,7 @@ HWTEST_F(DirectSubmissionDispatchBufferTest, directSubmission.tagValueSetValue = 0x4343123ull; directSubmission.tagAddressSetValue = 0xBEEF00000ull; directSubmission.dispatchWorkloadSection(batchBuffer); - size_t expectedDispatchSize = disabledSizeDispatch; + size_t expectedDispatchSize = disabledSizeDispatch - directSubmission.getSizeNewResourceHandler(); EXPECT_EQ(expectedDispatchSize, directSubmission.ringCommandStream.getUsed()); HardwareParse hwParse; @@ -478,7 +478,7 @@ HWTEST_F(DirectSubmissionDispatchBufferTest, EXPECT_EQ(disabledSizeDispatch, (regularSizeDispatch - flushSize)); directSubmission.dispatchWorkloadSection(batchBuffer); - size_t expectedDispatchSize = disabledSizeDispatch; + size_t expectedDispatchSize = disabledSizeDispatch - directSubmission.getSizeNewResourceHandler(); EXPECT_EQ(expectedDispatchSize, directSubmission.ringCommandStream.getUsed()); HardwareParse hwParse; @@ -529,7 +529,7 @@ HWTEST_F(DirectSubmissionDispatchBufferTest, directSubmission.workloadModeOneExpectedValue = 0x40u; directSubmission.semaphoreGpuVa = 0xAFF0000; directSubmission.dispatchWorkloadSection(batchBuffer); - size_t expectedDispatchSize = debugSizeDispatch; + size_t expectedDispatchSize = debugSizeDispatch - directSubmission.getSizeNewResourceHandler(); EXPECT_EQ(expectedDispatchSize, directSubmission.ringCommandStream.getUsed()); HardwareParse hwParse; @@ -571,7 +571,7 @@ HWTEST_F(DirectSubmissionDispatchBufferTest, directSubmission.currentQueueWorkCount = 0x40u; directSubmission.dispatchWorkloadSection(batchBuffer); - size_t expectedDispatchSize = debugSizeDispatch; + size_t expectedDispatchSize = debugSizeDispatch - directSubmission.getSizeNewResourceHandler(); EXPECT_EQ(expectedDispatchSize, directSubmission.ringCommandStream.getUsed()); HardwareParse hwParse; @@ -624,7 +624,7 @@ HWTEST_F(DirectSubmissionDispatchBufferTest, EXPECT_EQ(1u, directSubmission.submitCount); EXPECT_EQ(2u, directSubmission.handleResidencyCount); - EXPECT_EQ(sizeUsed + directSubmission.getSizeDispatch(false, false), directSubmission.ringCommandStream.getUsed()); + EXPECT_EQ(sizeUsed + directSubmission.getSizeDispatch(false, false) - directSubmission.getSizeNewResourceHandler(), directSubmission.ringCommandStream.getUsed()); EXPECT_TRUE(directSubmission.ringStart); HardwareParse hwParse; @@ -666,7 +666,7 @@ HWTEST_F(DirectSubmissionDispatchBufferTest, EXPECT_EQ(oldRingAllocation->getGpuAddress(), directSubmission.submitGpuAddress); EXPECT_EQ(2u, directSubmission.handleResidencyCount); - size_t dispatchSize = submitSize + directSubmission.getSizeDispatch(false, false); + size_t dispatchSize = submitSize + directSubmission.getSizeDispatch(false, false) - directSubmission.getSizeNewResourceHandler(); EXPECT_EQ(dispatchSize, directSubmission.ringCommandStream.getUsed()); EXPECT_TRUE(directSubmission.ringStart); @@ -709,7 +709,7 @@ HWTEST_F(DirectSubmissionDispatchBufferTest, EXPECT_EQ(1u, directSubmission.submitCount); EXPECT_EQ(2u, directSubmission.handleResidencyCount); - EXPECT_EQ(directSubmission.getSizeDispatch(false, false), directSubmission.ringCommandStream.getUsed()); + EXPECT_EQ(directSubmission.getSizeDispatch(false, false) - directSubmission.getSizeNewResourceHandler(), directSubmission.ringCommandStream.getUsed()); EXPECT_TRUE(directSubmission.ringStart); } @@ -746,7 +746,7 @@ HWTEST_F(DirectSubmissionDispatchBufferTest, EXPECT_EQ(submitSize, directSubmission.submitSize); EXPECT_EQ(2u, directSubmission.handleResidencyCount); - size_t dispatchSize = submitSize + directSubmission.getSizeDispatch(false, false); + size_t dispatchSize = submitSize + directSubmission.getSizeDispatch(false, false) - directSubmission.getSizeNewResourceHandler(); EXPECT_EQ(dispatchSize, directSubmission.ringCommandStream.getUsed()); EXPECT_TRUE(directSubmission.ringStart); 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 46f5d72a13..64bbe3d2a5 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 @@ -306,6 +306,24 @@ HWTEST_F(WddmDirectSubmissionTest, givenWddmWhenSwitchingRingBufferNotStartedThe EXPECT_EQ(nullptr, bbStart); } +HWTEST_F(WddmDirectSubmissionTest, givenDirectSubmissionNewResourceTlbFlushWhenHandleNewResourcesSubmissionThenDispatchProperCommands) { + DebugManagerStateRestore restorer; + DebugManager.flags.DirectSubmissionNewResourceTlbFlush.set(1); + MockWddmDirectSubmission> wddmDirectSubmission(*device->getDefaultEngine().commandStreamReceiver); + + bool ret = wddmDirectSubmission.initialize(false, false); + EXPECT_TRUE(ret); + + size_t usedSpace = wddmDirectSubmission.ringCommandStream.getUsed(); + EXPECT_EQ(0u, usedSpace); + + EXPECT_TRUE(wddmDirectSubmission.isNewResourceHandleNeeded()); + + wddmDirectSubmission.handleNewResourcesSubmission(); + + EXPECT_EQ(wddmDirectSubmission.ringCommandStream.getUsed(), usedSpace + wddmDirectSubmission.getSizeNewResourceHandler()); +} + HWTEST_F(WddmDirectSubmissionTest, givenWddmWhenSwitchingRingBufferStartedAndWaitFenceUpdateThenExpectNewRingBufferAllocated) { using MI_BATCH_BUFFER_START = typename FamilyType::MI_BATCH_BUFFER_START; MockWddmDirectSubmission> wddmDirectSubmission(*device->getDefaultEngine().commandStreamReceiver); 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 9af072cec1..646734a4c3 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 @@ -19,13 +19,16 @@ struct MockWddmDirectSubmission : public WddmDirectSubmission(OsContext::create(nullptr, 0, 0, EngineDescriptorHelper::getDefaultDescriptor())); + + EXPECT_EQ(osContext->peekTlbFlushCounter(), 0u); + EXPECT_FALSE(osContext->isTlbFlushRequired()); + + osContext->setNewResourceBound(); + + EXPECT_EQ(osContext->peekTlbFlushCounter(), 1u); + EXPECT_TRUE(osContext->isTlbFlushRequired()); + + osContext->setTlbFlushed(1u); + + EXPECT_EQ(osContext->peekTlbFlushCounter(), 1u); + EXPECT_FALSE(osContext->isTlbFlushRequired()); +} + struct DeferredOsContextCreationTests : ::testing::Test { void SetUp() override { device = std::unique_ptr{MockDevice::createWithNewExecutionEnvironment(defaultHwInfo.get())}; diff --git a/shared/test/unit_test/os_interface/windows/device_command_stream_tests.cpp b/shared/test/unit_test/os_interface/windows/device_command_stream_tests.cpp index 91e3a2acc3..ebf55e5587 100644 --- a/shared/test/unit_test/os_interface/windows/device_command_stream_tests.cpp +++ b/shared/test/unit_test/os_interface/windows/device_command_stream_tests.cpp @@ -1171,6 +1171,7 @@ HWTEST_TEMPLATED_F(WddmCommandStreamMockGdiTest, givenDirectSubmissionEnabledOnR if (directSubmission->isRelaxedOrderingEnabled()) { expectedSize += RelaxedOrderingHelper::getSizeRegistersInit(); } + expectedSize -= directSubmission->getSizeNewResourceHandler(); EXPECT_EQ(expectedSize, actualDispatchSize); memoryManager->freeGraphicsMemory(commandBuffer); @@ -1218,6 +1219,7 @@ HWTEST_TEMPLATED_F(WddmCommandStreamMockGdiTest, givenDirectSubmissionEnabledOnB if (directSubmission->isRelaxedOrderingEnabled()) { expectedSize += RelaxedOrderingHelper::getSizeRegistersInit(); } + expectedSize -= directSubmission->getSizeNewResourceHandler(); EXPECT_EQ(expectedSize, actualDispatchSize); memoryManager->freeGraphicsMemory(commandBuffer); diff --git a/shared/test/unit_test/os_interface/windows/wddm_kmdaf_listener_tests.cpp b/shared/test/unit_test/os_interface/windows/wddm_kmdaf_listener_tests.cpp index d6cb0cf052..7c68bcf899 100644 --- a/shared/test/unit_test/os_interface/windows/wddm_kmdaf_listener_tests.cpp +++ b/shared/test/unit_test/os_interface/windows/wddm_kmdaf_listener_tests.cpp @@ -42,6 +42,7 @@ class WddmWithKmDafMock : public Wddm { class WddmKmDafListenerTest : public ::testing::Test { public: void SetUp() { + executionEnvironment.initializeMemoryManager(); rootDeviceEnvironment = executionEnvironment.rootDeviceEnvironments[0].get(); auto osEnvironment = new OsEnvironmentWin(); osEnvironment->gdi.reset(new MockGdi()); diff --git a/shared/test/unit_test/os_interface/windows/wddm_tests.cpp b/shared/test/unit_test/os_interface/windows/wddm_tests.cpp index b747c22794..c7b6b1b282 100644 --- a/shared/test/unit_test/os_interface/windows/wddm_tests.cpp +++ b/shared/test/unit_test/os_interface/windows/wddm_tests.cpp @@ -115,6 +115,52 @@ TEST_F(WddmTests, WhenCallingReInitializeContextWithContextCreateDisabledFlagEna EXPECT_EQ(0u, newContext->getWddmContextHandle()); } +TEST(WddmNewRsourceTest, whenSetNewResourcesBoundToPageTableThenSetInContextFromProperRootDeviceEnvironment) { + MockExecutionEnvironment executionEnvironment; + executionEnvironment.prepareRootDeviceEnvironments(2); + WddmMock *mockWddm; + for (int i = 0; i < 2; ++i) { + *executionEnvironment.rootDeviceEnvironments[i]->getMutableHardwareInfo() = *defaultHwInfo; + auto wddm = static_cast(Wddm::createWddm(nullptr, *executionEnvironment.rootDeviceEnvironments[i])); + auto wddmMockInterface = new WddmMockInterface20(*wddm); + wddm->wddmInterface.reset(wddmMockInterface); + mockWddm = wddm; + executionEnvironment.rootDeviceEnvironments[i]->osInterface = std::make_unique(); + executionEnvironment.rootDeviceEnvironments[i]->osInterface->setDriverModel(std::unique_ptr(wddm)); + executionEnvironment.rootDeviceEnvironments[i]->memoryOperationsInterface = std::make_unique(wddm); + executionEnvironment.rootDeviceEnvironments[i]->initHelpers(); + } + executionEnvironment.initializeMemoryManager(); + auto csr1 = std::unique_ptr(createCommandStream(executionEnvironment, 0, 1)); + auto csr2 = std::unique_ptr(createCommandStream(executionEnvironment, 1, 1)); + EngineDescriptor engineDesc({aub_stream::ENGINE_CCS, EngineUsage::Regular}, 1, PreemptionMode::Disabled, false, false); + executionEnvironment.memoryManager->createAndRegisterOsContext(csr1.get(), engineDesc); + executionEnvironment.memoryManager->createAndRegisterOsContext(csr2.get(), engineDesc); + + auto engines = executionEnvironment.memoryManager->getRegisteredEngines(0); + for (const auto &engine : engines) { + EXPECT_EQ(engine.osContext->peekTlbFlushCounter(), 0u); + } + engines = executionEnvironment.memoryManager->getRegisteredEngines(1); + for (const auto &engine : engines) { + EXPECT_EQ(engine.osContext->peekTlbFlushCounter(), 0u); + } + + mockWddm->setNewResourceBoundToPageTable(); + + engines = executionEnvironment.memoryManager->getRegisteredEngines(0); + for (const auto &engine : engines) { + EXPECT_EQ(engine.osContext->peekTlbFlushCounter(), 0u); + } + engines = executionEnvironment.memoryManager->getRegisteredEngines(1); + for (const auto &engine : engines) { + EXPECT_EQ(engine.osContext->peekTlbFlushCounter(), executionEnvironment.rootDeviceEnvironments[1]->getProductHelper().isTlbFlushRequired()); + } + + executionEnvironment.memoryManager->unregisterEngineForCsr(csr1.get()); + executionEnvironment.memoryManager->unregisterEngineForCsr(csr2.get()); +} + TEST(WddmPciSpeedInfoTest, WhenGetPciSpeedInfoIsCalledThenUnknownIsReturned) { MockExecutionEnvironment executionEnvironment; RootDeviceEnvironment rootDeviceEnvironment(executionEnvironment);