Add createSyncObjects for GEVulkanDriver

This commit is contained in:
Benau 2022-01-22 00:18:42 +08:00
parent 9e321d804e
commit 2f4093516a
2 changed files with 57 additions and 0 deletions

View File

@ -311,6 +311,9 @@ namespace GE
VkSwapchainKHR swap_chain;
std::vector<VkImage> swap_chain_images;
std::vector<VkImageView> swap_chain_image_views;
std::vector<VkSemaphore> image_available_semaphores;
std::vector<VkSemaphore> render_finished_semaphores;
std::vector<VkFence> in_flight_fences;
VK()
{
instance = VK_NULL_HANDLE;
@ -320,6 +323,12 @@ namespace GE
}
~VK()
{
for (VkSemaphore& semaphore : image_available_semaphores)
vkDestroySemaphore(device, semaphore, NULL);
for (VkSemaphore& semaphore : render_finished_semaphores)
vkDestroySemaphore(device, semaphore, NULL);
for (VkFence& fence : in_flight_fences)
vkDestroyFence(device, fence, NULL);
for (VkImageView& image_view : swap_chain_image_views)
vkDestroyImageView(device, image_view, NULL);
if (swap_chain != VK_NULL_HANDLE)
@ -360,6 +369,7 @@ namespace GE
std::vector<VkPresentModeKHR>* present_modes);
void createDevice();
void createSwapChain();
void createSyncObjects();
std::string getVulkanVersionString() const;
std::string getDriverVersionString() const;
};

View File

@ -1,6 +1,7 @@
#include "ge_vulkan_driver.hpp"
#ifdef _IRR_COMPILE_WITH_VULKAN_
const unsigned int MAX_FRAMES_IN_FLIGHT = 2;
#include "SDL_vulkan.h"
#include <limits>
#include <set>
@ -484,6 +485,7 @@ GEVulkanDriver::GEVulkanDriver(const SIrrlichtCreationParameters& params,
vkGetPhysicalDeviceProperties(m_physical_device, &m_properties);
createSwapChain();
createSyncObjects();
os::Printer::log("Vulkan version", getVulkanVersionString().c_str());
os::Printer::log("Vulkan vendor", getVendorInfo().c_str());
os::Printer::log("Vulkan renderer", m_properties.deviceName);
@ -895,6 +897,51 @@ void GEVulkanDriver::createSwapChain()
}
} // createSwapChain
// ----------------------------------------------------------------------------
void GEVulkanDriver::createSyncObjects()
{
VkSemaphoreCreateInfo semaphore_info = {};
semaphore_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
VkFenceCreateInfo fence_info = {};
fence_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
fence_info.flags = VK_FENCE_CREATE_SIGNALED_BIT;
for (unsigned int i = 0; i < MAX_FRAMES_IN_FLIGHT; i++)
{
VkSemaphore image_available_semaphore;
VkResult result = vkCreateSemaphore(m_vk.device, &semaphore_info, NULL,
&image_available_semaphore);
if (result != VK_SUCCESS)
{
throw std::runtime_error(
"vkCreateSemaphore on image_available_semaphore failed");
}
VkSemaphore render_finished_semaphore;
result = vkCreateSemaphore(m_vk.device, &semaphore_info, NULL,
&render_finished_semaphore);
if (result != VK_SUCCESS)
{
throw std::runtime_error(
"vkCreateSemaphore on render_finished_semaphore failed");
}
VkFence in_flight_fence;
result = vkCreateFence(m_vk.device, &fence_info, NULL,
&in_flight_fence);
if (result != VK_SUCCESS)
throw std::runtime_error("vkCreateFence failed");
m_vk.image_available_semaphores.push_back(image_available_semaphore);
m_vk.render_finished_semaphores.push_back(render_finished_semaphore);
m_vk.in_flight_fences.push_back(in_flight_fence);
}
} // createSyncObjects
// ----------------------------------------------------------------------------
void GEVulkanDriver::OnResize(const core::dimension2d<u32>& size)
{