1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2024-11-29 10:24:10 +01:00

[dxvk] Forward memory allocation statistics to the adapter

This commit is contained in:
Philip Rebohle 2018-11-13 12:21:53 +01:00
parent d49de734b7
commit 1af96347e1
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
4 changed files with 105 additions and 3 deletions

View File

@ -13,6 +13,7 @@ namespace dxvk {
: m_instance (instance),
m_vki (instance->vki()),
m_handle (handle) {
this->initHeapAllocInfo();
this->queryExtensions();
this->queryDeviceInfo();
this->queryDeviceFeatures();
@ -30,6 +31,22 @@ namespace dxvk {
}
DxvkAdapterMemoryInfo DxvkAdapter::getMemoryHeapInfo() const {
VkPhysicalDeviceMemoryProperties props = memoryProperties();
DxvkAdapterMemoryInfo info = { };
info.heapCount = props.memoryHeapCount;
for (uint32_t i = 0; i < info.heapCount; i++) {
info.heaps[i].heapFlags = props.memoryHeaps[i].flags;
info.heaps[i].memoryAvailable = props.memoryHeaps[i].size;
info.heaps[i].memoryAllocated = m_heapAlloc[i].load();
}
return info;
}
VkPhysicalDeviceMemoryProperties DxvkAdapter::memoryProperties() const {
VkPhysicalDeviceMemoryProperties memoryProperties;
m_vki->vkGetPhysicalDeviceMemoryProperties(m_handle, &memoryProperties);
@ -288,6 +305,20 @@ namespace dxvk {
Rc<DxvkSurface> DxvkAdapter::createSurface(HINSTANCE instance, HWND window) {
return new DxvkSurface(this, instance, window);
}
void DxvkAdapter::notifyHeapMemoryAlloc(
uint32_t heap,
VkDeviceSize bytes) {
m_heapAlloc[heap] += bytes;
}
void DxvkAdapter::notifyHeapMemoryFree(
uint32_t heap,
VkDeviceSize bytes) {
m_heapAlloc[heap] -= bytes;
}
void DxvkAdapter::logAdapterInfo() const {
@ -322,6 +353,12 @@ namespace dxvk {
}
void DxvkAdapter::initHeapAllocInfo() {
for (uint32_t i = 0; i < m_heapAlloc.size(); i++)
m_heapAlloc[i] = 0;
}
void DxvkAdapter::queryExtensions() {
m_deviceExtensions = DxvkNameSet::enumDeviceExtensions(m_vki, m_handle);
}

View File

@ -19,6 +19,29 @@ namespace dxvk {
Nvidia = 0x10de,
Intel = 0x8086,
};
/**
* \brief Adapter memory heap info
*
* Stores info about a heap, and the amount
* of memory allocated from it by the app.
*/
struct DxvkAdapterMemoryHeapInfo {
VkMemoryHeapFlags heapFlags;
VkDeviceSize memoryAvailable;
VkDeviceSize memoryAllocated;
};
/**
* \brief Adapter memory info
*
* Stores properties and allocation
* info of each available heap.
*/
struct DxvkAdapterMemoryInfo {
uint32_t heapCount;
DxvkAdapterMemoryHeapInfo heaps[VK_MAX_MEMORY_HEAPS];
};
/**
* \brief DXVK adapter
@ -91,6 +114,17 @@ namespace dxvk {
return m_deviceFeatures;
}
/**
* \brief Retrieves memory heap info
*
* Returns properties of all available memory heaps,
* both device-local and non-local heaps, and the
* amount of memory allocated from those heaps by
* logical devices.
* \returns Memory heap info
*/
DxvkAdapterMemoryInfo getMemoryHeapInfo() const;
/**
* \brief Memory properties
*
@ -99,7 +133,7 @@ namespace dxvk {
* \returns Device memory properties
*/
VkPhysicalDeviceMemoryProperties memoryProperties() const;
/**
* \brief Queries format support
*
@ -170,6 +204,28 @@ namespace dxvk {
HINSTANCE instance,
HWND window);
/**
* \brief Registers memory allocation
*
* Updates memory alloc info accordingly.
* \param [in] heap Memory heap index
* \param [in] bytes Allocation size
*/
void notifyHeapMemoryAlloc(
uint32_t heap,
VkDeviceSize bytes);
/**
* \brief Registers memory deallocation
*
* Updates memory alloc info accordingly.
* \param [in] heap Memory heap index
* \param [in] bytes Allocation size
*/
void notifyHeapMemoryFree(
uint32_t heap,
VkDeviceSize bytes);
/**
* \brief Logs DXVK adapter info
*
@ -190,6 +246,9 @@ namespace dxvk {
std::vector<VkQueueFamilyProperties> m_queueFamilies;
std::array<std::atomic<VkDeviceSize>, VK_MAX_MEMORY_HEAPS> m_heapAlloc;
void initHeapAllocInfo();
void queryExtensions();
void queryDeviceInfo();
void queryDeviceFeatures();

View File

@ -152,8 +152,9 @@ namespace dxvk {
DxvkMemoryAllocator::DxvkMemoryAllocator(const DxvkDevice* device)
: m_vkd (device->vkd()),
m_devProps (device->adapter()->deviceProperties()),
m_memProps (device->adapter()->memoryProperties()),
m_adapter (device->adapter()),
m_devProps (m_adapter->deviceProperties()),
m_memProps (m_adapter->memoryProperties()),
m_allowOvercommit (device->config().allowMemoryOvercommit) {
for (uint32_t i = 0; i < m_memProps.memoryHeapCount; i++) {
VkDeviceSize heapSize = m_memProps.memoryHeaps[i].size;
@ -165,6 +166,7 @@ namespace dxvk {
for (uint32_t i = 0; i < m_memProps.memoryTypeCount; i++) {
m_memTypes[i].heap = &m_memHeaps[m_memProps.memoryTypes[i].heapIndex];
m_memTypes[i].heapId = m_memProps.memoryTypes[i].heapIndex;
m_memTypes[i].memType = m_memProps.memoryTypes[i];
m_memTypes[i].memTypeId = i;
}
@ -307,6 +309,7 @@ namespace dxvk {
}
type->heap->stats.memoryAllocated += size;
m_adapter->notifyHeapMemoryAlloc(type->heapId, size);
return result;
}
@ -346,6 +349,7 @@ namespace dxvk {
DxvkDeviceMemory memory) {
m_vkd->vkFreeMemory(m_vkd->device(), memory.memHandle, nullptr);
type->heap->stats.memoryAllocated -= memory.memSize;
m_adapter->notifyHeapMemoryFree(type->heapId, memory.memSize);
}

View File

@ -56,6 +56,7 @@ namespace dxvk {
*/
struct DxvkMemoryType {
DxvkMemoryHeap* heap;
uint32_t heapId;
VkMemoryType memType;
uint32_t memTypeId;
@ -255,6 +256,7 @@ namespace dxvk {
private:
const Rc<vk::DeviceFn> m_vkd;
const Rc<DxvkAdapter> m_adapter;
const VkPhysicalDeviceProperties m_devProps;
const VkPhysicalDeviceMemoryProperties m_memProps;
const bool m_allowOvercommit;