Копирование между буферами данных
This commit is contained in:
parent
18d2fa9bba
commit
f505616086
|
@ -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
|
42
src/vk.cpp
42
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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue