From f5056160867e36a7298e87a038790effdd7b94d5 Mon Sep 17 00:00:00 2001 From: "re.kovalev" Date: Thu, 3 Mar 2022 16:56:50 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9A=D0=BE=D0=BF=D0=B8=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BC=D0=B5=D0=B6=D0=B4=D1=83=20?= =?UTF-8?q?=D0=B1=D1=83=D1=84=D0=B5=D1=80=D0=B0=D0=BC=D0=B8=20=D0=B4=D0=B0?= =?UTF-8?q?=D0=BD=D0=BD=D1=8B=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/vk.h | 1 + src/vk.cpp | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/include/vk.h b/include/vk.h index 8f65f8d..be2db0a 100644 --- a/include/vk.h +++ b/include/vk.h @@ -46,6 +46,7 @@ class Vulkan void createGraphicPipeline(); // Создание графического конвеера void createBuffer(VkDeviceSize size, VkBufferUsageFlags usage, VkMemoryPropertyFlags properties, VkBuffer& buffer, VkDeviceMemory& bufferMemory); // Создание произвольного буфера данных void createCommandPool(); // Создание пула команд + void copyBuffer(VkBuffer srcBuffer, VkBuffer dstBuffer, VkDeviceSize size); // Копирование между буферами данных }; #endif // VK_H \ No newline at end of file diff --git a/src/vk.cpp b/src/vk.cpp index 41942d8..9bf9b4f 100644 --- a/src/vk.cpp +++ b/src/vk.cpp @@ -803,3 +803,45 @@ void Vulkan::createCommandPool() throw std::runtime_error("Unable to allocate command buffers"); } } + +// Копирование между буферами данных +void Vulkan::copyBuffer(VkBuffer srcBuffer, VkBuffer dstBuffer, VkDeviceSize size) +{ + // Информация о выделяемом буфере команд + VkCommandBufferAllocateInfo allocInfo{}; + allocInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; + allocInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY; + allocInfo.commandPool = commandPool; + allocInfo.commandBufferCount = 1; + + // Дескриптор и выделение буфера команд + VkCommandBuffer commandBuffer; + vkAllocateCommandBuffers(logicalDevice, &allocInfo, &commandBuffer); + + // Начало записи команд + VkCommandBufferBeginInfo beginInfo{}; + beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; + beginInfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; + vkBeginCommandBuffer(commandBuffer, &beginInfo); + + // Операция копирования + VkBufferCopy copyRegion{}; + copyRegion.size = size; + vkCmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, 1, ©Region); + + // Конец записи команд + vkEndCommandBuffer(commandBuffer); + + // Информация о запускаемых буферах команд + VkSubmitInfo submitInfo{}; + submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; + submitInfo.commandBufferCount = 1; + submitInfo.pCommandBuffers = &commandBuffer; + + // Запуск командного буфера копирования и ожидание завершения + vkQueueSubmit(queue.descriptor, 1, &submitInfo, VK_NULL_HANDLE); + vkQueueWaitIdle(queue.descriptor); + + // Освобождение командного буфера копирования + vkFreeCommandBuffers(logicalDevice, commandPool, 1, &commandBuffer); +}