diff --git a/include/vk.h b/include/vk.h index bb0d4a3..ad4f369 100644 --- a/include/vk.h +++ b/include/vk.h @@ -25,6 +25,7 @@ class Vulkan VkRenderPass renderPass; // Проходы рендера VkPipelineLayout pipelineLayout; // Раскладка конвейера VkPipeline graphicsPipeline; // Графический конвейер + VkCommandPool commandPool; // Пул команд // Структура для хранения флагов struct @@ -43,6 +44,7 @@ class Vulkan VkShaderModule createShaderModule(const char * filename); // Создание шейдерного модуля void createGraphicPipeline(); // Создание графического конвеера void createBuffer(VkDeviceSize size, VkBufferUsageFlags usage, VkMemoryPropertyFlags properties, VkBuffer& buffer, VkDeviceMemory& bufferMemory); // Создание произвольного буфера данных + void createCommandPool(); // Создание пула команд }; #endif // VK_H \ No newline at end of file diff --git a/src/vk.cpp b/src/vk.cpp index 69f514a..de80481 100644 --- a/src/vk.cpp +++ b/src/vk.cpp @@ -19,14 +19,17 @@ void Vulkan::init(GLFWwindow* window) createSwapchain(window); // Создание списка показа createRenderpass(); // Создание проходов рендера createGraphicPipeline(); // Создание графического конвейера + createCommandPool(); // Создание пула команд } // завершение работы void Vulkan::destroy() { - vkDestroyPipeline(logicalDevice, graphicsPipeline, nullptr); - vkDestroyPipelineLayout(logicalDevice, pipelineLayout, nullptr); - vkDestroyRenderPass(logicalDevice, renderPass, nullptr); + vkDestroyCommandPool(logicalDevice, commandPool, nullptr); // Уничтожение командного пула + + vkDestroyPipeline(logicalDevice, graphicsPipeline, nullptr); // Уничтожение графического конвейера + vkDestroyPipelineLayout(logicalDevice, pipelineLayout, nullptr); // Уничтожение раскладки графического конвейера + vkDestroyRenderPass(logicalDevice, renderPass, nullptr); // Уничтожение проходов рендера // Уничтожение информации о изображениях списка показа for (auto & imageView : swapChainImageViews) @@ -768,3 +771,20 @@ void Vulkan::createBuffer(VkDeviceSize size, VkBufferUsageFlags usage, VkMemoryP // Привязка выделенной памяти к буферу vkBindBufferMemory(logicalDevice, buffer, bufferMemory, 0); } + +// Создание пула команд +void Vulkan::createCommandPool() +{ + // Информация о создаваемом командном пуле + VkCommandPoolCreateInfo poolInfo{}; + poolInfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; + poolInfo.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT; + poolInfo.queueFamilyIndex = queue.index; + + // Создание командного пула + if (vkCreateCommandPool(logicalDevice, &poolInfo, nullptr, &commandPool) != VK_SUCCESS) + { + throw std::runtime_error("Unable to create graphics command pool"); + } + +}