diff --git a/src/dxvk/hud/dxvk_hud.cpp b/src/dxvk/hud/dxvk_hud.cpp index cf15da2d..246a6c4f 100644 --- a/src/dxvk/hud/dxvk_hud.cpp +++ b/src/dxvk/hud/dxvk_hud.cpp @@ -42,6 +42,7 @@ namespace dxvk::hud { addItem("submissions", device); addItem("drawcalls", device); addItem("pipelines", device); + addItem("memory", device); } diff --git a/src/dxvk/hud/dxvk_hud_item.cpp b/src/dxvk/hud/dxvk_hud_item.cpp index 415e6b64..849b7bcd 100644 --- a/src/dxvk/hud/dxvk_hud_item.cpp +++ b/src/dxvk/hud/dxvk_hud_item.cpp @@ -1,5 +1,6 @@ #include "dxvk_hud_item.h" +#include #include namespace dxvk::hud { @@ -388,4 +389,46 @@ namespace dxvk::hud { return position; } + + HudMemoryStatsItem::HudMemoryStatsItem(const Rc& device) + : m_device(device), m_memory(device->adapter()->memoryProperties()) { + + } + + + HudMemoryStatsItem::~HudMemoryStatsItem() { + + } + + + void HudMemoryStatsItem::update(dxvk::high_resolution_clock::time_point time) { + for (uint32_t i = 0; i < m_memory.memoryHeapCount; i++) + m_heaps[i] = m_device->getMemoryStats(i); + } + + + HudPos HudMemoryStatsItem::render( + HudRenderer& renderer, + HudPos position) { + for (uint32_t i = 0; i < m_memory.memoryHeapCount; i++) { + bool isDeviceLocal = m_memory.memoryHeaps[i].flags & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT; + + uint64_t memUsedMib = m_heaps[i].memoryUsed >> 20; + uint64_t percentage = (100 * m_heaps[i].memoryUsed) / m_memory.memoryHeaps[i].size; + + std::string text = str::format(isDeviceLocal ? "Vidmem" : "Sysmem", " heap ", i, ": ", + std::setfill(' '), std::setw(5), memUsedMib, " MB (", percentage, "%)"); + + position.y += 16.0f; + renderer.drawText(16.0f, + { position.x, position.y }, + { 1.0f, 1.0f, 1.0f, 1.0f }, + text); + position.y += 4.0f; + } + + position.y += 4.0f; + return position; + } + } diff --git a/src/dxvk/hud/dxvk_hud_item.h b/src/dxvk/hud/dxvk_hud_item.h index 419ef595..c40a2054 100644 --- a/src/dxvk/hud/dxvk_hud_item.h +++ b/src/dxvk/hud/dxvk_hud_item.h @@ -296,4 +296,30 @@ namespace dxvk::hud { }; + + /** + * \brief HUD item to display memory usage + */ + class HudMemoryStatsItem : public HudItem { + + public: + + HudMemoryStatsItem(const Rc& device); + + ~HudMemoryStatsItem(); + + void update(dxvk::high_resolution_clock::time_point time); + + HudPos render( + HudRenderer& renderer, + HudPos position); + + private: + + Rc m_device; + VkPhysicalDeviceMemoryProperties m_memory; + DxvkMemoryStats m_heaps[VK_MAX_MEMORY_HEAPS]; + + }; + } \ No newline at end of file