diff --git a/src/VmaReplay/Common.h b/src/VmaReplay/Common.h index fa2dfe9..5d52e5c 100644 --- a/src/VmaReplay/Common.h +++ b/src/VmaReplay/Common.h @@ -173,9 +173,16 @@ public: size_t GetCount() const { return m_Count; } StrRange GetRange(size_t index) const { - return StrRange { - m_Line.beg + m_Ranges[index * 2], - m_Line.beg + m_Ranges[index * 2 + 1] }; + if(index < m_Count) + { + return StrRange { + m_Line.beg + m_Ranges[index * 2], + m_Line.beg + m_Ranges[index * 2 + 1] }; + } + else + { + return StrRange{0, 0}; + } } private: diff --git a/src/VmaReplay/Constants.cpp b/src/VmaReplay/Constants.cpp index e353f49..6258117 100644 --- a/src/VmaReplay/Constants.cpp +++ b/src/VmaReplay/Constants.cpp @@ -54,6 +54,7 @@ const char* VMA_FUNCTION_NAMES[] = { "vmaResizeAllocation", "vmaDefragmentationBegin", "vmaDefragmentationEnd", + "vmaSetPoolName", }; static_assert( _countof(VMA_FUNCTION_NAMES) == (size_t)VMA_FUNCTION::Count, diff --git a/src/VmaReplay/Constants.h b/src/VmaReplay/Constants.h index e479168..4dcea82 100644 --- a/src/VmaReplay/Constants.h +++ b/src/VmaReplay/Constants.h @@ -87,6 +87,7 @@ enum class VMA_FUNCTION ResizeAllocation, DefragmentationBegin, DefragmentationEnd, + SetPoolName, Count }; extern const char* VMA_FUNCTION_NAMES[]; diff --git a/src/VmaReplay/VmaReplay.cpp b/src/VmaReplay/VmaReplay.cpp index 4ed29f8..57251fb 100644 --- a/src/VmaReplay/VmaReplay.cpp +++ b/src/VmaReplay/VmaReplay.cpp @@ -688,7 +688,7 @@ static size_t g_DefragmentAfterLineNextIndex = 0; static bool ValidateFileVersion() { if(GetVersionMajor(g_FileVersion) == 1 && - GetVersionMinor(g_FileVersion) <= 6) + GetVersionMinor(g_FileVersion) <= 7) { return true; } @@ -1665,6 +1665,7 @@ private: void ExecuteResizeAllocation(size_t lineNumber, const CsvSplit& csvSplit); void ExecuteDefragmentationBegin(size_t lineNumber, const CsvSplit& csvSplit); void ExecuteDefragmentationEnd(size_t lineNumber, const CsvSplit& csvSplit); + void ExecuteSetPoolName(size_t lineNumber, const CsvSplit& csvSplit); void DestroyAllocation(size_t lineNumber, const CsvSplit& csvSplit, const char* functionName); @@ -1819,6 +1820,8 @@ void Player::ExecuteLine(size_t lineNumber, const StrRange& line) ExecuteDefragmentationBegin(lineNumber, csvSplit); else if(StrRangeEq(functionName, VMA_FUNCTION_NAMES[(uint32_t)VMA_FUNCTION::DefragmentationEnd])) ExecuteDefragmentationEnd(lineNumber, csvSplit); + else if(StrRangeEq(functionName, VMA_FUNCTION_NAMES[(uint32_t)VMA_FUNCTION::SetPoolName])) + ExecuteSetPoolName(lineNumber, csvSplit); else { if(IssueWarning()) @@ -3863,6 +3866,48 @@ void Player::ExecuteDefragmentationEnd(size_t lineNumber, const CsvSplit& csvSpl } } +void Player::ExecuteSetPoolName(size_t lineNumber, const CsvSplit& csvSplit) +{ + m_Stats.RegisterFunctionCall(VMA_FUNCTION::SetPoolName); + + if(!g_UserDataEnabled) + { + return; + } + + if(ValidateFunctionParameterCount(lineNumber, csvSplit, 2, true)) + { + uint64_t origPtr = 0; + if(StrRangeToPtr(csvSplit.GetRange(FIRST_PARAM_INDEX), origPtr)) + { + if(origPtr != 0) + { + const auto it = m_Pools.find(origPtr); + if(it != m_Pools.end()) + { + std::string poolName; + csvSplit.GetRange(FIRST_PARAM_INDEX + 1).to_str(poolName); + vmaSetPoolName(m_Allocator, it->second.pool, !poolName.empty() ? poolName.c_str() : nullptr); + } + else + { + if(IssueWarning()) + { + printf("Line %zu: Pool %llX not found.\n", lineNumber, origPtr); + } + } + } + } + else + { + if(IssueWarning()) + { + printf("Line %zu: Invalid parameters for vmaSetPoolName.\n", lineNumber); + } + } + } +} + //////////////////////////////////////////////////////////////////////////////// // Main functions diff --git a/src/vk_mem_alloc.h b/src/vk_mem_alloc.h index d0fcdee..992c4f3 100644 --- a/src/vk_mem_alloc.h +++ b/src/vk_mem_alloc.h @@ -2523,7 +2523,7 @@ VMA_CALL_PRE void VMA_CALL_POST vmaGetPoolName( VmaPool pool, const char** ppName); -/* \brief Sets name of a custom pool. +/** \brief Sets name of a custom pool. `pName` can be either null or pointer to a null-terminated string with new name for the pool. Function makes internal copy of the string, so it can be changed or freed immediately after this call. @@ -6702,6 +6702,9 @@ public: VmaDefragmentationContext ctx); void RecordDefragmentationEnd(uint32_t frameIndex, VmaDefragmentationContext ctx); + void RecordSetPoolName(uint32_t frameIndex, + VmaPool pool, + const char* name); private: struct CallParams @@ -13659,7 +13662,7 @@ VkResult VmaRecorder::Init(const VmaRecordSettings& settings, bool useMutex) // Write header. fprintf(m_File, "%s\n", "Vulkan Memory Allocator,Calls recording"); - fprintf(m_File, "%s\n", "1,6"); + fprintf(m_File, "%s\n", "1,7"); return VK_SUCCESS; } @@ -14092,6 +14095,19 @@ void VmaRecorder::RecordDefragmentationEnd(uint32_t frameIndex, Flush(); } +void VmaRecorder::RecordSetPoolName(uint32_t frameIndex, + VmaPool pool, + const char* name) +{ + CallParams callParams; + GetBasicParams(callParams); + + VmaMutexLock lock(m_FileMutex, m_UseMutex); + fprintf(m_File, "%u,%.3f,%u,vmaSetPoolName,%p,%s\n", callParams.threadId, callParams.time, frameIndex, + pool, name != VMA_NULL ? name : ""); + Flush(); +} + VmaRecorder::UserDataString::UserDataString(VmaAllocationCreateFlags allocFlags, const void* pUserData) { if(pUserData != VMA_NULL) @@ -16303,6 +16319,13 @@ VMA_CALL_PRE void VMA_CALL_POST vmaSetPoolName( VMA_DEBUG_GLOBAL_MUTEX_LOCK pool->SetName(pName); + +#if VMA_RECORDING_ENABLED + if(allocator->GetRecorder() != VMA_NULL) + { + allocator->GetRecorder()->RecordSetPoolName(allocator->GetCurrentFrameIndex(), pool, pName); + } +#endif } VMA_CALL_PRE VkResult VMA_CALL_POST vmaAllocateMemory(