Minor fixes. Added basic statistics.

This commit is contained in:
Adam Sawicki 2018-08-07 17:30:29 +02:00
parent 71f3d067c5
commit deeb817d7a
2 changed files with 73 additions and 14 deletions

View File

@ -149,6 +149,39 @@ void CsvSplit::Set(const StrRange& line, size_t maxCount)
m_Count = rangeIndex;
}
////////////////////////////////////////////////////////////////////////////////
// class Statistics
class Statistics
{
public:
Statistics() { }
size_t GetImageCreationCount() const { return m_ImageCreationCount; }
size_t GetBufferCreationCount() const { return m_BufferCreationCount; }
size_t GetAllocationCreationCount() const { return m_AllocationCreationCount; }
void RegisterCreateImage();
void RegisterCreateBuffer();
private:
size_t m_ImageCreationCount = 0;
size_t m_BufferCreationCount = 0;
size_t m_AllocationCreationCount = 0; // Also includes buffers and images.
};
void Statistics::RegisterCreateImage()
{
++m_ImageCreationCount;
++m_AllocationCreationCount;
}
void Statistics::RegisterCreateBuffer()
{
++m_BufferCreationCount;
++m_AllocationCreationCount;
}
////////////////////////////////////////////////////////////////////////////////
// class Player
@ -248,6 +281,8 @@ private:
std::unordered_map<uint64_t, Pool> m_Pools;
std::unordered_map<uint64_t, Allocation> m_Allocations;
Statistics m_Stats;
void Destroy(const Allocation& alloc);
// Increments warning counter. Returns true if warning message should be printed.
@ -256,6 +291,7 @@ private:
int InitVulkan();
void FinalizeVulkan();
void RegisterDebugCallbacks();
void PrintStats();
// If parmeter count doesn't match, issues warning and returns false.
bool ValidateFunctionParameterCount(size_t lineNumber, const CsvSplit& csvSplit, size_t expectedParamCount, bool lastUnbound);
@ -282,6 +318,8 @@ int Player::Init()
Player::~Player()
{
PrintStats();
FinalizeVulkan();
if(m_WarningCount > MAX_WARNINGS_TO_SHOW)
@ -321,6 +359,13 @@ void Player::ExecuteLine(size_t lineNumber, const StrRange& line)
// Nothing to do.
}
}
else if(StrRangeEq(functionName, "vmaDestroyAllocator"))
{
if(ValidateFunctionParameterCount(lineNumber, csvSplit, 0, false))
{
// Nothing to do.
}
}
else if(StrRangeEq(functionName, "vmaCreatePool"))
ExecuteCreatePool(lineNumber, csvSplit);
else if(StrRangeEq(functionName, "vmaDestroyPool"))
@ -633,6 +678,14 @@ void Player::RegisterDebugCallbacks()
assert(res == VK_SUCCESS);
}
void Player::PrintStats()
{
printf("Statistics:\n");
printf(" Total allocations created: %zu\n", m_Stats.GetAllocationCreationCount());
printf(" Total buffers created: %zu\n", m_Stats.GetBufferCreationCount());
printf(" Total images created: %zu\n", m_Stats.GetImageCreationCount());
}
bool Player::ValidateFunctionParameterCount(size_t lineNumber, const CsvSplit& csvSplit, size_t expectedParamCount, bool lastUnbound)
{
bool ok;
@ -756,18 +809,21 @@ void Player::ExecuteCreateBuffer(size_t lineNumber, const CsvSplit& csvSplit)
VkResult res = vmaCreateBuffer(m_Allocator, &bufCreateInfo, &allocCreateInfo, &allocDesc.buffer, &allocDesc.allocation, nullptr);
if(res == VK_SUCCESS)
{
const auto existingIt = m_Allocations.find(origPtr);
if(existingIt != m_Allocations.end())
{
if(IssueWarning())
printf("Line %zu: Allocation %llX already exists.\n", lineNumber, origPtr);
}
m_Stats.RegisterCreateBuffer();
}
else
{
if(IssueWarning())
printf("Line %zu: vmaCreateBuffer failed (%u).\n", lineNumber, res);
}
const auto existingIt = m_Allocations.find(origPtr);
if(existingIt != m_Allocations.end())
{
if(IssueWarning())
printf("Line %zu: Allocation %llX already exists.\n", lineNumber, origPtr);
}
m_Allocations[origPtr] = allocDesc;
}
else
@ -852,18 +908,21 @@ void Player::ExecuteCreateImage(size_t lineNumber, const CsvSplit& csvSplit)
VkResult res = vmaCreateImage(m_Allocator, &imageCreateInfo, &allocCreateInfo, &allocDesc.image, &allocDesc.allocation, nullptr);
if(res == VK_SUCCESS)
{
const auto existingIt = m_Allocations.find(origPtr);
if(existingIt != m_Allocations.end())
{
if(IssueWarning())
printf("Line %zu: Allocation %llX already exists.\n", lineNumber, origPtr);
}
m_Stats.RegisterCreateImage();
}
else
{
if(IssueWarning())
printf("Line %zu: vmaCreateImage failed (%u).\n", lineNumber, res);
}
const auto existingIt = m_Allocations.find(origPtr);
if(existingIt != m_Allocations.end())
{
if(IssueWarning())
printf("Line %zu: Allocation %llX already exists.\n", lineNumber, origPtr);
}
m_Allocations[origPtr] = allocDesc;
}
else
@ -900,7 +959,7 @@ static int ProcessFile(const char* data, size_t numBytes)
}
if(!lineSplit.GetNextLine(line) ||
!StrRangeEq(line, "1,0"))
!(StrRangeEq(line, "1,0") || StrRangeEq(line, "1,1")))
{
printf("ERROR: Incorrect file format version.\n");
return RESULT_ERROR_FORMAT;

View File

@ -2666,7 +2666,7 @@ void EnsureFile()
{
fopen_s(&g_File, "VMA_Usage_Dump", "wb");
fprintf(g_File, "%s\n", "Vulkan Memory Allocator,Calls recording");
fprintf(g_File, "%s\n", "1,0");
fprintf(g_File, "%s\n", "1,1");
QueryPerformanceFrequency(&g_Freq);
QueryPerformanceCounter(&g_StartCounter);
}