mirror of
https://github.com/intel/compute-runtime.git
synced 2025-09-15 13:01:45 +08:00
Dont unlock/evict wddm allocations during releasing memory
Change-Id: Ib934867886a883a22fde2f0c03e16338dc215e65 Signed-off-by: Mateusz Jablonski <mateusz.jablonski@intel.com>
This commit is contained in:
@ -134,7 +134,7 @@ void MemoryManager::freeGraphicsMemory(GraphicsAllocation *gfxAllocation) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (gfxAllocation->isLocked()) {
|
if (gfxAllocation->isLocked()) {
|
||||||
unlockResource(gfxAllocation);
|
freeAssociatedResourceImpl(*gfxAllocation);
|
||||||
}
|
}
|
||||||
freeGraphicsMemoryImpl(gfxAllocation);
|
freeGraphicsMemoryImpl(gfxAllocation);
|
||||||
}
|
}
|
||||||
|
@ -263,6 +263,7 @@ class MemoryManager {
|
|||||||
|
|
||||||
virtual void *lockResourceImpl(GraphicsAllocation &graphicsAllocation) = 0;
|
virtual void *lockResourceImpl(GraphicsAllocation &graphicsAllocation) = 0;
|
||||||
virtual void unlockResourceImpl(GraphicsAllocation &graphicsAllocation) = 0;
|
virtual void unlockResourceImpl(GraphicsAllocation &graphicsAllocation) = 0;
|
||||||
|
virtual void freeAssociatedResourceImpl(GraphicsAllocation &graphicsAllocation) { return unlockResourceImpl(graphicsAllocation); };
|
||||||
|
|
||||||
bool force32bitAllocations = false;
|
bool force32bitAllocations = false;
|
||||||
bool virtualPaddingAvailable = false;
|
bool virtualPaddingAvailable = false;
|
||||||
|
@ -1002,7 +1002,15 @@ void Wddm::applyBlockingMakeResident(const D3DKMT_HANDLE &handle) {
|
|||||||
while (currentPagingFenceValue > *getPagingFenceAddress())
|
while (currentPagingFenceValue > *getPagingFenceAddress())
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
void Wddm::removeTemporaryResource(const D3DKMT_HANDLE &handle) {
|
||||||
|
auto lock = acquireLock(temporaryResourcesLock);
|
||||||
|
auto position = std::find(temporaryResources.begin(), temporaryResources.end(), handle);
|
||||||
|
if (position == temporaryResources.end()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
*position = temporaryResources.back();
|
||||||
|
temporaryResources.pop_back();
|
||||||
|
}
|
||||||
std::unique_lock<SpinLock> Wddm::acquireLock(SpinLock &lock) {
|
std::unique_lock<SpinLock> Wddm::acquireLock(SpinLock &lock) {
|
||||||
return std::unique_lock<SpinLock>{lock};
|
return std::unique_lock<SpinLock>{lock};
|
||||||
}
|
}
|
||||||
|
@ -150,6 +150,7 @@ class Wddm {
|
|||||||
MOCKABLE_VIRTUAL EvictionStatus evictTemporaryResource(const D3DKMT_HANDLE &handle);
|
MOCKABLE_VIRTUAL EvictionStatus evictTemporaryResource(const D3DKMT_HANDLE &handle);
|
||||||
MOCKABLE_VIRTUAL void applyBlockingMakeResident(const D3DKMT_HANDLE &handle);
|
MOCKABLE_VIRTUAL void applyBlockingMakeResident(const D3DKMT_HANDLE &handle);
|
||||||
MOCKABLE_VIRTUAL std::unique_lock<SpinLock> acquireLock(SpinLock &lock);
|
MOCKABLE_VIRTUAL std::unique_lock<SpinLock> acquireLock(SpinLock &lock);
|
||||||
|
MOCKABLE_VIRTUAL void removeTemporaryResource(const D3DKMT_HANDLE &handle);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool initialized = false;
|
bool initialized = false;
|
||||||
|
@ -286,6 +286,14 @@ void WddmMemoryManager::unlockResourceImpl(GraphicsAllocation &graphicsAllocatio
|
|||||||
DEBUG_BREAK_IF(evictionStatus == EvictionStatus::FAILED);
|
DEBUG_BREAK_IF(evictionStatus == EvictionStatus::FAILED);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
void WddmMemoryManager::freeAssociatedResourceImpl(GraphicsAllocation &graphicsAllocation) {
|
||||||
|
auto &wddmAllocation = static_cast<WddmAllocation &>(graphicsAllocation);
|
||||||
|
if (wddmAllocation.needsMakeResidentBeforeLock) {
|
||||||
|
for (auto i = 0u; i < wddmAllocation.getNumHandles(); i++) {
|
||||||
|
wddm->removeTemporaryResource(wddmAllocation.getHandles()[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void WddmMemoryManager::freeGraphicsMemoryImpl(GraphicsAllocation *gfxAllocation) {
|
void WddmMemoryManager::freeGraphicsMemoryImpl(GraphicsAllocation *gfxAllocation) {
|
||||||
WddmAllocation *input = static_cast<WddmAllocation *>(gfxAllocation);
|
WddmAllocation *input = static_cast<WddmAllocation *>(gfxAllocation);
|
||||||
|
@ -70,6 +70,7 @@ class WddmMemoryManager : public MemoryManager {
|
|||||||
|
|
||||||
void *lockResourceImpl(GraphicsAllocation &graphicsAllocation) override;
|
void *lockResourceImpl(GraphicsAllocation &graphicsAllocation) override;
|
||||||
void unlockResourceImpl(GraphicsAllocation &graphicsAllocation) override;
|
void unlockResourceImpl(GraphicsAllocation &graphicsAllocation) override;
|
||||||
|
void freeAssociatedResourceImpl(GraphicsAllocation &graphicsAllocation) override;
|
||||||
GraphicsAllocation *allocate32BitGraphicsMemoryImpl(const AllocationData &allocationData) override;
|
GraphicsAllocation *allocate32BitGraphicsMemoryImpl(const AllocationData &allocationData) override;
|
||||||
GraphicsAllocation *allocateGraphicsMemoryInDevicePool(const AllocationData &allocationData, AllocationStatus &status) override;
|
GraphicsAllocation *allocateGraphicsMemoryInDevicePool(const AllocationData &allocationData, AllocationStatus &status) override;
|
||||||
|
|
||||||
|
@ -254,6 +254,11 @@ void WddmMock::applyBlockingMakeResident(const D3DKMT_HANDLE &handle) {
|
|||||||
return Wddm::applyBlockingMakeResident(handle);
|
return Wddm::applyBlockingMakeResident(handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WddmMock::removeTemporaryResource(const D3DKMT_HANDLE &handle) {
|
||||||
|
removeTemporaryResourceResult.called++;
|
||||||
|
return Wddm::removeTemporaryResource(handle);
|
||||||
|
}
|
||||||
|
|
||||||
std::unique_lock<SpinLock> WddmMock::acquireLock(SpinLock &lock) {
|
std::unique_lock<SpinLock> WddmMock::acquireLock(SpinLock &lock) {
|
||||||
acquireLockResult.called++;
|
acquireLockResult.called++;
|
||||||
acquireLockResult.uint64ParamPassed = reinterpret_cast<uint64_t>(&lock);
|
acquireLockResult.uint64ParamPassed = reinterpret_cast<uint64_t>(&lock);
|
||||||
|
@ -93,6 +93,7 @@ class WddmMock : public Wddm {
|
|||||||
EvictionStatus evictAllTemporaryResources() override;
|
EvictionStatus evictAllTemporaryResources() override;
|
||||||
EvictionStatus evictTemporaryResource(const D3DKMT_HANDLE &handle) override;
|
EvictionStatus evictTemporaryResource(const D3DKMT_HANDLE &handle) override;
|
||||||
void applyBlockingMakeResident(const D3DKMT_HANDLE &handle) override;
|
void applyBlockingMakeResident(const D3DKMT_HANDLE &handle) override;
|
||||||
|
void removeTemporaryResource(const D3DKMT_HANDLE &handle) override;
|
||||||
std::unique_lock<SpinLock> acquireLock(SpinLock &lock) override;
|
std::unique_lock<SpinLock> acquireLock(SpinLock &lock) override;
|
||||||
bool reserveValidAddressRange(size_t size, void *&reservedMem);
|
bool reserveValidAddressRange(size_t size, void *&reservedMem);
|
||||||
GmmMemory *getGmmMemory() const;
|
GmmMemory *getGmmMemory() const;
|
||||||
@ -131,6 +132,7 @@ class WddmMock : public Wddm {
|
|||||||
WddmMockHelpers::EvictCallResult evictAllTemporaryResourcesResult;
|
WddmMockHelpers::EvictCallResult evictAllTemporaryResourcesResult;
|
||||||
WddmMockHelpers::EvictCallResult evictTemporaryResourceResult;
|
WddmMockHelpers::EvictCallResult evictTemporaryResourceResult;
|
||||||
WddmMockHelpers::CallResult applyBlockingMakeResidentResult;
|
WddmMockHelpers::CallResult applyBlockingMakeResidentResult;
|
||||||
|
WddmMockHelpers::CallResult removeTemporaryResourceResult;
|
||||||
WddmMockHelpers::CallResult acquireLockResult;
|
WddmMockHelpers::CallResult acquireLockResult;
|
||||||
WddmMockHelpers::CallResult registerTrimCallbackResult;
|
WddmMockHelpers::CallResult registerTrimCallbackResult;
|
||||||
WddmMockHelpers::CallResult getPagingFenceAddressResult;
|
WddmMockHelpers::CallResult getPagingFenceAddressResult;
|
||||||
|
@ -1524,12 +1524,12 @@ TEST_F(WddmMemoryManagerSimpleTest, whenDestroyingNotLockedAllocationThatDoesntN
|
|||||||
memoryManager->freeGraphicsMemory(allocation);
|
memoryManager->freeGraphicsMemory(allocation);
|
||||||
EXPECT_EQ(0u, wddm->evictTemporaryResourceResult.called);
|
EXPECT_EQ(0u, wddm->evictTemporaryResourceResult.called);
|
||||||
}
|
}
|
||||||
TEST_F(WddmMemoryManagerSimpleTest, whenDestroyingLockedAllocationThatNeedsMakeResidentBeforeLockThenEvictAllocationFromWddmTemporaryResources) {
|
TEST_F(WddmMemoryManagerSimpleTest, whenDestroyingLockedAllocationThatNeedsMakeResidentBeforeLockThenRemoveTemporaryResource) {
|
||||||
auto allocation = static_cast<WddmAllocation *>(memoryManager->allocateGraphicsMemoryWithProperties(MockAllocationProperties{MemoryConstants::pageSize}));
|
auto allocation = static_cast<WddmAllocation *>(memoryManager->allocateGraphicsMemoryWithProperties(MockAllocationProperties{MemoryConstants::pageSize}));
|
||||||
allocation->needsMakeResidentBeforeLock = true;
|
allocation->needsMakeResidentBeforeLock = true;
|
||||||
memoryManager->lockResource(allocation);
|
memoryManager->lockResource(allocation);
|
||||||
memoryManager->freeGraphicsMemory(allocation);
|
memoryManager->freeGraphicsMemory(allocation);
|
||||||
EXPECT_EQ(1u, wddm->evictTemporaryResourceResult.called);
|
EXPECT_EQ(1u, wddm->removeTemporaryResourceResult.called);
|
||||||
}
|
}
|
||||||
TEST_F(WddmMemoryManagerSimpleTest, whenDestroyingNotLockedAllocationThatNeedsMakeResidentBeforeLockThenDontEvictAllocationFromWddmTemporaryResources) {
|
TEST_F(WddmMemoryManagerSimpleTest, whenDestroyingNotLockedAllocationThatNeedsMakeResidentBeforeLockThenDontEvictAllocationFromWddmTemporaryResources) {
|
||||||
auto allocation = static_cast<WddmAllocation *>(memoryManager->allocateGraphicsMemoryWithProperties(MockAllocationProperties{MemoryConstants::pageSize}));
|
auto allocation = static_cast<WddmAllocation *>(memoryManager->allocateGraphicsMemoryWithProperties(MockAllocationProperties{MemoryConstants::pageSize}));
|
||||||
|
Reference in New Issue
Block a user