Fix for compilation on AppleClang 13.1 Fixes #253
diff --git a/include/vk_mem_alloc.h b/include/vk_mem_alloc.h index 7525264..5589f04 100644 --- a/include/vk_mem_alloc.h +++ b/include/vk_mem_alloc.h
@@ -2569,6 +2569,7 @@ #include <cstdlib> #include <cstring> #include <utility> +#include <type_traits> #ifdef _MSC_VER #include <intrin.h> // For functions like __popcnt, _BitScanForward etc. @@ -5491,6 +5492,7 @@ // Posts next part of an open string. The number is converted to decimal characters. void ContinueString(uint32_t n); void ContinueString(uint64_t n); + void ContinueString_Size(size_t n); // Posts next part of an open string. Pointer value is converted to characters // using "%p" formatting - shown as hexadecimal number, e.g.: 000000081276Ad00 void ContinueString_Pointer(const void* ptr); @@ -5500,6 +5502,7 @@ // Writes a number value. void WriteNumber(uint32_t n); void WriteNumber(uint64_t n); + void WriteSize(size_t n); // Writes a boolean value - false or true. void WriteBool(bool b); // Writes a null value. @@ -5524,6 +5527,11 @@ VmaVector< StackItem, VmaStlAllocator<StackItem> > m_Stack; bool m_InsideString; + // Write size_t for less than 64bits + void WriteSize(size_t n, std::integral_constant<bool, false>) { m_SB.AddNumber(static_cast<uint32_t>(n)); } + // Write size_t for 64bits + void WriteSize(size_t n, std::integral_constant<bool, true>) { m_SB.AddNumber(static_cast<uint64_t>(n)); } + void BeginValue(bool isString); void WriteIndent(bool oneLess = false); }; @@ -5666,6 +5674,14 @@ m_SB.AddNumber(n); } +void VmaJsonWriter::ContinueString_Size(size_t n) +{ + VMA_ASSERT(m_InsideString); + // Fix for AppleClang incorrect type casting + // TODO: Change to if constexpr when C++17 used as minimal standard + WriteSize(n, std::is_same<size_t, uint64_t>{}); +} + void VmaJsonWriter::ContinueString_Pointer(const void* ptr) { VMA_ASSERT(m_InsideString); @@ -5697,6 +5713,15 @@ m_SB.AddNumber(n); } +void VmaJsonWriter::WriteSize(size_t n) +{ + VMA_ASSERT(!m_InsideString); + BeginValue(false); + // Fix for AppleClang incorrect type casting + // TODO: Change to if constexpr when C++17 used as minimal standard + WriteSize(n, std::is_same<size_t, uint64_t>{}); +} + void VmaJsonWriter::WriteBool(bool b) { VMA_ASSERT(!m_InsideString); @@ -6445,13 +6470,13 @@ json.WriteNumber(GetSize()); json.WriteString("UnusedBytes"); - json.WriteNumber(unusedBytes); + json.WriteSize(unusedBytes); json.WriteString("Allocations"); - json.WriteNumber(allocationCount); + json.WriteSize(allocationCount); json.WriteString("UnusedRanges"); - json.WriteNumber(unusedRangeCount); + json.WriteSize(unusedRangeCount); json.WriteString("Suballocations"); json.BeginArray(); @@ -15978,7 +16003,7 @@ { json.WriteString("Name"); json.BeginString(); - json.ContinueString(index++); + json.ContinueString_Size(index++); if (pool->GetName()) { json.WriteString(" - ");
diff --git a/src/VulkanSample.cpp b/src/VulkanSample.cpp index dfc01ad..d7b0db9 100644 --- a/src/VulkanSample.cpp +++ b/src/VulkanSample.cpp
@@ -35,8 +35,8 @@ static const char* const SHADER_PATH2 = "../bin/"; static const wchar_t* const WINDOW_CLASS_NAME = L"VULKAN_MEMORY_ALLOCATOR_SAMPLE"; static const char* const VALIDATION_LAYER_NAME = "VK_LAYER_KHRONOS_validation"; -static const char* const APP_TITLE_A = "Vulkan Memory Allocator Sample 2.4.0"; -static const wchar_t* const APP_TITLE_W = L"Vulkan Memory Allocator Sample 2.4.0"; +static const char* const APP_TITLE_A = "Vulkan Memory Allocator Sample 3.0.0"; +static const wchar_t* const APP_TITLE_W = L"Vulkan Memory Allocator Sample 3.0.0"; static const bool VSYNC = true; static const uint32_t COMMAND_BUFFER_COUNT = 2;