Add a tracker and logging of memory allocated by the GPU library

This commit is contained in:
Brad Davis 2016-03-22 20:21:36 -07:00
parent 2fdb92e8cd
commit 252a49eea4

View file

@ -10,11 +10,74 @@
//
#include "Resource.h"
#include <atomic>
#include <SharedUtil.h>
#include <NumericalConstants.h>
#include <QDebug>
using namespace gpu;
class AllocationDebugger {
public:
void operator+=(size_t size) {
_allocatedMemory += size;
maybeReport();
}
void operator-=(size_t size) {
_allocatedMemory -= size;
maybeReport();
}
private:
QString formatSize(size_t size) {
float num = size;
QStringList list;
list << "KB" << "MB" << "GB" << "TB";
QStringListIterator i(list);
QString unit("bytes");
while (num >= K && i.hasNext()) {
unit = i.next();
num /= K;
}
return QString().setNum(num, 'f', 2) + " " + unit;
}
void maybeReport() {
auto now = usecTimestampNow();
if (now - _lastReportTime < MAX_REPORT_FREQUENCY) {
return;
}
size_t current = _allocatedMemory;
size_t last = _lastReportedMemory;
size_t delta = (current > last) ? (current - last) : (last - current);
if (delta > MIN_REPORT_DELTA) {
_lastReportTime = now;
_lastReportedMemory = current;
qDebug() << "Total allocation " << formatSize(current);
}
}
std::atomic<size_t> _allocatedMemory;
std::atomic<size_t> _lastReportedMemory;
std::atomic<uint64_t> _lastReportTime;
static const float K;
// Report changes of 5 megabytes
static const size_t MIN_REPORT_DELTA = 1024 * 1024 * 5;
// Report changes no more frequently than every 15 seconds
static const uint64_t MAX_REPORT_FREQUENCY = USECS_PER_SECOND * 15;
};
const float AllocationDebugger::K = 1024.0f;
static AllocationDebugger allocationDebugger;
Resource::Size Resource::Sysmem::allocateMemory(Byte** dataAllocated, Size size) {
allocationDebugger += size;
if ( !dataAllocated ) {
qWarning() << "Buffer::Sysmem::allocateMemory() : Must have a valid dataAllocated pointer.";
return NOT_ALLOCATED;
@ -38,6 +101,7 @@ Resource::Size Resource::Sysmem::allocateMemory(Byte** dataAllocated, Size size)
}
void Resource::Sysmem::deallocateMemory(Byte* dataAllocated, Size size) {
allocationDebugger -= size;
if (dataAllocated) {
delete[] dataAllocated;
}