diff --git a/src/dxvk/dxvk_memory.cpp b/src/dxvk/dxvk_memory.cpp index 15d199cd5..3431c40cc 100644 --- a/src/dxvk/dxvk_memory.cpp +++ b/src/dxvk/dxvk_memory.cpp @@ -160,6 +160,13 @@ namespace dxvk { for (uint32_t i = 0; i < m_memProps.memoryHeapCount; i++) { m_memHeaps[i].properties = m_memProps.memoryHeaps[i]; m_memHeaps[i].stats = DxvkMemoryStats { 0, 0 }; + m_memHeaps[i].budget = 0; + + /* Target 80% of a heap on systems where we want + * to avoid oversubscribing memory heaps */ + if ((m_memProps.memoryHeaps[i].flags & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) + && (m_device->isUnifiedMemoryArchitecture())) + m_memHeaps[i].budget = (8 * m_memProps.memoryHeaps[i].size) / 10; } for (uint32_t i = 0; i < m_memProps.memoryTypeCount; i++) { @@ -170,7 +177,6 @@ namespace dxvk { m_memTypes[i].chunkSize = pickChunkSize(i); } - m_restrictAllocations = m_device->isUnifiedMemoryArchitecture(); } @@ -316,7 +322,7 @@ namespace dxvk { bool useMemoryPriority = (flags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) && (m_device->features().extMemoryPriority.memoryPriority); - if (m_restrictAllocations && type->heap->stats.memoryAllocated + size > type->heap->properties.size) + if (type->heap->budget && type->heap->stats.memoryAllocated + size > type->heap->budget) return DxvkDeviceMemory(); DxvkDeviceMemory result; diff --git a/src/dxvk/dxvk_memory.h b/src/dxvk/dxvk_memory.h index 927195018..334fbfa6d 100644 --- a/src/dxvk/dxvk_memory.h +++ b/src/dxvk/dxvk_memory.h @@ -44,6 +44,7 @@ namespace dxvk { struct DxvkMemoryHeap { VkMemoryHeap properties; DxvkMemoryStats stats; + VkDeviceSize budget; }; @@ -285,8 +286,6 @@ namespace dxvk { std::array m_memHeaps; std::array m_memTypes; - bool m_restrictAllocations; - DxvkMemory tryAlloc( const VkMemoryRequirements* req, const VkMemoryDedicatedAllocateInfo* dedAllocInfo,