Add command creation for GEVulkanDriver

This commit is contained in:
Benau 2022-01-22 00:41:24 +08:00
parent 2f4093516a
commit 8e64c69c5d
2 changed files with 49 additions and 0 deletions

View File

@ -314,15 +314,26 @@ namespace GE
std::vector<VkSemaphore> image_available_semaphores;
std::vector<VkSemaphore> render_finished_semaphores;
std::vector<VkFence> in_flight_fences;
VkCommandPool command_pool;
std::vector<VkCommandBuffer> command_buffers;
VK()
{
instance = VK_NULL_HANDLE;
surface = VK_NULL_HANDLE;
device = VK_NULL_HANDLE;
swap_chain = VK_NULL_HANDLE;
command_pool = VK_NULL_HANDLE;
}
~VK()
{
if (!command_buffers.empty())
{
vkFreeCommandBuffers(device, command_pool,
(uint32_t)(command_buffers.size()),
&command_buffers[0]);
}
if (command_pool != VK_NULL_HANDLE)
vkDestroyCommandPool(device, command_pool, NULL);
for (VkSemaphore& semaphore : image_available_semaphores)
vkDestroySemaphore(device, semaphore, NULL);
for (VkSemaphore& semaphore : render_finished_semaphores)
@ -370,6 +381,8 @@ namespace GE
void createDevice();
void createSwapChain();
void createSyncObjects();
void createCommandPool();
void createCommandBuffers();
std::string getVulkanVersionString() const;
std::string getDriverVersionString() const;
};

View File

@ -486,6 +486,8 @@ GEVulkanDriver::GEVulkanDriver(const SIrrlichtCreationParameters& params,
vkGetPhysicalDeviceProperties(m_physical_device, &m_properties);
createSwapChain();
createSyncObjects();
createCommandPool();
createCommandBuffers();
os::Printer::log("Vulkan version", getVulkanVersionString().c_str());
os::Printer::log("Vulkan vendor", getVendorInfo().c_str());
os::Printer::log("Vulkan renderer", m_properties.deviceName);
@ -942,6 +944,40 @@ void GEVulkanDriver::createSyncObjects()
}
} // createSyncObjects
// ----------------------------------------------------------------------------
void GEVulkanDriver::createCommandPool()
{
VkCommandPoolCreateInfo pool_info = {};
pool_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
pool_info.queueFamilyIndex = m_graphics_family;
VkResult result = vkCreateCommandPool(m_vk.device, &pool_info, NULL,
&m_vk.command_pool);
if (result != VK_SUCCESS)
throw std::runtime_error("vkCreateCommandPool failed");
} // createCommandPool
// ----------------------------------------------------------------------------
void GEVulkanDriver::createCommandBuffers()
{
std::vector<VkCommandBuffer> buffers(m_vk.swap_chain_images.size());
VkCommandBufferAllocateInfo alloc_info = {};
alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
alloc_info.commandPool = m_vk.command_pool;
alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
alloc_info.commandBufferCount = (uint32_t)buffers.size();
VkResult result = vkAllocateCommandBuffers(m_vk.device, &alloc_info,
&buffers[0]);
if (result != VK_SUCCESS)
throw std::runtime_error("vkAllocateCommandBuffers failed");
m_vk.command_buffers = buffers;
} // createCommandBuffers
// ----------------------------------------------------------------------------
void GEVulkanDriver::OnResize(const core::dimension2d<u32>& size)
{