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