Копирование между буферами данных

This commit is contained in:
parent 18d2fa9bba
commit f505616086
2 changed files with 43 additions and 0 deletions

View File

@ -46,6 +46,7 @@ class Vulkan
void createGraphicPipeline(); // Создание графического конвеера void createGraphicPipeline(); // Создание графического конвеера
void createBuffer(VkDeviceSize size, VkBufferUsageFlags usage, VkMemoryPropertyFlags properties, VkBuffer& buffer, VkDeviceMemory& bufferMemory); // Создание произвольного буфера данных void createBuffer(VkDeviceSize size, VkBufferUsageFlags usage, VkMemoryPropertyFlags properties, VkBuffer& buffer, VkDeviceMemory& bufferMemory); // Создание произвольного буфера данных
void createCommandPool(); // Создание пула команд void createCommandPool(); // Создание пула команд
void copyBuffer(VkBuffer srcBuffer, VkBuffer dstBuffer, VkDeviceSize size); // Копирование между буферами данных
}; };
#endif // VK_H #endif // VK_H

View File

@ -803,3 +803,45 @@ void Vulkan::createCommandPool()
throw std::runtime_error("Unable to allocate command buffers"); 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, &copyRegion);
// Конец записи команд
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);
}