Browse Source

Vulkan: Fix the default mem callbacks. Make the work in ANV

Panagiotis Christopoulos Charitos 8 years ago
parent
commit
20f8cee7b5
2 changed files with 49 additions and 6 deletions
  1. 39 6
      src/anki/gr/vulkan/GrManagerImpl.cpp
  2. 10 0
      src/anki/gr/vulkan/GrManagerImpl.h

+ 39 - 6
src/anki/gr/vulkan/GrManagerImpl.cpp

@@ -554,19 +554,46 @@ Error GrManagerImpl::initMemory(const ConfigSet& cfg)
 	return ErrorCode::NONE;
 	return ErrorCode::NONE;
 }
 }
 
 
+#if ANKI_GR_MANAGER_DEBUG_MEMMORY
 void* GrManagerImpl::allocateCallback(
 void* GrManagerImpl::allocateCallback(
 	void* userData, size_t size, size_t alignment, VkSystemAllocationScope allocationScope)
 	void* userData, size_t size, size_t alignment, VkSystemAllocationScope allocationScope)
 {
 {
 	ANKI_ASSERT(userData);
 	ANKI_ASSERT(userData);
-	GrManagerImpl* self = static_cast<GrManagerImpl*>(userData);
-	return self->getAllocator().getMemoryPool().allocate(size, alignment);
+	ANKI_ASSERT(size);
+	ANKI_ASSERT(isPowerOfTwo(alignment));
+	ANKI_ASSERT(alignment <= MAX_ALLOC_ALIGNMENT);
+
+	auto alloc = static_cast<GrManagerImpl*>(userData)->getAllocator();
+
+	PtrSize newSize = size + sizeof(AllocHeader);
+	AllocHeader* header = static_cast<AllocHeader*>(alloc.getMemoryPool().allocate(newSize, MAX_ALLOC_ALIGNMENT));
+	header->m_sig = ALLOC_SIG;
+	header->m_size = size;
+	++header;
+
+	return static_cast<AllocHeader*>(header);
 }
 }
 
 
 void* GrManagerImpl::reallocateCallback(
 void* GrManagerImpl::reallocateCallback(
 	void* userData, void* original, size_t size, size_t alignment, VkSystemAllocationScope allocationScope)
 	void* userData, void* original, size_t size, size_t alignment, VkSystemAllocationScope allocationScope)
 {
 {
-	ANKI_ASSERT(!"TODO");
-	return nullptr;
+	if(original && size == 0)
+	{
+		freeCallback(userData, original);
+		return nullptr;
+	}
+
+	void* mem = allocateCallback(userData, size, alignment, allocationScope);
+	if(original)
+	{
+		// Move the data
+		AllocHeader* header = static_cast<AllocHeader*>(original);
+		--header;
+		ANKI_ASSERT(header->m_sig == ALLOC_SIG);
+		memcpy(mem, original, header->m_size);
+	}
+
+	return mem;
 }
 }
 
 
 void GrManagerImpl::freeCallback(void* userData, void* ptr)
 void GrManagerImpl::freeCallback(void* userData, void* ptr)
@@ -574,10 +601,16 @@ void GrManagerImpl::freeCallback(void* userData, void* ptr)
 	if(ptr)
 	if(ptr)
 	{
 	{
 		ANKI_ASSERT(userData);
 		ANKI_ASSERT(userData);
-		GrManagerImpl* self = static_cast<GrManagerImpl*>(userData);
-		self->getAllocator().getMemoryPool().free(ptr);
+		auto alloc = static_cast<GrManagerImpl*>(userData)->getAllocator();
+
+		AllocHeader* header = static_cast<AllocHeader*>(ptr);
+		--header;
+		ANKI_ASSERT(header->m_sig == ALLOC_SIG);
+
+		alloc.getMemoryPool().free(header);
 	}
 	}
 }
 }
+#endif
 
 
 void GrManagerImpl::beginFrame()
 void GrManagerImpl::beginFrame()
 {
 {

+ 10 - 0
src/anki/gr/vulkan/GrManagerImpl.h

@@ -195,6 +195,14 @@ private:
 
 
 #if ANKI_GR_MANAGER_DEBUG_MEMMORY
 #if ANKI_GR_MANAGER_DEBUG_MEMMORY
 	VkAllocationCallbacks m_debugAllocCbs;
 	VkAllocationCallbacks m_debugAllocCbs;
+	static const U32 MAX_ALLOC_ALIGNMENT = 64;
+	static const PtrSize ALLOC_SIG = 0xF00B00;
+
+	struct alignas(MAX_ALLOC_ALIGNMENT) AllocHeader
+	{
+		PtrSize m_sig;
+		PtrSize m_size;
+	};
 #endif
 #endif
 
 
 	VkInstance m_instance = VK_NULL_HANDLE;
 	VkInstance m_instance = VK_NULL_HANDLE;
@@ -305,6 +313,7 @@ private:
 	ANKI_USE_RESULT Error initFramebuffers(const GrManagerInitInfo& init);
 	ANKI_USE_RESULT Error initFramebuffers(const GrManagerInitInfo& init);
 	ANKI_USE_RESULT Error initMemory(const ConfigSet& cfg);
 	ANKI_USE_RESULT Error initMemory(const ConfigSet& cfg);
 
 
+#if ANKI_GR_MANAGER_DEBUG_MEMMORY
 	static void* allocateCallback(
 	static void* allocateCallback(
 		void* userData, size_t size, size_t alignment, VkSystemAllocationScope allocationScope);
 		void* userData, size_t size, size_t alignment, VkSystemAllocationScope allocationScope);
 
 
@@ -312,6 +321,7 @@ private:
 		void* userData, void* original, size_t size, size_t alignment, VkSystemAllocationScope allocationScope);
 		void* userData, void* original, size_t size, size_t alignment, VkSystemAllocationScope allocationScope);
 
 
 	static void freeCallback(void* userData, void* ptr);
 	static void freeCallback(void* userData, void* ptr);
+#endif
 
 
 	void resetFrame(PerFrame& frame);
 	void resetFrame(PerFrame& frame);