Копирование между буферами данных
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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user