diff --git a/src/modules/graphics/vulkan/Buffer.cpp b/src/modules/graphics/vulkan/Buffer.cpp index d9387ca1b..496563da7 100644 --- a/src/modules/graphics/vulkan/Buffer.cpp +++ b/src/modules/graphics/vulkan/Buffer.cpp @@ -59,6 +59,7 @@ Buffer::Buffer(love::graphics::Graphics *gfx, const Settings &settings, const st , usageFlags(settings.usageFlags) , vgfx(dynamic_cast(gfx)) , zeroInitialize(settings.zeroInitialize) + , initialData(data) { loadVolatile(); } @@ -86,6 +87,9 @@ bool Buffer::loadVolatile() if (zeroInitialize) vkCmdFillBuffer(vgfx->getCommandBufferForDataTransfer(), buffer, 0, VK_WHOLE_SIZE, 0); + if (initialData) + fill(0, size, initialData); + if (usageFlags & BUFFERUSAGEFLAG_TEXEL) { VkBufferViewCreateInfo bufferViewInfo{}; @@ -156,6 +160,8 @@ void *Buffer::map(MapType map, size_t offset, size_t size) if (vmaCreateBuffer(allocator, &bufferInfo, &allocInfo, &stagingBuffer, &stagingAllocation, &stagingAllocInfo) != VK_SUCCESS) throw love::Exception("failed to create staging buffer"); + mappedRange = Range(offset, size); + return stagingAllocInfo.pMappedData; } } @@ -188,7 +194,8 @@ bool Buffer::fill(size_t offset, size_t size, const void *data) memcpy(fillAllocInfo.pMappedData, data, size); VkBufferCopy bufferCopy{}; - bufferCopy.srcOffset = offset; + bufferCopy.srcOffset = 0; + bufferCopy.dstOffset = offset; bufferCopy.size = size; vkCmdCopyBuffer(vgfx->getCommandBufferForDataTransfer(), fillBuffer, buffer, 1, &bufferCopy); @@ -205,7 +212,8 @@ void Buffer::unmap(size_t usedoffset, size_t usedsize) if (dataUsage != BUFFERDATAUSAGE_READBACK) { VkBufferCopy bufferCopy{}; - bufferCopy.srcOffset = usedoffset; + bufferCopy.srcOffset = usedoffset - mappedRange.getOffset(); + bufferCopy.dstOffset = usedoffset; bufferCopy.size = usedsize; vkCmdCopyBuffer(vgfx->getCommandBufferForDataTransfer(), stagingBuffer, buffer, 1, &bufferCopy); diff --git a/src/modules/graphics/vulkan/Buffer.h b/src/modules/graphics/vulkan/Buffer.h index 33bdaebe1..809bcd848 100644 --- a/src/modules/graphics/vulkan/Buffer.h +++ b/src/modules/graphics/vulkan/Buffer.h @@ -20,6 +20,8 @@ #pragma once +#include "common/Range.h" + #include "graphics/Buffer.h" #include "graphics/Volatile.h" @@ -55,6 +57,7 @@ public: private: bool zeroInitialize; + const void *initialData; VkBuffer buffer = VK_NULL_HANDLE; VkBuffer stagingBuffer = VK_NULL_HANDLE; VkBufferView bufferView = VK_NULL_HANDLE; @@ -65,6 +68,7 @@ private: VmaAllocationInfo allocInfo; VmaAllocationInfo stagingAllocInfo; BufferUsageFlags usageFlags; + Range mappedRange; }; } // vulkan