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); +}