Browse Source

vulkan: implement Buffer::copyTo

niki 3 years ago
parent
commit
ad8243f257
2 changed files with 14 additions and 2 deletions
  1. 11 1
      src/modules/graphics/vulkan/Buffer.cpp
  2. 3 1
      src/modules/graphics/vulkan/Graphics.cpp

+ 11 - 1
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) {
 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
 } // vulkan
 } // graphics
 } // graphics
 } // love
 } // love

+ 3 - 1
src/modules/graphics/vulkan/Graphics.cpp

@@ -564,7 +564,9 @@ const PFN_vkCmdPushDescriptorSetKHR Graphics::getVkCmdPushDescriptorSetKHRFuncti
 
 
 void Graphics::queueDatatransfer(std::function<void(VkCommandBuffer)> command, std::function<void()> cleanUp) {
 void Graphics::queueDatatransfer(std::function<void(VkCommandBuffer)> command, std::function<void()> cleanUp) {
 	command(dataTransferCommandBuffers.at(currentFrame));
 	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<void()> cleanUp) {
 void Graphics::queueCleanUp(std::function<void()> cleanUp) {