diff --git a/shared/source/os_interface/windows/wddm_memory_manager.cpp b/shared/source/os_interface/windows/wddm_memory_manager.cpp index 5c424807df..de5ef4ccd2 100644 --- a/shared/source/os_interface/windows/wddm_memory_manager.cpp +++ b/shared/source/os_interface/windows/wddm_memory_manager.cpp @@ -761,11 +761,11 @@ void WddmMemoryManager::freeGraphicsMemoryImpl(GraphicsAllocation *gfxAllocation cleanGraphicsMemoryCreatedFromHostPtr(gfxAllocation); } else { if (input->getResourceHandle() != 0) { - [[maybe_unused]] auto status = tryDeferDeletions(nullptr, 0, input->getResourceHandle(), gfxAllocation->getRootDeviceIndex()); + [[maybe_unused]] auto status = tryDeferDeletions(nullptr, 0, input->getResourceHandle(), gfxAllocation->getRootDeviceIndex(), gfxAllocation->getAllocationType()); DEBUG_BREAK_IF(!status); } else { for (auto handle : input->getHandles()) { - [[maybe_unused]] auto status = tryDeferDeletions(&handle, 1, 0, gfxAllocation->getRootDeviceIndex()); + [[maybe_unused]] auto status = tryDeferDeletions(&handle, 1, 0, gfxAllocation->getRootDeviceIndex(), gfxAllocation->getAllocationType()); DEBUG_BREAK_IF(!status); } } @@ -809,9 +809,9 @@ void WddmMemoryManager::handleFenceCompletion(GraphicsAllocation *allocation) { } } -bool WddmMemoryManager::tryDeferDeletions(const D3DKMT_HANDLE *handles, uint32_t allocationCount, D3DKMT_HANDLE resourceHandle, uint32_t rootDeviceIndex) { +bool WddmMemoryManager::tryDeferDeletions(const D3DKMT_HANDLE *handles, uint32_t allocationCount, D3DKMT_HANDLE resourceHandle, uint32_t rootDeviceIndex, AllocationType type) { bool status = true; - if (deferredDeleter) { + if (deferredDeleter && type != AllocationType::externalHostPtr) { deferredDeleter->deferDeletion(DeferrableDeletion::create(&getWddm(rootDeviceIndex), handles, allocationCount, resourceHandle)); } else { status = getWddm(rootDeviceIndex).destroyAllocations(handles, allocationCount, resourceHandle); @@ -893,7 +893,7 @@ void WddmMemoryManager::cleanOsHandles(OsHandleStorage &handleStorage, uint32_t } } - bool success = tryDeferDeletions(handles, allocationCount, 0, rootDeviceIndex); + bool success = tryDeferDeletions(handles, allocationCount, 0, rootDeviceIndex, AllocationType::unknown); for (unsigned int i = 0; i < maxFragmentsCount; i++) { if (handleStorage.fragmentStorageData[i].freeTheFragment) { diff --git a/shared/source/os_interface/windows/wddm_memory_manager.h b/shared/source/os_interface/windows/wddm_memory_manager.h index d77f2a2a94..a0016ed347 100644 --- a/shared/source/os_interface/windows/wddm_memory_manager.h +++ b/shared/source/os_interface/windows/wddm_memory_manager.h @@ -51,7 +51,7 @@ class WddmMemoryManager : public MemoryManager { uint64_t getLocalMemorySize(uint32_t rootDeviceIndex, uint32_t deviceBitfield) override; double getPercentOfGlobalMemoryAvailable(uint32_t rootDeviceIndex) override; - bool tryDeferDeletions(const D3DKMT_HANDLE *handles, uint32_t allocationCount, D3DKMT_HANDLE resourceHandle, uint32_t rootDeviceIndex); + bool tryDeferDeletions(const D3DKMT_HANDLE *handles, uint32_t allocationCount, D3DKMT_HANDLE resourceHandle, uint32_t rootDeviceIndex, AllocationType type); bool isMemoryBudgetExhausted() const override; diff --git a/shared/test/unit_test/os_interface/windows/wddm_memory_manager_tests.cpp b/shared/test/unit_test/os_interface/windows/wddm_memory_manager_tests.cpp index e4b36c6a74..0da98c306c 100644 --- a/shared/test/unit_test/os_interface/windows/wddm_memory_manager_tests.cpp +++ b/shared/test/unit_test/os_interface/windows/wddm_memory_manager_tests.cpp @@ -4037,16 +4037,23 @@ struct WddmMemoryManagerWithAsyncDeleterTest : public ::testing::Test { WddmMock *wddm; }; +TEST_F(WddmMemoryManagerWithAsyncDeleterTest, givenWddmWhenAsyncDeleterIsEnabledThenDoNotDeferExternalHostptrDeletions) { + EXPECT_EQ(0, deleter->deferDeletionCalled); + memoryManager->tryDeferDeletions(nullptr, 0, 0, 0, AllocationType::externalHostPtr); + EXPECT_EQ(0, deleter->deferDeletionCalled); + EXPECT_EQ(1u, wddm->destroyAllocationResult.called); +} + TEST_F(WddmMemoryManagerWithAsyncDeleterTest, givenWddmWhenAsyncDeleterIsEnabledThenCanDeferDeletions) { EXPECT_EQ(0, deleter->deferDeletionCalled); - memoryManager->tryDeferDeletions(nullptr, 0, 0, 0); + memoryManager->tryDeferDeletions(nullptr, 0, 0, 0, AllocationType::unknown); EXPECT_EQ(1, deleter->deferDeletionCalled); EXPECT_EQ(1u, wddm->destroyAllocationResult.called); } TEST_F(WddmMemoryManagerWithAsyncDeleterTest, givenWddmWhenAsyncDeleterIsDisabledThenCannotDeferDeletions) { memoryManager->setDeferredDeleter(nullptr); - memoryManager->tryDeferDeletions(nullptr, 0, 0, 0); + memoryManager->tryDeferDeletions(nullptr, 0, 0, 0, AllocationType::unknown); EXPECT_EQ(1u, wddm->destroyAllocationResult.called); }