From: Mikko Rasa Date: Tue, 25 Jan 2022 17:16:57 +0000 (+0200) Subject: Refactor Vulkan memory mapping functions X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=commitdiff_plain;h=bec8444ce5f844d156f5aac90ce9f0a92750cf62 Refactor Vulkan memory mapping functions An allocation is now always mapped in its entirety. Unmapping is done by ID instead of mapped address. --- diff --git a/source/backends/vulkan/buffer_backend.cpp b/source/backends/vulkan/buffer_backend.cpp index 750c926b..c3dcb8e1 100644 --- a/source/backends/vulkan/buffer_backend.cpp +++ b/source/backends/vulkan/buffer_backend.cpp @@ -70,14 +70,13 @@ bool VulkanBuffer::can_map() const void *VulkanBuffer::map() { - size_t size = static_cast(this)->size; - mapped_address = device.get_allocator().map(memory_id, 0, size); + mapped_address = device.get_allocator().map(memory_id); return mapped_address; } bool VulkanBuffer::unmap() { - device.get_allocator().unmap(mapped_address); + device.get_allocator().unmap(memory_id); mapped_address = 0; return true; } diff --git a/source/backends/vulkan/memoryallocator.cpp b/source/backends/vulkan/memoryallocator.cpp index fad67873..b15344c7 100644 --- a/source/backends/vulkan/memoryallocator.cpp +++ b/source/backends/vulkan/memoryallocator.cpp @@ -106,7 +106,7 @@ void MemoryAllocator::release(unsigned id) vk.FreeMemory(allocations[id-1].memory); } -void *MemoryAllocator::map(unsigned id, size_t offset, size_t size) +void *MemoryAllocator::map(unsigned id) { if(!id || id>allocations.size() || !allocations[id-1].memory) throw key_error(id); @@ -115,21 +115,24 @@ void *MemoryAllocator::map(unsigned id, size_t offset, size_t size) const VulkanFunctions &vk = device.get_functions(); - vk.MapMemory(alloc.memory, offset, size, 0, &alloc.mapped_address); + vk.MapMemory(alloc.memory, 0, alloc.size, 0, &alloc.mapped_address); return alloc.mapped_address; } -void MemoryAllocator::unmap(void *ptr) +void MemoryAllocator::unmap(unsigned id) { - auto i = find_member(allocations, ptr, &Allocation::mapped_address); - if(i==allocations.end()) + if(!id || id>allocations.size() || !allocations[id-1].memory) + throw key_error(id); + + Allocation &alloc = allocations[id-1]; + if(!alloc.mapped_address) throw invalid_operation("MemoryAllocator::unmap"); const VulkanFunctions &vk = device.get_functions(); - vk.UnmapMemory(i->memory); - i->mapped_address = 0; + vk.UnmapMemory(alloc.memory); + alloc.mapped_address = 0; } } // namespace GL diff --git a/source/backends/vulkan/memoryallocator.h b/source/backends/vulkan/memoryallocator.h index fee4726b..230f21a2 100644 --- a/source/backends/vulkan/memoryallocator.h +++ b/source/backends/vulkan/memoryallocator.h @@ -46,8 +46,8 @@ public: unsigned allocate(VkImage, MemoryType); void release(unsigned); - void *map(unsigned, std::size_t, std::size_t); - void unmap(void *); + void *map(unsigned); + void unmap(unsigned); }; } // namespace GL diff --git a/source/backends/vulkan/transferqueue.cpp b/source/backends/vulkan/transferqueue.cpp index 9fc94140..4ad50d86 100644 --- a/source/backends/vulkan/transferqueue.cpp +++ b/source/backends/vulkan/transferqueue.cpp @@ -126,7 +126,7 @@ TransferQueue::StagingBuffer::StagingBuffer(Device &d, size_t s): MemoryAllocator &allocator = device.get_allocator(); memory_id = allocator.allocate(buffer, STAGING_MEMORY); - mapped_address = allocator.map(memory_id, 0, size); + mapped_address = allocator.map(memory_id); } TransferQueue::StagingBuffer::StagingBuffer(StagingBuffer &&other): @@ -149,7 +149,7 @@ TransferQueue::StagingBuffer::~StagingBuffer() if(mapped_address) { - allocator.unmap(mapped_address); + allocator.unmap(memory_id); allocator.release(memory_id); } if(buffer)