mirror of
https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git
synced 2024-11-26 16:34:35 +00:00
VmaReplay: Added "device memory statistics" - count and total size of successfully allocated device memory blocks, total and per memory type.
This commit is contained in:
parent
a1f727c9d0
commit
70556b6754
@ -724,7 +724,9 @@ public:
|
||||
static uint32_t ImageUsageToClass(uint32_t usage);
|
||||
|
||||
Statistics();
|
||||
~Statistics();
|
||||
void Init(uint32_t memHeapCount, uint32_t memTypeCount);
|
||||
void PrintDeviceMemStats() const;
|
||||
void PrintMemStats() const;
|
||||
void PrintDetailedStats() const;
|
||||
|
||||
@ -745,6 +747,7 @@ public:
|
||||
void RegisterAllocateMemoryPages(size_t allocCount) { m_VmaAllocateMemoryPages.PostValue(allocCount); }
|
||||
void RegisterDefragmentation(const VmaDefragmentationInfo2& info);
|
||||
|
||||
void RegisterDeviceMemoryAllocation(uint32_t memoryType, VkDeviceSize size);
|
||||
void UpdateMemStats(const VmaStats& currStats);
|
||||
|
||||
private:
|
||||
@ -756,6 +759,17 @@ private:
|
||||
size_t m_LinearImageCreationCount = 0;
|
||||
size_t m_BufferCreationCount[4] = { };
|
||||
|
||||
struct DeviceMemStatInfo
|
||||
{
|
||||
size_t allocationCount;
|
||||
VkDeviceSize allocationTotalSize;
|
||||
};
|
||||
struct DeviceMemStats
|
||||
{
|
||||
DeviceMemStatInfo memoryType[VK_MAX_MEMORY_TYPES];
|
||||
DeviceMemStatInfo total;
|
||||
} m_DeviceMemStats;
|
||||
|
||||
// Structure similar to VmaStatInfo, but not the same.
|
||||
struct MemStatInfo
|
||||
{
|
||||
@ -785,6 +799,28 @@ private:
|
||||
static void PrintMemStatInfo(const MemStatInfo& info);
|
||||
};
|
||||
|
||||
// Hack for global AllocateDeviceMemoryCallback.
|
||||
static Statistics* g_Statistics;
|
||||
|
||||
static void VKAPI_CALL AllocateDeviceMemoryCallback(
|
||||
VmaAllocator allocator,
|
||||
uint32_t memoryType,
|
||||
VkDeviceMemory memory,
|
||||
VkDeviceSize size)
|
||||
{
|
||||
g_Statistics->RegisterDeviceMemoryAllocation(memoryType, size);
|
||||
}
|
||||
|
||||
/// Callback function called before vkFreeMemory.
|
||||
static void VKAPI_CALL FreeDeviceMemoryCallback(
|
||||
VmaAllocator allocator,
|
||||
uint32_t memoryType,
|
||||
VkDeviceMemory memory,
|
||||
VkDeviceSize size)
|
||||
{
|
||||
// Nothing.
|
||||
}
|
||||
|
||||
uint32_t Statistics::BufferUsageToClass(uint32_t usage)
|
||||
{
|
||||
// Buffer is used as source of data for fixed-function stage of graphics pipeline.
|
||||
@ -850,7 +886,17 @@ uint32_t Statistics::ImageUsageToClass(uint32_t usage)
|
||||
|
||||
Statistics::Statistics()
|
||||
{
|
||||
ZeroMemory(&m_DeviceMemStats, sizeof(m_DeviceMemStats));
|
||||
ZeroMemory(&m_PeakMemStats, sizeof(m_PeakMemStats));
|
||||
|
||||
assert(g_Statistics == nullptr);
|
||||
g_Statistics = this;
|
||||
}
|
||||
|
||||
Statistics::~Statistics()
|
||||
{
|
||||
assert(g_Statistics == this);
|
||||
g_Statistics = nullptr;
|
||||
}
|
||||
|
||||
void Statistics::Init(uint32_t memHeapCount, uint32_t memTypeCount)
|
||||
@ -859,6 +905,18 @@ void Statistics::Init(uint32_t memHeapCount, uint32_t memTypeCount)
|
||||
m_MemTypeCount = memTypeCount;
|
||||
}
|
||||
|
||||
void Statistics::PrintDeviceMemStats() const
|
||||
{
|
||||
printf("Successful device memory allocations:\n");
|
||||
printf(" Total: count = %zu, total size = %llu\n",
|
||||
m_DeviceMemStats.total.allocationCount, m_DeviceMemStats.total.allocationTotalSize);
|
||||
for(uint32_t i = 0; i < m_MemTypeCount; ++i)
|
||||
{
|
||||
printf(" Memory type %u: count = %zu, total size = %llu\n",
|
||||
i, m_DeviceMemStats.memoryType[i].allocationCount, m_DeviceMemStats.memoryType[i].allocationTotalSize);
|
||||
}
|
||||
}
|
||||
|
||||
void Statistics::PrintMemStats() const
|
||||
{
|
||||
printf("Memory statistics:\n");
|
||||
@ -953,6 +1011,15 @@ void Statistics::UpdateMemStats(const VmaStats& currStats)
|
||||
}
|
||||
}
|
||||
|
||||
void Statistics::RegisterDeviceMemoryAllocation(uint32_t memoryType, VkDeviceSize size)
|
||||
{
|
||||
++m_DeviceMemStats.total.allocationCount;
|
||||
m_DeviceMemStats.total.allocationTotalSize += size;
|
||||
|
||||
++m_DeviceMemStats.memoryType[memoryType].allocationCount;
|
||||
m_DeviceMemStats.memoryType[memoryType].allocationTotalSize += size;
|
||||
}
|
||||
|
||||
void Statistics::UpdateMemStatInfo(MemStatInfo& inoutPeakInfo, const VmaStatInfo& currInfo)
|
||||
{
|
||||
#define SET_PEAK(inoutDst, src) \
|
||||
@ -2137,10 +2204,15 @@ int Player::InitVulkan()
|
||||
|
||||
// Create memory allocator
|
||||
|
||||
VmaDeviceMemoryCallbacks deviceMemoryCallbacks = {};
|
||||
deviceMemoryCallbacks.pfnAllocate = AllocateDeviceMemoryCallback;
|
||||
deviceMemoryCallbacks.pfnFree = FreeDeviceMemoryCallback;
|
||||
|
||||
VmaAllocatorCreateInfo allocatorInfo = {};
|
||||
allocatorInfo.physicalDevice = m_PhysicalDevice;
|
||||
allocatorInfo.device = m_Device;
|
||||
allocatorInfo.flags = VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT;
|
||||
allocatorInfo.pDeviceMemoryCallbacks = &deviceMemoryCallbacks;
|
||||
|
||||
if(m_DedicatedAllocationEnabled)
|
||||
{
|
||||
@ -2434,6 +2506,8 @@ void Player::PrintStats()
|
||||
return;
|
||||
}
|
||||
|
||||
m_Stats.PrintDeviceMemStats();
|
||||
|
||||
printf("Statistics:\n");
|
||||
if(m_Stats.GetAllocationCreationCount() > 0)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user