mirror of
https://github.com/EduApps-CDG/OpenDX
synced 2024-12-30 09:45:37 +01:00
[dxvk] Pick memory chunk size dynamically
Reduces the number of Vulkan memory allocations, and can lead to lower CPU overhead in certain situations. Improves Shadow Warrior 2 by ~2% on RADV.
This commit is contained in:
parent
2aa6b04fd9
commit
43cbe42ea8
@ -148,7 +148,10 @@ namespace dxvk {
|
|||||||
m_devProps(adapter->deviceProperties()),
|
m_devProps(adapter->deviceProperties()),
|
||||||
m_memProps(adapter->memoryProperties()) {
|
m_memProps(adapter->memoryProperties()) {
|
||||||
for (uint32_t i = 0; i < m_memProps.memoryHeapCount; i++) {
|
for (uint32_t i = 0; i < m_memProps.memoryHeapCount; i++) {
|
||||||
|
VkDeviceSize heapSize = m_memProps.memoryHeaps[i].size;
|
||||||
|
|
||||||
m_memHeaps[i].properties = m_memProps.memoryHeaps[i];
|
m_memHeaps[i].properties = m_memProps.memoryHeaps[i];
|
||||||
|
m_memHeaps[i].chunkSize = pickChunkSize(heapSize);
|
||||||
m_memHeaps[i].stats = DxvkMemoryStats { 0, 0 };
|
m_memHeaps[i].stats = DxvkMemoryStats { 0, 0 };
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -231,7 +234,7 @@ namespace dxvk {
|
|||||||
const VkMemoryDedicatedAllocateInfoKHR* dedAllocInfo) {
|
const VkMemoryDedicatedAllocateInfoKHR* dedAllocInfo) {
|
||||||
DxvkMemory memory;
|
DxvkMemory memory;
|
||||||
|
|
||||||
if ((size >= ChunkSize / 4) || dedAllocInfo) {
|
if ((size >= type->heap->chunkSize / 4) || dedAllocInfo) {
|
||||||
DxvkDeviceMemory devMem = this->tryAllocDeviceMemory(type, size, dedAllocInfo);
|
DxvkDeviceMemory devMem = this->tryAllocDeviceMemory(type, size, dedAllocInfo);
|
||||||
|
|
||||||
if (devMem.memHandle != VK_NULL_HANDLE)
|
if (devMem.memHandle != VK_NULL_HANDLE)
|
||||||
@ -241,7 +244,8 @@ namespace dxvk {
|
|||||||
memory = type->chunks[i]->alloc(size, align);
|
memory = type->chunks[i]->alloc(size, align);
|
||||||
|
|
||||||
if (!memory) {
|
if (!memory) {
|
||||||
DxvkDeviceMemory devMem = tryAllocDeviceMemory(type, ChunkSize, nullptr);
|
DxvkDeviceMemory devMem = tryAllocDeviceMemory(
|
||||||
|
type, type->heap->chunkSize, nullptr);
|
||||||
|
|
||||||
if (devMem.memHandle == VK_NULL_HANDLE)
|
if (devMem.memHandle == VK_NULL_HANDLE)
|
||||||
return DxvkMemory();
|
return DxvkMemory();
|
||||||
@ -330,5 +334,16 @@ namespace dxvk {
|
|||||||
m_vkd->vkFreeMemory(m_vkd->device(), memory.memHandle, nullptr);
|
m_vkd->vkFreeMemory(m_vkd->device(), memory.memHandle, nullptr);
|
||||||
type->heap->stats.memoryAllocated -= memory.memSize;
|
type->heap->stats.memoryAllocated -= memory.memSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
VkDeviceSize DxvkMemoryAllocator::pickChunkSize(VkDeviceSize heapSize) const {
|
||||||
|
// Pick a reasonable chunk size depending on the memory
|
||||||
|
// heap size. Small chunk sizes can reduce fragmentation
|
||||||
|
// and are therefore preferred for small memory heaps.
|
||||||
|
constexpr VkDeviceSize MaxChunkSize = 64 * 1024 * 1024;
|
||||||
|
constexpr VkDeviceSize MinChunkCount = 16;
|
||||||
|
|
||||||
|
return std::min(heapSize / MinChunkCount, MaxChunkSize);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -41,6 +41,7 @@ namespace dxvk {
|
|||||||
*/
|
*/
|
||||||
struct DxvkMemoryHeap {
|
struct DxvkMemoryHeap {
|
||||||
VkMemoryHeap properties;
|
VkMemoryHeap properties;
|
||||||
|
VkDeviceSize chunkSize;
|
||||||
DxvkMemoryStats stats;
|
DxvkMemoryStats stats;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -252,8 +253,6 @@ namespace dxvk {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
constexpr static VkDeviceSize ChunkSize = 16 * 1024 * 1024;
|
|
||||||
|
|
||||||
const Rc<vk::DeviceFn> m_vkd;
|
const Rc<vk::DeviceFn> m_vkd;
|
||||||
const VkPhysicalDeviceProperties m_devProps;
|
const VkPhysicalDeviceProperties m_devProps;
|
||||||
const VkPhysicalDeviceMemoryProperties m_memProps;
|
const VkPhysicalDeviceMemoryProperties m_memProps;
|
||||||
@ -290,6 +289,9 @@ namespace dxvk {
|
|||||||
void freeDeviceMemory(
|
void freeDeviceMemory(
|
||||||
DxvkMemoryType* type,
|
DxvkMemoryType* type,
|
||||||
DxvkDeviceMemory memory);
|
DxvkDeviceMemory memory);
|
||||||
|
|
||||||
|
VkDeviceSize pickChunkSize(
|
||||||
|
VkDeviceSize heapSize) const;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user