diff --git a/src/modules/graphics/vulkan/Buffer.cpp b/src/modules/graphics/vulkan/Buffer.cpp index cda9bb3ba..958e58a31 100644 --- a/src/modules/graphics/vulkan/Buffer.cpp +++ b/src/modules/graphics/vulkan/Buffer.cpp @@ -86,8 +86,18 @@ void Buffer::unmap(size_t usedoffset, size_t usedsize) { } void Buffer::copyTo(love::graphics::Buffer* dest, size_t sourceoffset, size_t destoffset, size_t size) { - throw love::Exception("not implemented yet"); + Graphics* vgfx = (Graphics*)gfx; + + vgfx->queueDatatransfer([buffer = buffer, dest = dest, sourceoffset, destoffset, size](VkCommandBuffer commandBuffer){ + VkBufferCopy bufferCopy{}; + bufferCopy.srcOffset = sourceoffset; + bufferCopy.dstOffset = destoffset; + bufferCopy.size = size; + + vkCmdCopyBuffer(commandBuffer, buffer, (VkBuffer) dest->getHandle(), 1, &bufferCopy); + }, nullptr); } + } // vulkan } // graphics } // love diff --git a/src/modules/graphics/vulkan/Graphics.cpp b/src/modules/graphics/vulkan/Graphics.cpp index 1dc3acd9d..2eb6f48af 100644 --- a/src/modules/graphics/vulkan/Graphics.cpp +++ b/src/modules/graphics/vulkan/Graphics.cpp @@ -564,7 +564,9 @@ const PFN_vkCmdPushDescriptorSetKHR Graphics::getVkCmdPushDescriptorSetKHRFuncti void Graphics::queueDatatransfer(std::function command, std::function cleanUp) { command(dataTransferCommandBuffers.at(currentFrame)); - cleanUpFunctions.at(currentFrame).push_back(std::move(cleanUp)); + if (cleanUp) { + cleanUpFunctions.at(currentFrame).push_back(std::move(cleanUp)); + } } void Graphics::queueCleanUp(std::function cleanUp) {